Slide 1

Slide 1 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 classified information

Slide 2

Slide 2 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 classified information

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 3rdEden ! 3rd-Eden ! arnout.kazemier ! arnoutkazemier

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 history the origin of primus

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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.

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 use cases the envisioned use cases

Slide 12

Slide 12 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 use cases module authors giving your users total feedom

Slide 13

Slide 13 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 use cases startups real-time is hard to get right

Slide 14

Slide 14 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 the community

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 the community

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 learning primus super simple stuff

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 learning primus ! ! '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);! });! CODE EXAMPLE: PRIMUS CLIENT

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 supported frameworks socket.io

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 supported frameworks engine.io

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 supported frameworks browserchannel

Slide 34

Slide 34 text

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 ._.

Slide 35

Slide 35 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 supported frameworks sockjs

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 supported frameworks websockets (ws)

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 custom encoders JSON out of the box third-party for more

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 offline detection all messages are queued and close/offline events are fired

Slide 47

Slide 47 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 broadcast two different ways

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 additional fixes and hacks

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 client works on node same api, same code on server & client

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 plugins light core, infinite functionality

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 build with love ♥

Slide 59

Slide 59 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 impossibruu not convinced? demo time!

Slide 60

Slide 60 text

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?! ? ? ? ? ? ?

Slide 61

Slide 61 text

Arnout Kazemier, founder 3rd-Eden & Observe.it nodejsconf.it 2014 3rdEden ! 3rd-Eden ! arnout.kazemier ! arnoutkazemier

Slide 62

Slide 62 text

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