node-token-sockjs
Version:
A wrapper around express, sockjs-node, and redis that provides token based authentication, a websocket based rpc-like abstraction, and an optional publish subscribe interface.
64 lines (60 loc) • 2.05 kB
JavaScript
var async = require("async"),
_ = require("lodash"),
utils = require("./utils"),
ALL_CHANNEL = "__all__",
SYNC_CHANNEL = "___sync___";
module.exports = function(socket, message, callback){
if(!message.rpc)
return callback("Invalid request");
var self = this;
switch(message.rpc){
case "_subscribe":
utils.checkListeners(self._emitter, "subscribe", socket, message, function(error, allowed){
if(error || !allowed)
callback(error || "Forbidden");
else
self.subscribe(socket, message.req.channel);
});
break;
case "_unsubscribe":
utils.checkListeners(self._emitter, "unsubscribe", socket, message, function(error, allowed){
if(error || !allowed)
callback(error || "Forbidden");
else
self.unsubscribe(socket, message.req.channel);
});
break;
case "_publish":
utils.checkListeners(self._emitter, "publish", socket, message, function(error, allowed){
if(error || !allowed || message.req.channel === ALL_CHANNEL || message.req.channel === SYNC_CHANNEL)
callback(error || "Forbidden");
else
self.publish(message.req.channel, message.req.data);
});
break;
case "_broadcast":
utils.checkListeners(self._emitter, "broadcast", socket, message, function(error, allowed){
if(error || !allowed)
callback(error || "Forbidden");
else
self.broadcast(message.req.data);
});
break;
case "_rpc":
if(message.fid && self._inTransit[message.fid]){
var fn = self._inTransit[message.fid];
if(typeof fn === "function")
fn(message.resp.error, message.resp.data);
delete self._inTransit[message.fid];
}
break;
default:
// proxy the socket controller
var action = utils.checkController(self.socketController, self._routes, message.rpc);
if(action && typeof action === "function")
action(socket.auth, message.req, callback, socket);
else
callback("Function not found");
break;
}
};