On Github rh0 / drupalcampatx-slides
$subject = "To all users:"; $body = "Hello World!"; nodejs_broadcast_message($subject, $body);
function nodejs_broadcast_message($subject, $body) {
$message = (object) array(
'broadcast' => TRUE,
'data' => (object) array(
'subject' => $subject,
'body' => $body,
),
'channel' => 'nodejs_notify',
);
nodejs_enqueue_message($message);
}
nodejs.module
function messagejs_nodejs_user_channels($auth_user) {
$channels = array();
if (user_access('receive messagejs notifications', $auth_user)) {
$channels[] = 'messagejs_general';
}
return $channels;
}
messagejs.module
function messagejs_send_message($body, $subject = '') {
$notification = new stdClass();
$notification->channel = 'messagejs_general';
$notification->data['subject'] = $subject;
$notification->data['body'] = $body;
$notification->callback = 'nodejsNotify';
nodejs_enqueue_message($notification);
}
messagejs.module
function swapit_demo_nodejs_handlers_info() {
return array(
drupal_get_path('module', 'swapit_demo').'/swapit_demo.client.js',
);
}
swapit_demo.module
$message = new stdClass(); $message->channel = 'swapit_demo'; $message->data['body'] = $user_msg; $message->callback = 'swapIt'; nodejs_send_message($message);swapit_demo.module
Drupal.Nodejs.callbacks.swapIt = {
//grab the message and inject into the DOM
callback: function (message) {
if(message.channel == 'swapit_demo') {
$('form #nodejs-selector').html(message.data.body);
}
}
};
swapit_demo.client.js
exports.setup = function (config) {
...
}
process.on('client-connection', function (sessionId) {
console.log('... got connection event for session ' + sessionId);
config.publishMessageToClient(sessionId, {
data: {
subject: 'Example extension',
body: 'Hello, you just connected.'
}
}
);
})
nodejs/nodejs.server.extension.js.example
var message = {
type: 'nodeToDrupal',
messageBody: 'Hello from the client side!'
};
$("#node-to-drupal-form").submit(function() {
Drupal.Nodejs.socket.emit('message', message);
return false;
});
node_to_drupal.client.js
exports.setup = function (config) {
process.on('client-message', function (sessionId, message) {
console.log('Got a message from the client. Take a look: ');
console.log(message);
// Do some stuff ...
config.publishMessageToClient(sessionId, {
data: {
subject: 'Success',
body: "Huzzah!"
}
});
}
};
node_to_drupal.server.extension.js
function node_to_drupal_nodejs_message_callback($type) {
switch($type) {
case 'nodeToDrupal':
return array('node_to_drupal_handler');
}
return false;
}
function node_to_drupal_handler($message, &$responce) {
$message_body = $message['messageBody'];
watchdog('node_to_drupal', $message_body, array(), WATCHDOG_INFO);
$responce = 'Message logged to Watchdog!';
}
node_to_drupal.module
message.messageType = 'nodeToDrupal';
config.sendMessageToBackend(message, function(error, responce, body) {
if(error) {
console.log('Error sending message to backend.', error);
return;
}
console.log('Response from drupal: ', body);
});
nodejs_send_content_channel_token('dchess_game_' . $node->nid);
nodejs_send_content_channel_message($message);
function sendMessageToTokenChannel(message, config) {
if (!message.hasOwnProperty('channel')) {
console.log('... invalid message object was provided.');
return;
}
if (!config.tokenChannels.hasOwnProperty(message.channel)) {
console.log('... channel "' + message.channel + '" doesn\'t exist.');
return;
}
for (var socketId in config.tokenChannels[message.channel].sockets) {
config.publishMessageToClient(socketId, message);
}
}
dchess.server.js
Works great with pushing messagesto the client.
You can build more complex node applicaitons with this...
but should you?