Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Transforming real-time with Primus

Transforming real-time with Primus

This is the talk that did about the Primus framework. Which changes the way you use, build and maintain real-time applications.

If want to learn more about primus check out: https://github.com/primus/primus

Or #primus on irc.freenode.net

Arnout Kazemier

January 25, 2014
Tweet

More Decks by Arnout Kazemier

Other Decks in Technology

Transcript

  1. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 what is

    primus or who is primus did he really create all the transformers? YES
  2. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 history little

    known fact primus started out as wrapper for engine.io
  3. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 history little

    known fact then it got refactored in to “portal” as one message goes in, and comes out on the other side.
  4. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 history little

    known fact then I released that this project has way to much potential to be just another feature in a framework
  5. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 stars, but

    growing steady star it on http://github.com/primus/primus 553 5 developers with commit access make 2 great pull requests, and you’ll get full github access forks which i regularly check for commits that people “forget” to contribute 43
  6. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 the community

    #primus on irc.freenode.net all other questions are currently posted in the github issue tracker
  7. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 the community

    github.com/primus/primus or if you want to type less primus.io
  8. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 deep dive

    in to primus exploring some of it’s functionality and how can it help you
  9. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 learning primus

    cd your-awesome-project! ! $ npm install --save primus ws! ! echo "??" ! echo “profit!”! ! vim index.js CODE EXAMPLE: TERMINAL
  10. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 learning primus

    'use strict';! ! var Primus = require("primus")! , server = require("http").createServer(fn)! , primus = new Primus(server, { transformer:"ws" });! ! primus.on("connection", function connection(spark) {! console.log("connection received", spark.id);! spark.write("ohai");! ! spark.on("data", function data(msg) {! console.log("received", msg);! });! });! ! server.listen(8080); CODE EXAMPLE: PRIMUS SERVER
  11. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 learning primus

    <script src="http://localhost:8080/primus/primus.js"></script>! <script>! 'use strict';! ! var primus = new Primus("http://localhost:8080");! ! primus.on("open", function connected() {! console.log("connection opened");! primus.write("ohai");! });! ! primus.on("data", function data(msg) {! console.log(“received", msg);! });! </script> CODE EXAMPLE: PRIMUS CLIENT
  12. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 stream compatible

    .pipe() or message streams no need to learn a new API, you already know this
  13. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 streamcompatible primus.on("end",

    function disconnected() {! console.log("connection ended");! });! ! primus.end();! primus.write();! ! fs.createReadStream(__dirname + '/index.html').pipe(spark, {! end: false! }); CODE EXAMPLE: PRIMUS SERVER & CLIENT
  14. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 1 line

    of code to switch real-time libraries no more rewrites required, automatically compiles the client
  15. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 1 line

    of code var primus = new Primus(server, { ! transformer: “sockjs" // engine.io, socket.io etc! }); CODE EXAMPLE: PRIMUS SERVER
  16. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 module.exports =

    require(“primus/transformer").extend({! server: function () {! // This is only exposed and ran on the server.! },! ! client: function () {! // This is stringified end send/stored in the client.! // Can be ran on the server, if used through Node.js! },! ! // Optional library for the front-end, assumes globals! library: fs.readFileSync(__dirname +"./yourclientlib.js")! }); CODE EXAMPLE: PRIMUS SERVER 1 line of code
  17. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 supported frameworks

    socket.io multiple transports cross domain invested with bugs poorly / not maintained / left for dead no message order guarantee dies behind firewall/virusscanners
  18. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 supported engine.io

    supports multiple transports cross domain upgrade instead of downgrade works behind firewalls & virusscanners not well tested no message order guarantee
  19. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 supported frameworks

    browserchannel multiple transports client maintained by google message order guaranteed works behind firewalls & virusscanners not cross domain no websocket support coffeescript on the server ._.
  20. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 supported frameworks

    sockjs multiple transports (tons of them) cross domain poor error handling no query string allowed for connect argh, more coffeescript connection delay with firewalls
  21. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 supported frameworks

    websockets (ws) super damned fast supports binary cross domain i’m the only somewhat maintainer no fallbacks or downgrading broken by firewalls/virusscanners
  22. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 supported frameworks

    there are some minor inconsistencies small, but important to know
  23. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 custom encoders

    var primus = new Primus(server, { ! parser: "EJSON" // or binary-pack or a third party module! }); CODE EXAMPLE: PRIMUS SERVER
  24. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 module.exports =

    {! encoder: function (data, fn) {! // encode data to a string.! },! ! decoder: function (data, fn) {! // decode data to an object! },! ! // Optional library for the front-end, assumes globals! library: fs.readFileSync(__dirname +"./yourclientlib.js")! }; CODE EXAMPLE: PRIMUS SERVER custom encoders
  25. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 custom encoders

    primus.transform('incoming', function (packet) {! // This would transform all incoming messages to foo;! packet.data = 'foo';! });! ! primus.transform('outgoing', function (packet) {! // This would transform all outgoing messages to foo;! packet.data = 'foo';! }); CODE EXAMPLE: PRIMUS SERVER & CLIENT message transformers
  26. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 reconnect that

    works and is seen as core component, not as a feature
  27. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 reconnect var

    primus = new Primus("http://localhost:8080", {! strategy: "disconnect, online"! }); CODE EXAMPLE: PRIMUS CLIENT
  28. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 offline detection

    all messages are queued and close/offline events are fired
  29. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 broadcast primus.write("message");

    // send message to all users! ! primus.forEach(function (spark) {! // Or iterate over all connections, select the once you! // want and only write to those! ! spark.write("message");! }); CODE EXAMPLE: PRIMUS SERVER
  30. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 additional fixes

    and hacks broken websocket detection JSON encoder fixes ESC button fixes sockjs header access socket.io feature.* avoidance engine.io invalid port detection sockjs removal of transports socket.io memory leak fixes engine.io ip address access
  31. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 client works

    on node var primus = new Primus(server)! , Socket = primus.Socket;! ! var client = new Socket(“http://localhost:8080”);! ! // or if you want to connect to a remote server:! var primus = require(“primus”).createSocket({/* options */}); CODE EXAMPLE: PRIMUS SERVER
  32. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 written for

    real apps not demo applications or development environments
  33. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 plugins //

    The long awaited Socket.IO 1.0 release with Primus:! ! var server = require("http").createServer(fn)! , primus = new Primus(server, { transformer:"engine.io" });! ! primus.use(“emitter","primus-emitter")! .use(“multiplex”, require(“primus-multiplex”))! .use(“primus-emitter”, "primus-rooms"); CODE EXAMPLE: PRIMUS SERVER
  34. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 module.exports =

    {! server: function () {! // This is only exposed and ran on the server.! },! ! client: function () {! // This is stringified end send/stored in the client.! // Can be ran on the server, if used through Node.js! },! ! // Optional library for the front-end, assumes globals! library: fs.readFileSync(__dirname +"./yourclientlib.js")! }; CODE EXAMPLE: PRIMUS SERVER plugins
  35. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 much much

    more client works in node.js without changes authorization handling ip address resolving even behind proxies pathname exposure library generation smart server closing which boots connections full header access access to raw package data event based logger
  36. Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 questions FYI:

    these are answered in real-time ? ? ? ? dafuq? where can i donate my $$? Y U NO IMPLEMENT X?! ? ? ? ? ? ?