susi-forge
Version:
107 lines (95 loc) • 3.41 kB
JavaScript
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);
});
}
};