UNPKG

spincycle

Version:

A reactive message router and object manager that lets clients subscribe to object property changes on the server

136 lines (123 loc) 4.84 kB
<link rel="import" href="../../bower_components/polymer/polymer.html"> <link rel="import" href="../../bower_components/iron-signals/iron-signals.html"> <link rel="import" href="../../elements/message-router/message-router.html"> <polymer-element name="message-router" attributes="io"> <template> <iron-signals on-iron-signal-register="{{registerListener}}"></iron-signals> <iron-signals on-iron-signal-objectsubscribe="{{registerObjectSubscriber}}"></iron-signals> <iron-signals on-iron-signal-emit="{{emitMessage}}"></iron-signals> </template> <script> (function () { Polymer( { subscribers: [], objsubscribers: [], outstandingMessages: [], ready: function () { console.log('message-router is ready'); }, registerListener: function(e, detail, sender) { //console.dir(arguments); //console.log("message-router registering listener for message '"+detail.message+"'"); var subscribers = this.subscribers[detail.message] || []; subscribers.push(detail.callback); this.subscribers[detail.message] = subscribers; }, registerObjectSubscriber: function(e, detail, sender) { //console.dir(arguments); console.log("message-router registering subscriber for object '"+detail.obj.id+"' type "+detail.obj.type); var subscribers = this.objsubscribers[detail.obj.id] || []; subscribers.push(detail.callback); this.objsubscribers[detail.obj.id] = subscribers; this.io.emit('message', JSON.stringify({target:'registerForUpdatesOn', messageId: UUID.generate(), obj: detail.obj})) }, emitMessage: function(e, detail, sender) { console.log("emitMessage called"); console.dir(detail); detail.messageId = UUID.generate(); this.outstandingMessages.push(detail); this.io.emit('message', JSON.stringify(detail)); }, ioChanged: function() { if(this.io) { this.setupSockets(this.io) } }, setupSockets: function(io) { console.log("message-router setupSockets called"); console.dir(io); this.subscribers['OBJECT_UPDATE'] = [ function(obj) { console.log("+++++++++++ obj update message router got obj"); //console.dir(obj); var subscribers = this.objsubscribers[obj.id] || []; if(subscribers.length === 0) { console.log("* OH NOES! * No subscribers for object update on object "+obj.id); console.dir(this.objsubscribers); } else { subscribers.forEach(function(subscriber) { subscriber(obj) } ); } }.bind(this) ]; io.on('message', function(reply) { var status = reply.status; var message = reply.payload; var info = reply.info; console.log("got reply id "+reply.messageId+" status "+status+", info "+info+" data "+message); console.dir(reply); var index = -1; if(reply.messageId) { for(var i = 0; i < this.outstandingMessages.length; i++) { var detail = this.outstandingMessages[i]; if (detail.messageId == reply.messageId) { detail.callback(message); index = i; break; } } if(index > 0) { this.outstandingMessages.splice(index, 1); } } else { var subscribers = this.subscribers[info]; if(subscribers) { subscribers.forEach(function(listener) { //console.log("sending reply to listener"); listener(message) }); } else { console.log("no subscribers for message "+message); console.dir(reply); } } }.bind(this)); } }); })(); </script> </polymer-element>