susi-forge
Version:
76 lines (60 loc) • 2.32 kB
JavaScript
var CloudController = {
nodes: [],
init: function(){
susi.registerProcessor("registerNewNode@cloud", this.registerNewNode.bind(this));
susi.registerProcessor("cloud::getNodes", this.getNodes.bind(this));
},
registerNewNode: function(event){
if(!event.payload || !event.payload.nodeId){
throw "CloudCode: registerNewNode: you must specify event.payload.nodeId";
}
for(var i=0;i<this.nodes.length;i++){
if(this.nodes[i].nodeId === event.payload.nodeId){
throw "CloudCode: you are allready registered!";
}
}
this.nodes.push({
nodeId: event.payload.nodeId,
sessionId: event.sessionid
});
this.setupNodeRemover(event.sessionid);
log("CloudCode: added node "+event.payload.nodeId);
susi.publish({
topic: "cloud::node::new",
payload: event.payload.nodeId
});
event.payload.success = true;
susi.ack(event);
},
setupNodeRemover: function(sessionId){
var self = this;
var sessionDiedConsumerId = susi.registerConsumer("session::died",function(event){
if(event.payload === sessionId){
susi.unregisterConsumer(sessionDiedConsumerId); // unregister yourself
for(var i=0; i<self.nodes.length; i++){
if(self.nodes[i].sessionId === sessionId){
log("CloudCode: removed node "+self.nodes[i].nodeId);
var node = self.nodes[i];
self.nodes.remove(i);
susi.publish({
topic: "cloud::node::lost",
payload: node.nodeId
});
break;
}
}
}
});
},
getNodes: function(event){
event.payload = this.nodes;
susi.ack(event);
}
};
// http://ejohn.org/blog/javascript-array-remove/
Array.prototype.remove = function(from, to) {
var rest = this.slice((to || from) + 1 || this.length);
this.length = from < 0 ? this.length + from : from;
return this.push.apply(this, rest);
};
CloudController.init();