fix: fix fair share algorithm implementation
[poolifier.git] / src / pools / selection-strategies / worker-choice-strategy-context.ts
index 9a7bb81bd0d83259e9c6b33e86bad7676982eb83..e5fddc1b1fc5b400398b2e86bd0ac3b3fd6f97c9 100644 (file)
@@ -40,39 +40,49 @@ export class WorkerChoiceStrategyContext<
    */
   public constructor (
     pool: IPool<Worker, Data, Response>,
-    /**
-     * @defaultValue WorkerChoiceStrategies.ROUND_ROBIN
-     */
     private workerChoiceStrategy: WorkerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN,
     opts: WorkerChoiceStrategyOptions = DEFAULT_WORKER_CHOICE_STRATEGY_OPTIONS
   ) {
-    this.execute.bind(this)
+    this.execute = this.execute.bind(this)
     this.workerChoiceStrategies = new Map<
     WorkerChoiceStrategy,
     IWorkerChoiceStrategy
     >([
       [
         WorkerChoiceStrategies.ROUND_ROBIN,
-        new RoundRobinWorkerChoiceStrategy<Worker, Data, Response>(pool, opts)
+        new (RoundRobinWorkerChoiceStrategy.bind(this))<Worker, Data, Response>(
+          pool,
+          opts
+        )
       ],
       [
         WorkerChoiceStrategies.LESS_USED,
-        new LessUsedWorkerChoiceStrategy<Worker, Data, Response>(pool, opts)
+        new (LessUsedWorkerChoiceStrategy.bind(this))<Worker, Data, Response>(
+          pool,
+          opts
+        )
       ],
       [
         WorkerChoiceStrategies.LESS_BUSY,
-        new LessBusyWorkerChoiceStrategy<Worker, Data, Response>(pool, opts)
+        new (LessBusyWorkerChoiceStrategy.bind(this))<Worker, Data, Response>(
+          pool,
+          opts
+        )
       ],
       [
         WorkerChoiceStrategies.FAIR_SHARE,
-        new FairShareWorkerChoiceStrategy<Worker, Data, Response>(pool, opts)
-      ],
-      [
-        WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN,
-        new WeightedRoundRobinWorkerChoiceStrategy<Worker, Data, Response>(
+        new (FairShareWorkerChoiceStrategy.bind(this))<Worker, Data, Response>(
           pool,
           opts
         )
+      ],
+      [
+        WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN,
+        new (WeightedRoundRobinWorkerChoiceStrategy.bind(this))<
+        Worker,
+        Data,
+        Response
+        >(pool, opts)
       ]
     ])
   }
@@ -104,6 +114,19 @@ export class WorkerChoiceStrategyContext<
     this.workerChoiceStrategies.get(this.workerChoiceStrategy)?.reset()
   }
 
+  /**
+   * Updates the worker choice strategy internals in the context.
+   *
+   * @returns `true` if the update is successful, `false` otherwise.
+   */
+  public update (workerNodeKey: number): boolean {
+    return (
+      this.workerChoiceStrategies.get(
+        this.workerChoiceStrategy
+      ) as IWorkerChoiceStrategy
+    ).update(workerNodeKey)
+  }
+
   /**
    * Executes the worker choice strategy algorithm in the context.
    *