refactor: refine OCPP stack log message
[e-mobility-charging-stations-simulator.git] / src / worker / WorkerFactory.ts
... / ...
CommitLineData
1import { isMainThread } from 'node:worker_threads';
2
3import type { WorkerAbstract } from './WorkerAbstract';
4import { DEFAULT_WORKER_OPTIONS } from './WorkerConstants';
5import { WorkerDynamicPool } from './WorkerDynamicPool';
6import { WorkerFixedPool } from './WorkerFixedPool';
7import { WorkerSet } from './WorkerSet';
8import { type WorkerData, type WorkerOptions, WorkerProcessType } from './WorkerTypes';
9
10export 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> | null {
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> | null = null;
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}