Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 8x 8x 1x 1x 1x 8x 8x 6x 3x 3x 3x 3x 3x 3x 3x 1x 2x 2x 2x 2x 2x 2x 2x 1x 8x 8x 8x 9x 9x 9x 9x 9x 9x | import { Endpoint, Remote, wrap } from 'comlink'; import { NodeEndpoint } from 'comlink/dist/umd/node-adapter'; import { firstValueFrom } from 'rxjs'; import { Kernel } from '../kernel/kernel'; import { TypeOf } from '../utility/type-of'; /** * This prototype property decorator factory **Spawn**s a {@link Worker} and * {@link wrap}s and assigns the resulting {@link Remote} to the decorated * prototype property. * * @param worker - The `worker` module name or {@link Endpoint} to **Spawn**. * @param source - An optional {@link Kernel.Module} `source`. * @returns A prototype property decorator. * * @example * **Spawn** a {@link Worker}: * ```ts * import { Spawn, type Thread } from '@sgrud/core'; * import { type ExampleWorker } from 'example-worker'; * * export class ExampleWorkerHandler { * * @Spawn('example-worker') * public readonly worker!: Thread<ExampleWorker>; * * } * ``` * * @see {@link Thread} */ export function Spawn( worker: string | Endpoint | NodeEndpoint, source?: string ) { /** * @param prototype - The `prototype` to be decorated. * @param propertyKey - The `prototype` property to be decorated. * @throws A {@link ReferenceError} when the environment is incompatible. */ return function(prototype: object, propertyKey: PropertyKey): void { let thread; Object.defineProperty(prototype, propertyKey, { enumerable: true, get: (): Remote<unknown> => thread ||= (async() => { if (TypeOf.process(globalThis.process)) { if (TypeOf.string(worker)) { const { Worker } = require('worker_threads'); worker = new Worker(require.resolve(worker)); } const nodeEndpoint = require('comlink/dist/umd/node-adapter'); worker = nodeEndpoint(worker); } else if (TypeOf.string(worker)) { const kernel = new Kernel(); source ||= `${kernel.nodeModules}/${worker}`; const module = await firstValueFrom(kernel.resolve(worker, source)); if (!globalThis.sgrud && module.exports) { worker = new Worker(`${source}/${module.exports}`, { type: 'module' }); } else if (globalThis.sgrud && module.unpkg) { worker = new Worker(`${source}/${module.unpkg}`, { type: 'classic' }); } else { throw new ReferenceError(module.name); } } return wrap(worker as Endpoint); })(), set: Function.prototype as (...args: any[]) => any }); }; } |