UNPKG

11.4 kBSource Map (JSON)View Raw
1{"version":3,"file":"socket.min.js","sources":["../src/lib/plugin/socket.js","../src/web/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 parseUrl(url) {\n\tvar finalUrl = url;\n\tif (finalUrl.indexOf(\"/\") === 0) { // complete absolute paths without scheme only\n\t\tvar basePart = window.location.hostname + (window.location.port ? ':' + window.location.port : '');\n\t\tif (window.location.protocol === 'https:') {\n\t\t\tfinalUrl = \"wss://\" + basePart + finalUrl;\n\t\t} else if (window.location.protocol === 'http:') {\n\t\t\tfinalUrl = \"ws://\" + basePart + finalUrl;\n\t\t}\n\t}\n\treturn finalUrl;\n}\n\nfunction createSocket(url) {\n\tvar parsedUrl = parseUrl(url.evaluate());\n\treturn new WebSocket(parsedUrl);\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(\"expression\", 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.sender;\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","\nimport socket from \"../../lib/plugin/socket.js\"\n\nsocket(window._hyperscript)\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","parsedUrl","finalUrl","indexOf","basePart","window","location","hostname","port","protocol","parseUrl","evaluate","WebSocket","_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","i","parseInt","uuid","args","arguments","length","push","rpcInfo","iid","function","send","JSON","stringify","promise","Promise","resolve","reject","setTimeout","socketObject","raw","dispatchEvent","evt","details","detail","sender","_namedArgList_","obj1","obj2","key","hasOwnProperty","mergeObjects","rpc","socketFeature","name","install","target","assignToNamespace","onmessage","data","dataAsJson","parse","e","makeContext","message","result","addEventListener"],"mappings":"6EAGA,SAASA,IACR,MAAO,uCAAuCC,QAAQ,QAAS,SAAUC,GACxE,IAAIC,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADS,KAALH,EAAWC,EAAS,EAAJA,EAAW,GACtBG,SAAS,MAiBpB,SAASC,EAAaC,GACrB,IAAIC,EAdL,SAAkBD,GACjB,IAAIE,EAAWF,EACf,GAA8B,IAA1BE,EAASC,QAAQ,KAAY,CAChC,IAAIC,EAAWC,OAAOC,SAASC,UAAYF,OAAOC,SAASE,KAAO,IAAMH,OAAOC,SAASE,KAAO,IAC9D,WAA7BH,OAAOC,SAASG,SACnBP,EAAW,SAAWE,EAAWF,EACM,UAA7BG,OAAOC,SAASG,WAC1BP,EAAW,QAAUE,EAAWF,GAGlC,OAAOA,EAISQ,CAASV,EAAIW,YAC7B,WAAWC,UAAUX,GAMtB,IAAeY,EAGVC,EAHUD,EC7BRR,OAAOQ,aDgCTC,EAAkB,CAAC,OAAQ,QAAS,SAAU,eAAgB,UAElED,EAAaE,WAAW,SAAU,SAAUC,EAAQC,EAASC,GAoD5D,GAAIA,EAAOC,WAAW,UAAW,CAChC,IAEIC,EAFOJ,EAAOK,eAAe,iBAAkBH,GAC1BP,WACKW,MAAM,KAChCC,EAAaH,EAAUI,MAEvBC,EAAW,GACXzB,EAAMgB,EAAOK,eAAe,aAAcH,GAE1CQ,EAAiB,IAMrB,GALIR,EAAOC,WAAW,UACrBD,EAAOS,aAAa,WACpBD,EAAiBV,EAAOK,eAAe,aAAcH,GAAQP,YAG1DO,EAAOC,WAAW,MAAO,CAE5B,GADAD,EAAOS,aAAa,WAChBT,EAAOC,WAAW,MAAO,CAC5BD,EAAOS,aAAa,QACpB,IAAIC,GAAe,EAapB,IAXA,IAAIC,EAAiBb,EAAOK,eAAe,cAAeH,GACtDY,EAAiB,CACpBC,KAAM,iBACNC,GAAI,SAAUC,GACb,OAAOhB,EAAQiB,MAEhBC,QAAS,SAAUF,MAIhBG,EAAMP,EACHO,EAAIC,MACVD,EAAMA,EAAIC,KAEXD,EAAIC,KAAOP,EAKZ,IAAIQ,EAASvC,EAAaC,GACtBuC,EA5FL,SAASC,EAASC,GACjB,WAAWC,MACV,GACA,CACCC,IAAK,SAAUC,EAAKC,GACnB,OAAI/B,EAAgBX,QAAQ0C,IAAa,OAEjB,cAAbA,EACHL,GAAU,GACM,YAAbK,WACOC,GAChB,OAAON,EAASO,SAASD,gBAMzB,IAFA,IAAIE,EAAOxD,IACPyD,EAAO,GACFH,EAAI,EAAGA,EAAII,UAAUC,OAAQL,IACrCG,EAAKG,KAAKF,UAAUJ,IAErB,IAAIO,EAAU,CACbC,IAAKN,EACLO,SAAUV,EACVI,KAAMA,IAEPX,EAASA,GAAkBvC,EAAaC,IACjCwD,KAAKC,KAAKC,UAAUL,IAE3B,IAAIM,EAAU,IAAIC,QAAQ,SAAUC,EAASC,GAC5CrC,EAASuB,GAAQ,CAChBa,QAASA,EACTC,OAAQA,KAYV,OARIrB,GAAW,GACdsB,WAAW,WACNtC,EAASuB,IACZvB,EAASuB,GAAMc,OAAO,oBAEhBrC,EAASuB,IACdP,GAEGkB,MAiDGnB,CAASd,GAEpBsC,EAAe,CAClBC,IAAK3B,EACL4B,cAAe,SAAUC,GACxB,IAAIC,EAAUD,EAAIE,cAEXD,EAAQE,cACRF,EAAQG,eACfjC,EAAOkB,KAAKC,KAAKC,mBEnIOc,EAAMC,GAClC,IAAK,IAAIC,KAAOD,EACXA,EAAKE,eAAeD,KACvBF,EAAKE,GAAOD,EAAKC,IAGnB,OAAOF,EF6HwBI,CAAa,CAAE7C,KAAMoC,EAAIpC,MAAQqC,MAE7DS,IAAKtC,GAGFuC,EAAgB,CACnBC,KAAMxD,EACNe,OAAQ0B,EACRgB,QAAS,SAAUC,GAClBhE,EAAQiE,kBAAkBD,EAAQ7D,EAAWG,EAAYyC,KA4C3D,OAxCA1B,EAAO6C,UAAY,SAAUhB,GAC5B,IAAIiB,EAAOjB,EAAIiB,KACf,IACC,IAAIC,EAAa5B,KAAK6B,MAAMF,GAC3B,MAAOG,IAcT,GATIF,GAAcA,EAAW/B,MACxB+B,QACH5D,EAAS4D,EAAW/B,KAAKQ,OAAOuB,SAEhC5D,EAAS4D,EAAW/B,KAAKO,QAAQwB,iBAE3B5D,EAAS4D,EAAW/B,MAGxBzB,EAAgB,CACnB,IAAII,EAAUhB,EAAQuE,YAAYxB,EAAcc,EAAed,GAC/D,GAAIpC,EAAc,CACjB,IAAIyD,EAIH,KAAM,0CAA4CD,EAHlDnD,EAAQwD,QAAUJ,EAClBpD,EAAQyD,OAASL,OAKlBpD,EAAQwD,QAAUL,EAClBnD,EAAQyD,OAASN,EAElBvD,EAAeM,QAAQF,KAKzBK,EAAOqD,iBAAiB,QAAS,SAAUJ,GAC1CjD,EAAS,OAGHwC"}
\No newline at end of file