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 10 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 = 60000; // All requests timeout after 1 minute 

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

  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.


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