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.

index.js 1.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. var crypto = require("crypto");
  2. function Listener() {
  3. var self = {}
  4. var key = crypto.randomBytes(16).toString("hex");
  5. self.key = key;
  6. var events = [];
  7. var waiter = null;
  8. function respond() {
  9. waiter.end(JSON.stringify(events));
  10. waiter = null;
  11. events = [];
  12. }
  13. self.emit = function(name, args) {
  14. events.push({ name: name, args: args });
  15. if (waiter != null) {
  16. respond();
  17. }
  18. }
  19. self.handle = function(res) {
  20. waiter = res;
  21. if (events.length > 0) {
  22. respond();
  23. }
  24. }
  25. return self;
  26. }
  27. function WebEvents() {
  28. var self = {}
  29. var listeners = {};
  30. self.emit = function(name, args) {
  31. for (var i in listeners) {
  32. listeners[i].emit(name, args);
  33. }
  34. }
  35. self.handle = function(req, res) {
  36. var parts = req.url.substring(1).split("/");
  37. if (parts[0] !== "webevents")
  38. return;
  39. res.writeHead(200, { "content-type": "application/json" });
  40. if (parts[1] === "register") {
  41. var listener = Listener();
  42. listeners[listener.key] = listener;
  43. res.end(JSON.stringify({ key: listener.key }));
  44. } else if (parts[1] === "await") {
  45. var listener = listeners[parts[2]];
  46. if (!listener) {
  47. res.end(JSON.stringify({
  48. error: "ENOTREGISTERED"
  49. }));
  50. return;
  51. }
  52. listener.handle(res);
  53. }
  54. }
  55. return self
  56. }
  57. module.exports = WebEvents;