12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- (function() {
- function post(url, cb) {
- var xhr = new XMLHttpRequest();
-
- xhr.addEventListener("load", function() {
- var obj = JSON.parse(xhr.responseText);
-
- 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() {
- post("/webevents/register", function(err, res) {
-
- // Retry on error
- if (err) {
- setTimeout(function() { init() }, 2000);
- return;
- }
-
- key = res.key;
- await();
- });
- }
-
- function await() {
- post("/webevents/await/"+key, function(err, res) {
-
- // 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;
- }
- })();
|