Experimental Client-side Javascript library that allows binding clientside objects to RethinkDB queries
JavaScript
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
mock initial commit Feb 21, 2015
.gitignore
README.md
bindtable.js
bindtable.spec.js
karma.conf.js
package.json

README.md

BindTable provides cool bindings to RethinkDB

bindtable is an experimental library that binds a clientside object to rethinkdb queries.

// Example usage in angularjs
var app = angular.module('realtime', 
  ['btford.socket-io', 'bindtable']);

app.factory('socket', function(socketFactory){
  return socketFactory();
});

app.factory('bindTable', function(bindTableFactory, socket){
  return bindTableFactory({socket: socket});
});

app
  .controller('QuestionsCtrl', questionsCtrl);

function questionsCtrl($scope, bindTable){
  
  var questionTable = bindTable('question');
  // calling bind(filter, limit, offset) creates a rows
  // property that is synchronized with changes on the server side
  questionTable.bind(null, 100);

  $scope.questions = questionTable.rows;
  $scope.delete = questionTable.delete;
  $scope.$on('$destroy', function(){

    questionTable.unBind();
    
  });

}

Server side code

io.on('connection', function(socket){

  socket.on('question:findById', function(id, cb){
    r.table('question')
      .get(id)
      .run(cb);
  });

  socket.on('question:add', function(record, cb){
    
    record = _.pick(record, 'name', 'question');
    record.createdAt = new Date();
    
    r.table('question')
      .insert(record)
      .run(function(err, result){

        if(err){
          cb(err);
        }
        else{
          record.id = result.generated_keys[0];
          cb(null, record);
        }

      });

  });
  socket.on('question:update', function(record, cb){

    record = _.pick(record, 'id', 'name', 'question');
    r.table('question')
      .get(record.id)
      .update(record)
      .run(cb);
    
  });

  socket.on('question:delete', function(id, cb){

    r.table('question')
      .get(id)
      .delete()
      .run(cb);

  });

  socket.on('question:changes:start', function(data){

    let limit, filter;
    limit = data.limit || 100; 
    filter = data.filter || {};
    r.table('question')
      .orderBy({index: r.desc('createdAt')})
      .filter(filter)
      .limit(limit)
      .changes()
      .run({cursor: true}, handleChange);

    function handleChange(err, cursor){

      if(err){
        
        console.log(err); 
      
      }
      else{

        if(cursor){
          cursor.each(function(err, record){
            if(err){
              console.log(err);
            }
            else{
              socket.emit('question:changes', record);
            }
          });
        }

      }
      socket.on('question:changes:stop', stopCursor);

      socket.on('disconnect', stopCursor);

      function stopCursor () {
        if(cursor){
          cursor.close();
        }
        socket.removeListener('question:changes:stop', stopCursor);
        socket.removeListener('disconnect', stopCursor);
      }

    }

  });
  
  
});