67da00d88a5b2d32572fa2f8a5f422fe3b73a843
1 import { isMainThread
} from
'node:worker_threads'
3 import { mergeDeepRight
} from
'rambda'
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'
12 // eslint-disable-next-line @typescript-eslint/no-extraneous-class
13 export class WorkerFactory
{
14 private constructor () {
15 // This is intentional
18 public static getWorkerImplementation
<T
extends WorkerData
>(
20 workerProcessType
: WorkerProcessType
,
21 workerOptions
?: WorkerOptions
22 ): WorkerAbstract
<T
> | undefined {
24 throw new Error('Cannot get a worker implementation outside the main thread')
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
)
32 case WorkerProcessType
.fixedPool
:
33 workerImplementation
= new WorkerFixedPool(workerScript
, workerOptions
)
35 case WorkerProcessType
.dynamicPool
:
36 workerImplementation
= new WorkerDynamicPool(workerScript
, workerOptions
)
39 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
40 throw new Error(`Worker implementation type '${workerProcessType}' not found`)
42 return workerImplementation