About myself
Ivo Nellis
CTO, Fenomen Veebiagentuur

● Working with Drupal since 2007
● Contributed mostly to Estonian translations
● Main focus: Drupal, Node.js, MongoDB

                                   Skype: ivonellis
                                  Twitter: ivonellis
                                 ivo@fenomen.ee
Developing realtime apps
 with Node.js and Drupal
           Ivo Nellis
     Fenomen veebiagentuur
With Node.js, you can
  write web applications
Perfect for fast, scalable, light-weight data-
 intensive and real-time web applications
Node.js project is new
       Relatively...
1990                 2000                                  2010


                                                             Node.js


                                             Ruby on Rails



                                        ASP.NET

                          Java


                    PHP


       Python



Perl




                   Created 2009 by Ryan Dahl
With node, you can write
      in JavaScript
  or in something that compiles to JS
           (CoffeeScript, ...)
Server-side JavaScript is great!
● JavaScript is the core of modern Web
   ○ A lot of existing JS developers
   ○ Familiarity with asynchronous programming model
● Share code between client and server
   ○ Can use existing libraries on server side as well.
● It's fast ... and it's getting faster every day
   ○ Huge competition between browser vendors
But SSJS has been done before..

 Jaxer Rhino Ringo
Ejscript Spludo LiveWire
Node.js is built on
 Google V8 JS engine
Fast, Single runtime = less compability
                issues
Node.js is asynchronous
    & event driven
   and it's great for real-time apps
Apache request lifecycle


 Incoming requests




                     Child processes / threads
The cost of I/O
L1-cache                                                      3 cycles
L2-cache                                                   14 cycles
RAM                                                      250 cycles
Disk                                     41 000 000 cycles
Network                               240 000 000 cycles
           http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

           http://duartes.org/gustavo/blog/post/what-your-computer-does-while-you-wait
Node.js event loop


 Incoming requests




                     I/O callback



                           I/O request




                           Single process
Hello World!
var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': text/plain'});
  res.end('Hello Worldn');
}).listen(8000);

                        ●   Node itself does not provide much
                        ●   No "standard" webserver features:
                        ●   No authentication
                        ●   No session handling
                        ●   No cookies
                        ●   No email
                        ●   No templating system
                        ●   No MVC or framework layer
You need to extend
●   Active community
●   Node package manager (npm) is great
●   10913 packages as of 06/2012
●   Simple one-line installation
●   Manages all the dependencies for you

$ npm install express
var express = require("express");
express                            mongodb-native

connect           socket.io                              redis

 request             nodemailer
                                                         jquery
   underscore                  calipso
           async
           https://github.com/joyent/node/wiki/Modules
                       search.npmjs.org
                           github.com
Node.js vs Drupal
  CMS                  Modules, themes, ...      Libraries ...


                                                Calipso / etc...


  Framework                  Drupal           Express.js
                                                                 LIB
                                              Connect.js


  Scripting language          PHP
                                                   Node.js
  Web Server
                             Apache
Web sockets
  and socket.io
Realtime communication
 over HTTP is difficult
 HTTP is request - response by nature
 No good solutions (ajax, long polling)
Solution: Web sockets
●   Websocket API is a part of HTML5 spec
●   New protocol: ws:// & wss://
●   Persistant connection
●   Both parties can send data at any time
●   Native support in Chrome, Firefox, IE10
●   With node.js and socket.io you can use Web
    Sockets today

                http://socket.io/
Socket.io client & server
<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
  });
</script>
------------------------------------------------
-
var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
});
Combining Drupal, Node.
  js and Web sockets
       When and how?
When should I consider it?
● Doing it all on Apache & Drupal becomes too
  expensive and unscalable
  ○   Chat, messaging
  ○   Liveblog
  ○   Streaming data (logs, etc...)
  ○   API layer for a mobile app
  ○   Realtime widgets (sports, stocks)
  ○   Games
  ○   etc...
How?
● A: Write your own Node server
  ○ Write your own module code for Drupal
  ○ Write your own client code


● B: Build on the existing Drupal nodejs
  module
  ○ provides node.js server with socket.io support
  ○ provides a drupal module that integrates with it
  ○ focuses mainly on realtime updates

            http://drupal.org/project/nodejs
nodejs module for Drupal
Enables realtime communication
  Provides a module



    Drupal                                           Client
                                                     Clients



                      Node.js & socket.io
                          Provides a server script
Broadcast messages
Update Watchdog page realtime
Your custom module
 $message = (object) array(
    'broadcast' => TRUE,
    'data' => (object) array(
       'subject' => 'Hi!',
       'body' => 'An important message!',
    ),
    'channel' => 'my_channel',
 );
 nodejs_enqueue_message($message);
And the client side implementation
Drupal.nodejs.callbacks.example = {
  callback: function(message) {
    if (message.channel == "my_channel") {
      alert(message.data);
    }
  }
}
Thank you!
Developing realtime apps with Drupal and NodeJS

Developing realtime apps with Drupal and NodeJS

  • 2.
    About myself Ivo Nellis CTO,Fenomen Veebiagentuur ● Working with Drupal since 2007 ● Contributed mostly to Estonian translations ● Main focus: Drupal, Node.js, MongoDB Skype: ivonellis Twitter: ivonellis ivo@fenomen.ee
  • 3.
    Developing realtime apps with Node.js and Drupal Ivo Nellis Fenomen veebiagentuur
  • 4.
    With Node.js, youcan write web applications Perfect for fast, scalable, light-weight data- intensive and real-time web applications
  • 5.
    Node.js project isnew Relatively...
  • 6.
    1990 2000 2010 Node.js Ruby on Rails ASP.NET Java PHP Python Perl Created 2009 by Ryan Dahl
  • 7.
    With node, youcan write in JavaScript or in something that compiles to JS (CoffeeScript, ...)
  • 8.
    Server-side JavaScript isgreat! ● JavaScript is the core of modern Web ○ A lot of existing JS developers ○ Familiarity with asynchronous programming model ● Share code between client and server ○ Can use existing libraries on server side as well. ● It's fast ... and it's getting faster every day ○ Huge competition between browser vendors
  • 9.
    But SSJS hasbeen done before.. Jaxer Rhino Ringo Ejscript Spludo LiveWire
  • 10.
    Node.js is builton Google V8 JS engine Fast, Single runtime = less compability issues
  • 11.
    Node.js is asynchronous & event driven and it's great for real-time apps
  • 12.
    Apache request lifecycle Incoming requests Child processes / threads
  • 13.
    The cost ofI/O L1-cache 3 cycles L2-cache 14 cycles RAM 250 cycles Disk 41 000 000 cycles Network 240 000 000 cycles http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ http://duartes.org/gustavo/blog/post/what-your-computer-does-while-you-wait
  • 14.
    Node.js event loop Incoming requests I/O callback I/O request Single process
  • 15.
    Hello World! var http= require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': text/plain'}); res.end('Hello Worldn'); }).listen(8000); ● Node itself does not provide much ● No "standard" webserver features: ● No authentication ● No session handling ● No cookies ● No email ● No templating system ● No MVC or framework layer
  • 16.
    You need toextend ● Active community ● Node package manager (npm) is great ● 10913 packages as of 06/2012 ● Simple one-line installation ● Manages all the dependencies for you $ npm install express var express = require("express");
  • 17.
    express mongodb-native connect socket.io redis request nodemailer jquery underscore calipso async https://github.com/joyent/node/wiki/Modules search.npmjs.org github.com
  • 18.
    Node.js vs Drupal CMS Modules, themes, ... Libraries ... Calipso / etc... Framework Drupal Express.js LIB Connect.js Scripting language PHP Node.js Web Server Apache
  • 19.
    Web sockets and socket.io
  • 20.
    Realtime communication overHTTP is difficult HTTP is request - response by nature No good solutions (ajax, long polling)
  • 21.
    Solution: Web sockets ● Websocket API is a part of HTML5 spec ● New protocol: ws:// & wss:// ● Persistant connection ● Both parties can send data at any time ● Native support in Chrome, Firefox, IE10 ● With node.js and socket.io you can use Web Sockets today http://socket.io/
  • 22.
    Socket.io client &server <script src="/socket.io/socket.io.js"></script> <script> var socket = io.connect('http://localhost'); socket.on('news', function (data) { console.log(data); }); </script> ------------------------------------------------ - var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { socket.emit('news', { hello: 'world' }); });
  • 23.
    Combining Drupal, Node. js and Web sockets When and how?
  • 24.
    When should Iconsider it? ● Doing it all on Apache & Drupal becomes too expensive and unscalable ○ Chat, messaging ○ Liveblog ○ Streaming data (logs, etc...) ○ API layer for a mobile app ○ Realtime widgets (sports, stocks) ○ Games ○ etc...
  • 25.
    How? ● A: Writeyour own Node server ○ Write your own module code for Drupal ○ Write your own client code ● B: Build on the existing Drupal nodejs module ○ provides node.js server with socket.io support ○ provides a drupal module that integrates with it ○ focuses mainly on realtime updates http://drupal.org/project/nodejs
  • 26.
  • 27.
    Enables realtime communication Provides a module Drupal Client Clients Node.js & socket.io Provides a server script
  • 28.
  • 29.
  • 30.
    Your custom module $message = (object) array( 'broadcast' => TRUE, 'data' => (object) array( 'subject' => 'Hi!', 'body' => 'An important message!', ), 'channel' => 'my_channel', ); nodejs_enqueue_message($message);
  • 31.
    And the clientside implementation Drupal.nodejs.callbacks.example = { callback: function(message) { if (message.channel == "my_channel") { alert(message.data); } } }
  • 32.