aboutsummaryrefslogtreecommitdiffstats
path: root/www/js/server-event-dispatcher.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/js/server-event-dispatcher.js')
-rw-r--r--www/js/server-event-dispatcher.js66
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)
+ }
+ }
+
+ };
+});