UNPKG

susi-forge

Version:
76 lines (60 loc) 2.32 kB
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();