build: reenable eslint type checking
[poolifier.git] / src / pools / selection-strategies / worker-choice-strategies-context.ts
index 7e633e164f7c93d96661cd0bd0b6be1226f09e32..a736896a792649a85c9294d9b53aa6633b442820 100644 (file)
@@ -5,17 +5,18 @@ import type {
   StrategyPolicy,
   TaskStatisticsRequirements,
   WorkerChoiceStrategy,
-  WorkerChoiceStrategyOptions
+  WorkerChoiceStrategyOptions,
 } from './selection-strategies-types.js'
 import { WorkerChoiceStrategies } from './selection-strategies-types.js'
 import {
+  buildWorkerChoiceStrategiesPolicy,
+  buildWorkerChoiceStrategiesTaskStatisticsRequirements,
   getWorkerChoiceStrategiesRetries,
-  getWorkerChoiceStrategy
+  getWorkerChoiceStrategy,
 } from './selection-strategies-utils.js'
 
 /**
  * The worker choice strategies context.
- *
  * @typeParam Worker - Type of worker.
  * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data.
  * @typeParam Response - Type of execution response. This can only be structured-cloneable data.
@@ -39,10 +40,20 @@ export class WorkerChoiceStrategiesContext<
    * The worker choice strategies registered in the context.
    */
   private readonly workerChoiceStrategies: Map<
-  WorkerChoiceStrategy,
-  IWorkerChoiceStrategy
+    WorkerChoiceStrategy,
+    IWorkerChoiceStrategy
   >
 
+  /**
+   * The active worker choice strategies in the context policy.
+   */
+  private workerChoiceStrategiesPolicy: StrategyPolicy
+
+  /**
+   * The active worker choice strategies in the context task statistics requirements.
+   */
+  private workerChoiceStrategiesTaskStatisticsRequirements: TaskStatisticsRequirements
+
   /**
    * The maximum number of worker choice strategies execution retries.
    */
@@ -50,7 +61,6 @@ export class WorkerChoiceStrategiesContext<
 
   /**
    * Worker choice strategies context constructor.
-   *
    * @param pool - The pool instance.
    * @param workerChoiceStrategies - The worker choice strategies. @defaultValue [WorkerChoiceStrategies.ROUND_ROBIN]
    * @param opts - The worker choice strategy options.
@@ -58,19 +68,26 @@ export class WorkerChoiceStrategiesContext<
   public constructor (
     private readonly pool: IPool<Worker, Data, Response>,
     workerChoiceStrategies: WorkerChoiceStrategy[] = [
-      WorkerChoiceStrategies.ROUND_ROBIN
+      WorkerChoiceStrategies.ROUND_ROBIN,
     ],
     opts?: WorkerChoiceStrategyOptions
   ) {
     this.execute = this.execute.bind(this)
     this.defaultWorkerChoiceStrategy = workerChoiceStrategies[0]
     this.workerChoiceStrategies = new Map<
-    WorkerChoiceStrategy,
-    IWorkerChoiceStrategy
+      WorkerChoiceStrategy,
+      IWorkerChoiceStrategy
     >()
     for (const workerChoiceStrategy of workerChoiceStrategies) {
       this.addWorkerChoiceStrategy(workerChoiceStrategy, this.pool, opts)
     }
+    this.workerChoiceStrategiesPolicy = buildWorkerChoiceStrategiesPolicy(
+      this.workerChoiceStrategies
+    )
+    this.workerChoiceStrategiesTaskStatisticsRequirements =
+      buildWorkerChoiceStrategiesTaskStatisticsRequirements(
+        this.workerChoiceStrategies
+      )
     this.retriesCount = 0
     this.retries = getWorkerChoiceStrategiesRetries<Worker, Data, Response>(
       this.pool,
@@ -80,54 +97,22 @@ export class WorkerChoiceStrategiesContext<
 
   /**
    * Gets the active worker choice strategies in the context policy.
-   *
    * @returns The strategies policy.
    */
   public getPolicy (): StrategyPolicy {
-    const policies: StrategyPolicy[] = []
-    for (const workerChoiceStrategy of this.workerChoiceStrategies.values()) {
-      policies.push(workerChoiceStrategy.strategyPolicy)
-    }
-    return {
-      dynamicWorkerUsage: policies.some(p => p.dynamicWorkerUsage),
-      dynamicWorkerReady: policies.some(p => p.dynamicWorkerReady)
-    }
+    return this.workerChoiceStrategiesPolicy
   }
 
   /**
    * Gets the active worker choice strategies in the context task statistics requirements.
-   *
-   * @returns The task statistics requirements.
+   * @returns The strategies task statistics requirements.
    */
   public getTaskStatisticsRequirements (): TaskStatisticsRequirements {
-    const taskStatisticsRequirements: TaskStatisticsRequirements[] = []
-    for (const workerChoiceStrategy of this.workerChoiceStrategies.values()) {
-      taskStatisticsRequirements.push(
-        workerChoiceStrategy.taskStatisticsRequirements
-      )
-    }
-    return {
-      runTime: {
-        aggregate: taskStatisticsRequirements.some(r => r.runTime.aggregate),
-        average: taskStatisticsRequirements.some(r => r.runTime.average),
-        median: taskStatisticsRequirements.some(r => r.runTime.median)
-      },
-      waitTime: {
-        aggregate: taskStatisticsRequirements.some(r => r.waitTime.aggregate),
-        average: taskStatisticsRequirements.some(r => r.waitTime.average),
-        median: taskStatisticsRequirements.some(r => r.waitTime.median)
-      },
-      elu: {
-        aggregate: taskStatisticsRequirements.some(r => r.elu.aggregate),
-        average: taskStatisticsRequirements.some(r => r.elu.average),
-        median: taskStatisticsRequirements.some(r => r.elu.median)
-      }
-    }
+    return this.workerChoiceStrategiesTaskStatisticsRequirements
   }
 
   /**
    * Sets the default worker choice strategy to use in the context.
-   *
    * @param workerChoiceStrategy - The default worker choice strategy to set.
    * @param opts - The worker choice strategy options.
    */
@@ -143,20 +128,18 @@ export class WorkerChoiceStrategiesContext<
 
   /**
    * Updates the worker node key in the active worker choice strategies in the context internals.
-   *
+   * @param workerNodeKey - The worker node key.
    * @returns `true` if the update is successful, `false` otherwise.
    */
   public update (workerNodeKey: number): boolean {
-    const res: boolean[] = []
-    for (const workerChoiceStrategy of this.workerChoiceStrategies.values()) {
-      res.push(workerChoiceStrategy.update(workerNodeKey))
-    }
-    return res.every(r => r)
+    return Array.from(
+      this.workerChoiceStrategies,
+      ([_, workerChoiceStrategy]) => workerChoiceStrategy.update(workerNodeKey)
+    ).every(r => r)
   }
 
   /**
-   * Executes the worker choice strategy in the context algorithm.
-   *
+   * Executes the given worker choice strategy in the context algorithm.
    * @param workerChoiceStrategy - The worker choice strategy algorithm to execute. @defaultValue this.defaultWorkerChoiceStrategy
    * @returns The key of the worker node.
    * @throws {@link https://nodejs.org/api/errors.html#class-error} If after computed retries the worker node key is null or undefined.
@@ -173,7 +156,6 @@ export class WorkerChoiceStrategiesContext<
 
   /**
    * Executes the given worker choice strategy.
-   *
    * @param workerChoiceStrategy - The worker choice strategy.
    * @returns The key of the worker node.
    * @throws {@link https://nodejs.org/api/errors.html#class-error} If after computed retries the worker node key is null or undefined.
@@ -192,7 +174,7 @@ export class WorkerChoiceStrategiesContext<
     } while (workerNodeKey == null && retriesCount < this.retries)
     if (workerNodeKey == null) {
       throw new Error(
-        `Worker node key chosen is null or undefined after ${retriesCount} retries`
+        `Worker node key chosen is null or undefined after ${retriesCount.toString()} retries`
       )
     }
     return workerNodeKey
@@ -200,21 +182,18 @@ export class WorkerChoiceStrategiesContext<
 
   /**
    * Removes the worker node key from the active worker choice strategies in the context.
-   *
    * @param workerNodeKey - The worker node key.
    * @returns `true` if the removal is successful, `false` otherwise.
    */
   public remove (workerNodeKey: number): boolean {
-    const res: boolean[] = []
-    for (const workerChoiceStrategy of this.workerChoiceStrategies.values()) {
-      res.push(workerChoiceStrategy.remove(workerNodeKey))
-    }
-    return res.every(r => r)
+    return Array.from(
+      this.workerChoiceStrategies,
+      ([_, workerChoiceStrategy]) => workerChoiceStrategy.remove(workerNodeKey)
+    ).every(r => r)
   }
 
   /**
    * Sets the active worker choice strategies in the context options.
-   *
    * @param opts - The worker choice strategy options.
    */
   public setOptions (opts: WorkerChoiceStrategyOptions | undefined): void {
@@ -225,7 +204,6 @@ export class WorkerChoiceStrategiesContext<
 
   /**
    * Synchronizes the active worker choice strategies in the context with the given worker choice strategies.
-   *
    * @param workerChoiceStrategies - The worker choice strategies to synchronize.
    * @param opts - The worker choice strategy options.
    */
@@ -243,12 +221,19 @@ export class WorkerChoiceStrategiesContext<
         this.addWorkerChoiceStrategy(workerChoiceStrategy, this.pool, opts)
       }
     }
+    this.workerChoiceStrategiesPolicy = buildWorkerChoiceStrategiesPolicy(
+      this.workerChoiceStrategies
+    )
+    this.workerChoiceStrategiesTaskStatisticsRequirements =
+      buildWorkerChoiceStrategiesTaskStatisticsRequirements(
+        this.workerChoiceStrategies
+      )
   }
 
   /**
    * Adds a worker choice strategy to the context.
-   *
    * @param workerChoiceStrategy - The worker choice strategy to add.
+   * @param pool - The pool instance.
    * @param opts - The worker choice strategy options.
    * @returns The worker choice strategies.
    */
@@ -273,7 +258,6 @@ export class WorkerChoiceStrategiesContext<
 
   /**
    * Removes a worker choice strategy from the context.
-   *
    * @param workerChoiceStrategy - The worker choice strategy to remove.
    * @returns `true` if the worker choice strategy is removed, `false` otherwise.
    */