UNPKG

8.92 kBSource Map (JSON)View Raw
1{"version":3,"file":"worker.modern.js","sources":["../src/lib/plugin/worker.js"],"sourcesContent":["///=========================================================================\n/// This module provides the worker feature for hyperscript\n///=========================================================================\n\n/**\n * @param {HyperscriptObject} _hyperscript\n */\nexport default _hyperscript => {\n\n\tvar invocationIdCounter = 0;\n\n\tvar workerFunc = function (self) {\n\t\tself.onmessage = function (e) {\n\t\t\tswitch (e.data.type) {\n\t\t\t\tcase \"init\":\n\t\t\t\t\tself.importScripts(e.data._hyperscript);\n\t\t\t\t\tself.importScripts.apply(self, e.data.extraScripts);\n\t\t\t\t\tconst _hyperscript = self['_hyperscript']\n\t\t\t\t\tvar tokens = _hyperscript.internals.lexer.makeTokensObject(e.data.tokens, [], e.data.source);\n\t\t\t\t\tvar hyperscript = _hyperscript.internals.parser.parseElement(\"hyperscript\", tokens);\n\t\t\t\t\thyperscript.apply(self, self);\n\t\t\t\t\tpostMessage({ type: \"didInit\" });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"call\":\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar result = self['_hyperscript'].internals.runtime\n\t\t\t\t\t\t\t.getHyperscriptFeatures(self)[e.data.function]\n\t\t\t\t\t\t\t.apply(self, e.data.args);\n\t\t\t\t\t\tPromise.resolve(result)\n\t\t\t\t\t\t\t.then(function (value) {\n\t\t\t\t\t\t\t\tpostMessage({\n\t\t\t\t\t\t\t\t\ttype: \"resolve\",\n\t\t\t\t\t\t\t\t\tid: e.data.id,\n\t\t\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch(function (error) {\n\t\t\t\t\t\t\t\tpostMessage({\n\t\t\t\t\t\t\t\t\ttype: \"reject\",\n\t\t\t\t\t\t\t\t\tid: e.data.id,\n\t\t\t\t\t\t\t\t\terror: error.toString(),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tpostMessage({\n\t\t\t\t\t\t\ttype: \"reject\",\n\t\t\t\t\t\t\tid: e.data.id,\n\t\t\t\t\t\t\terror: error.toString(),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t};\n\t};\n\n\t// extract the body of the function, which was only defined so\n\t// that we can get syntax highlighting\n\tvar workerCode = \"(\" + workerFunc.toString() + \")(self)\";\n\tvar blob = new Blob([workerCode], { type: \"text/javascript\" });\n\tvar workerUri = URL.createObjectURL(blob);\n\n\t_hyperscript.addFeature(\"worker\", function (parser, runtime, tokens) {\n\t\tif (tokens.matchToken(\"worker\")) {\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 workerName = nameSpace.pop();\n\n\t\t\t// Parse extra scripts\n\t\t\tvar extraScripts = [];\n\t\t\tif (tokens.matchOpToken(\"(\")) {\n\t\t\t\tif (tokens.matchOpToken(\")\")) {\n\t\t\t\t\t// no external scripts\n\t\t\t\t} else {\n\t\t\t\t\tdo {\n\t\t\t\t\t\tvar extraScript = tokens.requireTokenType(\"STRING\").value;\n\t\t\t\t\t\tvar absoluteUrl = new URL(extraScript, location.href).href;\n\t\t\t\t\t\textraScripts.push(absoluteUrl);\n\t\t\t\t\t} while (tokens.matchOpToken(\",\"));\n\t\t\t\t\ttokens.requireOpToken(\")\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Consume worker methods\n\n\t\t\tvar funcNames = [];\n\t\t\tvar bodyStartIndex = tokens.consumed.length;\n\t\t\tvar bodyEndIndex = tokens.consumed.length;\n\t\t\tdo {\n\t\t\t\tvar feature = parser.parseAnyOf([\"defFeature\", \"jsFeature\"], tokens);\n\t\t\t\tif (feature) {\n\t\t\t\t\tif (feature.type === \"defFeature\") {\n\t\t\t\t\t\tfuncNames.push(feature.name);\n\t\t\t\t\t\tbodyEndIndex = tokens.consumed.length;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (tokens.hasMore()) continue;\n\t\t\t\t\t}\n\t\t\t\t} else break;\n\t\t\t} while (tokens.matchToken(\"end\") && tokens.hasMore()); // worker end\n\n\t\t\tvar bodyTokens = tokens.consumed.slice(bodyStartIndex, bodyEndIndex + 1);\n\n\t\t\t// Create worker\n\n\t\t\tvar worker = new Worker(workerUri);\n\n\t\t\t// Send init message to worker\n\n\t\t\tworker.postMessage({\n\t\t\t\ttype: \"init\",\n\t\t\t\t_hyperscript: runtime.hyperscriptUrl,\n\t\t\t\textraScripts: extraScripts,\n\t\t\t\ttokens: bodyTokens,\n\t\t\t\tsource: tokens.source,\n\t\t\t});\n\n\t\t\tvar workerPromise = new Promise(function (resolve, reject) {\n\t\t\t\tworker.addEventListener(\n\t\t\t\t\t\"message\",\n\t\t\t\t\tfunction (e) {\n\t\t\t\t\t\tif (e.data.type === \"didInit\") resolve();\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true }\n\t\t\t\t);\n\t\t\t});\n\n\t\t\t// Create function stubs\n\t\t\tvar stubs = {};\n\t\t\tfuncNames.forEach(function (funcName) {\n\t\t\t\tconsole.log(funcName)\n\t\t\t\tstubs[funcName] = function () {\n\t\t\t\t\tvar args = arguments;\n\t\t\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\t\t\tvar id = invocationIdCounter++;\n\t\t\t\t\t\tworker.addEventListener(\"message\", function returnListener(e) {\n\t\t\t\t\t\t\tif (e.data.id !== id) return;\n\t\t\t\t\t\t\tworker.removeEventListener(\"message\", returnListener);\n\t\t\t\t\t\t\tif (e.data.type === \"resolve\") resolve(e.data.value);\n\t\t\t\t\t\t\telse reject(e.data.error);\n\t\t\t\t\t\t});\n\t\t\t\t\t\tworkerPromise.then(function () {\n\t\t\t\t\t\t\t// Worker has been initialized, send invocation.\n\t\t\t\t\t\t\tworker.postMessage({\n\t\t\t\t\t\t\t\ttype: \"call\",\n\t\t\t\t\t\t\t\tfunction: funcName,\n\t\t\t\t\t\t\t\targs: Array.from(args),\n\t\t\t\t\t\t\t\tid: id,\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\n\t\t\treturn {\n\t\t\t\tname: workerName,\n\t\t\t\tworker: worker,\n\t\t\t\tinstall: function (target) {\n\t\t\t\t\truntime.assignToNamespace(target, nameSpace, workerName, stubs);\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t});\n}\n"],"names":["_hyperscript","invocationIdCounter","workerCode","self","onmessage","e","data","type","importScripts","apply","extraScripts","tokens","internals","lexer","makeTokensObject","source","hyperscript","parser","parseElement","postMessage","result","runtime","getHyperscriptFeatures","function","args","Promise","resolve","then","value","id","catch","error","toString","blob","Blob","workerUri","URL","createObjectURL","addFeature","matchToken","nameSpace","requireElement","evaluate","split","workerName","pop","matchOpToken","extraScript","requireTokenType","absoluteUrl","location","href","push","requireOpToken","funcNames","bodyStartIndex","consumed","length","bodyEndIndex","feature","parseAnyOf","name","hasMore","bodyTokens","slice","worker","Worker","hyperscriptUrl","workerPromise","reject","addEventListener","once","stubs","forEach","funcName","console","log","arguments","returnListener","removeEventListener","Array","from","install","target","assignToNamespace"],"mappings":"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"}
\No newline at end of file