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');

Sometimes you need to add to the requests made by Backbone.sync, such as adding an XAPP token. Backbone Super Sync provides the method editRequest to intercept the super-agent request object before the request is made.

NOTE: This is injected into ALL server-side Backbone.sync calls. This behaves signifcantly different than when Backbone is used on the client. For instance you should not use this to add user-specific data to a request like an oauth access token or similar identifier where as on the client you might want to inject that kind of data sync-wide b/c the browser only represents one user.

var Backbone = require('backbone');
var superSync = require('backbone-super-sync');
superSync.editRequest = function(req) {
  req.set({ 'XAPP-TOKEN': 'foobar' });
Backbone.sync = superSync;

The arguments of Backbone.sync are also passed to editRequest in case you need to globally adjust the request based off options or otherwise.

superSync.editRequest = function(reqmethodmodeloptions) {
  req.set({ 'X-ACCESS-TOKEN': options.user.get('access_token') });

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.

  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.

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