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 CHANGED
@@ -43,8 +43,10 @@ class Pool<T> {
43
43
 
44
44
  constructor(options: IPoolOptions<T>)
45
45
 
46
- destroy(): Promise<void>
46
+ prewarm(targetInstances: number): Promise<void>
47
47
 
48
48
  use<U>(fn: (instance: T) => Awaitable<U>): Promise<U>
49
+
50
+ destroy(): Promise<void>
49
51
  }
50
52
  ```
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.maxInstances = (_a = options.maxInstances) !== null && _a !== void 0 ? _a : Infinity;
38
- this.minInstances = (_b = options.minInstances) !== null && _b !== void 0 ? _b : 0;
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":"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"}
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "extra-pool",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "A library that helps you create object/thread/connection pools",
5
5
  "keywords": [
6
6
  "pool",
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
- this.maxInstances = options.maxInstances ?? Infinity
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
  /**