extra-pool 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/lib/pool.d.ts +2 -1
- package/lib/pool.js +29 -4
- package/lib/pool.js.map +1 -1
- package/package.json +1 -1
- package/src/pool.ts +54 -4
package/README.md
CHANGED
package/lib/pool.d.ts
CHANGED
|
@@ -13,13 +13,14 @@ export declare class Pool<T> {
|
|
|
13
13
|
private readonly fsm;
|
|
14
14
|
private readonly waitingUsers;
|
|
15
15
|
private readonly items;
|
|
16
|
-
private readonly maxInstances;
|
|
17
16
|
private readonly minInstances;
|
|
17
|
+
private readonly maxInstances;
|
|
18
18
|
private readonly idleTimeout;
|
|
19
19
|
private readonly concurrencyPerInstance;
|
|
20
20
|
get capacity(): number;
|
|
21
21
|
get size(): number;
|
|
22
22
|
constructor(options: IPoolOptions<T>);
|
|
23
|
+
prewarm(targetInstances: number): Promise<void>;
|
|
23
24
|
use<U>(fn: (instance: T) => Awaitable<U>): Promise<U>;
|
|
24
25
|
destroy(): Promise<void>;
|
|
25
26
|
}
|
package/lib/pool.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { go, CustomError, isntEmptyArray, assert } from '@blackglory/prelude';
|
|
1
|
+
import { go, CustomError, isntEmptyArray, assert, isPositiveInfinity } from '@blackglory/prelude';
|
|
2
2
|
import { Queue } from '@blackglory/structures';
|
|
3
3
|
import { FiniteStateMachine } from 'extra-fsm';
|
|
4
|
-
import { Deferred, each } from 'extra-promise';
|
|
4
|
+
import { Deferred, DeferredGroup, each } from 'extra-promise';
|
|
5
5
|
import { toArray, filter } from 'iterable-operator';
|
|
6
6
|
import { setTimeout } from 'extra-timers';
|
|
7
7
|
import { Instance } from './instance.js';
|
|
@@ -34,10 +34,35 @@ export class Pool {
|
|
|
34
34
|
this.items = new Set();
|
|
35
35
|
this.createInstance = options.create;
|
|
36
36
|
this.destroyInstance = options.destroy;
|
|
37
|
-
this.
|
|
38
|
-
|
|
37
|
+
this.minInstances = (_a = options.minInstances) !== null && _a !== void 0 ? _a : 0;
|
|
38
|
+
assert(Number.isInteger(this.minInstances) &&
|
|
39
|
+
Number.isFinite(this.minInstances) &&
|
|
40
|
+
this.minInstances >= 0, 'The minInstances must be a non-negative finite integer');
|
|
41
|
+
this.maxInstances = (_b = options.maxInstances) !== null && _b !== void 0 ? _b : Infinity;
|
|
42
|
+
assert((Number.isInteger(this.maxInstances) ||
|
|
43
|
+
isPositiveInfinity(this.maxInstances)) &&
|
|
44
|
+
this.maxInstances >= this.minInstances, 'The maxInstances must be either an integer greater than or equal to minInstances, or Infinity');
|
|
39
45
|
this.idleTimeout = (_c = options.idleTimeout) !== null && _c !== void 0 ? _c : 0;
|
|
46
|
+
assert(Number.isInteger(this.idleTimeout) &&
|
|
47
|
+
Number.isFinite(this.idleTimeout) &&
|
|
48
|
+
this.idleTimeout >= 0, 'The idleTimeout must be a non-negative finite integer');
|
|
40
49
|
this.concurrencyPerInstance = (_d = options.concurrencyPerInstance) !== null && _d !== void 0 ? _d : 1;
|
|
50
|
+
assert(Number.isInteger(this.concurrencyPerInstance) &&
|
|
51
|
+
this.concurrencyPerInstance >= 1, 'The concurrencyPerInstance must an integer greater than or equal to 1');
|
|
52
|
+
}
|
|
53
|
+
async prewarm(targetInstances) {
|
|
54
|
+
assert(targetInstances >= this.minInstances &&
|
|
55
|
+
targetInstances <= this.maxInstances &&
|
|
56
|
+
Number.isFinite(targetInstances), 'The targetInstances must be an finite integer in [minInstances, maxInstances]');
|
|
57
|
+
const promises = [];
|
|
58
|
+
const deferredGroup = new DeferredGroup();
|
|
59
|
+
while (this.size < targetInstances) {
|
|
60
|
+
const deferred = new Deferred();
|
|
61
|
+
deferredGroup.add(deferred);
|
|
62
|
+
promises.push(this.use(() => deferred));
|
|
63
|
+
}
|
|
64
|
+
deferredGroup.resolve();
|
|
65
|
+
await Promise.all(promises);
|
|
41
66
|
}
|
|
42
67
|
async use(fn) {
|
|
43
68
|
assert(this.fsm.matches(PoolState.Running), 'The pool is not available');
|
package/lib/pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAa,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/pool.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { go, Awaitable, CustomError, isntEmptyArray, assert } from '@blackglory/prelude'
|
|
1
|
+
import { go, Awaitable, CustomError, isntEmptyArray, assert, isPositiveInfinity } from '@blackglory/prelude'
|
|
2
2
|
import { Queue } from '@blackglory/structures'
|
|
3
3
|
import { FiniteStateMachine, IFiniteStateMachineSchema } from 'extra-fsm'
|
|
4
|
-
import { Deferred, each } from 'extra-promise'
|
|
4
|
+
import { Deferred, DeferredGroup, each } from 'extra-promise'
|
|
5
5
|
import { toArray, filter } from 'iterable-operator'
|
|
6
6
|
import { setTimeout } from 'extra-timers'
|
|
7
7
|
import { Instance } from './instance.js'
|
|
@@ -81,8 +81,8 @@ export class Pool<T> {
|
|
|
81
81
|
)
|
|
82
82
|
private readonly waitingUsers: Queue<Deferred<IPoolItem<T>>> = new Queue()
|
|
83
83
|
private readonly items: Set<IPoolItem<T>> = new Set()
|
|
84
|
-
private readonly maxInstances: number
|
|
85
84
|
private readonly minInstances: number
|
|
85
|
+
private readonly maxInstances: number
|
|
86
86
|
private readonly idleTimeout: number
|
|
87
87
|
private readonly concurrencyPerInstance: number
|
|
88
88
|
|
|
@@ -97,10 +97,60 @@ export class Pool<T> {
|
|
|
97
97
|
constructor(options: IPoolOptions<T>) {
|
|
98
98
|
this.createInstance = options.create
|
|
99
99
|
this.destroyInstance = options.destroy
|
|
100
|
-
|
|
100
|
+
|
|
101
101
|
this.minInstances = options.minInstances ?? 0
|
|
102
|
+
assert(
|
|
103
|
+
Number.isInteger(this.minInstances) &&
|
|
104
|
+
Number.isFinite(this.minInstances) &&
|
|
105
|
+
this.minInstances >= 0
|
|
106
|
+
, 'The minInstances must be a non-negative finite integer'
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
this.maxInstances = options.maxInstances ?? Infinity
|
|
110
|
+
assert(
|
|
111
|
+
(
|
|
112
|
+
Number.isInteger(this.maxInstances) ||
|
|
113
|
+
isPositiveInfinity(this.maxInstances)
|
|
114
|
+
) &&
|
|
115
|
+
this.maxInstances >= this.minInstances
|
|
116
|
+
, 'The maxInstances must be either an integer greater than or equal to minInstances, or Infinity'
|
|
117
|
+
)
|
|
118
|
+
|
|
102
119
|
this.idleTimeout = options.idleTimeout ?? 0
|
|
120
|
+
assert(
|
|
121
|
+
Number.isInteger(this.idleTimeout) &&
|
|
122
|
+
Number.isFinite(this.idleTimeout) &&
|
|
123
|
+
this.idleTimeout >= 0
|
|
124
|
+
, 'The idleTimeout must be a non-negative finite integer'
|
|
125
|
+
)
|
|
126
|
+
|
|
103
127
|
this.concurrencyPerInstance = options.concurrencyPerInstance ?? 1
|
|
128
|
+
assert(
|
|
129
|
+
Number.isInteger(this.concurrencyPerInstance) &&
|
|
130
|
+
this.concurrencyPerInstance >= 1
|
|
131
|
+
, 'The concurrencyPerInstance must an integer greater than or equal to 1'
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async prewarm(targetInstances: number): Promise<void> {
|
|
136
|
+
assert(
|
|
137
|
+
targetInstances >= this.minInstances &&
|
|
138
|
+
targetInstances <= this.maxInstances &&
|
|
139
|
+
Number.isFinite(targetInstances)
|
|
140
|
+
, 'The targetInstances must be an finite integer in [minInstances, maxInstances]'
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
const promises: Array<Promise<void>> = []
|
|
144
|
+
|
|
145
|
+
const deferredGroup = new DeferredGroup<void>()
|
|
146
|
+
while (this.size < targetInstances) {
|
|
147
|
+
const deferred = new Deferred<void>()
|
|
148
|
+
deferredGroup.add(deferred)
|
|
149
|
+
promises.push(this.use(() => deferred))
|
|
150
|
+
}
|
|
151
|
+
deferredGroup.resolve()
|
|
152
|
+
|
|
153
|
+
await Promise.all(promises)
|
|
104
154
|
}
|
|
105
155
|
|
|
106
156
|
/**
|