{"version":3,"sources":["jsdelivr-header.js","/npm/websocket-response-tester@2.0.1/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,AC4BA,IAAI,qBAAuB,WAE1B,IAAI,EAAc,CAAC,EACf,EAAS,GAET,EAAiB,GACjB,EAAY,CAAC,EAEjB,MAAO,CAEN,gBAAiB,SAAS,GAazB,OAXA,OAAO,KAAK,GAAS,SAAS,IACxB,EAAY,GAOhB,EAAY,GAAM,OAAS,EAAQ,GANnC,EAAY,GAAQ,CACnB,OAAQ,EAAQ,GAChB,OAAQ,CAAC,EACT,SAAU,CAAC,EAIb,IAEM,IACR,EAEA,eAAgB,SAAS,EAAO,GAoB/B,MAlBqB,iBAAX,IACT,EAAQ,CAAC,IAGV,EAAM,SAAS,IACd,IAAK,EAAY,KAAU,EAAY,GAAM,QAAU,EAAY,GAAM,OAAO,aAC/E,MAAM,IAAI,MAAM,EAAO,8BACxB,IAGD,EAAM,SAAS,IACd,IAAI,EAAO,EAAY,GAClB,EAAK,OAAO,GAGhB,EAAK,OAAO,KAFZ,EAAK,OAAO,GAAS,CAGtB,IAEM,IACR,EAEA,cAAgB,SAAS,GAExB,OADA,EAAO,KAAK,GACL,IACR,EAGA,KAAM,SAAS,GAwCd,OAtCA,OAAO,KAAK,GAAa,SAAS,IACjC,IAAI,EAAO,EAAY,GACvB,OAAO,KAAK,EAAK,QAAQ,SAAS,IACjC,IAAI,EAAY,IAEf,EAAK,OAAO,KACc,GAAtB,EAAK,OAAO,IACf,EAAK,OAAO,IAAI,EAAO,GAEnB,EAAU,KACd,EAAU,GAAQ,CAAC,GAEf,EAAU,GAAM,KACpB,EAAU,GAAM,GAAS,IAE1B,EAAU,GAAM,GAAO,KAAK,GAC5B,EAAK,SAAS,GAAO,OAArB,EAA6B,EAAI,EAElC,EAAK,OAAO,GAAG,EAAO,EAAQ,GAC9B,IAGF,OAAO,KAAK,GAAa,SAAS,IACjC,IAAI,EAAO,EAAY,GACvB,OAAO,KAAK,EAAK,QAAQ,SAAS,IACjC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,OAAO,GAAQ,IACvC,EAAe,KAAK,IAAI,SAAQ,CAAC,EAAS,KACpC,EAAK,SAAS,KAClB,EAAK,SAAS,GAAS,IAExB,EAAK,SAAS,GAAO,KAAK,EAAO,IAEnC,GACA,IAEF,EAAO,SAAS,IACf,GAAE,IAEI,QAAQ,IAAI,GAClB,MAAK,IACE,EAAE,IAEX,EAIF,EAEA,OAAO,QAAU","file":"/npm/websocket-response-tester@2.0.1/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/websocket-response-tester@2.0.1/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","// Current solution falls apart when need to listen for the same kind of event more than 1 time. \n// complication is how to make it easy for users to understand and apply. What should the output consist of if we want to account for\n// - different events\n// - different number of each event\n\n// Answer: array by default, and convert to single element without array if its multiple seems to be the answer.\n// \tReturns:\n//\t{\n//\t\tid1: {\n//\t\t\tmessage: [data],\n//\t\t\tnews: [data, data]\n//\t\t}\n//\t}\n\n//\tWhat connections should look like\n//\t{\n//\t\tid1: {\n//\t\t\tsocket: socket,\n//\t\t\tevents: {\n//\t\t\t\tmessage: 1,\n//\t\t\t\tnews: 2\n//\t\t\t},\n//\t\t\tresolves: {\n//\t\t\t\t'message': [resolve],\n//\t\t\t\t'news': [resolve1, resolve2]\n//\t\t\t}\n//\t\t},\n//\t\tid2: {\n//\t\t\t...\n//\t\t}\n//\t}\n\n\n\nvar SocketResponseTester = function() {\n\n\tvar connections = {}\n\tvar asyncs = []\n\tvar resolves = {}\n\tvar storedPromises = []\n\tvar responses = {}\n\n\treturn {\n\n\t\tregisterSockets: function(sockets) {\n\t\t\t// sockets => {name1: socket1, name2: socket2}\n\t\t\tObject.keys(sockets).forEach((name) => {\n\t\t\t\tif (!connections[name]) {\n\t\t\t\t\tconnections[name] = {\n\t\t\t\t\t\tsocket: sockets[name],\n\t\t\t\t\t\tevents: {},\n\t\t\t\t\t\tresolves: {}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconnections[name].socket = sockets[name]\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn this\n\t\t},\n\n\t\taddEventWaiter: function(names, event) {\n\t\t\t// can be either a single name or an array of names\n\t\t\tif (typeof(names) == 'string') {\n\t\t\t\tnames = [names]\n\t\t\t} \n\t\t\t// check that sockets are all registered\n\t\t\tnames.forEach((name) => {\n\t\t\t\tif (!connections[name] || !connections[name].socket || connections[name].socket.disconnected) {\n\t\t\t\t\tthrow new Error(name + ' is not a registered socket')\n\t\t\t\t}\n\t\t\t})\n\t\t\t// add events\n\t\t\tnames.forEach((name) => {\n\t\t\t\tvar conn = connections[name]\n\t\t\t\tif (!conn.events[event]) {\n\t\t\t\t\tconn.events[event] = 1\n\t\t\t\t} else {\n\t\t\t\t\tconn.events[event]++\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn this\n\t\t},\n\n\t\tqueueFunction : function(f) {\n\t\t\tasyncs.push(f)\n\t\t\treturn this\n\t\t},\n\n\n\t\tthen: function(f) {\n\t\t\t// attach listeners to listen for emit events. \n\t\t\tObject.keys(connections).forEach((name) => {\n\t\t\t\tvar conn = connections[name]\n\t\t\t\tObject.keys(conn.events).forEach((event) => {\n\t\t\t\t\tvar listener = (data) => {\n\t\t\t\t\t\t// only remove the listener if all events have been caught\n\t\t\t\t\t\tconn.events[event]--\n\t\t\t\t\t\tif (conn.events[event] == 0) {\n\t\t\t\t\t\t\tconn.socket.off(event, listener);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!responses[name]) {\n\t\t\t\t\t\t\tresponses[name] = {}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!responses[name][event]) {\n\t\t\t\t\t\t\tresponses[name][event] = []\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresponses[name][event].push(data)\n\t\t\t\t\t\tconn.resolves[event].shift()(true)\n\t\t\t\t\t}\n\t\t\t\t\tconn.socket.on(event, listener)\n\t\t\t\t})\n\t\t\t})\n\t\t\t// this mechanism creates promises whose resolves are stored for later use\n\t\t\tObject.keys(connections).forEach((name) => {\n\t\t\t\tvar conn = connections[name]\n\t\t\t\tObject.keys(conn.events).forEach((event) => {\n\t\t\t\t\tfor (var i = 0; i < conn.events[event]; i++) {\n\t\t\t\t\t\tstoredPromises.push(new Promise((resolve, reject) => {\n\t\t\t\t\t\t\tif (!conn.resolves[event]) {\n\t\t\t\t\t\t\t\tconn.resolves[event] = []\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconn.resolves[event].push(resolve)\n\t\t\t\t\t\t}))\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t\tasyncs.forEach((f) => {\n\t\t\t\tf()\n\t\t\t})\n\t\t\treturn Promise.all(storedPromises)\n\t\t\t.then(() => {\n\t\t\t\treturn f(responses)\n\t\t\t})\n\t\t}\n\n\t}\n\n}\n\nmodule.exports = SocketResponseTester;"]}