backbone-super-sync

Server-side Backbone.sync adapter using super agent.

Backbone Super Sync

An isomorphic Backbone.sync adapter using super-agent.

var Backbone = require('backbone');
Backbone.sync = require('backbone-super-sync');

By default Backbone super sync will timeout requests that take longer than 2 seconds. This is to avoid long hanging requests that can potentionally leak memory. You can set this to be longer for all requests, e.g.

superSync.timeout = 5000; // All requests timeout after 5 seconds 

...or you can set this per-request by specifying it in options, e.g.

model.fetch({
  timeout: 5000,
  error: function(model, err) {
    if (err.message.match('timeout') alert('too slow!');
  }
});

At Artsy we naively cache our server-side Backbone.sync requests. You can configure Backbone Super Sync to do this by setting superSync.cacheClient = client. If the cache: true option is set in a model.fetch, Backbone Super Sync will use the cacheClient to cache GET requests. The client API is based off of node-redis but you could easily leverage this API to roll your own caching mechanism.

e.g.

memoryCache = {}
superSync.cacheClient = {
  setfunction(keyvalcallback) {
    memoryCache[key] = val;
    callback(null, 'OK');
  }),
  getfunction(keycallback) {
    callback(null, memoryCache[key]);
  },
  expirefunction(keyexpiresIncallback) {
    setTimeout(expiresIn / 1000, function() {
      memoryCache[key] = null;
      callback(null, 1);
    });
  }
}
// Cache expiry time. Uses seconds. Defaults to 3600 or 1 hour. You may 
// also pass `cacheTime: Number` in the options of a fetch to set per-request. 
superSync.defaultCacheTime = 60;
 
new Backbone.Model({ id: 'cach-me' }).fetch({
  cache: true,
  successfunction() {}
})

Use at your own risk—remember there are only two hard things.

In the past there was a helper superSync.editRequest = function(req) {}. This has been deprecated. If you would like to modify sync-wide requests you can simply wrap Backbone.sync again. For example:

var Backbone = require('backbone');
var sync = Backbone.sync = require('backbone-super-sync');
 
Backbone.sync = function(methodmodeloptions) {
  options.headers['x-xapp-token'] = 'foobar';
  return sync(method, model, options);
}

Please fork the project and submit a pull request with tests. Install node modules npm install and run tests with npm test

MIT