chubarovNick/thunderer

View on GitHub
app/assets/javascripts/thunderer.js

Summary

Maintainability
B
7 hrs
Test Coverage
var Thunderer = (function (doc) {
  var handleResponse, connectToFaye, self;

  self = {
    connecting: false,
    fayeClient: null,
    fayeCallbacks: [],
    subscriptions: {},
    subscriptionObjects: {},
    subscriptionCallbacks: {}
  };

  handleResponse = function(message) {
    if (callback = self.subscriptionCallbacks[message.channel]) {
      callback(message.data, message.channel);
    }
  };

  connectToFaye = function () {
    self.fayeClient = new Faye.Client(self.subscriptions.server);
    self.fayeClient.addExtension(self.fayeExtension);
    for (var i=0; i < self.fayeCallbacks.length; i++) {
      self.fayeCallbacks[i](self.fayeClient);
    };
  };

  self.sign = function(options) {
    if (!self.subscriptions.server) {
      self.subscriptions.server = options.server;
    }
    self.subscriptions[options.channel] = options;
    self.faye(function(faye) {
      var sub = faye.subscribe(options.channel, handleResponse);
      self.subscriptionObjects[options.channel] = sub;
      if (options.subscription) {
        options.subscription(sub);
      }
    });
  };

  self.subscribe = function (channel, callback) {
    self.subscriptionCallbacks[channel] = callback;
  };

  self.faye = function (callback) {
    if (self.fayeClient) {
      callback(self.fayeClient);
    } else {
      self.fayeCallbacks.push(callback);
      if (self.subscriptions.server && !self.connecting) {
        self.connecting = true;
        if (typeof Faye === 'undefined') {
          console.log('Faye is undefined, you should require faye.js before using Thunderer')
        } else {
          connectToFaye();
        }
      }
    }
  };

  self.fayeExtension ={
    outgoing: function(message, callback) {
      if (message.channel == "/meta/subscribe") {
        // Attach the signature and timestamp to subscription messages
        var subscription = self.subscriptions[message.subscription];
        if (!message.ext) message.ext = {};
        message.ext.thunderer_signature = subscription.signature;
        message.ext.thunderer_timestamp = subscription.timestamp;
      }
      callback(message);
    }
  };

  self.subscription = function(channel) {
    return self.subscriptionObjects[channel];
  };
  self.unsubscribe = function (channel) {
    var sub = self.subscription(channel);
    if (sub) {
      sub.cancel();
      delete self.subscriptionObjects[channel];
    }
  };

  self.unsubscribeAll = function () {
    for (var i in self.subscriptionObjects) {
      if ( self.subscriptionObjects.hasOwnProperty(i) ) {
        self.unsubscribe(i);
      }
    }
  };
  return self;
}(document));