diff options
Diffstat (limited to 'www/js/server-event-dispatcher.js')
-rw-r--r-- | www/js/server-event-dispatcher.js | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/www/js/server-event-dispatcher.js b/www/js/server-event-dispatcher.js new file mode 100644 index 00000000..5526444b --- /dev/null +++ b/www/js/server-event-dispatcher.js @@ -0,0 +1,66 @@ +/* Inspired from https://gist.github.com/ismasan/299789 (MIT licensed) */ +$(function() { + ServerEventsDispatcher = function(url){ + var callbacks = {}; + var is_open = false; + var timeout = null; + var timeoutInterval = 2; /* s */ + var self = this; + var ws = null; + + this.open = function(){ + ws = new WebSocket(url); + ws.binaryType = "arraybuffer"; + + // dispatch to the right handlers + ws.onmessage = function(evt){ + var json = JSON.parse(evt.data) + //console.log("EVENT", json); + dispatch(json); + }; + + ws.onclose = function(){ + is_open = false; + dispatch({action: 'delete', object_name: 'local.connection'}) + + timeout = setTimeout(function() { self.open(); }, self.timeoutInterval); + } + + ws.onopen = function() { + if (timeout) + clearTimeout(timeout); + is_open = true; + dispatch({action: 'insert', object_name: 'local.connection'}) + } + }; + + this.open(); + + this.bind = function(action, object_name, callback){ + var key = action + object_name; + callbacks[key] = callbacks[key] || []; + callbacks[key].push(callback); + return this;// chainable + }; + + // XXX bad + this.send = function(query){ + var payload = JSON.stringify(query); + ws.send( payload ); // <= send JSON data to socket server + return this; + }; + + + var dispatch = function(query) { + var key = query.action + query.object_name; + var chain = callbacks[key]; + if(typeof chain === 'undefined') { + return; // no callbacks for this event + } + for(var i = 0; i < chain.length; i++){ + chain[i](query) + } + } + + }; +}); |