fix: fix performance configuration change at runtime
[e-mobility-charging-stations-simulator.git] / src / worker / WorkerFactory.ts
1 import { isMainThread } from 'node:worker_threads';
2
3 import type { WorkerAbstract } from './WorkerAbstract';
4 import { DEFAULT_WORKER_OPTIONS } from './WorkerConstants';
5 import { WorkerDynamicPool } from './WorkerDynamicPool';
6 import { WorkerFixedPool } from './WorkerFixedPool';
7 import { WorkerSet } from './WorkerSet';
8 import { type WorkerData, type WorkerOptions, WorkerProcessType } from './WorkerTypes';
9
10 export class WorkerFactory {
11 private constructor() {
12 // This is intentional
13 }
14
15 public static getWorkerImplementation<T extends WorkerData>(
16 workerScript: string,
17 workerProcessType: WorkerProcessType,
18 workerOptions?: WorkerOptions,
19 ): WorkerAbstract<T> | undefined {
20 if (!isMainThread) {
21 throw new Error('Cannot get a worker implementation outside the main thread');
22 }
23 workerOptions = { ...DEFAULT_WORKER_OPTIONS, ...workerOptions };
24 let workerImplementation: WorkerAbstract<T>;
25 switch (workerProcessType) {
26 case WorkerProcessType.workerSet:
27 workerImplementation = new WorkerSet(workerScript, workerOptions);
28 break;
29 case WorkerProcessType.fixedPool:
30 workerImplementation = new WorkerFixedPool(workerScript, workerOptions);
31 break;
32 case WorkerProcessType.dynamicPool:
33 workerImplementation = new WorkerDynamicPool(workerScript, workerOptions);
34 break;
35 default:
36 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
37 throw new Error(`Worker implementation type '${workerProcessType}' not found`);
38 }
39 return workerImplementation;
40 }
41 }