1 import { Worker
, isMainThread
} from
'worker_threads';
2 import { WorkerData
, WorkerOptions
, WorkerProcessType
} from
'../types/Worker';
4 import Constants from
'../utils/Constants';
5 import { PoolOptions
} from
'poolifier';
6 import type WorkerAbstract from
'./WorkerAbstract';
7 import WorkerDynamicPool from
'./WorkerDynamicPool';
8 import WorkerSet from
'./WorkerSet';
9 import WorkerStaticPool from
'./WorkerStaticPool';
11 export default class WorkerFactory
{
12 private constructor() {
13 // This is intentional
16 public static getWorkerImplementation
<T
extends WorkerData
>(
18 workerProcessType
: WorkerProcessType
,
19 workerOptions
?: WorkerOptions
20 ): WorkerAbstract
<T
> | null {
22 throw new Error('Trying to get a worker implementation outside the main thread');
24 workerOptions
= workerOptions
?? ({} as WorkerOptions
);
25 workerOptions
.workerStartDelay
=
26 workerOptions
?.workerStartDelay
?? Constants
.WORKER_START_DELAY
;
27 workerOptions
.elementStartDelay
=
28 workerOptions
?.elementStartDelay
?? Constants
.ELEMENT_START_DELAY
;
29 workerOptions
.poolOptions
= workerOptions
?.poolOptions
?? ({} as PoolOptions
<Worker
>);
30 workerOptions
?.messageHandler
&&
31 (workerOptions
.poolOptions
.messageHandler
= workerOptions
.messageHandler
);
32 let workerImplementation
: WorkerAbstract
<T
> = null;
33 switch (workerProcessType
) {
34 case WorkerProcessType
.WORKER_SET
:
35 workerOptions
.elementsPerWorker
=
36 workerOptions
?.elementsPerWorker
?? Constants
.DEFAULT_CHARGING_STATIONS_PER_WORKER
;
37 workerImplementation
= new WorkerSet(workerScript
, workerOptions
);
39 case WorkerProcessType
.STATIC_POOL
:
40 workerOptions
.poolMaxSize
=
41 workerOptions
?.poolMaxSize
?? Constants
.DEFAULT_WORKER_POOL_MAX_SIZE
;
42 workerImplementation
= new WorkerStaticPool(workerScript
, workerOptions
);
44 case WorkerProcessType
.DYNAMIC_POOL
:
45 workerOptions
.poolMinSize
=
46 workerOptions
?.poolMinSize
?? Constants
.DEFAULT_WORKER_POOL_MIN_SIZE
;
47 workerOptions
.poolMaxSize
=
48 workerOptions
?.poolMaxSize
?? Constants
.DEFAULT_WORKER_POOL_MAX_SIZE
;
49 workerImplementation
= new WorkerDynamicPool(workerScript
, workerOptions
);
52 throw new Error(`Worker implementation type '${workerProcessType}' not found`);
54 return workerImplementation
;