fast-worker
Version:
Module for executing heavy tasks in parallel, by providing a `Promise` based interface, minimum overhead, and bound workers.
3 lines (2 loc) • 1.95 kB
JavaScript
import e from"path";import{pathToFileURL as t}from"url";import{parentPort as s}from"worker_threads";const r=()=>{let e,t;const s=new Promise(((s,r)=>{e=s,t=r}));let r=!1;return s.fulfilled=!1,s.rejected=!1,s.resolve=t=>{r||(s.fulfilled=r=!0,e(t))},s.reject=e=>{r||(s.rejected=r=!0,t(e))},s.catch(),s};if(!s)throw new Error("This module can only be used on a worker-thread");const o=new Map,a=new Map,n=async s=>{let r=o.get(s);return r||o.set(s,r=(s=>(e.isAbsolute(s)&&(s=t(s).href),import(s)))(s).then((e=>(o.set(s,r=e),r)))),await r},{getPrototypeOf:c,setPrototypeOf:l,prototype:i}=Object,{isArray:f}=Array,p=new Set,y=!!process.env.FAST_WORKER_LOWER_LEVEL;let d,g=0,m=0;const u=e=>{let t;switch(e[0]){case 1:t=(async()=>{const[t,o,c,l,i,f]=e;try{++m;for(let e=0,t=f.length;e<t;++e){const t=f[e];i[e]="string"==typeof t?(0,eval)(t):async(...e)=>{const o=++g,n=r();return a.set(o,n),s.postMessage([2,o,t,e]),n}}const e=await(async(e,t,s)=>{const r=(await n(e))?.[t];if("function"!=typeof r)throw new Error(`Method '${t}' in module '${e}' is not a function.`);return r(...s)})(c,l,i);s.postMessage([1,o,e])}catch(e){s.postMessage([65537,o,e])}finally{--m,!0===y&&0===m&&(d??(d=setTimeout((()=>{d=void 0,0===m&&process.exit()}),1024)))}})();break;case 3:{const[t,s,r]=e,o=a.get(s);o&&(a.delete(s),o.resolve(r))}break;case 65539:{const[t,s,r]=e,o=a.get(s);if(o){if(a.delete(s),r&&"object"==typeof r)switch(c(r)){case null:case i:l(r,Error.prototype)}o.reject(r)}}break;case 256:s.off("message",u),s.off("messageerror",w),Promise.all(p).finally((()=>{s.postMessage([256]),s.close(),process.exit()}));break;default:throw new TypeError(`Unexpected request from parent process: ${e[0]}`)}t&&(t.finally((()=>{p.delete(t)})),p.add(t))},w=e=>{const{data:t}=e;if(f(t)){const[r,o]=t;s.postMessage([65536|r,o,JSON.parse(JSON.stringify(e))])}};s.on("message",u),s.on("messageerror",w),s.start(),s.postMessage([768]);
//# sourceMappingURL=worker-entry.mjs.map