(function() { function post(url, cb) { var xhr = new XMLHttpRequest(); xhr.addEventListener("load", function() { try { var obj = JSON.parse(xhr.responseText); } catch (err) { console.log(xhr.responseText); cb(err); } if (obj.error) { cb(obj.error); } else { cb(null, obj); } }); xhr.addEventListener("error", function(err) { cb(err); }); xhr.open("POST", url); xhr.send(); } window.WebEvents = function() { var self = {}; var cbs = {}; var key = null; function emit(name, args) { if (!cbs[name]) return; cbs[name].forEach(function(cb) { cb(args); }); } function init() { console.log("init..."); post("/webevents/register", function(err, res) { console.log("Init done", err ? "with errors" : "no errors"); // Retry on error if (err) { console.log(err); setTimeout(function() { init() }, 2000); return; } self.emit("connection"); key = res.key; await(); }); } function await() { console.log("await..."); post("/webevents/await/"+key, function(err, res) { console.log("Await done", err ? "with errors" : "no errors"); // Retry on error if (err === "ENOTREGISTERED") { console.log("Not registered, reregistering"); setTimeout(function() { init() }, 2000); return; } else if (err) { console.error(err); setTimeout(function() { await() }, 2000); return; } res.forEach(function(evt) { emit(evt.name, evt.args); }); await(); }); } self.on = function(name, cb) { if (!cbs[name]) cbs[name] = []; cbs[name].push(cb); }; init(); return self; } })();