Properly integrate standard JS tools for JS and TS code
[poolifier.git] / src / pools / selection-strategies / dynamic-pool-worker-choice-strategy.ts
CommitLineData
bdaf31cd 1import type { IPoolInternal } from '../pool-internal'
ea7a90d3 2import type { IPoolWorker } from '../pool-worker'
bdaf31cd
JB
3import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy'
4import type {
5 IWorkerChoiceStrategy,
6 WorkerChoiceStrategy
7} from './selection-strategies-types'
8import { WorkerChoiceStrategies } from './selection-strategies-types'
78cea37e 9import { getWorkerChoiceStrategy } from './selection-strategies-utils'
bdaf31cd
JB
10
11/**
bb3d5b74 12 * Selects the next worker for dynamic pool.
bdaf31cd
JB
13 *
14 * @template Worker Type of worker which manages the strategy.
15 * @template Data Type of data sent to the worker. This can only be serializable data.
16 * @template Response Type of response of execution. This can only be serializable data.
17 */
18export class DynamicPoolWorkerChoiceStrategy<
ea7a90d3 19 Worker extends IPoolWorker,
bdaf31cd
JB
20 Data,
21 Response
22> extends AbstractWorkerChoiceStrategy<Worker, Data, Response> {
78cea37e 23 private readonly workerChoiceStrategy: IWorkerChoiceStrategy<Worker>
bdaf31cd
JB
24
25 /**
bb3d5b74 26 * Constructs a worker choice strategy for dynamic pool.
bdaf31cd
JB
27 *
28 * @param pool The pool instance.
29 * @param createDynamicallyWorkerCallback The worker creation callback for dynamic pool.
30 * @param workerChoiceStrategy The worker choice strategy when the pull is busy.
31 */
32 public constructor (
33 pool: IPoolInternal<Worker, Data, Response>,
777af0ac 34 private readonly createDynamicallyWorkerCallback: () => Worker,
bdaf31cd
JB
35 workerChoiceStrategy: WorkerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN
36 ) {
37 super(pool)
78cea37e 38 this.workerChoiceStrategy = getWorkerChoiceStrategy(
bdaf31cd
JB
39 this.pool,
40 workerChoiceStrategy
41 )
10fcfaf4 42 this.requiredStatistics = this.workerChoiceStrategy.requiredStatistics
bdaf31cd
JB
43 }
44
ea7a90d3 45 /** @inheritDoc */
a6f7f1b4
JB
46 public reset (): boolean {
47 return this.workerChoiceStrategy.reset()
ea7a90d3
JB
48 }
49
a76fac14 50 /** @inheritDoc */
bdaf31cd
JB
51 public choose (): Worker {
52 const freeWorker = this.pool.findFreeWorker()
78cea37e 53 if (freeWorker !== false) {
bdaf31cd
JB
54 return freeWorker
55 }
56
78cea37e 57 if (this.pool.busy) {
bdaf31cd
JB
58 return this.workerChoiceStrategy.choose()
59 }
60
61 // All workers are busy, create a new worker
62 return this.createDynamicallyWorkerCallback()
63 }
64}