1 import { isMainThread
} from
'node:worker_threads';
3 import type { WorkerAbstract
} from
'./WorkerAbstract';
4 import { WorkerConstants
} from
'./WorkerConstants';
5 import { WorkerDynamicPool
} from
'./WorkerDynamicPool';
6 import { WorkerSet
} from
'./WorkerSet';
7 import { WorkerStaticPool
} from
'./WorkerStaticPool';
8 import { type WorkerData
, type WorkerOptions
, WorkerProcessType
} from
'./WorkerTypes';
10 const DEFAULT_WORKER_OPTIONS
: WorkerOptions
= {
11 workerStartDelay
: WorkerConstants
.DEFAULT_WORKER_START_DELAY
,
12 elementStartDelay
: WorkerConstants
.DEFAULT_ELEMENT_START_DELAY
,
13 poolMinSize
: WorkerConstants
.DEFAULT_POOL_MIN_SIZE
,
14 poolMaxSize
: WorkerConstants
.DEFAULT_POOL_MAX_SIZE
,
15 elementsPerWorker
: WorkerConstants
.DEFAULT_ELEMENTS_PER_WORKER
,
19 export class WorkerFactory
{
20 private constructor() {
21 // This is intentional
24 public static getWorkerImplementation
<T
extends WorkerData
>(
26 workerProcessType
: WorkerProcessType
,
27 workerOptions
?: WorkerOptions
,
28 ): WorkerAbstract
<T
> | null {
30 throw new Error('Cannot get a worker implementation outside the main thread');
32 workerOptions
= { ...DEFAULT_WORKER_OPTIONS
, ...workerOptions
};
33 let workerImplementation
: WorkerAbstract
<T
> | null = null;
34 switch (workerProcessType
) {
35 case WorkerProcessType
.workerSet
:
36 workerImplementation
= new WorkerSet(workerScript
, workerOptions
);
38 case WorkerProcessType
.staticPool
:
39 workerImplementation
= new WorkerStaticPool(workerScript
, workerOptions
);
41 case WorkerProcessType
.dynamicPool
:
42 workerImplementation
= new WorkerDynamicPool(workerScript
, workerOptions
);
45 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
46 throw new Error(`Worker implementation type '${workerProcessType}' not found`);
48 return workerImplementation
;