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;