@ariestools/threads 8.1.2 → 8.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/master/implementation.node.ts", "../../../src/master/index-node.ts", "../../../src/master/register.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable unicorn/text-encoding-identifier-case */\n/// <reference types=\"node\" />\n\nimport { cpus } from 'node:os'\nimport path from 'node:path'\nimport { cwd } from 'node:process'\nimport { isMainThread, Worker as NativeWorker } from 'node:worker_threads'\n\nimport type {\n ImplementationExport, ThreadsWorkerOptions, WorkerImplementation,\n} from '../types/master.ts'\n\n/** Default thread pool size based on the number of CPU cores. */\nexport const defaultPoolSize = cpus().length\n\nfunction resolveScriptPath(scriptPath: string, baseURL?: string) {\n const makeAbsolute = (filePath: string) => {\n return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath)\n }\n\n const absolutePath = makeAbsolute(scriptPath)\n return absolutePath\n}\n\nfunction initWorkerThreadsWorker(): ImplementationExport {\n let allWorkers: NativeWorker[] = []\n\n class Worker extends NativeWorker {\n private mappedEventListeners: WeakMap<EventListener, EventListener>\n\n constructor(scriptPath: string, options?: ThreadsWorkerOptions & { fromSource: boolean }) {\n const resolvedScriptPath = options?.fromSource === true ? null : resolveScriptPath(scriptPath, options?._baseURL)\n if (resolvedScriptPath === null) {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(sourceCode, { ...options, eval: true })\n } else {\n super(resolvedScriptPath, options)\n }\n\n this.mappedEventListeners = new WeakMap()\n allWorkers.push(this)\n }\n\n addEventListener(eventName: string, rawListener: EventListener) {\n const listener = (message: any) => {\n rawListener({ data: message } as any)\n }\n this.mappedEventListeners.set(rawListener, listener)\n this.on(eventName, listener)\n }\n\n removeEventListener(eventName: string, rawListener: EventListener) {\n const listener = this.mappedEventListeners.get(rawListener) || rawListener\n this.off(eventName, listener)\n }\n }\n\n const terminateWorkersAndMaster = () => {\n // we should terminate all workers and then gracefully shutdown self process\n void (async () => {\n try {\n await Promise.all(allWorkers.map(worker => worker.terminate()))\n process.exit(0)\n } catch {\n process.exit(1)\n }\n })()\n allWorkers = []\n }\n\n // Take care to not leave orphaned processes behind. See #147.\n process.on('SIGINT', () => terminateWorkersAndMaster())\n process.on('SIGTERM', () => terminateWorkersAndMaster())\n\n class BlobWorker extends Worker {\n constructor(blob: Uint8Array, options?: ThreadsWorkerOptions) {\n super(Buffer.from(blob).toString('utf-8'), { ...options, fromSource: true })\n }\n\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation {\n return new Worker(source, { ...options, fromSource: true }) as any\n }\n }\n\n return {\n blob: BlobWorker as any,\n default: Worker as any,\n }\n}\n\nlet implementation: ImplementationExport\n\n/**\n * Get the Node.js-specific worker implementation using `worker_threads`, lazily initializing it on first call.\n * @returns The platform-specific worker implementation export.\n */\nexport function getWorkerImplementation(): ImplementationExport {\n if (implementation === undefined) {\n implementation = initWorkerThreadsWorker()\n }\n return implementation\n}\n\n/**\n * Check whether the current code is running inside a Node.js worker thread.\n * @returns True if running in a worker thread (not the main thread), false otherwise.\n */\nexport function isWorkerRuntime() {\n return !isMainThread\n}\n", "import type { BlobWorker as BlobWorkerClass, Worker as WorkerType } from '../types/master.ts'\nimport * as NodeImplementation from './implementation.node.ts'\n\nexport type { FunctionThread, ModuleThread } from '../types/master.ts'\nexport { Pool } from './pool-browser.ts'\nexport { spawn } from './spawn.ts'\nexport { Thread } from './thread.ts'\n\n/** Constructor type for the Node.js blob-worker implementation. */\nexport type BlobWorker = typeof BlobWorkerClass\n/** Node.js worker instance type used by spawned threads. */\nexport type Worker = WorkerType\n\n/** Separate class to spawn workers from source code blobs or strings. */\nexport const BlobWorker = NodeImplementation.getWorkerImplementation().blob\n\n/** Worker implementation. Either web worker or a Node.js Worker class. */\nexport const Worker = NodeImplementation.getWorkerImplementation().default\n\nexport { isWorkerRuntime } from './implementation.node.ts'\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Worker as WorkerImplementation } from './index-node.ts'\n\ndeclare const window: any\n\nif (typeof globalThis !== 'undefined') {\n ;(globalThis as any).Worker = WorkerImplementation\n} else if (window !== undefined) {\n ;(window).Worker = WorkerImplementation\n}\n"],
5
- "mappings": ";AAIA,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,SAAS,WAAW;AACpB,SAAS,cAAc,UAAU,oBAAoB;AAO9C,IAAM,kBAAkB,KAAK,EAAE;AAEtC,SAAS,kBAAkB,YAAoB,SAAkB;AAC/D,QAAM,eAAe,CAAC,aAAqB;AACzC,WAAO,KAAK,WAAW,QAAQ,IAAI,WAAW,KAAK,KAAK,WAAW,IAAI,GAAG,QAAQ;AAAA,EACpF;AAEA,QAAM,eAAe,aAAa,UAAU;AAC5C,SAAO;AACT;AAEA,SAAS,0BAAgD;AACvD,MAAI,aAA6B,CAAC;AAAA,EAElC,MAAMA,gBAAe,aAAa;AAAA,IACxB;AAAA,IAER,YAAY,YAAoB,SAA0D;AACxF,YAAM,qBAAqB,SAAS,eAAe,OAAO,OAAO,kBAAkB,YAAY,SAAS,QAAQ;AAChH,UAAI,uBAAuB,MAAM;AAE/B,cAAM,aAAa;AACnB,cAAM,YAAY,EAAE,GAAG,SAAS,MAAM,KAAK,CAAC;AAAA,MAC9C,OAAO;AACL,cAAM,oBAAoB,OAAO;AAAA,MACnC;AAEA,WAAK,uBAAuB,oBAAI,QAAQ;AACxC,iBAAW,KAAK,IAAI;AAAA,IACtB;AAAA,IAEA,iBAAiB,WAAmB,aAA4B;AAC9D,YAAM,WAAW,CAAC,YAAiB;AACjC,oBAAY,EAAE,MAAM,QAAQ,CAAQ;AAAA,MACtC;AACA,WAAK,qBAAqB,IAAI,aAAa,QAAQ;AACnD,WAAK,GAAG,WAAW,QAAQ;AAAA,IAC7B;AAAA,IAEA,oBAAoB,WAAmB,aAA4B;AACjE,YAAM,WAAW,KAAK,qBAAqB,IAAI,WAAW,KAAK;AAC/D,WAAK,IAAI,WAAW,QAAQ;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,4BAA4B,MAAM;AAEtC,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,QAAQ,IAAI,WAAW,IAAI,YAAU,OAAO,UAAU,CAAC,CAAC;AAC9D,gBAAQ,KAAK,CAAC;AAAA,MAChB,QAAQ;AACN,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,GAAG;AACH,iBAAa,CAAC;AAAA,EAChB;AAGA,UAAQ,GAAG,UAAU,MAAM,0BAA0B,CAAC;AACtD,UAAQ,GAAG,WAAW,MAAM,0BAA0B,CAAC;AAAA,EAEvD,MAAMC,oBAAmBD,QAAO;AAAA,IAC9B,YAAY,MAAkB,SAAgC;AAC5D,YAAM,OAAO,KAAK,IAAI,EAAE,SAAS,OAAO,GAAG,EAAE,GAAG,SAAS,YAAY,KAAK,CAAC;AAAA,IAC7E;AAAA,IAEA,OAAO,SAAS,QAAgB,SAAsD;AACpF,aAAO,IAAIA,QAAO,QAAQ,EAAE,GAAG,SAAS,YAAY,KAAK,CAAC;AAAA,IAC5D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAMC;AAAA,IACN,SAASD;AAAA,EACX;AACF;AAEA,IAAI;AAMG,SAAS,0BAAgD;AAC9D,MAAI,mBAAmB,QAAW;AAChC,qBAAiB,wBAAwB;AAAA,EAC3C;AACA,SAAO;AACT;;;ACzFO,IAAM,aAAgC,wBAAwB,EAAE;AAGhE,IAAM,SAA4B,wBAAwB,EAAE;;;ACXnE,IAAI,OAAO,eAAe,aAAa;AACrC;AAAC,EAAC,WAAmB,SAAS;AAChC,WAAW,WAAW,QAAW;AAC/B;AAAC,EAAC,OAAQ,SAAS;AACrB;",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable unicorn/text-encoding-identifier-case */\n/// <reference types=\"node\" />\n\nimport { cpus } from 'node:os'\nimport path from 'node:path'\nimport { cwd } from 'node:process'\nimport { isMainThread, Worker as NativeWorker } from 'node:worker_threads'\n\nimport type {\n ImplementationExport, ThreadsWorkerOptions, WorkerImplementation,\n} from '../types/master.ts'\n\n/** Default thread pool size based on the number of CPU cores. */\nexport const defaultPoolSize = cpus().length\n\n/** Options for optional process-signal integration with the worker registry. */\nexport interface WorkerSignalHandlersOptions {\n /**\n * When true, call `process.exit(0|1)` after workers terminate on a signal.\n * Default `false` \u2014 the host owns process lifetime.\n */\n exitProcess?: boolean\n /**\n * Signals to listen for. Defaults to `SIGINT` and `SIGTERM`.\n */\n signals?: NodeJS.Signals[]\n}\n\ntype SignalHandler = () => void\n\ninterface WorkerRegistry {\n allWorkers: NativeWorker[]\n /** Active signal \u2192 handler map for the optional opt-in integration. */\n signalHandlers: Map<NodeJS.Signals, SignalHandler>\n}\n\nfunction resolveScriptPath(scriptPath: string, baseURL?: string) {\n const makeAbsolute = (filePath: string) => {\n return path.isAbsolute(filePath) ? filePath : path.join(baseURL ?? cwd(), filePath)\n }\n\n const absolutePath = makeAbsolute(scriptPath)\n return absolutePath\n}\n\n/**\n * Shared registry so opt-in signal handlers can terminate every worker\n * created through this implementation without owning process lifetime.\n */\nconst registry: WorkerRegistry = {\n allWorkers: [],\n signalHandlers: new Map(),\n}\n\nasync function terminateAllWorkers(): Promise<void> {\n const workers = [...registry.allWorkers]\n registry.allWorkers = []\n await Promise.all(workers.map(worker => worker.terminate()))\n}\n\nfunction initWorkerThreadsWorker(): ImplementationExport {\n class Worker extends NativeWorker {\n private mappedEventListeners: WeakMap<EventListener, EventListener>\n\n constructor(scriptPath: string, options?: ThreadsWorkerOptions & { fromSource: boolean }) {\n const resolvedScriptPath = options?.fromSource === true ? null : resolveScriptPath(scriptPath, options?._baseURL)\n if (resolvedScriptPath === null) {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(sourceCode, { ...options, eval: true })\n } else {\n super(resolvedScriptPath, options)\n }\n\n this.mappedEventListeners = new WeakMap()\n registry.allWorkers.push(this)\n this.once('exit', () => {\n registry.allWorkers = registry.allWorkers.filter(worker => worker !== this)\n })\n }\n\n addEventListener(eventName: string, rawListener: EventListener) {\n const listener = (message: any) => {\n rawListener({ data: message } as any)\n }\n this.mappedEventListeners.set(rawListener, listener)\n this.on(eventName, listener)\n }\n\n removeEventListener(eventName: string, rawListener: EventListener) {\n const listener = this.mappedEventListeners.get(rawListener) || rawListener\n this.off(eventName, listener)\n }\n }\n\n class BlobWorker extends Worker {\n constructor(blob: Uint8Array, options?: ThreadsWorkerOptions) {\n super(Buffer.from(blob).toString('utf-8'), { ...options, fromSource: true })\n }\n\n static fromText(source: string, options?: ThreadsWorkerOptions): WorkerImplementation {\n return new Worker(source, { ...options, fromSource: true }) as any\n }\n }\n\n return {\n blob: BlobWorker as any,\n default: Worker as any,\n }\n}\n\nlet implementation: ImplementationExport\n\n/**\n * Get the Node.js-specific worker implementation using `worker_threads`, lazily initializing it on first call.\n * @returns The platform-specific worker implementation export.\n */\nexport function getWorkerImplementation(): ImplementationExport {\n if (implementation === undefined) {\n implementation = initWorkerThreadsWorker()\n }\n return implementation\n}\n\n/**\n * Check whether the current code is running inside a Node.js worker thread.\n * @returns True if running in a worker thread (not the main thread), false otherwise.\n */\nexport function isWorkerRuntime() {\n return !isMainThread\n}\n\n/**\n * Opt-in: terminate tracked workers when the process receives the given signals.\n *\n * Libraries must not own host process lifetime. Call this only from an\n * application entrypoint that wants automatic worker cleanup on signal.\n * Returns a disposer that removes the handlers (idempotent).\n *\n * By default does **not** call `process.exit` \u2014 the host chooses exit status\n * and may complete async cleanup after the disposer or after the signal.\n */\nexport function installWorkerSignalHandlers(\n options: WorkerSignalHandlersOptions = {},\n): () => void {\n // Ensure the registry is initialized even if no Worker has been constructed yet.\n getWorkerImplementation()\n\n const signals: NodeJS.Signals[] = options.signals ?? ['SIGINT', 'SIGTERM']\n const exitProcess = options.exitProcess === true\n\n // Idempotent: replace any prior installation for the same process.\n uninstallWorkerSignalHandlers()\n\n for (const signal of signals) {\n const handler: SignalHandler = () => {\n void (async () => {\n try {\n await terminateAllWorkers()\n if (exitProcess) process.exit(0)\n } catch {\n if (exitProcess) process.exit(1)\n }\n })()\n }\n process.on(signal, handler)\n registry.signalHandlers.set(signal, handler)\n }\n\n return uninstallWorkerSignalHandlers\n}\n\n/**\n * Remove handlers installed by {@link installWorkerSignalHandlers}.\n * Safe to call when none are installed.\n */\nexport function uninstallWorkerSignalHandlers(): void {\n for (const [signal, handler] of registry.signalHandlers) {\n process.off(signal, handler)\n }\n registry.signalHandlers.clear()\n}\n", "import type { BlobWorker as BlobWorkerClass, Worker as WorkerType } from '../types/master.ts'\nimport * as NodeImplementation from './implementation.node.ts'\n\nexport type { FunctionThread, ModuleThread } from '../types/master.ts'\nexport { Pool } from './pool-browser.ts'\nexport { spawn } from './spawn.ts'\nexport { Thread } from './thread.ts'\n\n/** Constructor type for the Node.js blob-worker implementation. */\nexport type BlobWorker = typeof BlobWorkerClass\n/** Node.js worker instance type used by spawned threads. */\nexport type Worker = WorkerType\n\n/** Separate class to spawn workers from source code blobs or strings. */\nexport const BlobWorker = NodeImplementation.getWorkerImplementation().blob\n\n/** Worker implementation. Either web worker or a Node.js Worker class. */\nexport const Worker = NodeImplementation.getWorkerImplementation().default\n\nexport type { WorkerSignalHandlersOptions } from './implementation.node.ts'\nexport {\n installWorkerSignalHandlers,\n isWorkerRuntime,\n uninstallWorkerSignalHandlers,\n} from './implementation.node.ts'\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Worker as WorkerImplementation } from './index-node.ts'\n\ndeclare const window: any\n\nif (typeof globalThis !== 'undefined') {\n ;(globalThis as any).Worker = WorkerImplementation\n} else if (window !== undefined) {\n ;(window).Worker = WorkerImplementation\n}\n"],
5
+ "mappings": ";AAIA,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,SAAS,WAAW;AACpB,SAAS,cAAc,UAAU,oBAAoB;AAO9C,IAAM,kBAAkB,KAAK,EAAE;AAuBtC,SAAS,kBAAkB,YAAoB,SAAkB;AAC/D,QAAM,eAAe,CAAC,aAAqB;AACzC,WAAO,KAAK,WAAW,QAAQ,IAAI,WAAW,KAAK,KAAK,WAAW,IAAI,GAAG,QAAQ;AAAA,EACpF;AAEA,QAAM,eAAe,aAAa,UAAU;AAC5C,SAAO;AACT;AAMA,IAAM,WAA2B;AAAA,EAC/B,YAAY,CAAC;AAAA,EACb,gBAAgB,oBAAI,IAAI;AAC1B;AAQA,SAAS,0BAAgD;AAAA,EACvD,MAAMA,gBAAe,aAAa;AAAA,IACxB;AAAA,IAER,YAAY,YAAoB,SAA0D;AACxF,YAAM,qBAAqB,SAAS,eAAe,OAAO,OAAO,kBAAkB,YAAY,SAAS,QAAQ;AAChH,UAAI,uBAAuB,MAAM;AAE/B,cAAM,aAAa;AACnB,cAAM,YAAY,EAAE,GAAG,SAAS,MAAM,KAAK,CAAC;AAAA,MAC9C,OAAO;AACL,cAAM,oBAAoB,OAAO;AAAA,MACnC;AAEA,WAAK,uBAAuB,oBAAI,QAAQ;AACxC,eAAS,WAAW,KAAK,IAAI;AAC7B,WAAK,KAAK,QAAQ,MAAM;AACtB,iBAAS,aAAa,SAAS,WAAW,OAAO,YAAU,WAAW,IAAI;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,IAEA,iBAAiB,WAAmB,aAA4B;AAC9D,YAAM,WAAW,CAAC,YAAiB;AACjC,oBAAY,EAAE,MAAM,QAAQ,CAAQ;AAAA,MACtC;AACA,WAAK,qBAAqB,IAAI,aAAa,QAAQ;AACnD,WAAK,GAAG,WAAW,QAAQ;AAAA,IAC7B;AAAA,IAEA,oBAAoB,WAAmB,aAA4B;AACjE,YAAM,WAAW,KAAK,qBAAqB,IAAI,WAAW,KAAK;AAC/D,WAAK,IAAI,WAAW,QAAQ;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAMC,oBAAmBD,QAAO;AAAA,IAC9B,YAAY,MAAkB,SAAgC;AAC5D,YAAM,OAAO,KAAK,IAAI,EAAE,SAAS,OAAO,GAAG,EAAE,GAAG,SAAS,YAAY,KAAK,CAAC;AAAA,IAC7E;AAAA,IAEA,OAAO,SAAS,QAAgB,SAAsD;AACpF,aAAO,IAAIA,QAAO,QAAQ,EAAE,GAAG,SAAS,YAAY,KAAK,CAAC;AAAA,IAC5D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAMC;AAAA,IACN,SAASD;AAAA,EACX;AACF;AAEA,IAAI;AAMG,SAAS,0BAAgD;AAC9D,MAAI,mBAAmB,QAAW;AAChC,qBAAiB,wBAAwB;AAAA,EAC3C;AACA,SAAO;AACT;;;AC7GO,IAAM,aAAgC,wBAAwB,EAAE;AAGhE,IAAM,SAA4B,wBAAwB,EAAE;;;ACXnE,IAAI,OAAO,eAAe,aAAa;AACrC;AAAC,EAAC,WAAmB,SAAS;AAChC,WAAW,WAAW,QAAW;AAC/B;AAAC,EAAC,OAAQ,SAAS;AACrB;",
6
6
  "names": ["Worker", "BlobWorker"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ariestools/threads",
3
- "version": "8.1.2",
3
+ "version": "8.1.3",
4
4
  "description": "Web workers & worker threads as simple as a function call",
5
5
  "keywords": [
6
6
  "ariestools",
@@ -111,19 +111,19 @@
111
111
  "dependencies": {
112
112
  "debug": "~4.4.3",
113
113
  "observable-fns": "~0.6.1",
114
- "@ariestools/sdk": "~8.1.2"
114
+ "@ariestools/sdk": "~8.1.3"
115
115
  },
116
116
  "devDependencies": {
117
- "@ariestools/eslint-config-flat": "~8.7.14",
118
- "@ariestools/toolchain": "~8.7.14",
119
- "@ariestools/tsconfig": "~8.7.14",
117
+ "@ariestools/eslint-config-flat": "~8.7.21",
118
+ "@ariestools/toolchain": "~8.7.21",
119
+ "@ariestools/tsconfig": "~8.7.21",
120
120
  "@opentelemetry/api": "~1.9.1",
121
121
  "@types/debug": "~4.1.13",
122
122
  "@types/node": "~26.1.1",
123
123
  "eslint": "~10.7.0",
124
124
  "eslint-import-resolver-typescript": "~4.4.5",
125
125
  "typescript": "~6.0.3",
126
- "vite": "~8.1.4",
126
+ "vite": "~8.1.5",
127
127
  "vitest": "~4.1.10"
128
128
  },
129
129
  "peerDependencies": {