forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathWorkerComm.js
More file actions
1 lines (1 loc) · 3.86 KB
/
WorkerComm.js
File metadata and controls
1 lines (1 loc) · 3.86 KB
1
!function(){const ENV_BROWSER="browser",ENV_WORKER="worker",EVT_TYPE_EXEC="exec",EVT_TYPE_RESPONSE="response",EVT_TYPE_TRIGGER="trigger",EXEC_LOAD_SCRIPT="loadScript",EVENT_WORKER_COMM_INIT_COMPLETE="WorkerCommInitDone";let globalObject={},env;function createWorkerComm(postTarget,eventDispatcher){let postUniqueId=0,callBacks={},execHandlers={};if(eventDispatcher.setExecHandler=function(fnName,execHandlerFn){execHandlers[fnName]&&console.error(`${env}: Exec handler of same name already registered, will be overwritten: ${fnName}`),execHandlers[fnName]=execHandlerFn},eventDispatcher.execPeer=function(fnName,paramObject){return postUniqueId++,new Promise((resolve,reject)=>{postTarget.postMessage(JSON.stringify({type:EVT_TYPE_EXEC,exec:fnName,params:paramObject,postUniqueId:postUniqueId})),callBacks[postUniqueId]={resolve:resolve,reject:reject}})},eventDispatcher.triggerPeer=function(eventName,paramObject){postTarget.postMessage(JSON.stringify({type:EVT_TYPE_TRIGGER,eventName:eventName,params:paramObject}))},env===ENV_BROWSER){let loadScriptQueue=[],workerCommLoadCompleteInWorker=!1;function loadPendingScripts(){workerCommLoadCompleteInWorker=!0;for(let queuedLoads of loadScriptQueue)eventDispatcher.loadScriptInWorker(queuedLoads.scriptURL,queuedLoads.isModule);loadScriptQueue=[]}eventDispatcher.on(EVENT_WORKER_COMM_INIT_COMPLETE,loadPendingScripts),eventDispatcher.loadScriptInWorker=async function(scriptURL,isModule){workerCommLoadCompleteInWorker?await eventDispatcher.execPeer(EXEC_LOAD_SCRIPT,{scriptURL:scriptURL,isModule:isModule}):loadScriptQueue.push({scriptURL:scriptURL,isModule:isModule})}}else{function _loadScriptHandler({scriptURL:scriptURL,isModule:isModule}){if(console.log(`${env}: loading script from url: ${scriptURL}, isModule: ${isModule}`),isModule)return import(scriptURL);importScripts(scriptURL)}eventDispatcher.setExecHandler(EXEC_LOAD_SCRIPT,_loadScriptHandler)}function _processResponse(data){if(data.type===EVT_TYPE_RESPONSE){let postUniqueId=data.postUniqueId;if(callBacks[postUniqueId]){let{resolve:resolve,reject:reject}=callBacks[postUniqueId];data.err?reject(data.err):resolve(data.response),delete callBacks[postUniqueId]}return!0}return!1}function _processTrigger(data){return data.type===EVT_TYPE_TRIGGER&&(eventDispatcher.trigger(data.eventName,data.params),!0)}async function _processExec(data){let response={type:EVT_TYPE_RESPONSE,err:null,response:null,postUniqueId:data.postUniqueId},execHandlerFn=execHandlers[data.exec];try{execHandlerFn?(response.response=execHandlerFn(data.params),response.response instanceof Promise&&(response.response=await response.response)):(console.error(`${env}: Unknown exec function received: ${JSON.stringify(data)}`),response.err=`"Unknown exec function received" ${data.exec}`)}catch(err){response.err=err.message||err.stack?{message:err.message,stack:err.stack}:err.toString()}postTarget.postMessage(JSON.stringify(response))}postTarget.onmessage=async function(e){let data=JSON.parse(e.data);_processResponse(data)||_processTrigger(data)||await _processExec(data)}}"undefined"!=typeof window?(globalObject=window,env=ENV_BROWSER):"undefined"!=typeof self?(globalObject=self,env="worker"):console.error("unknown environment used to setup WorkerComm"),globalObject.WorkerComm||(globalObject.EventDispatcher?(env===ENV_BROWSER?globalObject.WorkerComm={createWorkerComm:createWorkerComm}:(globalObject.WorkerComm={},globalObject.EventDispatcher.makeEventDispatcher(globalObject.WorkerComm),createWorkerComm(globalObject,globalObject.WorkerComm),globalObject.WorkerComm.triggerPeer(EVENT_WORKER_COMM_INIT_COMPLETE)),globalObject.define&&env===ENV_BROWSER&&define(function(require,exports,module){exports.createWorkerComm=globalObject.WorkerComm.createWorkerComm,exports.EVENT_WORKER_COMM_INIT_COMPLETE=EVENT_WORKER_COMM_INIT_COMPLETE})):console.error(`${env}: Event dispatcher not loaded. Please importScripts utils/EventDispatcher.js before WorkerComm`))}();