1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- var crypto = require("crypto");
-
- function Listener() {
- var self = {}
-
- var key = crypto.randomBytes(16).toString("hex");
- self.key = key;
-
- var events = [];
- var waiter = null;
-
- function respond() {
- waiter.end(JSON.stringify(events));
- waiter = null;
- events = [];
- }
-
- self.emit = function(name, args) {
- events.push({ name: name, args: args });
-
- if (waiter != null) {
- respond();
- }
- }
-
- self.handle = function(res) {
- waiter = res;
-
- if (events.length > 0) {
- respond();
- }
- }
-
- return self;
- }
-
- function WebEvents() {
- var self = {}
-
- var listeners = {};
-
- self.emit = function(name, args) {
- for (var i in listeners) {
- listeners[i].emit(name, args);
- }
- }
-
- self.handle = function(req, res) {
- var parts = req.url.substring(1).split("/");
-
- if (parts[0] !== "webevents")
- return;
-
- res.writeHead(200, { "content-type": "application/json" });
-
- if (parts[1] === "register") {
- var listener = Listener();
- listeners[listener.key] = listener;
- res.end(JSON.stringify({ key: listener.key }));
-
- } else if (parts[1] === "await") {
- var listener = listeners[parts[2]];
- if (!listener) {
- res.end(JSON.stringify({
- error: "ENOTREGISTERED"
- }));
- return;
- }
-
- listener.handle(res);
- }
- }
-
- return self
- }
-
- module.exports = WebEvents;
|