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' | |
9 | import { SelectionStrategiesUtils } from './selection-strategies-utils' | |
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 | */ | |
18 | export class DynamicPoolWorkerChoiceStrategy< | |
ea7a90d3 | 19 | Worker extends IPoolWorker, |
bdaf31cd JB |
20 | Data, |
21 | Response | |
22 | > extends AbstractWorkerChoiceStrategy<Worker, Data, Response> { | |
23 | private workerChoiceStrategy: IWorkerChoiceStrategy<Worker> | |
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>, | |
34 | private createDynamicallyWorkerCallback: () => Worker, | |
35 | workerChoiceStrategy: WorkerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN | |
36 | ) { | |
37 | super(pool) | |
38 | this.workerChoiceStrategy = SelectionStrategiesUtils.getWorkerChoiceStrategy( | |
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() | |
53 | if (freeWorker) { | |
54 | return freeWorker | |
55 | } | |
56 | ||
caeb9817 | 57 | if (this.pool.busy === true) { |
bdaf31cd JB |
58 | return this.workerChoiceStrategy.choose() |
59 | } | |
60 | ||
61 | // All workers are busy, create a new worker | |
62 | return this.createDynamicallyWorkerCallback() | |
63 | } | |
64 | } |