Commit | Line | Data |
---|---|---|
d972af76 JB |
1 | import type { EventEmitter } from 'node:events'; |
2 | import { existsSync } from 'node:fs'; | |
be245fda | 3 | import type { Worker } from 'node:worker_threads'; |
4bfd80fa | 4 | |
d972af76 | 5 | import type { ErrorHandler, ExitHandler, PoolEmitter, PoolInfo } from 'poolifier'; |
b779c0f8 | 6 | |
268a74bb | 7 | import { WorkerConstants } from './WorkerConstants'; |
b779c0f8 | 8 | import type { SetInfo, WorkerData, WorkerOptions } from './WorkerTypes'; |
be245fda | 9 | import { defaultErrorHandler, defaultExitHandler } from './WorkerUtils'; |
7dde0b73 | 10 | |
268a74bb | 11 | export abstract class WorkerAbstract<T extends WorkerData> { |
322c9192 | 12 | protected readonly workerScript: string; |
4d7227e6 | 13 | protected readonly workerOptions: WorkerOptions; |
b779c0f8 | 14 | public abstract readonly info: PoolInfo | SetInfo; |
f2bf9948 | 15 | public abstract readonly size: number; |
72092cfc | 16 | public abstract readonly maxElementsPerWorker: number | undefined; |
d972af76 | 17 | public abstract readonly emitter: EventEmitter | PoolEmitter | undefined; |
6af9012e | 18 | |
7dde0b73 | 19 | /** |
e71cccf3 | 20 | * `WorkerAbstract` constructor. |
7dde0b73 | 21 | * |
0e4fa348 JB |
22 | * @param workerScript - |
23 | * @param workerOptions - | |
7dde0b73 | 24 | */ |
e7aeea18 JB |
25 | constructor( |
26 | workerScript: string, | |
27 | workerOptions: WorkerOptions = { | |
3fa0f0ed JB |
28 | workerStartDelay: WorkerConstants.DEFAULT_WORKER_START_DELAY, |
29 | elementStartDelay: WorkerConstants.DEFAULT_ELEMENT_START_DELAY, | |
30 | poolMinSize: WorkerConstants.DEFAULT_POOL_MIN_SIZE, | |
31 | poolMaxSize: WorkerConstants.DEFAULT_POOL_MAX_SIZE, | |
32 | elementsPerWorker: WorkerConstants.DEFAULT_ELEMENTS_PER_WORKER, | |
abe9e9dd | 33 | poolOptions: {}, |
e7aeea18 JB |
34 | } |
35 | ) { | |
ba516f9c | 36 | if (workerScript === null || workerScript === undefined) { |
44a95b7f JB |
37 | throw new Error('Worker script is not defined'); |
38 | } | |
ba516f9c JB |
39 | if (typeof workerScript === 'string' && workerScript.trim().length === 0) { |
40 | throw new Error('Worker script is empty'); | |
41 | } | |
d972af76 | 42 | if (!existsSync(workerScript)) { |
44a95b7f JB |
43 | throw new Error('Worker script file does not exist'); |
44 | } | |
ad2f27c3 | 45 | this.workerScript = workerScript; |
4d7227e6 | 46 | this.workerOptions = workerOptions; |
be245fda JB |
47 | this.workerOptions.poolOptions?.messageHandler?.bind(this); |
48 | this.workerOptions.poolOptions.errorHandler = ( | |
49 | this.workerOptions?.poolOptions?.errorHandler ?? defaultErrorHandler | |
50 | ).bind(this) as ErrorHandler<Worker>; | |
51 | this.workerOptions.poolOptions?.onlineHandler?.bind(this); | |
52 | this.workerOptions.poolOptions.exitHandler = ( | |
53 | this.workerOptions?.poolOptions?.exitHandler ?? defaultExitHandler | |
54 | ).bind(this) as ExitHandler<Worker>; | |
7dde0b73 JB |
55 | } |
56 | ||
8baf3f8f | 57 | /** |
361c98f5 | 58 | * Starts the worker pool/set. |
8baf3f8f | 59 | */ |
418106c8 | 60 | public abstract start(): Promise<void>; |
8baf3f8f | 61 | /** |
361c98f5 | 62 | * Stops the worker pool/set. |
8baf3f8f | 63 | */ |
ded13d97 | 64 | public abstract stop(): Promise<void>; |
8baf3f8f | 65 | /** |
361c98f5 | 66 | * Adds a task element to the worker pool/set. |
8baf3f8f JB |
67 | * |
68 | * @param elementData - | |
69 | */ | |
c3ee95af | 70 | public abstract addElement(elementData: T): Promise<void>; |
7dde0b73 | 71 | } |