refactor: explicity extends Task for MessageValue type
[poolifier.git] / src / pools / selection-strategies / less-busy-worker-choice-strategy.ts
CommitLineData
f06e48d8 1import type { IWorker } from '../worker'
168c526f 2import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy'
bf90656c
JB
3import type {
4 IWorkerChoiceStrategy,
5 RequiredStatistics
6} from './selection-strategies-types'
168c526f
JB
7
8/**
9 * Selects the less busy worker.
10 *
11 * @typeParam Worker - Type of worker which manages the strategy.
12 * @typeParam Data - Type of data sent to the worker. This can only be serializable data.
02706357 13 * @typeParam Response - Type of execution response. This can only be serializable data.
168c526f
JB
14 */
15export class LessBusyWorkerChoiceStrategy<
f06e48d8 16 Worker extends IWorker,
b2b1d84e
JB
17 Data = unknown,
18 Response = unknown
bf90656c
JB
19 >
20 extends AbstractWorkerChoiceStrategy<Worker, Data, Response>
17393ac8 21 implements IWorkerChoiceStrategy {
afc003b2 22 /** @inheritDoc */
168c526f 23 public readonly requiredStatistics: RequiredStatistics = {
c6bd2650 24 runTime: true,
78099a15
JB
25 avgRunTime: false,
26 medRunTime: false
168c526f
JB
27 }
28
afc003b2 29 /** @inheritDoc */
168c526f
JB
30 public reset (): boolean {
31 return true
32 }
33
afc003b2 34 /** @inheritDoc */
c923ce56 35 public choose (): number {
f06e48d8
JB
36 const freeWorkerNodeKey = this.pool.findFreeWorkerNodeKey()
37 if (freeWorkerNodeKey !== -1) {
38 return freeWorkerNodeKey
c141008c 39 }
168c526f 40 let minRunTime = Infinity
f06e48d8
JB
41 let lessBusyWorkerNodeKey!: number
42 for (const [index, workerNode] of this.pool.workerNodes.entries()) {
43 const workerRunTime = workerNode.tasksUsage.runTime
cf9c7b65 44 if (workerRunTime === 0) {
c923ce56 45 return index
168c526f
JB
46 } else if (workerRunTime < minRunTime) {
47 minRunTime = workerRunTime
f06e48d8 48 lessBusyWorkerNodeKey = index
168c526f
JB
49 }
50 }
f06e48d8 51 return lessBusyWorkerNodeKey
168c526f 52 }
97a2abc3 53
afc003b2 54 /** @inheritDoc */
f06e48d8 55 public remove (workerNodeKey: number): boolean {
97a2abc3
JB
56 return true
57 }
168c526f 58}