1 import type { EventEmitter
} from
'node:events';
2 import { existsSync
} from
'node:fs';
4 import type { PoolEmitter
, PoolInfo
} from
'poolifier';
6 import { WorkerConstants
} from
'./WorkerConstants';
7 import type { SetInfo
, WorkerData
, WorkerOptions
} from
'./WorkerTypes';
8 import { defaultErrorHandler
, defaultExitHandler
} from
'./WorkerUtils';
10 export abstract class WorkerAbstract
<T
extends WorkerData
> {
11 protected readonly workerScript
: string;
12 protected readonly workerOptions
: WorkerOptions
;
13 public abstract readonly info
: PoolInfo
| SetInfo
;
14 public abstract readonly size
: number;
15 public abstract readonly maxElementsPerWorker
: number | undefined;
16 public abstract readonly emitter
: EventEmitter
| PoolEmitter
| undefined;
19 * `WorkerAbstract` constructor.
21 * @param workerScript -
22 * @param workerOptions -
26 workerOptions
: WorkerOptions
= {
27 workerStartDelay
: WorkerConstants
.DEFAULT_WORKER_START_DELAY
,
28 elementStartDelay
: WorkerConstants
.DEFAULT_ELEMENT_START_DELAY
,
29 poolMinSize
: WorkerConstants
.DEFAULT_POOL_MIN_SIZE
,
30 poolMaxSize
: WorkerConstants
.DEFAULT_POOL_MAX_SIZE
,
31 elementsPerWorker
: WorkerConstants
.DEFAULT_ELEMENTS_PER_WORKER
,
35 if (workerScript
=== null || workerScript
=== undefined) {
36 throw new Error('Worker script is not defined');
38 if (typeof workerScript
=== 'string' && workerScript
.trim().length
=== 0) {
39 throw new Error('Worker script is empty');
41 if (!existsSync(workerScript
)) {
42 throw new Error('Worker script file does not exist');
44 this.workerScript
= workerScript
;
45 this.workerOptions
= workerOptions
;
46 this.workerOptions
.poolOptions
!.errorHandler
=
47 this.workerOptions
.poolOptions
?.errorHandler
?? defaultErrorHandler
;
48 this.workerOptions
.poolOptions
!.exitHandler
=
49 this.workerOptions
.poolOptions
?.exitHandler
?? defaultExitHandler
;
53 * Starts the worker pool/set.
55 public abstract start(): Promise
<void>;
57 * Stops the worker pool/set.
59 public abstract stop(): Promise
<void>;
61 * Adds a task element to the worker pool/set.
63 * @param elementData -
65 public abstract addElement(elementData
: T
): Promise
<void>;