perf: use worker key as much as possible instead of a reference to the
[poolifier.git] / src / pools / selection-strategies / selection-strategies-utils.ts
index 34c425b3541e806b770e1693e0aee6da7217e4f8..10c93335ea98cd1c3b019addb88603ed2749672e 100644 (file)
@@ -1,45 +1,48 @@
-import type { AbstractPoolWorker } from '../abstract-pool-worker'
 import type { IPoolInternal } from '../pool-internal'
-import { LessRecentlyUsedWorkerChoiceStrategy } from './less-recently-used-worker-choice-strategy'
+import type { IPoolWorker } from '../pool-worker'
+import { FairShareWorkerChoiceStrategy } from './fair-share-worker-choice-strategy'
+import { LessBusyWorkerChoiceStrategy } from './less-busy-worker-choice-strategy'
+import { LessUsedWorkerChoiceStrategy } from './less-used-worker-choice-strategy'
 import { RoundRobinWorkerChoiceStrategy } from './round-robin-worker-choice-strategy'
 import type {
   IWorkerChoiceStrategy,
   WorkerChoiceStrategy
 } from './selection-strategies-types'
 import { WorkerChoiceStrategies } from './selection-strategies-types'
-import { WeightedRoundRobinWorkerChoiceStrategy } from './weighted-round-robin-choice-strategy'
+import { WeightedRoundRobinWorkerChoiceStrategy } from './weighted-round-robin-worker-choice-strategy'
 
 /**
- * Worker selection strategies helpers class.
+ * Gets the worker choice strategy instance.
+ *
+ * @param pool - The pool instance.
+ * @param workerChoiceStrategy - The worker choice strategy.
+ * @returns The worker choice strategy instance.
  */
-export class SelectionStrategiesUtils {
-  /**
-   * Get the worker choice strategy instance.
-   *
-   * @param pool The pool instance.
-   * @param workerChoiceStrategy The worker choice strategy.
-   * @returns The worker choice strategy instance.
-   */
-  public static getWorkerChoiceStrategy<
-    Worker extends AbstractPoolWorker,
-    Data,
-    Response
-  > (
-    pool: IPoolInternal<Worker, Data, Response>,
-    workerChoiceStrategy: WorkerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN
-  ): IWorkerChoiceStrategy<Worker> {
-    switch (workerChoiceStrategy) {
-      case WorkerChoiceStrategies.ROUND_ROBIN:
-        return new RoundRobinWorkerChoiceStrategy(pool)
-      case WorkerChoiceStrategies.LESS_RECENTLY_USED:
-        return new LessRecentlyUsedWorkerChoiceStrategy(pool)
-      case WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN:
-        return new WeightedRoundRobinWorkerChoiceStrategy(pool)
-      default:
-        throw new Error(
-          // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
-          `Worker choice strategy '${workerChoiceStrategy}' not found`
-        )
-    }
+export function getWorkerChoiceStrategy<
+  Worker extends IPoolWorker,
+  Data,
+  Response
+> (
+  pool: IPoolInternal<Worker, Data, Response>,
+  workerChoiceStrategy: WorkerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN
+): IWorkerChoiceStrategy {
+  switch (workerChoiceStrategy) {
+    case WorkerChoiceStrategies.ROUND_ROBIN:
+      return new RoundRobinWorkerChoiceStrategy<Worker, Data, Response>(pool)
+    case WorkerChoiceStrategies.LESS_USED:
+      return new LessUsedWorkerChoiceStrategy<Worker, Data, Response>(pool)
+    case WorkerChoiceStrategies.LESS_BUSY:
+      return new LessBusyWorkerChoiceStrategy<Worker, Data, Response>(pool)
+    case WorkerChoiceStrategies.FAIR_SHARE:
+      return new FairShareWorkerChoiceStrategy<Worker, Data, Response>(pool)
+    case WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN:
+      return new WeightedRoundRobinWorkerChoiceStrategy<Worker, Data, Response>(
+        pool
+      )
+    default:
+      throw new Error(
+        // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+        `Worker choice strategy '${workerChoiceStrategy}' not found`
+      )
   }
 }