Add WRR worker choice strategy
[poolifier.git] / src / pools / selection-strategies / selection-strategies-utils.ts
1 import type { AbstractPoolWorker } from '../abstract-pool-worker'
2 import type { IPoolInternal } from '../pool-internal'
3 import { LessRecentlyUsedWorkerChoiceStrategy } from './less-recently-used-worker-choice-strategy'
4 import { RoundRobinWorkerChoiceStrategy } from './round-robin-worker-choice-strategy'
5 import type {
6 IWorkerChoiceStrategy,
7 WorkerChoiceStrategy
8 } from './selection-strategies-types'
9 import { WorkerChoiceStrategies } from './selection-strategies-types'
10 import { WeightedRoundRobinWorkerChoiceStrategy } from './weighted-round-robin-choice-strategy'
11
12 /**
13 * Worker selection strategies helpers class.
14 */
15 export class SelectionStrategiesUtils {
16 /**
17 * Get the worker choice strategy instance.
18 *
19 * @param pool The pool instance.
20 * @param workerChoiceStrategy The worker choice strategy.
21 * @returns The worker choice strategy instance.
22 */
23 public static getWorkerChoiceStrategy<
24 Worker extends AbstractPoolWorker,
25 Data,
26 Response
27 > (
28 pool: IPoolInternal<Worker, Data, Response>,
29 workerChoiceStrategy: WorkerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN
30 ): IWorkerChoiceStrategy<Worker> {
31 switch (workerChoiceStrategy) {
32 case WorkerChoiceStrategies.ROUND_ROBIN:
33 return new RoundRobinWorkerChoiceStrategy(pool)
34 case WorkerChoiceStrategies.LESS_RECENTLY_USED:
35 return new LessRecentlyUsedWorkerChoiceStrategy(pool)
36 case WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN:
37 return new WeightedRoundRobinWorkerChoiceStrategy(pool)
38 default:
39 throw new Error(
40 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
41 `Worker choice strategy '${workerChoiceStrategy}' not found`
42 )
43 }
44 }
45 }