@xylabs/threads 5.0.80 → 5.0.82
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.
- package/README.md +15 -5
- package/dist/browser/{index-browser-D33V4yi8.d.ts → index-browser-CZc9d-db.d.ts} +2 -2
- package/dist/browser/index-browser.d.ts +2 -2
- package/dist/browser/index-browser.mjs.map +1 -1
- package/dist/browser/master/implementation.browser.d.ts +1 -1
- package/dist/browser/master/index-browser.d.ts +2 -2
- package/dist/browser/master/index-browser.mjs.map +1 -1
- package/dist/browser/master/pool-browser.d.ts +1 -1
- package/dist/browser/{master-bPj1PEBt.d.ts → master-CFxtmoRJ.d.ts} +2 -2
- package/dist/neutral/master/register.mjs +2 -212
- package/dist/neutral/master/register.mjs.map +1 -1
- package/dist/neutral/master/spawn.d.ts +2 -2
- package/dist/neutral/master/spawn.mjs.map +1 -1
- package/dist/neutral/master/thread.d.ts +1 -1
- package/dist/neutral/{master-zgnSDvrP.d.ts → master-BaKB0oWh.d.ts} +2 -2
- package/dist/node/{index-node-BzKzk8TX.d.ts → index-node-BjbCKNdn.d.ts} +3 -3
- package/dist/node/index-node.d.ts +3 -3
- package/dist/node/index-node.mjs +3 -210
- package/dist/node/index-node.mjs.map +1 -1
- package/dist/node/master/implementation.node.d.ts +1 -1
- package/dist/node/master/implementation.node.mjs +3 -210
- package/dist/node/master/implementation.node.mjs.map +1 -1
- package/dist/node/master/index-node.d.ts +3 -3
- package/dist/node/master/index-node.mjs +3 -210
- package/dist/node/master/index-node.mjs.map +1 -1
- package/dist/node/master/pool-node.d.ts +2 -2
- package/dist/node/master/pool-node.mjs +1 -274
- package/dist/node/master/pool-node.mjs.map +1 -1
- package/dist/node/{master-YwdR-Xxf.d.ts → master-CTbq2uzL.d.ts} +2 -2
- package/dist/node/{pool-types-DAVPWCoG.d.ts → pool-types-CTBjm1B2.d.ts} +1 -1
- package/package.json +8 -9
- package/src/common.ts +0 -23
- package/src/index-browser.ts +0 -11
- package/src/index-node.ts +0 -11
- package/src/master/get-bundle-url.browser.ts +0 -32
- package/src/master/implementation.browser.ts +0 -82
- package/src/master/implementation.node.ts +0 -208
- package/src/master/index-browser.ts +0 -19
- package/src/master/index-node.ts +0 -19
- package/src/master/invocation-proxy.ts +0 -153
- package/src/master/pool-browser.ts +0 -399
- package/src/master/pool-node.ts +0 -399
- package/src/master/pool-types.ts +0 -83
- package/src/master/register.ts +0 -11
- package/src/master/spawn.ts +0 -172
- package/src/master/thread.ts +0 -29
- package/src/observable-promise.ts +0 -184
- package/src/observable.ts +0 -44
- package/src/promise.ts +0 -26
- package/src/serializers.ts +0 -68
- package/src/symbols.ts +0 -5
- package/src/transferable.ts +0 -71
- package/src/types/master.ts +0 -132
- package/src/types/messages.ts +0 -72
- package/src/types/worker.ts +0 -15
- package/src/worker/WorkerGlobalScope.ts +0 -6
- package/src/worker/expose.ts +0 -234
- package/src/worker/is-observable.d.ts +0 -7
- package/src/worker/worker.browser.ts +0 -56
- package/src/worker/worker.node.ts +0 -68
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../node_modules/.store/tiny-worker-npm-2.3.0-38c7100e1d/package/lib/index.js","../../../src/master/implementation.node.ts","../../../src/master/index-node.ts","../../../src/master/register.ts"],"sourcesContent":["\"use strict\";\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar path = require(\"path\"),\n fork = require(\"child_process\").fork,\n worker = path.join(__dirname, \"worker.js\"),\n events = /^(error|message)$/,\n defaultPorts = { inspect: 9229, debug: 5858 };\nvar range = { min: 1, max: 300 };\n\nvar Worker = function () {\n\tfunction Worker(arg) {\n\t\tvar _this = this;\n\n\t\tvar args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\t\tvar options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { cwd: process.cwd() };\n\n\t\t_classCallCheck(this, Worker);\n\n\t\tvar isfn = typeof arg === \"function\",\n\t\t input = isfn ? arg.toString() : arg;\n\n\t\tif (!options.cwd) {\n\t\t\toptions.cwd = process.cwd();\n\t\t}\n\n\t\t//get all debug related parameters\n\t\tvar debugVars = process.execArgv.filter(function (execArg) {\n\t\t\treturn (/(debug|inspect)/.test(execArg)\n\t\t\t);\n\t\t});\n\t\tif (debugVars.length > 0 && !options.noDebugRedirection) {\n\t\t\tif (!options.execArgv) {\n\t\t\t\t//if no execArgs are given copy all arguments\n\t\t\t\tdebugVars = Array.from(process.execArgv);\n\t\t\t\toptions.execArgv = [];\n\t\t\t}\n\n\t\t\tvar inspectIndex = debugVars.findIndex(function (debugArg) {\n\t\t\t\t//get index of inspect parameter\n\t\t\t\treturn (/^--inspect(-brk)?(=\\d+)?$/.test(debugArg)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tvar debugIndex = debugVars.findIndex(function (debugArg) {\n\t\t\t\t//get index of debug parameter\n\t\t\t\treturn (/^--debug(-brk)?(=\\d+)?$/.test(debugArg)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tvar portIndex = inspectIndex >= 0 ? inspectIndex : debugIndex; //get index of port, inspect has higher priority\n\n\t\t\tif (portIndex >= 0) {\n\t\t\t\tvar match = /^--(debug|inspect)(?:-brk)?(?:=(\\d+))?$/.exec(debugVars[portIndex]); //get port\n\t\t\t\tvar port = defaultPorts[match[1]];\n\t\t\t\tif (match[2]) {\n\t\t\t\t\tport = parseInt(match[2]);\n\t\t\t\t}\n\t\t\t\tdebugVars[portIndex] = \"--\" + match[1] + \"=\" + (port + range.min + Math.floor(Math.random() * (range.max - range.min))); //new parameter\n\n\t\t\t\tif (debugIndex >= 0 && debugIndex !== portIndex) {\n\t\t\t\t\t//remove \"-brk\" from debug if there\n\t\t\t\t\tmatch = /^(--debug)(?:-brk)?(.*)/.exec(debugVars[debugIndex]);\n\t\t\t\t\tdebugVars[debugIndex] = match[1] + (match[2] ? match[2] : \"\");\n\t\t\t\t}\n\t\t\t}\n\t\t\toptions.execArgv = options.execArgv.concat(debugVars);\n\t\t}\n\n\t\tdelete options.noDebugRedirection;\n\n\t\tthis.child = fork(worker, args, options);\n\t\tthis.onerror = undefined;\n\t\tthis.onmessage = undefined;\n\n\t\tthis.child.on(\"error\", function (e) {\n\t\t\tif (_this.onerror) {\n\t\t\t\t_this.onerror.call(_this, e);\n\t\t\t}\n\t\t});\n\n\t\tthis.child.on(\"message\", function (msg) {\n\t\t\tvar message = JSON.parse(msg);\n\t\t\tvar error = void 0;\n\n\t\t\tif (!message.error && _this.onmessage) {\n\t\t\t\t_this.onmessage.call(_this, message);\n\t\t\t}\n\n\t\t\tif (message.error && _this.onerror) {\n\t\t\t\terror = new Error(message.error);\n\t\t\t\terror.stack = message.stack;\n\n\t\t\t\t_this.onerror.call(_this, error);\n\t\t\t}\n\t\t});\n\n\t\tthis.child.send({ input: input, isfn: isfn, cwd: options.cwd, esm: options.esm });\n\t}\n\n\t_createClass(Worker, [{\n\t\tkey: \"addEventListener\",\n\t\tvalue: function addEventListener(event, fn) {\n\t\t\tif (events.test(event)) {\n\t\t\t\tthis[\"on\" + event] = fn;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: \"postMessage\",\n\t\tvalue: function postMessage(msg) {\n\t\t\tthis.child.send(JSON.stringify({ data: msg }, null, 0));\n\t\t}\n\t}, {\n\t\tkey: \"terminate\",\n\t\tvalue: function terminate() {\n\t\t\tthis.child.kill(\"SIGINT\");\n\t\t}\n\t}], [{\n\t\tkey: \"setRange\",\n\t\tvalue: function setRange(min, max) {\n\t\t\tif (min >= max) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\trange.min = min;\n\t\t\trange.max = max;\n\n\t\t\treturn true;\n\t\t}\n\t}]);\n\n\treturn Worker;\n}();\n\nmodule.exports = Worker;\n","/* eslint-disable @typescript-eslint/no-require-imports */\n\n/* eslint-disable unicorn/prefer-add-event-listener */\n/* eslint-disable unicorn/prefer-event-target */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable unicorn/text-encoding-identifier-case */\n\nimport { EventEmitter } from 'node:events'\nimport { cpus } from 'node:os'\nimport path from 'node:path'\nimport { cwd } from 'node:process'\nimport { Worker as NativeWorker } from 'node:worker_threads'\n\nimport type {\n ImplementationExport, ThreadsWorkerOptions, WorkerImplementation,\n// eslint-disable-next-line import-x/no-internal-modules\n} from '../types/master.ts'\n\ndeclare const __non_webpack_require__: typeof require\n\ntype WorkerEventName = 'error' | 'message'\n\nexport const defaultPoolSize = cpus().length\n\nfunction resolveScriptPath(scriptPath: string, baseURL?: string | undefined) {\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: Array<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 && options.fromSource ? null : resolveScriptPath(scriptPath, (options ?? {})._baseURL)\n if (resolvedScriptPath) {\n super(resolvedScriptPath, options)\n } else {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(sourceCode, { ...options, eval: true })\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 Promise.all(allWorkers.map(worker => worker.terminate())).then(\n () => process.exit(0),\n () => process.exit(1),\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\nfunction initTinyWorker(): ImplementationExport {\n const TinyWorker = require('tiny-worker')\n\n let allWorkers: Array<typeof TinyWorker> = []\n\n class Worker extends TinyWorker {\n private emitter: EventEmitter\n\n constructor(scriptPath: string, options?: ThreadsWorkerOptions & { fromSource?: boolean }) {\n // Need to apply a work-around for Windows or it will choke upon the absolute path\n // (`Error [ERR_INVALID_PROTOCOL]: Protocol 'c:' not supported`)\n const resolvedScriptPath\n = options && options.fromSource\n ? null\n : process.platform === 'win32'\n ? `file:///${resolveScriptPath(scriptPath).replaceAll('\\\\', '/')}`\n : resolveScriptPath(scriptPath)\n\n if (resolvedScriptPath) {\n super(resolvedScriptPath, [], { esm: true })\n } else {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(new Function(sourceCode), [], { esm: true })\n }\n\n allWorkers.push(this)\n\n this.emitter = new EventEmitter()\n this.onerror = (error: Error) => this.emitter.emit('error', error)\n this.onmessage = (message: MessageEvent) => this.emitter.emit('message', message)\n }\n\n addEventListener(eventName: WorkerEventName, listener: EventListener) {\n this.emitter.addListener(eventName, listener)\n }\n\n removeEventListener(eventName: WorkerEventName, listener: EventListener) {\n this.emitter.removeListener(eventName, listener)\n }\n\n terminate() {\n allWorkers = allWorkers.filter(worker => worker !== this)\n return super.terminate()\n }\n }\n\n const terminateWorkersAndMaster = () => {\n // we should terminate all workers and then gracefully shutdown self process\n Promise.all(allWorkers.map(worker => worker.terminate())).then(\n () => process.exit(0),\n () => process.exit(1),\n )\n allWorkers = []\n }\n\n // Take care to not leave orphaned processes behind\n // See <https://github.com/avoidwork/tiny-worker#faq>\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\nlet isTinyWorker: boolean\n\nfunction selectWorkerImplementation(): ImplementationExport {\n try {\n isTinyWorker = false\n return initWorkerThreadsWorker()\n } catch (ex) {\n console.error(ex)\n // tslint:disable-next-line no-console\n console.debug('Node worker_threads not available. Trying to fall back to tiny-worker polyfill...')\n isTinyWorker = true\n return initTinyWorker()\n }\n}\n\nexport function getWorkerImplementation(): ImplementationExport {\n if (!implementation) {\n implementation = selectWorkerImplementation()\n }\n return implementation\n}\n\nexport function isWorkerRuntime() {\n if (isTinyWorker) {\n return globalThis !== undefined && self['postMessage'] ? true : false\n } else {\n // Webpack hack\n const isMainThread\n = typeof __non_webpack_require__ === 'function'\n ? __non_webpack_require__('worker_threads').isMainThread\n : eval('require')('worker_threads').isMainThread\n return !isMainThread\n }\n}\n","/* eslint-disable import-x/no-internal-modules */\nimport 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\nexport type BlobWorker = typeof BlobWorkerClass\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 as any).Worker = WorkerImplementation\n}\n"],"mappings":"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","names":["path","Worker","Worker","BlobWorker"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/master/implementation.node.ts","../../../src/master/index-node.ts","../../../src/master/register.ts"],"sourcesContent":["/* eslint-disable unicorn/prefer-add-event-listener */\n/* eslint-disable unicorn/prefer-event-target */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable unicorn/text-encoding-identifier-case */\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// eslint-disable-next-line import-x/no-internal-modules\n} from '../types/master.ts'\n\nexport const defaultPoolSize = cpus().length\n\nfunction resolveScriptPath(scriptPath: string, baseURL?: string | undefined) {\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: Array<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 && options.fromSource ? null : resolveScriptPath(scriptPath, (options ?? {})._baseURL)\n if (resolvedScriptPath) {\n super(resolvedScriptPath, options)\n } else {\n // `options.fromSource` is true\n const sourceCode = scriptPath\n super(sourceCode, { ...options, eval: true })\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 Promise.all(allWorkers.map(worker => worker.terminate())).then(\n () => process.exit(0),\n () => process.exit(1),\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\nexport function getWorkerImplementation(): ImplementationExport {\n if (!implementation) {\n implementation = initWorkerThreadsWorker()\n }\n return implementation\n}\n\nexport function isWorkerRuntime() {\n return !isMainThread\n}\n","/* eslint-disable import-x/no-internal-modules */\nimport 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\nexport type BlobWorker = typeof BlobWorkerClass\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 as any).Worker = WorkerImplementation\n}\n"],"mappings":";AAKA,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,SAAS,WAAW;AACpB,SAAS,cAAc,UAAU,oBAAoB;AAO9C,IAAM,kBAAkB,KAAK,EAAE;AAEtC,SAAS,kBAAkB,YAAoB,SAA8B;AAC3E,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,aAAkC,CAAC;AAAA,EAEvC,MAAMA,gBAAe,aAAa;AAAA,IACxB;AAAA,IAER,YAAY,YAAoB,SAA0D;AACxF,YAAM,qBAAqB,WAAW,QAAQ,aAAa,OAAO,kBAAkB,aAAa,WAAW,CAAC,GAAG,QAAQ;AACxH,UAAI,oBAAoB;AACtB,cAAM,oBAAoB,OAAO;AAAA,MACnC,OAAO;AAEL,cAAM,aAAa;AACnB,cAAM,YAAY,EAAE,GAAG,SAAS,MAAM,KAAK,CAAC;AAAA,MAC9C;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,YAAQ,IAAI,WAAW,IAAI,YAAU,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,MACxD,MAAM,QAAQ,KAAK,CAAC;AAAA,MACpB,MAAM,QAAQ,KAAK,CAAC;AAAA,IACtB;AACA,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;AAEG,SAAS,0BAAgD;AAC9D,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,wBAAwB;AAAA,EAC3C;AACA,SAAO;AACT;;;ACnFO,IAAM,aAAgC,wBAAwB,EAAE;AAGhE,IAAM,SAA4B,wBAAwB,EAAE;;;ACVnE,IAAI,OAAO,eAAe,aAAa;AACrC;AAAC,EAAC,WAAmB,SAAS;AAChC,WAAW,WAAW,QAAW;AAC/B;AAAC,EAAC,OAAe,SAAS;AAC5B;","names":["Worker","BlobWorker"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { F as FunctionThread, M as ModuleThread, S as StripAsync, a as Worker } from '../master-
|
|
1
|
+
import { F as FunctionThread, M as ModuleThread, S as StripAsync, a as Worker } from '../master-BaKB0oWh.js';
|
|
2
2
|
import 'observable-fns';
|
|
3
3
|
import '../observable-promise.js';
|
|
4
4
|
|
|
@@ -17,7 +17,7 @@ type ExposedToThreadType<Exposed extends WorkerFunction | WorkerModule<any>> = E
|
|
|
17
17
|
* abstraction layer to provide the transparent API and verifies that
|
|
18
18
|
* the worker has initialized successfully.
|
|
19
19
|
*
|
|
20
|
-
* @param worker Instance of `Worker`. Either a web worker
|
|
20
|
+
* @param worker Instance of `Worker`. Either a web worker or `worker_threads` worker.
|
|
21
21
|
* @param [options]
|
|
22
22
|
* @param [options.timeout] Init message timeout. Default: 10000 or set by environment variable.
|
|
23
23
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/master/spawn.ts","../../../src/serializers.ts","../../../src/common.ts","../../../src/promise.ts","../../../src/symbols.ts","../../../src/master/invocation-proxy.ts","../../../src/observable-promise.ts","../../../src/transferable.ts"],"sourcesContent":["/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport DebugLogger from 'debug'\nimport { Observable } from 'observable-fns'\n\nimport { deserialize } from '../common.ts'\nimport { createPromiseWithResolver } from '../promise.ts'\nimport {\n $errors, $events, $terminate, $worker,\n} from '../symbols.ts'\nimport type {\n FunctionThread,\n ModuleThread,\n PrivateThreadProps,\n StripAsync,\n Worker as WorkerType,\n WorkerEvent,\n WorkerInternalErrorEvent,\n WorkerMessageEvent,\n WorkerTerminationEvent,\n} from '../types/master.ts'\nimport { WorkerEventType } from '../types/master.ts'\nimport type { WorkerInitMessage, WorkerUncaughtErrorMessage } from '../types/messages.ts'\nimport type { WorkerFunction, WorkerModule } from '../types/worker.ts'\nimport { createProxyFunction, createProxyModule } from './invocation-proxy.ts'\n\ntype ArbitraryWorkerInterface = WorkerFunction & WorkerModule<string> & { somekeythatisneverusedinproductioncode123: 'magicmarker123' }\ntype ArbitraryThreadType = FunctionThread<any, any> & ModuleThread<any>\n\nexport type ExposedToThreadType<Exposed extends WorkerFunction | WorkerModule<any>> =\n Exposed extends ArbitraryWorkerInterface ? ArbitraryThreadType\n : Exposed extends WorkerFunction ? FunctionThread<Parameters<Exposed>, StripAsync<ReturnType<Exposed>>>\n : Exposed extends WorkerModule<any> ? ModuleThread<Exposed>\n : never\n\nconst debugMessages = DebugLogger('threads:master:messages')\nconst debugSpawn = DebugLogger('threads:master:spawn')\nconst debugThreadUtils = DebugLogger('threads:master:thread-utils')\n\nconst isInitMessage = (data: any): data is WorkerInitMessage => data && data.type === ('init' as const)\nconst isUncaughtErrorMessage = (data: any): data is WorkerUncaughtErrorMessage => data && data.type === ('uncaughtError' as const)\n\nconst initMessageTimeout\n = typeof process !== 'undefined' && process.env !== undefined && process.env.THREADS_WORKER_INIT_TIMEOUT\n ? Number.parseInt(process.env.THREADS_WORKER_INIT_TIMEOUT, 10)\n : 10_000\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutInMs: number, errorMessage: string): Promise<T> {\n let timeoutHandle: any\n\n const timeout = new Promise<never>((resolve, reject) => {\n timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), timeoutInMs)\n })\n const result = await Promise.race([promise, timeout])\n\n clearTimeout(timeoutHandle)\n return result\n}\n\nfunction receiveInitMessage(worker: WorkerType): Promise<WorkerInitMessage> {\n return new Promise((resolve, reject) => {\n const messageHandler = ((event: MessageEvent) => {\n debugMessages('Message from worker before finishing initialization:', event.data)\n if (isInitMessage(event.data)) {\n worker.removeEventListener('message', messageHandler)\n resolve(event.data)\n } else if (isUncaughtErrorMessage(event.data)) {\n worker.removeEventListener('message', messageHandler)\n reject(deserialize(event.data.error))\n }\n }) as EventListener\n worker.addEventListener('message', messageHandler)\n })\n}\n\nfunction createEventObservable(worker: WorkerType, workerTermination: Promise<any>): Observable<WorkerEvent> {\n return new Observable<WorkerEvent>((observer) => {\n const messageHandler = ((messageEvent: MessageEvent) => {\n const workerEvent: WorkerMessageEvent<any> = {\n data: messageEvent.data,\n type: WorkerEventType.message,\n }\n observer.next(workerEvent)\n }) as EventListener\n const rejectionHandler = ((errorEvent: PromiseRejectionEvent) => {\n debugThreadUtils('Unhandled promise rejection event in thread:', errorEvent)\n const workerEvent: WorkerInternalErrorEvent = {\n error: new Error(errorEvent.reason),\n type: WorkerEventType.internalError,\n }\n observer.next(workerEvent)\n }) as EventListener\n worker.addEventListener('message', messageHandler)\n worker.addEventListener('unhandledrejection', rejectionHandler)\n\n workerTermination.then(() => {\n const terminationEvent: WorkerTerminationEvent = { type: WorkerEventType.termination }\n worker.removeEventListener('message', messageHandler)\n worker.removeEventListener('unhandledrejection', rejectionHandler)\n observer.next(terminationEvent)\n observer.complete()\n })\n })\n}\n\nfunction createTerminator(worker: WorkerType): { terminate: () => Promise<void>; termination: Promise<void> } {\n const [termination, resolver] = createPromiseWithResolver<void>()\n const terminate = async () => {\n debugThreadUtils('Terminating worker')\n // Newer versions of worker_threads workers return a promise\n await worker.terminate()\n resolver()\n }\n return { terminate, termination }\n}\n\nfunction setPrivateThreadProps<T>(\n raw: T,\n worker: WorkerType,\n workerEvents: Observable<WorkerEvent>,\n terminate: () => Promise<void>,\n): T & PrivateThreadProps {\n const workerErrors = workerEvents\n .filter(event => event.type === WorkerEventType.internalError)\n .map(errorEvent => (errorEvent as WorkerInternalErrorEvent).error)\n\n return Object.assign(raw as any, {\n [$errors]: workerErrors,\n [$events]: workerEvents,\n [$terminate]: terminate,\n [$worker]: worker,\n })\n}\n\n/**\n * Spawn a new thread. Takes a fresh worker instance, wraps it in a thin\n * abstraction layer to provide the transparent API and verifies that\n * the worker has initialized successfully.\n *\n * @param worker Instance of `Worker`. Either a web worker, `worker_threads` worker or `tiny-worker` worker.\n * @param [options]\n * @param [options.timeout] Init message timeout. Default: 10000 or set by environment variable.\n */\nexport async function spawn<Exposed extends WorkerFunction | WorkerModule<any> = ArbitraryWorkerInterface>(\n worker: WorkerType,\n options?: { timeout?: number },\n): Promise<ExposedToThreadType<Exposed>> {\n debugSpawn('Initializing new thread')\n\n const timeout = options && options.timeout ? options.timeout : initMessageTimeout\n const initMessage = await withTimeout(\n receiveInitMessage(worker),\n timeout,\n `Timeout: Did not receive an init message from worker after ${timeout}ms. Make sure the worker calls expose().`,\n )\n const exposed = initMessage.exposed\n\n const { termination, terminate } = createTerminator(worker)\n const events = createEventObservable(worker, termination)\n\n if (exposed.type === 'function') {\n const proxy = createProxyFunction(worker)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n } else if (exposed.type === 'module') {\n const proxy = createProxyModule(worker, exposed.methods)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n } else {\n const type = (exposed as WorkerInitMessage['exposed']).type\n throw new Error(`Worker init message states unexpected type of expose(): ${type}`)\n }\n}\n","/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { SerializedError } from './types/messages.ts'\n\nexport interface Serializer<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg): Input\n serialize(input: Input): Msg\n}\n\nexport interface SerializerImplementation<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg, defaultDeserialize: (msg: Msg) => Input): Input\n serialize(input: Input, defaultSerialize: (inp: Input) => Msg): Msg\n}\n\nexport function extendSerializer<MessageType, InputType = any>(\n extend: Serializer<MessageType, InputType>,\n implementation: SerializerImplementation<MessageType, InputType>,\n): Serializer<MessageType, InputType> {\n const fallbackDeserializer = extend.deserialize.bind(extend)\n const fallbackSerializer = extend.serialize.bind(extend)\n\n return {\n deserialize(message: MessageType): InputType {\n return implementation.deserialize(message, fallbackDeserializer)\n },\n\n serialize(input: InputType): MessageType {\n return implementation.serialize(input, fallbackSerializer)\n },\n }\n}\n\ntype JsonSerializablePrimitive = string | number | boolean | null\n\ntype JsonSerializableObject = {\n [key: string]: JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[] | undefined\n}\n\nexport type JsonSerializable = JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[]\n\nconst DefaultErrorSerializer: Serializer<SerializedError, Error> = {\n deserialize(message: SerializedError): Error {\n return Object.assign(new Error(message.message), {\n name: message.name,\n stack: message.stack,\n })\n },\n serialize(error: Error): SerializedError {\n return {\n __error_marker: '$$error',\n message: error.message,\n name: error.name,\n stack: error.stack,\n }\n },\n}\n\nconst isSerializedError = (thing: any): thing is SerializedError =>\n thing && typeof thing === 'object' && '__error_marker' in thing && thing.__error_marker === '$$error'\n\nexport const DefaultSerializer: Serializer<JsonSerializable> = {\n deserialize(message: JsonSerializable): any {\n return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message\n },\n serialize(input: any): JsonSerializable {\n return input instanceof Error ? (DefaultErrorSerializer.serialize(input) as any as JsonSerializable) : input\n },\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n JsonSerializable, Serializer, SerializerImplementation,\n} from './serializers.ts'\nimport { DefaultSerializer, extendSerializer } from './serializers.ts'\n\ndeclare global {\n var registeredSerializer: Serializer<JsonSerializable>\n}\n\nglobalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSerializer\n\nexport function registerSerializer(serializer: SerializerImplementation<JsonSerializable>) {\n globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer)\n}\n\nexport function deserialize(message: JsonSerializable): any {\n return globalThis.registeredSerializer.deserialize(message)\n}\n\nexport function serialize(input: any): JsonSerializable {\n return globalThis.registeredSerializer.serialize(input)\n}\n","// eslint-disable-next-line unicorn/no-useless-undefined\nconst doNothing = () => undefined\n\n/**\n * Creates a new promise and exposes its resolver function.\n * Use with care!\n */\nexport function createPromiseWithResolver<T>(): [Promise<T>, (result: T) => void] {\n let alreadyResolved = false\n let resolvedTo: T\n let resolver: (value: T | PromiseLike<T>) => void = doNothing\n\n const promise = new Promise<T>((resolve) => {\n if (alreadyResolved) {\n resolve(resolvedTo)\n } else {\n resolver = resolve\n }\n })\n const exposedResolver = (value: T) => {\n alreadyResolved = true\n resolvedTo = value\n resolver(resolvedTo)\n }\n return [promise, exposedResolver]\n}\n","export const $errors = Symbol('thread.errors')\nexport const $events = Symbol('thread.events')\nexport const $terminate = Symbol('thread.terminate')\nexport const $transferable = Symbol('thread.transferable')\nexport const $worker = Symbol('thread.worker')\n","/// <reference lib=\"webworker\" />\n\n/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * This source file contains the code for proxying calls in the master thread to calls in the workers\n * by `.postMessage()`-ing.\n *\n * Keep in mind that this code can make or break the program's performance! Need to optimize more…\n */\n\nimport DebugLogger from 'debug'\nimport { multicast, Observable } from 'observable-fns'\n\nimport { deserialize, serialize } from '../common.ts'\nimport { ObservablePromise } from '../observable-promise.ts'\nimport { isTransferDescriptor } from '../transferable.ts'\nimport type {\n ModuleMethods, ModuleProxy, ProxyableFunction, Worker as WorkerType,\n} from '../types/master.ts'\nimport type {\n MasterJobCancelMessage,\n MasterJobRunMessage,\n WorkerJobErrorMessage,\n WorkerJobResultMessage,\n WorkerJobStartMessage,\n} from '../types/messages.ts'\nimport {\n MasterMessageType,\n WorkerMessageType,\n} from '../types/messages.ts'\n\nconst debugMessages = DebugLogger('threads:master:messages')\n\nlet nextJobUID = 1\n\nconst dedupe = <T>(array: T[]): T[] => [...new Set(array)]\n\nconst isJobErrorMessage = (data: any): data is WorkerJobErrorMessage => data && data.type === WorkerMessageType.error\nconst isJobResultMessage = (data: any): data is WorkerJobResultMessage => data && data.type === WorkerMessageType.result\nconst isJobStartMessage = (data: any): data is WorkerJobStartMessage => data && data.type === WorkerMessageType.running\n\nfunction createObservableForJob<ResultType>(worker: WorkerType, jobUID: number): Observable<ResultType> {\n return new Observable((observer) => {\n let asyncType: 'observable' | 'promise' | undefined\n\n const messageHandler = ((event: MessageEvent) => {\n debugMessages('Message from worker:', event.data)\n if (!event.data || event.data.uid !== jobUID) return\n\n if (isJobStartMessage(event.data)) {\n asyncType = event.data.resultType\n } else if (isJobResultMessage(event.data)) {\n if (asyncType === 'promise') {\n if (event.data.payload !== undefined) {\n observer.next(deserialize(event.data.payload))\n }\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n } else {\n if (event.data.payload) {\n observer.next(deserialize(event.data.payload))\n }\n if (event.data.complete) {\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n }\n }\n } else if (isJobErrorMessage(event.data)) {\n const error = deserialize(event.data.error as any)\n if (asyncType === 'promise' || !asyncType) {\n observer.error(error)\n } else {\n observer.error(error)\n }\n worker.removeEventListener('message', messageHandler)\n }\n }) as EventListener\n\n worker.addEventListener('message', messageHandler)\n\n return () => {\n if (asyncType === 'observable' || !asyncType) {\n const cancelMessage: MasterJobCancelMessage = {\n type: MasterMessageType.cancel,\n uid: jobUID,\n }\n worker.postMessage(cancelMessage)\n }\n worker.removeEventListener('message', messageHandler)\n }\n })\n}\n\nfunction prepareArguments(rawArgs: any[]): { args: any[]; transferables: Transferable[] } {\n if (rawArgs.length === 0) {\n // Exit early if possible\n return {\n args: [],\n transferables: [],\n }\n }\n\n const args: any[] = []\n const transferables: Transferable[] = []\n\n for (const arg of rawArgs) {\n if (isTransferDescriptor(arg)) {\n args.push(serialize(arg.send))\n transferables.push(...arg.transferables)\n } else {\n args.push(serialize(arg))\n }\n }\n\n return {\n args,\n transferables: transferables.length === 0 ? transferables : dedupe(transferables),\n }\n}\n\nexport function createProxyFunction<Args extends any[], ReturnType>(worker: WorkerType, method?: string) {\n return ((...rawArgs: Args) => {\n const uid = nextJobUID++\n const { args, transferables } = prepareArguments(rawArgs)\n const runMessage: MasterJobRunMessage = {\n args,\n method,\n type: MasterMessageType.run,\n uid,\n }\n\n debugMessages('Sending command to run function to worker:', runMessage)\n\n try {\n worker.postMessage(runMessage, transferables)\n } catch (error) {\n return ObservablePromise.from(Promise.reject(error))\n }\n\n return ObservablePromise.from(multicast(createObservableForJob<ReturnType>(worker, uid)))\n }) as any as ProxyableFunction<Args, ReturnType>\n}\n\nexport function createProxyModule<Methods extends ModuleMethods>(worker: WorkerType, methodNames: string[]): ModuleProxy<Methods> {\n const proxy: any = {}\n\n for (const methodName of methodNames) {\n proxy[methodName] = createProxyFunction(worker, methodName)\n }\n\n return proxy\n}\n","/* eslint-disable unicorn/no-thenable */\n/* eslint-disable @typescript-eslint/member-ordering */\n/* eslint-disable @typescript-eslint/no-floating-promises */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-this-alias */\n/* eslint-disable unicorn/no-this-assignment */\nimport type { ObservableLike, SubscriptionObserver } from 'observable-fns'\nimport { Observable } from 'observable-fns'\n\ntype OnFulfilled<T, Result = void> = (value: T) => Result\ntype OnRejected<Result = void> = (error: Error) => Result\n\ntype Initializer<T> = (observer: SubscriptionObserver<T>) => UnsubscribeFn | void\n\ntype Thenable<T> = { then: (onFulfilled?: (value: T) => any, onRejected?: (error: any) => any) => any }\n\ntype UnsubscribeFn = () => void\n\nconst doNothing = () => {}\nconst returnInput = <T>(input: T): T => input\nconst runDeferred = (fn: () => void) => Promise.resolve().then(fn)\n\nfunction fail(error: Error): never {\n throw error\n}\n\nfunction isThenable(thing: any): thing is Thenable<any> {\n return thing && typeof thing.then === 'function'\n}\n\n/**\n * Creates a hybrid, combining the APIs of an Observable and a Promise.\n *\n * It is used to proxy async process states when we are initially not sure\n * if that async process will yield values once (-> Promise) or multiple\n * times (-> Observable).\n *\n * Note that the observable promise inherits some of the observable's characteristics:\n * The `init` function will be called *once for every time anyone subscribes to it*.\n *\n * If this is undesired, derive a hot observable from it using `makeHot()` and\n * subscribe to that.\n */\nexport class ObservablePromise<T> extends Observable<T> implements Promise<T> {\n readonly [Symbol.toStringTag] = '[object ObservablePromise]'\n private initHasRun = false\n private fulfillmentCallbacks: Array<OnFulfilled<T>> = []\n private rejectionCallbacks: OnRejected[] = []\n\n private firstValue: T | undefined\n private firstValueSet = false\n private rejection: Error | undefined\n private state: 'fulfilled' | 'pending' | 'rejected' = 'pending'\n\n constructor(init: Initializer<T>) {\n super((originalObserver: SubscriptionObserver<T>) => {\n // tslint:disable-next-line no-this-assignment\n const self = this\n const observer: SubscriptionObserver<T> = {\n ...originalObserver,\n complete() {\n originalObserver.complete()\n self.onCompletion()\n },\n error(error: Error) {\n originalObserver.error(error)\n self.onError(error)\n },\n next(value: T) {\n originalObserver.next(value)\n self.onNext(value)\n },\n }\n\n try {\n this.initHasRun = true\n return init(observer)\n } catch (error) {\n observer.error(error)\n }\n })\n }\n\n private onNext(value: T) {\n if (!this.firstValueSet) {\n this.firstValue = value\n this.firstValueSet = true\n }\n }\n\n private onError(error: Error) {\n this.state = 'rejected'\n this.rejection = error\n\n for (const onRejected of this.rejectionCallbacks) {\n // Promisifying the call to turn errors into unhandled promise rejections\n // instead of them failing sync and cancelling the iteration\n runDeferred(() => onRejected(error))\n }\n }\n\n private onCompletion() {\n this.state = 'fulfilled'\n\n for (const onFulfilled of this.fulfillmentCallbacks) {\n // Promisifying the call to turn errors into unhandled promise rejections\n // instead of them failing sync and cancelling the iteration\n runDeferred(() => onFulfilled(this.firstValue as T))\n }\n }\n\n then<TResult1 = T, TResult2 = never>(\n onFulfilledRaw?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n onRejectedRaw?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null,\n ): Promise<TResult1 | TResult2> {\n const onFulfilled: OnFulfilled<T, TResult1> = onFulfilledRaw || (returnInput as any)\n const onRejected = onRejectedRaw || fail\n let onRejectedCalled = false\n\n return new Promise<TResult1 | TResult2>((resolve, reject) => {\n const rejectionCallback = (error: Error) => {\n if (onRejectedCalled) return\n onRejectedCalled = true\n\n try {\n resolve(onRejected(error))\n } catch (anotherError) {\n reject(anotherError)\n }\n }\n const fulfillmentCallback = (value: T) => {\n try {\n resolve(onFulfilled(value))\n } catch (ex) {\n const error = ex as Error\n rejectionCallback(error)\n }\n }\n if (!this.initHasRun) {\n this.subscribe({ error: rejectionCallback })\n }\n if (this.state === 'fulfilled') {\n return resolve(onFulfilled(this.firstValue as T))\n }\n if (this.state === 'rejected') {\n onRejectedCalled = true\n return resolve(onRejected(this.rejection as Error))\n }\n this.fulfillmentCallbacks.push(fulfillmentCallback)\n this.rejectionCallbacks.push(rejectionCallback)\n })\n }\n\n catch<Result = never>(onRejected: ((error: Error) => Promise<Result> | Result) | null | undefined) {\n return this.then(undefined, onRejected) as Promise<Result>\n }\n\n finally(onCompleted?: (() => void) | null | undefined) {\n const handler = onCompleted || doNothing\n return this.then(\n (value: T) => {\n handler()\n return value\n },\n () => handler(),\n ) as Promise<T>\n }\n\n static override from<T>(thing: Observable<T> | ObservableLike<T> | ArrayLike<T> | Thenable<T>): ObservablePromise<T> {\n return isThenable(thing)\n ? new ObservablePromise((observer) => {\n const onFulfilled = (value: T) => {\n observer.next(value)\n observer.complete()\n }\n const onRejected = (error: any) => {\n observer.error(error)\n }\n thing.then(onFulfilled, onRejected)\n })\n : (super.from(thing) as ObservablePromise<T>)\n }\n}\n","/// <reference lib=\"webworker\" />\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { $transferable } from './symbols.ts'\n\nexport interface TransferDescriptor<T = any> {\n [$transferable]: true\n send: T\n transferables: Transferable[]\n}\n\nfunction isTransferable(thing: any): thing is Transferable {\n if (!thing || typeof thing !== 'object') return false\n // Don't check too thoroughly, since the list of transferable things in JS might grow over time\n return true\n}\n\nexport function isTransferDescriptor(thing: any): thing is TransferDescriptor {\n return thing && typeof thing === 'object' && thing[$transferable]\n}\n\n/**\n * Mark a transferable object as such, so it will no be serialized and\n * deserialized on messaging with the main thread, but to transfer\n * ownership of it to the receiving thread.\n *\n * Only works with array buffers, message ports and few more special\n * types of objects, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @param transferable Array buffer, message port or similar.\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer(transferable: Transferable): TransferDescriptor\n\n/**\n * Mark transferable objects within an arbitrary object or array as\n * being a transferable object. They will then not be serialized\n * and deserialized on messaging with the main thread, but ownership\n * of them will be tranferred to the receiving thread.\n *\n * Only array buffers, message ports and few more special types of\n * objects can be transferred, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @param transferable Array buffer, message port or similar.\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer<T>(payload: T, transferables: Transferable[]): TransferDescriptor\n\nexport function Transfer<T>(payload: T, transferables?: Transferable[]): TransferDescriptor {\n console.log('Transfer')\n if (!transferables) {\n if (!isTransferable(payload)) throw new Error('Not transferable')\n transferables = [payload]\n }\n\n return {\n [$transferable]: true,\n send: payload,\n transferables,\n }\n}\n"],"mappings":"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","names":["DebugLogger","Observable","Observable","doNothing","Observable","debugMessages","DebugLogger","Observable"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/master/spawn.ts","../../../src/serializers.ts","../../../src/common.ts","../../../src/promise.ts","../../../src/symbols.ts","../../../src/master/invocation-proxy.ts","../../../src/observable-promise.ts","../../../src/transferable.ts"],"sourcesContent":["/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-floating-promises */\nimport DebugLogger from 'debug'\nimport { Observable } from 'observable-fns'\n\nimport { deserialize } from '../common.ts'\nimport { createPromiseWithResolver } from '../promise.ts'\nimport {\n $errors, $events, $terminate, $worker,\n} from '../symbols.ts'\nimport type {\n FunctionThread,\n ModuleThread,\n PrivateThreadProps,\n StripAsync,\n Worker as WorkerType,\n WorkerEvent,\n WorkerInternalErrorEvent,\n WorkerMessageEvent,\n WorkerTerminationEvent,\n} from '../types/master.ts'\nimport { WorkerEventType } from '../types/master.ts'\nimport type { WorkerInitMessage, WorkerUncaughtErrorMessage } from '../types/messages.ts'\nimport type { WorkerFunction, WorkerModule } from '../types/worker.ts'\nimport { createProxyFunction, createProxyModule } from './invocation-proxy.ts'\n\ntype ArbitraryWorkerInterface = WorkerFunction & WorkerModule<string> & { somekeythatisneverusedinproductioncode123: 'magicmarker123' }\ntype ArbitraryThreadType = FunctionThread<any, any> & ModuleThread<any>\n\nexport type ExposedToThreadType<Exposed extends WorkerFunction | WorkerModule<any>> =\n Exposed extends ArbitraryWorkerInterface ? ArbitraryThreadType\n : Exposed extends WorkerFunction ? FunctionThread<Parameters<Exposed>, StripAsync<ReturnType<Exposed>>>\n : Exposed extends WorkerModule<any> ? ModuleThread<Exposed>\n : never\n\nconst debugMessages = DebugLogger('threads:master:messages')\nconst debugSpawn = DebugLogger('threads:master:spawn')\nconst debugThreadUtils = DebugLogger('threads:master:thread-utils')\n\nconst isInitMessage = (data: any): data is WorkerInitMessage => data && data.type === ('init' as const)\nconst isUncaughtErrorMessage = (data: any): data is WorkerUncaughtErrorMessage => data && data.type === ('uncaughtError' as const)\n\nconst initMessageTimeout\n = typeof process !== 'undefined' && process.env !== undefined && process.env.THREADS_WORKER_INIT_TIMEOUT\n ? Number.parseInt(process.env.THREADS_WORKER_INIT_TIMEOUT, 10)\n : 10_000\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutInMs: number, errorMessage: string): Promise<T> {\n let timeoutHandle: any\n\n const timeout = new Promise<never>((resolve, reject) => {\n timeoutHandle = setTimeout(() => reject(new Error(errorMessage)), timeoutInMs)\n })\n const result = await Promise.race([promise, timeout])\n\n clearTimeout(timeoutHandle)\n return result\n}\n\nfunction receiveInitMessage(worker: WorkerType): Promise<WorkerInitMessage> {\n return new Promise((resolve, reject) => {\n const messageHandler = ((event: MessageEvent) => {\n debugMessages('Message from worker before finishing initialization:', event.data)\n if (isInitMessage(event.data)) {\n worker.removeEventListener('message', messageHandler)\n resolve(event.data)\n } else if (isUncaughtErrorMessage(event.data)) {\n worker.removeEventListener('message', messageHandler)\n reject(deserialize(event.data.error))\n }\n }) as EventListener\n worker.addEventListener('message', messageHandler)\n })\n}\n\nfunction createEventObservable(worker: WorkerType, workerTermination: Promise<any>): Observable<WorkerEvent> {\n return new Observable<WorkerEvent>((observer) => {\n const messageHandler = ((messageEvent: MessageEvent) => {\n const workerEvent: WorkerMessageEvent<any> = {\n data: messageEvent.data,\n type: WorkerEventType.message,\n }\n observer.next(workerEvent)\n }) as EventListener\n const rejectionHandler = ((errorEvent: PromiseRejectionEvent) => {\n debugThreadUtils('Unhandled promise rejection event in thread:', errorEvent)\n const workerEvent: WorkerInternalErrorEvent = {\n error: new Error(errorEvent.reason),\n type: WorkerEventType.internalError,\n }\n observer.next(workerEvent)\n }) as EventListener\n worker.addEventListener('message', messageHandler)\n worker.addEventListener('unhandledrejection', rejectionHandler)\n\n workerTermination.then(() => {\n const terminationEvent: WorkerTerminationEvent = { type: WorkerEventType.termination }\n worker.removeEventListener('message', messageHandler)\n worker.removeEventListener('unhandledrejection', rejectionHandler)\n observer.next(terminationEvent)\n observer.complete()\n })\n })\n}\n\nfunction createTerminator(worker: WorkerType): { terminate: () => Promise<void>; termination: Promise<void> } {\n const [termination, resolver] = createPromiseWithResolver<void>()\n const terminate = async () => {\n debugThreadUtils('Terminating worker')\n // Newer versions of worker_threads workers return a promise\n await worker.terminate()\n resolver()\n }\n return { terminate, termination }\n}\n\nfunction setPrivateThreadProps<T>(\n raw: T,\n worker: WorkerType,\n workerEvents: Observable<WorkerEvent>,\n terminate: () => Promise<void>,\n): T & PrivateThreadProps {\n const workerErrors = workerEvents\n .filter(event => event.type === WorkerEventType.internalError)\n .map(errorEvent => (errorEvent as WorkerInternalErrorEvent).error)\n\n return Object.assign(raw as any, {\n [$errors]: workerErrors,\n [$events]: workerEvents,\n [$terminate]: terminate,\n [$worker]: worker,\n })\n}\n\n/**\n * Spawn a new thread. Takes a fresh worker instance, wraps it in a thin\n * abstraction layer to provide the transparent API and verifies that\n * the worker has initialized successfully.\n *\n * @param worker Instance of `Worker`. Either a web worker or `worker_threads` worker.\n * @param [options]\n * @param [options.timeout] Init message timeout. Default: 10000 or set by environment variable.\n */\nexport async function spawn<Exposed extends WorkerFunction | WorkerModule<any> = ArbitraryWorkerInterface>(\n worker: WorkerType,\n options?: { timeout?: number },\n): Promise<ExposedToThreadType<Exposed>> {\n debugSpawn('Initializing new thread')\n\n const timeout = options && options.timeout ? options.timeout : initMessageTimeout\n const initMessage = await withTimeout(\n receiveInitMessage(worker),\n timeout,\n `Timeout: Did not receive an init message from worker after ${timeout}ms. Make sure the worker calls expose().`,\n )\n const exposed = initMessage.exposed\n\n const { termination, terminate } = createTerminator(worker)\n const events = createEventObservable(worker, termination)\n\n if (exposed.type === 'function') {\n const proxy = createProxyFunction(worker)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n } else if (exposed.type === 'module') {\n const proxy = createProxyModule(worker, exposed.methods)\n return setPrivateThreadProps(proxy, worker, events, terminate) as ExposedToThreadType<Exposed>\n } else {\n const type = (exposed as WorkerInitMessage['exposed']).type\n throw new Error(`Worker init message states unexpected type of expose(): ${type}`)\n }\n}\n","/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { SerializedError } from './types/messages.ts'\n\nexport interface Serializer<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg): Input\n serialize(input: Input): Msg\n}\n\nexport interface SerializerImplementation<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg, defaultDeserialize: (msg: Msg) => Input): Input\n serialize(input: Input, defaultSerialize: (inp: Input) => Msg): Msg\n}\n\nexport function extendSerializer<MessageType, InputType = any>(\n extend: Serializer<MessageType, InputType>,\n implementation: SerializerImplementation<MessageType, InputType>,\n): Serializer<MessageType, InputType> {\n const fallbackDeserializer = extend.deserialize.bind(extend)\n const fallbackSerializer = extend.serialize.bind(extend)\n\n return {\n deserialize(message: MessageType): InputType {\n return implementation.deserialize(message, fallbackDeserializer)\n },\n\n serialize(input: InputType): MessageType {\n return implementation.serialize(input, fallbackSerializer)\n },\n }\n}\n\ntype JsonSerializablePrimitive = string | number | boolean | null\n\ntype JsonSerializableObject = {\n [key: string]: JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[] | undefined\n}\n\nexport type JsonSerializable = JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[]\n\nconst DefaultErrorSerializer: Serializer<SerializedError, Error> = {\n deserialize(message: SerializedError): Error {\n return Object.assign(new Error(message.message), {\n name: message.name,\n stack: message.stack,\n })\n },\n serialize(error: Error): SerializedError {\n return {\n __error_marker: '$$error',\n message: error.message,\n name: error.name,\n stack: error.stack,\n }\n },\n}\n\nconst isSerializedError = (thing: any): thing is SerializedError =>\n thing && typeof thing === 'object' && '__error_marker' in thing && thing.__error_marker === '$$error'\n\nexport const DefaultSerializer: Serializer<JsonSerializable> = {\n deserialize(message: JsonSerializable): any {\n return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message\n },\n serialize(input: any): JsonSerializable {\n return input instanceof Error ? (DefaultErrorSerializer.serialize(input) as any as JsonSerializable) : input\n },\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n JsonSerializable, Serializer, SerializerImplementation,\n} from './serializers.ts'\nimport { DefaultSerializer, extendSerializer } from './serializers.ts'\n\ndeclare global {\n var registeredSerializer: Serializer<JsonSerializable>\n}\n\nglobalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSerializer\n\nexport function registerSerializer(serializer: SerializerImplementation<JsonSerializable>) {\n globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer)\n}\n\nexport function deserialize(message: JsonSerializable): any {\n return globalThis.registeredSerializer.deserialize(message)\n}\n\nexport function serialize(input: any): JsonSerializable {\n return globalThis.registeredSerializer.serialize(input)\n}\n","// eslint-disable-next-line unicorn/no-useless-undefined\nconst doNothing = () => undefined\n\n/**\n * Creates a new promise and exposes its resolver function.\n * Use with care!\n */\nexport function createPromiseWithResolver<T>(): [Promise<T>, (result: T) => void] {\n let alreadyResolved = false\n let resolvedTo: T\n let resolver: (value: T | PromiseLike<T>) => void = doNothing\n\n const promise = new Promise<T>((resolve) => {\n if (alreadyResolved) {\n resolve(resolvedTo)\n } else {\n resolver = resolve\n }\n })\n const exposedResolver = (value: T) => {\n alreadyResolved = true\n resolvedTo = value\n resolver(resolvedTo)\n }\n return [promise, exposedResolver]\n}\n","export const $errors = Symbol('thread.errors')\nexport const $events = Symbol('thread.events')\nexport const $terminate = Symbol('thread.terminate')\nexport const $transferable = Symbol('thread.transferable')\nexport const $worker = Symbol('thread.worker')\n","/// <reference lib=\"webworker\" />\n\n/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * This source file contains the code for proxying calls in the master thread to calls in the workers\n * by `.postMessage()`-ing.\n *\n * Keep in mind that this code can make or break the program's performance! Need to optimize more…\n */\n\nimport DebugLogger from 'debug'\nimport { multicast, Observable } from 'observable-fns'\n\nimport { deserialize, serialize } from '../common.ts'\nimport { ObservablePromise } from '../observable-promise.ts'\nimport { isTransferDescriptor } from '../transferable.ts'\nimport type {\n ModuleMethods, ModuleProxy, ProxyableFunction, Worker as WorkerType,\n} from '../types/master.ts'\nimport type {\n MasterJobCancelMessage,\n MasterJobRunMessage,\n WorkerJobErrorMessage,\n WorkerJobResultMessage,\n WorkerJobStartMessage,\n} from '../types/messages.ts'\nimport {\n MasterMessageType,\n WorkerMessageType,\n} from '../types/messages.ts'\n\nconst debugMessages = DebugLogger('threads:master:messages')\n\nlet nextJobUID = 1\n\nconst dedupe = <T>(array: T[]): T[] => [...new Set(array)]\n\nconst isJobErrorMessage = (data: any): data is WorkerJobErrorMessage => data && data.type === WorkerMessageType.error\nconst isJobResultMessage = (data: any): data is WorkerJobResultMessage => data && data.type === WorkerMessageType.result\nconst isJobStartMessage = (data: any): data is WorkerJobStartMessage => data && data.type === WorkerMessageType.running\n\nfunction createObservableForJob<ResultType>(worker: WorkerType, jobUID: number): Observable<ResultType> {\n return new Observable((observer) => {\n let asyncType: 'observable' | 'promise' | undefined\n\n const messageHandler = ((event: MessageEvent) => {\n debugMessages('Message from worker:', event.data)\n if (!event.data || event.data.uid !== jobUID) return\n\n if (isJobStartMessage(event.data)) {\n asyncType = event.data.resultType\n } else if (isJobResultMessage(event.data)) {\n if (asyncType === 'promise') {\n if (event.data.payload !== undefined) {\n observer.next(deserialize(event.data.payload))\n }\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n } else {\n if (event.data.payload) {\n observer.next(deserialize(event.data.payload))\n }\n if (event.data.complete) {\n observer.complete()\n worker.removeEventListener('message', messageHandler)\n }\n }\n } else if (isJobErrorMessage(event.data)) {\n const error = deserialize(event.data.error as any)\n if (asyncType === 'promise' || !asyncType) {\n observer.error(error)\n } else {\n observer.error(error)\n }\n worker.removeEventListener('message', messageHandler)\n }\n }) as EventListener\n\n worker.addEventListener('message', messageHandler)\n\n return () => {\n if (asyncType === 'observable' || !asyncType) {\n const cancelMessage: MasterJobCancelMessage = {\n type: MasterMessageType.cancel,\n uid: jobUID,\n }\n worker.postMessage(cancelMessage)\n }\n worker.removeEventListener('message', messageHandler)\n }\n })\n}\n\nfunction prepareArguments(rawArgs: any[]): { args: any[]; transferables: Transferable[] } {\n if (rawArgs.length === 0) {\n // Exit early if possible\n return {\n args: [],\n transferables: [],\n }\n }\n\n const args: any[] = []\n const transferables: Transferable[] = []\n\n for (const arg of rawArgs) {\n if (isTransferDescriptor(arg)) {\n args.push(serialize(arg.send))\n transferables.push(...arg.transferables)\n } else {\n args.push(serialize(arg))\n }\n }\n\n return {\n args,\n transferables: transferables.length === 0 ? transferables : dedupe(transferables),\n }\n}\n\nexport function createProxyFunction<Args extends any[], ReturnType>(worker: WorkerType, method?: string) {\n return ((...rawArgs: Args) => {\n const uid = nextJobUID++\n const { args, transferables } = prepareArguments(rawArgs)\n const runMessage: MasterJobRunMessage = {\n args,\n method,\n type: MasterMessageType.run,\n uid,\n }\n\n debugMessages('Sending command to run function to worker:', runMessage)\n\n try {\n worker.postMessage(runMessage, transferables)\n } catch (error) {\n return ObservablePromise.from(Promise.reject(error))\n }\n\n return ObservablePromise.from(multicast(createObservableForJob<ReturnType>(worker, uid)))\n }) as any as ProxyableFunction<Args, ReturnType>\n}\n\nexport function createProxyModule<Methods extends ModuleMethods>(worker: WorkerType, methodNames: string[]): ModuleProxy<Methods> {\n const proxy: any = {}\n\n for (const methodName of methodNames) {\n proxy[methodName] = createProxyFunction(worker, methodName)\n }\n\n return proxy\n}\n","/* eslint-disable unicorn/no-thenable */\n/* eslint-disable @typescript-eslint/member-ordering */\n/* eslint-disable @typescript-eslint/no-floating-promises */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-this-alias */\n/* eslint-disable unicorn/no-this-assignment */\nimport type { ObservableLike, SubscriptionObserver } from 'observable-fns'\nimport { Observable } from 'observable-fns'\n\ntype OnFulfilled<T, Result = void> = (value: T) => Result\ntype OnRejected<Result = void> = (error: Error) => Result\n\ntype Initializer<T> = (observer: SubscriptionObserver<T>) => UnsubscribeFn | void\n\ntype Thenable<T> = { then: (onFulfilled?: (value: T) => any, onRejected?: (error: any) => any) => any }\n\ntype UnsubscribeFn = () => void\n\nconst doNothing = () => {}\nconst returnInput = <T>(input: T): T => input\nconst runDeferred = (fn: () => void) => Promise.resolve().then(fn)\n\nfunction fail(error: Error): never {\n throw error\n}\n\nfunction isThenable(thing: any): thing is Thenable<any> {\n return thing && typeof thing.then === 'function'\n}\n\n/**\n * Creates a hybrid, combining the APIs of an Observable and a Promise.\n *\n * It is used to proxy async process states when we are initially not sure\n * if that async process will yield values once (-> Promise) or multiple\n * times (-> Observable).\n *\n * Note that the observable promise inherits some of the observable's characteristics:\n * The `init` function will be called *once for every time anyone subscribes to it*.\n *\n * If this is undesired, derive a hot observable from it using `makeHot()` and\n * subscribe to that.\n */\nexport class ObservablePromise<T> extends Observable<T> implements Promise<T> {\n readonly [Symbol.toStringTag] = '[object ObservablePromise]'\n private initHasRun = false\n private fulfillmentCallbacks: Array<OnFulfilled<T>> = []\n private rejectionCallbacks: OnRejected[] = []\n\n private firstValue: T | undefined\n private firstValueSet = false\n private rejection: Error | undefined\n private state: 'fulfilled' | 'pending' | 'rejected' = 'pending'\n\n constructor(init: Initializer<T>) {\n super((originalObserver: SubscriptionObserver<T>) => {\n // tslint:disable-next-line no-this-assignment\n const self = this\n const observer: SubscriptionObserver<T> = {\n ...originalObserver,\n complete() {\n originalObserver.complete()\n self.onCompletion()\n },\n error(error: Error) {\n originalObserver.error(error)\n self.onError(error)\n },\n next(value: T) {\n originalObserver.next(value)\n self.onNext(value)\n },\n }\n\n try {\n this.initHasRun = true\n return init(observer)\n } catch (error) {\n observer.error(error)\n }\n })\n }\n\n private onNext(value: T) {\n if (!this.firstValueSet) {\n this.firstValue = value\n this.firstValueSet = true\n }\n }\n\n private onError(error: Error) {\n this.state = 'rejected'\n this.rejection = error\n\n for (const onRejected of this.rejectionCallbacks) {\n // Promisifying the call to turn errors into unhandled promise rejections\n // instead of them failing sync and cancelling the iteration\n runDeferred(() => onRejected(error))\n }\n }\n\n private onCompletion() {\n this.state = 'fulfilled'\n\n for (const onFulfilled of this.fulfillmentCallbacks) {\n // Promisifying the call to turn errors into unhandled promise rejections\n // instead of them failing sync and cancelling the iteration\n runDeferred(() => onFulfilled(this.firstValue as T))\n }\n }\n\n then<TResult1 = T, TResult2 = never>(\n onFulfilledRaw?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n onRejectedRaw?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null,\n ): Promise<TResult1 | TResult2> {\n const onFulfilled: OnFulfilled<T, TResult1> = onFulfilledRaw || (returnInput as any)\n const onRejected = onRejectedRaw || fail\n let onRejectedCalled = false\n\n return new Promise<TResult1 | TResult2>((resolve, reject) => {\n const rejectionCallback = (error: Error) => {\n if (onRejectedCalled) return\n onRejectedCalled = true\n\n try {\n resolve(onRejected(error))\n } catch (anotherError) {\n reject(anotherError)\n }\n }\n const fulfillmentCallback = (value: T) => {\n try {\n resolve(onFulfilled(value))\n } catch (ex) {\n const error = ex as Error\n rejectionCallback(error)\n }\n }\n if (!this.initHasRun) {\n this.subscribe({ error: rejectionCallback })\n }\n if (this.state === 'fulfilled') {\n return resolve(onFulfilled(this.firstValue as T))\n }\n if (this.state === 'rejected') {\n onRejectedCalled = true\n return resolve(onRejected(this.rejection as Error))\n }\n this.fulfillmentCallbacks.push(fulfillmentCallback)\n this.rejectionCallbacks.push(rejectionCallback)\n })\n }\n\n catch<Result = never>(onRejected: ((error: Error) => Promise<Result> | Result) | null | undefined) {\n return this.then(undefined, onRejected) as Promise<Result>\n }\n\n finally(onCompleted?: (() => void) | null | undefined) {\n const handler = onCompleted || doNothing\n return this.then(\n (value: T) => {\n handler()\n return value\n },\n () => handler(),\n ) as Promise<T>\n }\n\n static override from<T>(thing: Observable<T> | ObservableLike<T> | ArrayLike<T> | Thenable<T>): ObservablePromise<T> {\n return isThenable(thing)\n ? new ObservablePromise((observer) => {\n const onFulfilled = (value: T) => {\n observer.next(value)\n observer.complete()\n }\n const onRejected = (error: any) => {\n observer.error(error)\n }\n thing.then(onFulfilled, onRejected)\n })\n : (super.from(thing) as ObservablePromise<T>)\n }\n}\n","/// <reference lib=\"webworker\" />\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { $transferable } from './symbols.ts'\n\nexport interface TransferDescriptor<T = any> {\n [$transferable]: true\n send: T\n transferables: Transferable[]\n}\n\nfunction isTransferable(thing: any): thing is Transferable {\n if (!thing || typeof thing !== 'object') return false\n // Don't check too thoroughly, since the list of transferable things in JS might grow over time\n return true\n}\n\nexport function isTransferDescriptor(thing: any): thing is TransferDescriptor {\n return thing && typeof thing === 'object' && thing[$transferable]\n}\n\n/**\n * Mark a transferable object as such, so it will no be serialized and\n * deserialized on messaging with the main thread, but to transfer\n * ownership of it to the receiving thread.\n *\n * Only works with array buffers, message ports and few more special\n * types of objects, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @param transferable Array buffer, message port or similar.\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer(transferable: Transferable): TransferDescriptor\n\n/**\n * Mark transferable objects within an arbitrary object or array as\n * being a transferable object. They will then not be serialized\n * and deserialized on messaging with the main thread, but ownership\n * of them will be tranferred to the receiving thread.\n *\n * Only array buffers, message ports and few more special types of\n * objects can be transferred, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @param transferable Array buffer, message port or similar.\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer<T>(payload: T, transferables: Transferable[]): TransferDescriptor\n\nexport function Transfer<T>(payload: T, transferables?: Transferable[]): TransferDescriptor {\n console.log('Transfer')\n if (!transferables) {\n if (!isTransferable(payload)) throw new Error('Not transferable')\n transferables = [payload]\n }\n\n return {\n [$transferable]: true,\n send: payload,\n transferables,\n }\n}\n"],"mappings":"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","names":["DebugLogger","Observable","Observable","doNothing","Observable","debugMessages","DebugLogger","Observable"]}
|
|
@@ -50,10 +50,10 @@ interface AnyModuleThread extends PrivateThreadProps {
|
|
|
50
50
|
/** Worker thread. Either a `FunctionThread` or a `ModuleThread`. */
|
|
51
51
|
type Thread = AnyFunctionThread | AnyModuleThread;
|
|
52
52
|
type TransferList = Transferable[];
|
|
53
|
-
/** Worker instance. Either a web worker or a node.js Worker provided by `worker_threads
|
|
53
|
+
/** Worker instance. Either a web worker or a node.js Worker provided by `worker_threads`. */
|
|
54
54
|
interface Worker extends EventTarget {
|
|
55
55
|
postMessage(value: any, transferList?: TransferList): void;
|
|
56
|
-
/** In nodejs
|
|
56
|
+
/** In nodejs return type is Promise while in browser return type is void */
|
|
57
57
|
terminate(callback?: (error?: Error, exitCode?: number) => void): void | Promise<number>;
|
|
58
58
|
}
|
|
59
59
|
/** Event as emitted by worker thread. Subscribe to using `Thread.events(thread)`. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { F as FunctionThread, M as ModuleThread, S as StripAsync, a as Worker$1, B as BlobWorker$1, b as WorkerImplementation } from './master-
|
|
1
|
+
import { F as FunctionThread, M as ModuleThread, S as StripAsync, a as Worker$1, B as BlobWorker$1, b as WorkerImplementation } from './master-CTbq2uzL.js';
|
|
2
2
|
import { Observable } from 'observable-fns';
|
|
3
|
-
import { T as Thread, P as PoolEvent, a as PoolEventType, b as TaskRunFunction, Q as QueuedTask } from './pool-types-
|
|
3
|
+
import { T as Thread, P as PoolEvent, a as PoolEventType, b as TaskRunFunction, Q as QueuedTask } from './pool-types-CTBjm1B2.js';
|
|
4
4
|
import { W as WorkerFunction, a as WorkerModule } from './worker-04t9iwDh.js';
|
|
5
5
|
import './master/implementation.node.js';
|
|
6
6
|
|
|
@@ -100,7 +100,7 @@ type ExposedToThreadType<Exposed extends WorkerFunction | WorkerModule<any>> = E
|
|
|
100
100
|
* abstraction layer to provide the transparent API and verifies that
|
|
101
101
|
* the worker has initialized successfully.
|
|
102
102
|
*
|
|
103
|
-
* @param worker Instance of `Worker`. Either a web worker
|
|
103
|
+
* @param worker Instance of `Worker`. Either a web worker or `worker_threads` worker.
|
|
104
104
|
* @param [options]
|
|
105
105
|
* @param [options.timeout] Init message timeout. Default: 10000 or set by environment variable.
|
|
106
106
|
*/
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { D as DefaultSerializer, J as JsonSerializable, S as Serializer, a as SerializerImplementation, r as registerSerializer } from './common-Cuiya5FG.js';
|
|
2
|
-
export { B as BlobWorker, E as ExposedAs, P as Pool, W as Worker, s as spawn } from './index-node-
|
|
3
|
-
export { Q as QueuedTask, T as Thread } from './pool-types-
|
|
2
|
+
export { B as BlobWorker, E as ExposedAs, P as Pool, W as Worker, s as spawn } from './index-node-BjbCKNdn.js';
|
|
3
|
+
export { Q as QueuedTask, T as Thread } from './pool-types-CTBjm1B2.js';
|
|
4
4
|
export { T as Transfer, a as TransferDescriptor } from './transferable-BjEBIWqm.js';
|
|
5
|
-
export { F as FunctionThread, M as ModuleThread } from './master-
|
|
5
|
+
export { F as FunctionThread, M as ModuleThread } from './master-CTbq2uzL.js';
|
|
6
6
|
export { isWorkerRuntime } from './master/implementation.node.js';
|
|
7
7
|
import 'observable-fns';
|
|
8
8
|
import './worker-04t9iwDh.js';
|
package/dist/node/index-node.mjs
CHANGED
|
@@ -1,141 +1,3 @@
|
|
|
1
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
3
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
4
|
-
}) : x)(function(x) {
|
|
5
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
6
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
-
});
|
|
8
|
-
var __commonJS = (cb, mod) => function __require2() {
|
|
9
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
// ../../node_modules/.store/tiny-worker-npm-2.3.0-38c7100e1d/package/lib/index.js
|
|
13
|
-
var require_lib = __commonJS({
|
|
14
|
-
"../../node_modules/.store/tiny-worker-npm-2.3.0-38c7100e1d/package/lib/index.js"(exports, module) {
|
|
15
|
-
"use strict";
|
|
16
|
-
var _createClass = /* @__PURE__ */ (function() {
|
|
17
|
-
function defineProperties(target, props) {
|
|
18
|
-
for (var i = 0; i < props.length; i++) {
|
|
19
|
-
var descriptor = props[i];
|
|
20
|
-
descriptor.enumerable = descriptor.enumerable || false;
|
|
21
|
-
descriptor.configurable = true;
|
|
22
|
-
if ("value" in descriptor) descriptor.writable = true;
|
|
23
|
-
Object.defineProperty(target, descriptor.key, descriptor);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return function(Constructor, protoProps, staticProps) {
|
|
27
|
-
if (protoProps) defineProperties(Constructor.prototype, protoProps);
|
|
28
|
-
if (staticProps) defineProperties(Constructor, staticProps);
|
|
29
|
-
return Constructor;
|
|
30
|
-
};
|
|
31
|
-
})();
|
|
32
|
-
function _classCallCheck(instance, Constructor) {
|
|
33
|
-
if (!(instance instanceof Constructor)) {
|
|
34
|
-
throw new TypeError("Cannot call a class as a function");
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
var path2 = __require("path");
|
|
38
|
-
var fork = __require("child_process").fork;
|
|
39
|
-
var worker = path2.join(__dirname, "worker.js");
|
|
40
|
-
var events = /^(error|message)$/;
|
|
41
|
-
var defaultPorts = { inspect: 9229, debug: 5858 };
|
|
42
|
-
var range = { min: 1, max: 300 };
|
|
43
|
-
var Worker3 = (function() {
|
|
44
|
-
function Worker4(arg) {
|
|
45
|
-
var _this = this;
|
|
46
|
-
var args = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
|
|
47
|
-
var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : { cwd: process.cwd() };
|
|
48
|
-
_classCallCheck(this, Worker4);
|
|
49
|
-
var isfn = typeof arg === "function", input = isfn ? arg.toString() : arg;
|
|
50
|
-
if (!options.cwd) {
|
|
51
|
-
options.cwd = process.cwd();
|
|
52
|
-
}
|
|
53
|
-
var debugVars = process.execArgv.filter(function(execArg) {
|
|
54
|
-
return /(debug|inspect)/.test(execArg);
|
|
55
|
-
});
|
|
56
|
-
if (debugVars.length > 0 && !options.noDebugRedirection) {
|
|
57
|
-
if (!options.execArgv) {
|
|
58
|
-
debugVars = Array.from(process.execArgv);
|
|
59
|
-
options.execArgv = [];
|
|
60
|
-
}
|
|
61
|
-
var inspectIndex = debugVars.findIndex(function(debugArg) {
|
|
62
|
-
return /^--inspect(-brk)?(=\d+)?$/.test(debugArg);
|
|
63
|
-
});
|
|
64
|
-
var debugIndex = debugVars.findIndex(function(debugArg) {
|
|
65
|
-
return /^--debug(-brk)?(=\d+)?$/.test(debugArg);
|
|
66
|
-
});
|
|
67
|
-
var portIndex = inspectIndex >= 0 ? inspectIndex : debugIndex;
|
|
68
|
-
if (portIndex >= 0) {
|
|
69
|
-
var match = /^--(debug|inspect)(?:-brk)?(?:=(\d+))?$/.exec(debugVars[portIndex]);
|
|
70
|
-
var port = defaultPorts[match[1]];
|
|
71
|
-
if (match[2]) {
|
|
72
|
-
port = parseInt(match[2]);
|
|
73
|
-
}
|
|
74
|
-
debugVars[portIndex] = "--" + match[1] + "=" + (port + range.min + Math.floor(Math.random() * (range.max - range.min)));
|
|
75
|
-
if (debugIndex >= 0 && debugIndex !== portIndex) {
|
|
76
|
-
match = /^(--debug)(?:-brk)?(.*)/.exec(debugVars[debugIndex]);
|
|
77
|
-
debugVars[debugIndex] = match[1] + (match[2] ? match[2] : "");
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
options.execArgv = options.execArgv.concat(debugVars);
|
|
81
|
-
}
|
|
82
|
-
delete options.noDebugRedirection;
|
|
83
|
-
this.child = fork(worker, args, options);
|
|
84
|
-
this.onerror = void 0;
|
|
85
|
-
this.onmessage = void 0;
|
|
86
|
-
this.child.on("error", function(e) {
|
|
87
|
-
if (_this.onerror) {
|
|
88
|
-
_this.onerror.call(_this, e);
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
this.child.on("message", function(msg) {
|
|
92
|
-
var message = JSON.parse(msg);
|
|
93
|
-
var error = void 0;
|
|
94
|
-
if (!message.error && _this.onmessage) {
|
|
95
|
-
_this.onmessage.call(_this, message);
|
|
96
|
-
}
|
|
97
|
-
if (message.error && _this.onerror) {
|
|
98
|
-
error = new Error(message.error);
|
|
99
|
-
error.stack = message.stack;
|
|
100
|
-
_this.onerror.call(_this, error);
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
this.child.send({ input, isfn, cwd: options.cwd, esm: options.esm });
|
|
104
|
-
}
|
|
105
|
-
_createClass(Worker4, [{
|
|
106
|
-
key: "addEventListener",
|
|
107
|
-
value: function addEventListener(event, fn) {
|
|
108
|
-
if (events.test(event)) {
|
|
109
|
-
this["on" + event] = fn;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}, {
|
|
113
|
-
key: "postMessage",
|
|
114
|
-
value: function postMessage(msg) {
|
|
115
|
-
this.child.send(JSON.stringify({ data: msg }, null, 0));
|
|
116
|
-
}
|
|
117
|
-
}, {
|
|
118
|
-
key: "terminate",
|
|
119
|
-
value: function terminate() {
|
|
120
|
-
this.child.kill("SIGINT");
|
|
121
|
-
}
|
|
122
|
-
}], [{
|
|
123
|
-
key: "setRange",
|
|
124
|
-
value: function setRange(min, max) {
|
|
125
|
-
if (min >= max) {
|
|
126
|
-
return false;
|
|
127
|
-
}
|
|
128
|
-
range.min = min;
|
|
129
|
-
range.max = max;
|
|
130
|
-
return true;
|
|
131
|
-
}
|
|
132
|
-
}]);
|
|
133
|
-
return Worker4;
|
|
134
|
-
})();
|
|
135
|
-
module.exports = Worker3;
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
|
|
139
1
|
// src/serializers.ts
|
|
140
2
|
function extendSerializer(extend, implementation2) {
|
|
141
3
|
const fallbackDeserializer = extend.deserialize.bind(extend);
|
|
@@ -188,11 +50,10 @@ function serialize(input) {
|
|
|
188
50
|
}
|
|
189
51
|
|
|
190
52
|
// src/master/implementation.node.ts
|
|
191
|
-
import { EventEmitter } from "events";
|
|
192
53
|
import { cpus } from "os";
|
|
193
54
|
import path from "path";
|
|
194
55
|
import { cwd } from "process";
|
|
195
|
-
import { Worker as NativeWorker } from "worker_threads";
|
|
56
|
+
import { isMainThread, Worker as NativeWorker } from "worker_threads";
|
|
196
57
|
var defaultPoolSize = cpus().length;
|
|
197
58
|
function resolveScriptPath(scriptPath, baseURL) {
|
|
198
59
|
const makeAbsolute = (filePath) => {
|
|
@@ -250,83 +111,15 @@ function initWorkerThreadsWorker() {
|
|
|
250
111
|
default: Worker3
|
|
251
112
|
};
|
|
252
113
|
}
|
|
253
|
-
function initTinyWorker() {
|
|
254
|
-
const TinyWorker = require_lib();
|
|
255
|
-
let allWorkers = [];
|
|
256
|
-
class Worker3 extends TinyWorker {
|
|
257
|
-
emitter;
|
|
258
|
-
constructor(scriptPath, options) {
|
|
259
|
-
const resolvedScriptPath = options && options.fromSource ? null : process.platform === "win32" ? `file:///${resolveScriptPath(scriptPath).replaceAll("\\", "/")}` : resolveScriptPath(scriptPath);
|
|
260
|
-
if (resolvedScriptPath) {
|
|
261
|
-
super(resolvedScriptPath, [], { esm: true });
|
|
262
|
-
} else {
|
|
263
|
-
const sourceCode = scriptPath;
|
|
264
|
-
super(new Function(sourceCode), [], { esm: true });
|
|
265
|
-
}
|
|
266
|
-
allWorkers.push(this);
|
|
267
|
-
this.emitter = new EventEmitter();
|
|
268
|
-
this.onerror = (error) => this.emitter.emit("error", error);
|
|
269
|
-
this.onmessage = (message) => this.emitter.emit("message", message);
|
|
270
|
-
}
|
|
271
|
-
addEventListener(eventName, listener) {
|
|
272
|
-
this.emitter.addListener(eventName, listener);
|
|
273
|
-
}
|
|
274
|
-
removeEventListener(eventName, listener) {
|
|
275
|
-
this.emitter.removeListener(eventName, listener);
|
|
276
|
-
}
|
|
277
|
-
terminate() {
|
|
278
|
-
allWorkers = allWorkers.filter((worker) => worker !== this);
|
|
279
|
-
return super.terminate();
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
const terminateWorkersAndMaster = () => {
|
|
283
|
-
Promise.all(allWorkers.map((worker) => worker.terminate())).then(
|
|
284
|
-
() => process.exit(0),
|
|
285
|
-
() => process.exit(1)
|
|
286
|
-
);
|
|
287
|
-
allWorkers = [];
|
|
288
|
-
};
|
|
289
|
-
process.on("SIGINT", () => terminateWorkersAndMaster());
|
|
290
|
-
process.on("SIGTERM", () => terminateWorkersAndMaster());
|
|
291
|
-
class BlobWorker2 extends Worker3 {
|
|
292
|
-
constructor(blob, options) {
|
|
293
|
-
super(Buffer.from(blob).toString("utf-8"), { ...options, fromSource: true });
|
|
294
|
-
}
|
|
295
|
-
static fromText(source, options) {
|
|
296
|
-
return new Worker3(source, { ...options, fromSource: true });
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
return {
|
|
300
|
-
blob: BlobWorker2,
|
|
301
|
-
default: Worker3
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
114
|
var implementation;
|
|
305
|
-
var isTinyWorker;
|
|
306
|
-
function selectWorkerImplementation() {
|
|
307
|
-
try {
|
|
308
|
-
isTinyWorker = false;
|
|
309
|
-
return initWorkerThreadsWorker();
|
|
310
|
-
} catch (ex) {
|
|
311
|
-
console.error(ex);
|
|
312
|
-
console.debug("Node worker_threads not available. Trying to fall back to tiny-worker polyfill...");
|
|
313
|
-
isTinyWorker = true;
|
|
314
|
-
return initTinyWorker();
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
115
|
function getWorkerImplementation() {
|
|
318
116
|
if (!implementation) {
|
|
319
|
-
implementation =
|
|
117
|
+
implementation = initWorkerThreadsWorker();
|
|
320
118
|
}
|
|
321
119
|
return implementation;
|
|
322
120
|
}
|
|
323
121
|
function isWorkerRuntime() {
|
|
324
|
-
|
|
325
|
-
return globalThis !== void 0 && self["postMessage"] ? true : false;
|
|
326
|
-
} else {
|
|
327
|
-
const isMainThread = typeof __non_webpack_require__ === "function" ? __non_webpack_require__("worker_threads").isMainThread : eval("require")("worker_threads").isMainThread;
|
|
328
|
-
return !isMainThread;
|
|
329
|
-
}
|
|
122
|
+
return !isMainThread;
|
|
330
123
|
}
|
|
331
124
|
|
|
332
125
|
// src/master/pool-browser.ts
|