c2210fa122b31e0ac509856b92b9fcf8dba24534
1 import { isMainThread
} from
'node:worker_threads'
2 import { mergeDeepRight
} from
'rambda'
4 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
<D
extends WorkerData
, R
extends WorkerData
>(
20 workerProcessType
: WorkerProcessType
,
21 workerOptions
?: WorkerOptions
22 ): WorkerAbstract
<D
, R
> {
24 throw new Error('Cannot get a worker implementation outside the main thread')
26 workerOptions
= mergeDeepRight
<WorkerOptions
>(DEFAULT_WORKER_OPTIONS
, workerOptions
?? {})
27 switch (workerProcessType
) {
28 case WorkerProcessType
.dynamicPool
:
29 return new WorkerDynamicPool
<D
, R
>(workerScript
, workerOptions
)
30 case WorkerProcessType
.fixedPool
:
31 return new WorkerFixedPool
<D
, R
>(workerScript
, workerOptions
)
32 case WorkerProcessType
.workerSet
:
33 return new WorkerSet
<D
, R
>(workerScript
, workerOptions
)
35 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
36 throw new Error(`Worker implementation type '${workerProcessType}' not found`)