1 import { type Worker
, isMainThread
} from
'node:worker_threads';
3 import type { PoolOptions
} from
'poolifier';
5 import type { WorkerAbstract
} from
'./WorkerAbstract';
6 import { WorkerConstants
} from
'./WorkerConstants';
7 import { WorkerDynamicPool
} from
'./WorkerDynamicPool';
8 import { WorkerSet
} from
'./WorkerSet';
9 import { WorkerStaticPool
} from
'./WorkerStaticPool';
10 import { type WorkerData
, type WorkerOptions
, WorkerProcessType
} from
'./WorkerTypes';
12 export class WorkerFactory
{
13 private constructor() {
14 // This is intentional
17 public static getWorkerImplementation
<T
extends WorkerData
>(
19 workerProcessType
: WorkerProcessType
,
20 workerOptions
?: WorkerOptions
21 ): WorkerAbstract
<T
> | null {
23 throw new Error('Cannot get a worker implementation outside the main thread');
25 workerOptions
= workerOptions
?? (WorkerConstants
.EMPTY_OBJECT
as WorkerOptions
);
26 workerOptions
.workerStartDelay
=
27 workerOptions
?.workerStartDelay
?? WorkerConstants
.DEFAULT_WORKER_START_DELAY
;
28 workerOptions
.elementStartDelay
=
29 workerOptions
?.elementStartDelay
?? WorkerConstants
.DEFAULT_ELEMENT_START_DELAY
;
30 workerOptions
.poolOptions
=
31 workerOptions
?.poolOptions
?? (WorkerConstants
.EMPTY_OBJECT
as PoolOptions
<Worker
>);
32 workerOptions
?.messageHandler
&&
33 (workerOptions
.poolOptions
.messageHandler
= workerOptions
.messageHandler
);
34 let workerImplementation
: WorkerAbstract
<T
> | null = null;
35 switch (workerProcessType
) {
36 case WorkerProcessType
.workerSet
:
37 workerOptions
.elementsPerWorker
=
38 workerOptions
?.elementsPerWorker
?? WorkerConstants
.DEFAULT_ELEMENTS_PER_WORKER
;
39 workerImplementation
= new WorkerSet(workerScript
, workerOptions
);
41 case WorkerProcessType
.staticPool
:
42 workerOptions
.poolMaxSize
=
43 workerOptions
?.poolMaxSize
?? WorkerConstants
.DEFAULT_POOL_MAX_SIZE
;
44 workerImplementation
= new WorkerStaticPool(workerScript
, workerOptions
);
46 case WorkerProcessType
.dynamicPool
:
47 workerOptions
.poolMinSize
=
48 workerOptions
?.poolMinSize
?? WorkerConstants
.DEFAULT_POOL_MIN_SIZE
;
49 workerOptions
.poolMaxSize
=
50 workerOptions
?.poolMaxSize
?? WorkerConstants
.DEFAULT_POOL_MAX_SIZE
;
51 workerImplementation
= new WorkerDynamicPool(workerScript
, workerOptions
);
54 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
55 throw new Error(`Worker implementation type '${workerProcessType}' not found`);
57 return workerImplementation
;