Commit | Line | Data |
---|---|---|
bdaf31cd | 1 | import type { IPoolInternal } from '../pool-internal' |
ea7a90d3 | 2 | import type { IPoolWorker } from '../pool-worker' |
bdaf31cd JB |
3 | import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy' |
4 | import type { | |
5 | IWorkerChoiceStrategy, | |
6 | WorkerChoiceStrategy | |
7 | } from './selection-strategies-types' | |
8 | import { WorkerChoiceStrategies } from './selection-strategies-types' | |
78cea37e | 9 | import { getWorkerChoiceStrategy } from './selection-strategies-utils' |
bdaf31cd JB |
10 | |
11 | /** | |
bb3d5b74 | 12 | * Selects the next worker for dynamic pool. |
bdaf31cd | 13 | * |
38e795c1 JB |
14 | * @typeParam Worker - Type of worker which manages the strategy. |
15 | * @typeParam Data - Type of data sent to the worker. This can only be serializable data. | |
16 | * @typeParam Response - Type of response of execution. This can only be serializable data. | |
bdaf31cd JB |
17 | */ |
18 | export 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 | 27 | * |
38e795c1 JB |
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. | |
bdaf31cd JB |
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 | ||
38e795c1 | 45 | /** {@inheritDoc} */ |
a6f7f1b4 JB |
46 | public reset (): boolean { |
47 | return this.workerChoiceStrategy.reset() | |
ea7a90d3 JB |
48 | } |
49 | ||
38e795c1 | 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 | } |