UNPKG

10.4 kBSource Map (JSON)View Raw
1{"version":3,"file":"socket.modern.js","sources":["../src/lib/plugin/socket.js","../src/lib/utils.js"],"sourcesContent":["\nimport { mergeObjects } from \"../utils.js\";\n\nfunction genUUID() {\n\treturn \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n\t\tvar r = (Math.random() * 16) | 0,\n\t\tv = c == \"x\" ? r : (r & 0x3) | 0x8;\n\t\treturn v.toString(16);\n\t});\n}\n\nfunction createSocket(url) {\n\treturn new WebSocket(url.evaluate());\n}\n\n/**\n * @param {HyperscriptObject} _hyperscript\n */\nexport default _hyperscript => {\n\n\t/** @type {(string | symbol)[]} */\n\tvar PROXY_BLACKLIST = [\"then\", \"catch\", \"length\", \"asyncWrapper\", \"toJSON\"];\n\n\t_hyperscript.addFeature(\"socket\", function (parser, runtime, tokens) {\n\t\tfunction getProxy(timeout) {\n\t\t\treturn new Proxy(\n\t\t\t\t{},\n\t\t\t\t{\n\t\t\t\t\tget: function (obj, property) {\n\t\t\t\t\t\tif (PROXY_BLACKLIST.indexOf(property) >= 0) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t} else if (property === \"noTimeout\") {\n\t\t\t\t\t\t\treturn getProxy(-1);\n\t\t\t\t\t\t} else if (property === \"timeout\") {\n\t\t\t\t\t\t\treturn function (i) {\n\t\t\t\t\t\t\t\treturn getProxy(parseInt(i));\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn function () {\n\t\t\t\t\t\t\t\tvar uuid = genUUID();\n\t\t\t\t\t\t\t\tvar args = [];\n\t\t\t\t\t\t\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\t\t\t\t\t\t\targs.push(arguments[i]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tvar rpcInfo = {\n\t\t\t\t\t\t\t\t\tiid: uuid,\n\t\t\t\t\t\t\t\t\tfunction: property,\n\t\t\t\t\t\t\t\t\targs: args,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tsocket = socket ? socket : createSocket(url); //recreate socket if needed\n\t\t\t\t\t\t\t\tsocket.send(JSON.stringify(rpcInfo));\n\n\t\t\t\t\t\t\t\tvar promise = new Promise(function (resolve, reject) {\n\t\t\t\t\t\t\t\t\tpromises[uuid] = {\n\t\t\t\t\t\t\t\t\t\tresolve: resolve,\n\t\t\t\t\t\t\t\t\t\treject: reject,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (timeout >= 0) {\n\t\t\t\t\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\t\t\t\t\tif (promises[uuid]) {\n\t\t\t\t\t\t\t\t\t\t\tpromises[uuid].reject(\"Timed out\");\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tdelete promises[uuid];\n\t\t\t\t\t\t\t\t\t}, timeout); // TODO configurable?\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn promise;\n\t\t\t\t\t\t\t};\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}\n\n\t\tif (tokens.matchToken(\"socket\")) {\n\t\t\tvar name = parser.requireElement(\"dotOrColonPath\", tokens);\n\t\t\tvar qualifiedName = name.evaluate();\n\t\t\tvar nameSpace = qualifiedName.split(\".\");\n\t\t\tvar socketName = nameSpace.pop();\n\n\t\t\tvar promises = {};\n\t\t\tvar url = parser.requireElement(\"stringLike\", tokens);\n\n\t\t\tvar defaultTimeout = 10000;\n\t\t\tif (tokens.matchToken(\"with\")) {\n\t\t\t\ttokens.requireToken(\"timeout\");\n\t\t\t\tdefaultTimeout = parser.requireElement(\"timeExpression\", tokens).evaluate();\n\t\t\t}\n\n\t\t\tif (tokens.matchToken(\"on\")) {\n\t\t\t\ttokens.requireToken(\"message\");\n\t\t\t\tif (tokens.matchToken(\"as\")) {\n\t\t\t\t\ttokens.requireToken(\"json\");\n\t\t\t\t\tvar jsonMessages = true;\n\t\t\t\t}\n\t\t\t\tvar messageHandler = parser.requireElement(\"commandList\", tokens);\n\t\t\t\tvar implicitReturn = {\n\t\t\t\t\ttype: \"implicitReturn\",\n\t\t\t\t\top: function (context) {\n\t\t\t\t\t\treturn runtime.HALT;\n\t\t\t\t\t},\n\t\t\t\t\texecute: function (context) {\n\t\t\t\t\t\t// do nothing\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tvar end = messageHandler;\n\t\t\t\twhile (end.next) {\n\t\t\t\t\tend = end.next;\n\t\t\t\t}\n\t\t\t\tend.next = implicitReturn;\n\t\t\t\t// TODO set parent?\n\t\t\t\t// parser.setParent(implicitReturn, initFeature);\n\t\t\t}\n\n\t\t\tvar socket = createSocket(url);\n\t\t\tvar rpcProxy = getProxy(defaultTimeout);\n\n\t\t\tvar socketObject = {\n\t\t\t\traw: socket,\n\t\t\t\tdispatchEvent: function (evt) {\n\t\t\t\t\tvar details = evt.detail;\n\t\t\t\t\t// remove hyperscript internals\n\t\t\t\t\tdelete details.sentBy;\n\t\t\t\t\tdelete details._namedArgList_;\n\t\t\t\t\tsocket.send(JSON.stringify(mergeObjects({ type: evt.type }, details)));\n\t\t\t\t},\n\t\t\t\trpc: rpcProxy,\n\t\t\t};\n\n\t\t\tvar socketFeature = {\n\t\t\t\tname: socketName,\n\t\t\t\tsocket: socketObject,\n\t\t\t\tinstall: function (target) {\n\t\t\t\t\truntime.assignToNamespace(target, nameSpace, socketName, socketObject);\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tsocket.onmessage = function (evt) {\n\t\t\t\tvar data = evt.data;\n\t\t\t\ttry {\n\t\t\t\t\tvar dataAsJson = JSON.parse(data);\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// not JSON\n\t\t\t\t}\n\n\t\t\t\t// RPC reply\n\t\t\t\tif (dataAsJson && dataAsJson.iid) {\n\t\t\t\t\tif (dataAsJson.throw) {\n\t\t\t\t\t\tpromises[dataAsJson.iid].reject(dataAsJson.throw);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpromises[dataAsJson.iid].resolve(dataAsJson.return);\n\t\t\t\t\t}\n\t\t\t\t\tdelete promises[dataAsJson.iid];\n\t\t\t\t}\n\n\t\t\t\tif (messageHandler) {\n\t\t\t\t\tvar context = runtime.makeContext(socketObject, socketFeature, socketObject);\n\t\t\t\t\tif (jsonMessages) {\n\t\t\t\t\t\tif (dataAsJson) {\n\t\t\t\t\t\t\tcontext.message = dataAsJson;\n\t\t\t\t\t\t\tcontext.result = dataAsJson;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow \"Received non-JSON message from socket: \" + data;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.message = data;\n\t\t\t\t\t\tcontext.result = data;\n\t\t\t\t\t}\n\t\t\t\t\tmessageHandler.execute(context);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// clear socket on close to be recreated\n\t\t\tsocket.addEventListener(\"close\", function (e) {\n\t\t\t\tsocket = null;\n\t\t\t});\n\n\t\t\treturn socketFeature;\n\t\t}\n\t});\n}\n","\n/**\n * mergeObjects combines the keys from obj2 into obj2, then returns obj1\n *\n * @param {object} obj1\n * @param {object} obj2\n * @returns object\n */\nexport function mergeObjects(obj1, obj2) {\n\tfor (var key in obj2) {\n\t\tif (obj2.hasOwnProperty(key)) {\n\t\t\tobj1[key] = obj2[key];\n\t\t}\n\t}\n\treturn obj1;\n}\n\nexport function getOrInitObject(root, prop) {\n\tvar value = root[prop];\n\tif (value) {\n\t\treturn value;\n\t} else {\n\t\tvar newObj = {};\n\t\troot[prop] = newObj;\n\t\treturn newObj;\n\t}\n}\n\n/**\n * parseJSON parses a JSON string into a corresponding value. If the\n * value passed in is not valid JSON, then it logs an error and returns `null`.\n *\n * @param {string} jString\n * @returns any\n */\nexport function parseJSON(jString) {\n\ttry {\n\t\treturn JSON.parse(jString);\n\t} catch (error) {\n\t\tlogError(error);\n\t\treturn null;\n\t}\n}\n\n/**\n * logError writes an error message to the Javascript console. It can take any\n * value, but msg should commonly be a simple string.\n * @param {*} msg\n */\nexport function logError(msg) {\n\tif (console.error) {\n\t\tconsole.error(msg);\n\t} else if (console.log) {\n\t\tconsole.log(\"ERROR: \", msg);\n\t}\n}\n\n// TODO: JSDoc description of what's happening here\nexport function varargConstructor(Cls, args) {\n\treturn new (Cls.bind.apply(Cls, [Cls].concat(args)))();\n}\n"],"names":["genUUID","replace","c","r","Math","random","toString","createSocket","url","WebSocket","evaluate","_hyperscript","PROXY_BLACKLIST","addFeature","parser","runtime","tokens","matchToken","nameSpace","requireElement","split","socketName","pop","promises","defaultTimeout","requireToken","jsonMessages","messageHandler","implicitReturn","type","op","context","HALT","execute","end","next","socket","rpcProxy","getProxy","timeout","Proxy","get","obj","property","indexOf","i","parseInt","uuid","args","arguments","length","push","rpcInfo","iid","function","send","JSON","stringify","promise","Promise","resolve","reject","setTimeout","socketObject","raw","dispatchEvent","evt","details","detail","sentBy","_namedArgList_","obj1","obj2","key","hasOwnProperty","mergeObjects","rpc","socketFeature","name","install","target","assignToNamespace","onmessage","data","dataAsJson","parse","e","throw","return","makeContext","message","result","addEventListener"],"mappings":"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"}
\No newline at end of file