1 import type { AbstractPoolWorker
} from
'../abstract-pool-worker'
2 import type { IPoolInternal
} from
'../pool-internal'
3 import { PoolType
} from
'../pool-internal'
4 import { DynamicPoolWorkerChoiceStrategy
} from
'./dynamic-pool-worker-choice-strategy'
8 } from
'./selection-strategies-types'
9 import { WorkerChoiceStrategies
} from
'./selection-strategies-types'
10 import { SelectionStrategiesUtils
} from
'./selection-strategies-utils'
13 * The worker choice strategy context.
15 * @template Worker Type of worker.
16 * @template Data Type of data sent to the worker. This can only be serializable data.
17 * @template Response Type of response of execution. This can only be serializable data.
19 export class WorkerChoiceStrategyContext
<
20 Worker
extends AbstractPoolWorker
,
24 // Will be set by setter in constructor
25 private workerChoiceStrategy
!: IWorkerChoiceStrategy
<Worker
>
28 * Worker choice strategy context constructor.
30 * @param pool The pool instance.
31 * @param createDynamicallyWorkerCallback The worker creation callback for dynamic pool.
32 * @param workerChoiceStrategy The worker choice strategy.
35 private readonly pool
: IPoolInternal
<Worker
, Data
, Response
>,
36 private createDynamicallyWorkerCallback
: () => Worker
,
37 workerChoiceStrategy
: WorkerChoiceStrategy
= WorkerChoiceStrategies
.ROUND_ROBIN
39 this.setWorkerChoiceStrategy(workerChoiceStrategy
)
43 * Get the worker choice strategy instance specific to the pool type.
45 * @param workerChoiceStrategy The worker choice strategy.
46 * @returns The worker choice strategy instance for the pool type.
48 private getPoolWorkerChoiceStrategy (
49 workerChoiceStrategy
: WorkerChoiceStrategy
= WorkerChoiceStrategies
.ROUND_ROBIN
50 ): IWorkerChoiceStrategy
<Worker
> {
51 if (this.pool
.type === PoolType
.DYNAMIC
) {
52 return new DynamicPoolWorkerChoiceStrategy(
54 this.createDynamicallyWorkerCallback
,
58 return SelectionStrategiesUtils
.getWorkerChoiceStrategy(
65 * Set the worker choice strategy to use in the context.
67 * @param workerChoiceStrategy The worker choice strategy to set.
69 public setWorkerChoiceStrategy (
70 workerChoiceStrategy
: WorkerChoiceStrategy
72 this.workerChoiceStrategy
= this.getPoolWorkerChoiceStrategy(
78 * Choose a worker with the underlying selection strategy.
80 * @returns The chosen one.
82 public execute (): Worker
{
83 return this.workerChoiceStrategy
.choose()