1 import type { EventEmitterAsyncResource
} from
'node:events'
3 import { FixedThreadPool
, type PoolInfo
} from
'poolifier'
5 import { WorkerAbstract
} from
'./WorkerAbstract.js'
6 import type { WorkerData
, WorkerOptions
} from
'./WorkerTypes.js'
7 import { randomizeDelay
, sleep
} from
'./WorkerUtils.js'
9 export class WorkerFixedPool
<D
extends WorkerData
, R
extends WorkerData
> extends WorkerAbstract
<
13 private readonly pool
: FixedThreadPool
<D
, R
>
16 * Creates a new `WorkerFixedPool`.
18 * @param workerScript -
19 * @param workerOptions -
21 constructor (workerScript
: string, workerOptions
: WorkerOptions
) {
22 super(workerScript
, workerOptions
)
23 this.pool
= new FixedThreadPool
<D
, R
>(
24 this.workerOptions
.poolMaxSize
,
26 this.workerOptions
.poolOptions
30 get
info (): PoolInfo
{
35 return this.pool
.info
.workerNodes
38 get
maxElementsPerWorker (): number | undefined {
42 get
emitter (): EventEmitterAsyncResource
| undefined {
43 return this.pool
.emitter
47 public start (): void {
52 public async stop (): Promise
<void> {
53 await this.pool
.destroy()
57 public async addElement (elementData
: D
): Promise
<R
> {
58 const response
= await this.pool
.execute(elementData
)
59 // Start element sequentially to optimize memory at startup
60 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
61 this.workerOptions
.elementAddDelay
! > 0 &&
62 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
63 (await sleep(randomizeDelay(this.workerOptions
.elementAddDelay
!)))