UNPKG

susi-forge

Version:
107 lines (95 loc) 3.41 kB
var GatewayController = { nodeId: null, init: function(){ this.nodeId = this.generateGUID(); log("Cluster: nodeId: "+this.nodeId); var self = this; self.setupProcessor(function(){ self.setupTemperatureForwarding(function(){ self.registerNodeAtCloud(function(){ susi.registerConsumer("cluster::node::open",function(evt){ self.registerNodeAtCloud(); }); }); }); }); }, // Tell local cluster-code to listen for events "*@thid.nodeId" setupProcessor: function(cb){ var self = this; susi.publish({ topic: "cluster::registerProcessor", payload: { node: 'cloud', topic: '*@'+self.nodeId } },function(){ // If such event occurs, strip the address information and publish it local. susi.registerProcessor("*@"+self.nodeId, function(event){ log("got event from cloud: "+event.topic); susi.publish({ topic: event.topic.split('@')[0], payload: event.payload },function(res){ // when local publish is finished, ack it back. log("local event processing finished, ack it back..."); event.payload = res.payload; event.headers = res.headers; susi.ack(event); }); }); if(cb && typeof cb === "function"){ cb(); } }); }, // Forward 'demo::temperature::update' events to cloud and suffix the topic with '@src:<nodeId>' setupTemperatureForwarding: function(cb){ var self = this; susi.publish({ topic: "cluster::forward", payload: { node: 'cloud', topic: 'demo::temperature::update@src:'+self.nodeId } },function(){ susi.registerConsumer("demo::temperature::update", function(event){ log("forward temp update..."); susi.publish({ topic: 'demo::temperature::update@src:'+self.nodeId, payload: event.payload },function(res){ log("forwarded temperature::update to cloud"); }); }); if(cb && typeof cb === "function"){ cb(); } }); }, registerNodeAtCloud: function(cb){ var self = this; susi.publish({ topic: "registerNewNode@cloud", payload: { nodeId: self.nodeId } },function(evt){ if(evt.payload && evt.payload.success){ log("registerNewNode@cloud: success!"); }else{ log("registerNewNode@cloud: fail..."); log(JSON.stringify(evt)); } if(cb && typeof cb === "function"){ cb(); } }); }, generateGUID: function(){ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); return v.toString(16); }); } };