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