UNPKG

@xylabs/threads

Version:

Web workers & worker threads as simple as a function call

84 lines (81 loc) 2.66 kB
// src/master/implementation.node.ts import { cpus } from "node:os"; import path from "node:path"; import { cwd } from "node:process"; import { isMainThread, Worker as NativeWorker } from "node:worker_threads"; var defaultPoolSize = cpus().length; function resolveScriptPath(scriptPath, baseURL) { const makeAbsolute = (filePath) => { return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath); }; const absolutePath = makeAbsolute(scriptPath); return absolutePath; } function initWorkerThreadsWorker() { let allWorkers = []; class Worker2 extends NativeWorker { mappedEventListeners; constructor(scriptPath, options) { const resolvedScriptPath = options?.fromSource ? null : resolveScriptPath(scriptPath, options?._baseURL); if (resolvedScriptPath === null) { const sourceCode = scriptPath; super(sourceCode, { ...options, eval: true }); } else { super(resolvedScriptPath, options); } this.mappedEventListeners = /* @__PURE__ */ new WeakMap(); allWorkers.push(this); } addEventListener(eventName, rawListener) { const listener = (message) => { rawListener({ data: message }); }; this.mappedEventListeners.set(rawListener, listener); this.on(eventName, listener); } removeEventListener(eventName, rawListener) { const listener = this.mappedEventListeners.get(rawListener) || rawListener; this.off(eventName, listener); } } const terminateWorkersAndMaster = () => { Promise.all(allWorkers.map((worker) => worker.terminate())).then( () => process.exit(0), () => process.exit(1) ); allWorkers = []; }; process.on("SIGINT", () => terminateWorkersAndMaster()); process.on("SIGTERM", () => terminateWorkersAndMaster()); class BlobWorker2 extends Worker2 { constructor(blob, options) { super(Buffer.from(blob).toString("utf-8"), { ...options, fromSource: true }); } static fromText(source, options) { return new Worker2(source, { ...options, fromSource: true }); } } return { blob: BlobWorker2, default: Worker2 }; } var implementation; function getWorkerImplementation() { if (implementation === void 0) { implementation = initWorkerThreadsWorker(); } return implementation; } // src/master/index-node.ts var BlobWorker = getWorkerImplementation().blob; var Worker = getWorkerImplementation().default; // src/master/register.ts if (typeof globalThis !== "undefined") { ; globalThis.Worker = Worker; } else if (window !== void 0) { ; window.Worker = Worker; } //# sourceMappingURL=register.mjs.map