This library provides an easy way to send events to a web browser (or any other client) over HTTP.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

client.js 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. (function() {
  2. function post(url, cb) {
  3. var xhr = new XMLHttpRequest();
  4. xhr.addEventListener("load", function() {
  5. var obj = JSON.parse(xhr.responseText);
  6. if (obj.error) {
  7. cb(obj.error);
  8. } else {
  9. cb(null, obj);
  10. }
  11. });
  12. xhr.addEventListener("error", function(err) {
  13. cb(err);
  14. });
  15. xhr.open("POST", url);
  16. xhr.send();
  17. }
  18. window.WebEvents = function() {
  19. var self = {};
  20. var cbs = {};
  21. var key = null;
  22. function emit(name, args) {
  23. if (!cbs[name])
  24. return;
  25. cbs[name].forEach(function(cb) {
  26. cb(args);
  27. });
  28. }
  29. function init(time) {
  30. post("/webevents/register", function(err, res) {
  31. // Retry on error
  32. if (err) {
  33. console.error(err);
  34. time = time || 1000;
  35. setTimeout(function() { init(time * 2) }, time);
  36. return;
  37. }
  38. key = res.key;
  39. await();
  40. });
  41. }
  42. function await(time) {
  43. post("/webevents/await/"+key, function(err, res) {
  44. // Retry registering on error
  45. if (err) {
  46. console.error(err);
  47. time = time || 1000;
  48. setTimeout(function() { init(time * 2) }, time);
  49. return;
  50. }
  51. res.forEach(function(evt) {
  52. emit(evt.name, evt.args);
  53. });
  54. await();
  55. });
  56. }
  57. self.on = function(name, cb) {
  58. if (!cbs[name])
  59. cbs[name] = [];
  60. cbs[name].push(cb);
  61. };
  62. init();
  63. return self;
  64. }
  65. })();