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

ShareJS + RethinkdDB: livedb-rethinkdb

ShareJS + RethinkdDB: livedb-rethinkdb

Jorge Silva

April 24, 2015
Tweet

More Decks by Jorge Silva

Other Decks in Technology

Transcript

  1. The beauty of Operational Transformation and a realtime database Jorge

    Silva · @thejsj · Developer Evangelist @ RethinkDB
  2. Overview What is Operational Transformation? ShareJS: A Node.js library for

    OT RethinkDB: A database for realtime apps livedb-rethinkdb: RethinkDB + ShareJS
  3. A class of algorithms that do multi-site realtime concurrency. Gives

    you eventual consistency - between multiple users - without retries - without errors - without any data being overwritten http://sharejs.org/
  4. Enter ShareJS “ShareJS is an Operational Transform library for NodeJS

    & browsers. It lets you easily do live concurrent editing in your app.”
  5. // WebSocket Connection var ws = new WebSocket(‘ws://localhost:8005’); var shareJS

    = new window.sharejs.Connection(ws); // Textarea var textareaDoc = shareJS.get(‘documents’, ‘helloworld’); textareaDoc.subscribe(); // Wait for document to be ready textareaDoc.whenReady(function () { setTimeout(function () { if (!textareaDoc.type) { textareaDoc.create(‘text’); } if (textareaDoc.type && textareaDoc.type.name === ‘text’) { var elem = document.getElementById(‘helloworld’); textareaDoc.attachTextarea(elem); } }); }); ShareJS on the client https://github.com/thejsj/sharejs-rethinkdb-example/blob/master/client/index.html#L102-L124
  6. // WebSocket Connection var ws = new WebSocket(‘ws://localhost:8005’); var shareJS

    = new window.sharejs.Connection(ws); // Textarea var textareaDoc = shareJS.get(‘documents’, ‘helloworld’); textareaDoc.subscribe(); // Wait for document to be ready textareaDoc.whenReady(function () { setTimeout(function () { if (!textareaDoc.type) { textareaDoc.create(‘text’); } if (textareaDoc.type && textareaDoc.type.name === ‘text’) { var elem = document.getElementById(‘helloworld’); textareaDoc.attachTextarea(elem); } }); }); ShareJS on the client https://github.com/thejsj/sharejs-rethinkdb-example/blob/master/client/index.html#L102-L124
  7. var sharejs = require(‘share’); var livedb = require(‘livedb’); // Connect

    to the database var db = require(‘livedb-rethinkdb’)({ host: ‘localhost’, port: 28015, db: ‘sharejs’ }); var backend = livedb.client(db); // Attach livedb instances to ShareJS var share = sharejs.server.createClient({ backend: backend }); ShareJS on the server: database https://github.com/thejsj/sharejs-rethinkdb-example/blob/master/server/livedb-client.js
  8. var sharejs = require(‘share’); var livedb = require(‘livedb’); // Connect

    to the database var db = require(‘livedb-rethinkdb’)({ host: ‘localhost’, port: 28015, db: ‘sharejs’ }); var backend = livedb.client(db); // Attach livedb instances to ShareJS var share = sharejs.server.createClient({ backend: backend }); ShareJS on the server: database https://github.com/thejsj/sharejs-rethinkdb-example/blob/master/server/livedb-client.js
  9. var wss = new WebSocketServer(); var Duplex = require(‘stream’).Duplex; var

    share = sharejs.server.createClient({ backend: backend }); // On socket connection wss.on(‘connection’, function () { var stream = new Duplex({ objectMode: true }); stream._write = function (chunk, encoding, callback) { client.send(JSON.stringify(chunk)); return callback(); }; client.on(‘message’, function (data) { return stream.push(JSON.parse(data)); }); return share.listen(stream); }); ShareJS on the server https://github.com/thejsj/sharejs-rethinkdb-example/blob/master/server/socket-handler.js#L8-L49
  10. var wss = new WebSocketServer(); var Duplex = require(‘stream’).Duplex; var

    share = sharejs.server.createClient({ backend: backend }); // On socket connection wss.on(‘connection’, function () { var stream = new Duplex({ objectMode: true }); stream._write = function (chunk, encoding, callback) { client.send(JSON.stringify(chunk)); return callback(); }; client.on(‘message’, function (data) { return stream.push(JSON.parse(data)); }); return share.listen(stream); }); ShareJS on the server https://github.com/thejsj/sharejs-rethinkdb-example/blob/master/server/socket-handler.js#L8-L49
  11. Open source database for building realtime applications NoSQL database that

    stores schemaless JSON documents Distributed database that is easy to scale What is RethinkDB?
  12. Subscribe to change notifications from database queries No more polling

    – the database pushes changes to your app Reduce the amount of plumbing needed to stream live updates Built for realtime
  13. var r = require(‘rethinkdb’); r .db(‘share_js’) .table(‘documents’) .filter({ name: ‘helloworld’

    }) .run(conn) .then(function (cursor) { // Go through every row returned by the query cursor.each(function (row) { console.log(row); }); }); Changefeeds
  14. var r = require(‘rethinkdb’); r .db(‘share_js’) .table(‘documents’) .filter({ name: ‘helloworld’

    }) .run(conn) .then(function (cursor) { // Go through every row returned by the query cursor.each(function (row) { console.log(row); }); }); Changefeeds
  15. var r = require(‘rethinkdb’); r .db(‘share_js’) .table(‘documents’) .filter({ name: ‘helloworld’

    }) .changes() .run(conn) .then(function (cursor) { // Gets fired every time a row changes cursor.each(function (row) { console.log(row); }); }); Changefeeds