prool 0.0.3 → 0.0.5
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/CHANGELOG.md +15 -0
- package/_lib/exports/index.d.ts +1 -1
- package/_lib/exports/processes.d.ts +2 -0
- package/_lib/exports/processes.d.ts.map +1 -0
- package/_lib/exports/processes.js +2 -0
- package/_lib/exports/processes.js.map +1 -0
- package/_lib/instance.d.ts +9 -6
- package/_lib/instance.d.ts.map +1 -1
- package/_lib/instance.js +22 -3
- package/_lib/instance.js.map +1 -1
- package/_lib/instances/anvil.d.ts +1 -5
- package/_lib/instances/anvil.d.ts.map +1 -1
- package/_lib/instances/anvil.js +18 -44
- package/_lib/instances/anvil.js.map +1 -1
- package/_lib/instances/stackup.d.ts +86 -0
- package/_lib/instances/stackup.d.ts.map +1 -0
- package/_lib/instances/stackup.js +89 -0
- package/_lib/instances/stackup.js.map +1 -0
- package/_lib/pool.d.ts +7 -6
- package/_lib/pool.d.ts.map +1 -1
- package/_lib/pool.js +60 -53
- package/_lib/pool.js.map +1 -1
- package/_lib/processes/execa.d.ts +27 -0
- package/_lib/processes/execa.d.ts.map +1 -0
- package/_lib/processes/execa.js +63 -0
- package/_lib/processes/execa.js.map +1 -0
- package/_lib/server.d.ts +3 -3
- package/_lib/server.d.ts.map +1 -1
- package/_lib/server.js +42 -34
- package/_lib/server.js.map +1 -1
- package/_lib/utils.d.ts +4 -3
- package/_lib/utils.d.ts.map +1 -1
- package/_lib/utils.js +2 -2
- package/_lib/utils.js.map +1 -1
- package/exports/index.ts +2 -2
- package/exports/processes.test.ts +10 -0
- package/exports/processes.ts +8 -0
- package/instance.test.ts +34 -2
- package/instance.ts +46 -13
- package/instances/anvil.test.ts +5 -3
- package/instances/anvil.ts +21 -49
- package/instances/stackup.test.ts +106 -0
- package/instances/stackup.ts +162 -0
- package/package.json +6 -2
- package/pool.test.ts +203 -138
- package/pool.ts +83 -66
- package/processes/execa.test.ts +143 -0
- package/processes/execa.ts +100 -0
- package/server.test.ts +162 -85
- package/server.ts +46 -38
- package/tsconfig.build.tsbuildinfo +1 -1
- package/utils.ts +11 -9
package/pool.test.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import getPort from 'get-port'
|
|
2
|
-
import { afterEach, describe, expect, test } from 'vitest'
|
|
2
|
+
import { afterEach, beforeAll, describe, expect, test } from 'vitest'
|
|
3
|
+
|
|
4
|
+
import { stackupOptions } from '../test/utils.js'
|
|
3
5
|
import { anvil } from './instances/anvil.js'
|
|
6
|
+
import { stackup } from './instances/stackup.js'
|
|
4
7
|
import { definePool } from './pool.js'
|
|
5
8
|
|
|
6
9
|
let pool: ReturnType<typeof definePool>
|
|
10
|
+
const port = await getPort()
|
|
11
|
+
|
|
12
|
+
beforeAll(() => anvil({ port }).start())
|
|
7
13
|
|
|
8
14
|
afterEach(async () => {
|
|
9
15
|
try {
|
|
@@ -13,197 +19,256 @@ afterEach(async () => {
|
|
|
13
19
|
}
|
|
14
20
|
})
|
|
15
21
|
|
|
16
|
-
describe.each([
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
describe.each([
|
|
23
|
+
{ instance: anvil() },
|
|
24
|
+
{
|
|
25
|
+
instance: stackup(stackupOptions({ port })),
|
|
26
|
+
},
|
|
27
|
+
])('instance: $instance.name', ({ instance }) => {
|
|
28
|
+
test('default', async () => {
|
|
29
|
+
pool = definePool({
|
|
30
|
+
instance,
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
expect(pool).toBeDefined()
|
|
34
|
+
})
|
|
23
35
|
|
|
24
|
-
|
|
36
|
+
test('start', async () => {
|
|
37
|
+
pool = definePool({
|
|
38
|
+
instance,
|
|
25
39
|
})
|
|
26
40
|
|
|
27
|
-
|
|
28
|
-
pool = definePool({
|
|
29
|
-
instance,
|
|
30
|
-
})
|
|
41
|
+
expect(pool.size).toEqual(0)
|
|
31
42
|
|
|
32
|
-
|
|
43
|
+
const instance_1 = await pool.start(1)
|
|
44
|
+
expect(instance_1.status).toBe('started')
|
|
45
|
+
expect(pool.size).toEqual(1)
|
|
33
46
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
47
|
+
const instance_2 = await pool.start(2)
|
|
48
|
+
expect(instance_2.status).toBe('started')
|
|
49
|
+
expect(pool.size).toEqual(2)
|
|
37
50
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
51
|
+
const instance_3 = await pool.start(1337)
|
|
52
|
+
expect(instance_3.status).toBe('started')
|
|
53
|
+
expect(pool.size).toEqual(3)
|
|
54
|
+
})
|
|
41
55
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
56
|
+
test('callback instance', async () => {
|
|
57
|
+
const keys: (number | string)[] = []
|
|
58
|
+
pool = definePool({
|
|
59
|
+
instance(key) {
|
|
60
|
+
keys.push(key)
|
|
61
|
+
return instance
|
|
62
|
+
},
|
|
45
63
|
})
|
|
46
64
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
})
|
|
65
|
+
await pool.start(1)
|
|
66
|
+
await pool.start(2)
|
|
67
|
+
await pool.start(1337)
|
|
51
68
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const instance_3 = await pool.start(3)
|
|
69
|
+
expect(keys).toStrictEqual([1, 2, 1337])
|
|
70
|
+
})
|
|
55
71
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
72
|
+
test('stop / destroy', async () => {
|
|
73
|
+
pool = definePool({
|
|
74
|
+
instance,
|
|
75
|
+
})
|
|
60
76
|
|
|
61
|
-
|
|
62
|
-
|
|
77
|
+
const instance_1 = await pool.start(1)
|
|
78
|
+
const instance_2 = await pool.start(2)
|
|
79
|
+
const instance_3 = await pool.start(3)
|
|
63
80
|
|
|
64
|
-
|
|
65
|
-
|
|
81
|
+
expect(instance_1.status).toBe('started')
|
|
82
|
+
expect(instance_2.status).toBe('started')
|
|
83
|
+
expect(instance_3.status).toBe('started')
|
|
84
|
+
expect(pool.size).toEqual(3)
|
|
66
85
|
|
|
67
|
-
|
|
68
|
-
|
|
86
|
+
await pool.stop(1)
|
|
87
|
+
expect(instance_1.status).toBe('stopped')
|
|
69
88
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
await pool.stop(3)
|
|
73
|
-
await pool.stop(4)
|
|
89
|
+
await pool.stop(2)
|
|
90
|
+
expect(instance_2.status).toBe('stopped')
|
|
74
91
|
|
|
75
|
-
|
|
92
|
+
await pool.stop(3)
|
|
93
|
+
expect(instance_3.status).toBe('stopped')
|
|
76
94
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
95
|
+
await pool.stop(1)
|
|
96
|
+
await pool.stop(2)
|
|
97
|
+
await pool.stop(3)
|
|
98
|
+
await pool.stop(4)
|
|
99
|
+
|
|
100
|
+
expect(pool.size).toEqual(3)
|
|
101
|
+
|
|
102
|
+
await pool.destroy(1)
|
|
103
|
+
expect(pool.size).toEqual(2)
|
|
104
|
+
await pool.destroy(2)
|
|
105
|
+
expect(pool.size).toEqual(1)
|
|
106
|
+
await pool.destroy(3)
|
|
107
|
+
expect(pool.size).toEqual(0)
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
test('restart', async () => {
|
|
111
|
+
pool = definePool({
|
|
112
|
+
instance,
|
|
83
113
|
})
|
|
84
114
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
})
|
|
115
|
+
const instance_1 = await pool.start(1)
|
|
116
|
+
const instance_2 = await pool.start(2)
|
|
117
|
+
const instance_3 = await pool.start(3)
|
|
89
118
|
|
|
90
|
-
|
|
91
|
-
|
|
119
|
+
expect(instance_1.status).toBe('started')
|
|
120
|
+
expect(instance_2.status).toBe('started')
|
|
121
|
+
expect(instance_3.status).toBe('started')
|
|
122
|
+
expect(pool.size).toEqual(3)
|
|
92
123
|
|
|
93
|
-
|
|
94
|
-
|
|
124
|
+
const promise_1 = pool.restart(1)
|
|
125
|
+
expect(instance_1.status).toBe('restarting')
|
|
126
|
+
await promise_1
|
|
127
|
+
expect(instance_1.status).toBe('started')
|
|
128
|
+
})
|
|
95
129
|
|
|
96
|
-
|
|
97
|
-
|
|
130
|
+
test('start > stop > start', async () => {
|
|
131
|
+
pool = definePool({
|
|
132
|
+
instance,
|
|
98
133
|
})
|
|
99
134
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
instance,
|
|
103
|
-
})
|
|
135
|
+
const instance_1 = await pool.start(1)
|
|
136
|
+
expect(instance_1.status).toBe('started')
|
|
104
137
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
await pool.start(3)
|
|
138
|
+
await pool.stop(1)
|
|
139
|
+
expect(instance_1.status).toBe('stopped')
|
|
108
140
|
|
|
109
|
-
|
|
141
|
+
await pool.start(1)
|
|
142
|
+
expect(instance_1.status).toBe('started')
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
test('stopAll / destroyAll', async () => {
|
|
146
|
+
pool = definePool({
|
|
147
|
+
instance,
|
|
148
|
+
})
|
|
110
149
|
|
|
111
|
-
|
|
112
|
-
|
|
150
|
+
await pool.start(1)
|
|
151
|
+
await pool.start(2)
|
|
152
|
+
await pool.start(3)
|
|
113
153
|
|
|
114
|
-
|
|
115
|
-
|
|
154
|
+
expect(pool.size).toEqual(3)
|
|
155
|
+
|
|
156
|
+
await pool.stopAll()
|
|
157
|
+
expect(pool.size).toEqual(3)
|
|
158
|
+
|
|
159
|
+
await pool.destroyAll()
|
|
160
|
+
expect(pool.size).toEqual(0)
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
test('get', async () => {
|
|
164
|
+
pool = definePool({
|
|
165
|
+
instance,
|
|
116
166
|
})
|
|
117
167
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
})
|
|
168
|
+
const instance_1 = await pool.start(1)
|
|
169
|
+
const instance_2 = await pool.start(2)
|
|
170
|
+
const instance_3 = await pool.start(3)
|
|
122
171
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
172
|
+
expect(pool.get(1)).toStrictEqual(instance_1)
|
|
173
|
+
expect(pool.get(2)).toStrictEqual(instance_2)
|
|
174
|
+
expect(pool.get(3)).toStrictEqual(instance_3)
|
|
175
|
+
})
|
|
126
176
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
177
|
+
test('behavior: start more than once', async () => {
|
|
178
|
+
pool = definePool({
|
|
179
|
+
instance,
|
|
130
180
|
})
|
|
131
181
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
})
|
|
182
|
+
const promise_1 = pool.start(1)
|
|
183
|
+
const promise_2 = pool.start(1)
|
|
184
|
+
expect(promise_1).toStrictEqual(promise_2)
|
|
136
185
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
186
|
+
const instance_1 = await promise_1
|
|
187
|
+
const instance_2 = await promise_2
|
|
188
|
+
expect(instance_1).toStrictEqual(instance_2)
|
|
189
|
+
})
|
|
140
190
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
191
|
+
test('behavior: clear more than once', async () => {
|
|
192
|
+
pool = definePool({
|
|
193
|
+
instance,
|
|
144
194
|
})
|
|
145
195
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
})
|
|
196
|
+
await pool.start(1)
|
|
197
|
+
await pool.start(2)
|
|
198
|
+
await pool.start(3)
|
|
150
199
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
200
|
+
const promise_1 = pool.stopAll()
|
|
201
|
+
const promise_2 = pool.stopAll()
|
|
202
|
+
expect(promise_1).toStrictEqual(promise_2)
|
|
154
203
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
204
|
+
await promise_1
|
|
205
|
+
await promise_2
|
|
206
|
+
})
|
|
158
207
|
|
|
159
|
-
|
|
160
|
-
|
|
208
|
+
test('behavior: restart more than once', async () => {
|
|
209
|
+
pool = definePool({
|
|
210
|
+
instance,
|
|
161
211
|
})
|
|
162
212
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
213
|
+
const instance_1 = await pool.start(1)
|
|
214
|
+
expect(instance_1.status).toBe('started')
|
|
215
|
+
|
|
216
|
+
const promise_1 = pool.restart(1)
|
|
217
|
+
expect(instance_1.status).toBe('restarting')
|
|
218
|
+
const promise_2 = pool.restart(1)
|
|
219
|
+
expect(instance_1.status).toBe('restarting')
|
|
167
220
|
|
|
168
|
-
|
|
221
|
+
expect(promise_1).toStrictEqual(promise_2)
|
|
169
222
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
223
|
+
await promise_1
|
|
224
|
+
expect(instance_1.status).toBe('started')
|
|
225
|
+
await promise_2
|
|
226
|
+
expect(instance_1.status).toBe('started')
|
|
227
|
+
})
|
|
173
228
|
|
|
174
|
-
|
|
175
|
-
|
|
229
|
+
test('behavior: stop more than once', async () => {
|
|
230
|
+
pool = definePool({
|
|
231
|
+
instance,
|
|
176
232
|
})
|
|
177
233
|
|
|
178
|
-
|
|
179
|
-
const port = await getPort()
|
|
234
|
+
await pool.start(1)
|
|
180
235
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
236
|
+
const promise_1 = pool.stop(1)
|
|
237
|
+
const promise_2 = pool.stop(1)
|
|
238
|
+
expect(promise_1).toStrictEqual(promise_2)
|
|
184
239
|
|
|
185
|
-
|
|
240
|
+
await promise_1
|
|
241
|
+
await promise_2
|
|
242
|
+
})
|
|
186
243
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
expect(promise_1).toStrictEqual(promise_2)
|
|
244
|
+
test('error: start more than once on same port', async () => {
|
|
245
|
+
const port = await getPort()
|
|
190
246
|
|
|
191
|
-
|
|
192
|
-
|
|
247
|
+
pool = definePool({
|
|
248
|
+
instance,
|
|
193
249
|
})
|
|
194
250
|
|
|
195
|
-
|
|
196
|
-
pool = definePool({
|
|
197
|
-
instance,
|
|
198
|
-
limit: 2,
|
|
199
|
-
})
|
|
251
|
+
await pool.start(1, { port })
|
|
200
252
|
|
|
201
|
-
|
|
202
|
-
|
|
253
|
+
const promise_1 = pool.start(2, { port })
|
|
254
|
+
const promise_2 = pool.start(2, { port })
|
|
255
|
+
expect(promise_1).toStrictEqual(promise_2)
|
|
203
256
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
257
|
+
await expect(() => promise_1).rejects.toThrowError()
|
|
258
|
+
await expect(() => promise_2).rejects.toThrowError()
|
|
259
|
+
})
|
|
260
|
+
|
|
261
|
+
test('error: instance limit reached', async () => {
|
|
262
|
+
pool = definePool({
|
|
263
|
+
instance,
|
|
264
|
+
limit: 2,
|
|
207
265
|
})
|
|
208
|
-
|
|
209
|
-
)
|
|
266
|
+
|
|
267
|
+
await pool.start(1)
|
|
268
|
+
await pool.start(2)
|
|
269
|
+
|
|
270
|
+
await expect(() => pool.start(3)).rejects.toThrowError(
|
|
271
|
+
'Instance limit of 2 reached.',
|
|
272
|
+
)
|
|
273
|
+
})
|
|
274
|
+
})
|
package/pool.ts
CHANGED
|
@@ -4,28 +4,33 @@ import type { Instance } from './instance.js'
|
|
|
4
4
|
|
|
5
5
|
type Instance_ = Omit<Instance, 'create'>
|
|
6
6
|
|
|
7
|
-
export type Pool<key = number> = Pick<
|
|
7
|
+
export type Pool<key extends number | string = number | string> = Pick<
|
|
8
8
|
Map<key, Instance_>,
|
|
9
9
|
'entries' | 'keys' | 'forEach' | 'get' | 'has' | 'size' | 'values'
|
|
10
10
|
> & {
|
|
11
11
|
_internal: {
|
|
12
|
-
instance: Instance_
|
|
12
|
+
instance: Instance_ | ((key: key) => Instance_)
|
|
13
13
|
}
|
|
14
14
|
destroy(key: key): Promise<void>
|
|
15
15
|
destroyAll(): Promise<void>
|
|
16
|
+
restart(key: key): Promise<void>
|
|
16
17
|
start(key: key, options?: { port?: number }): Promise<Instance_>
|
|
17
18
|
stop(key: key): Promise<void>
|
|
18
19
|
stopAll(): Promise<void>
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
export type DefinePoolParameters
|
|
22
|
+
export type DefinePoolParameters<
|
|
23
|
+
key extends number | string = number | string,
|
|
24
|
+
> = {
|
|
22
25
|
/** Instance for the pool. */
|
|
23
|
-
instance: Instance
|
|
26
|
+
instance: Instance | ((key: key) => Instance)
|
|
24
27
|
/** The maximum number of instances that can be started. */
|
|
25
28
|
limit?: number | number
|
|
26
29
|
}
|
|
27
30
|
|
|
28
|
-
export type DefinePoolReturnType<
|
|
31
|
+
export type DefinePoolReturnType<
|
|
32
|
+
key extends number | string = number | string,
|
|
33
|
+
> = Pool<key>
|
|
29
34
|
|
|
30
35
|
/**
|
|
31
36
|
* Defines an instance pool. Instances can be started, cached, and stopped against an identifier.
|
|
@@ -41,10 +46,10 @@ export type DefinePoolReturnType<key = number> = Pool<key>
|
|
|
41
46
|
* const instance_3 = await pool.start(3)
|
|
42
47
|
* ```
|
|
43
48
|
*/
|
|
44
|
-
export function definePool<key = number>(
|
|
45
|
-
parameters: DefinePoolParameters
|
|
49
|
+
export function definePool<key extends number | string = number>(
|
|
50
|
+
parameters: DefinePoolParameters<key>,
|
|
46
51
|
): DefinePoolReturnType<key> {
|
|
47
|
-
const {
|
|
52
|
+
const { limit } = parameters
|
|
48
53
|
|
|
49
54
|
type Instance_ = Omit<Instance, 'create'>
|
|
50
55
|
const instances = new Map<key, Instance_>()
|
|
@@ -56,6 +61,7 @@ export function definePool<key = number>(
|
|
|
56
61
|
const promises = {
|
|
57
62
|
destroy: new Map<key, Promise<void>>(),
|
|
58
63
|
destroyAll: undefined as Promise<void> | undefined,
|
|
64
|
+
restart: new Map<key, Promise<void>>(),
|
|
59
65
|
start: new Map<key, Promise<Instance_>>(),
|
|
60
66
|
stop: new Map<key, Promise<void>>(),
|
|
61
67
|
stopAll: undefined as Promise<void> | undefined,
|
|
@@ -63,7 +69,7 @@ export function definePool<key = number>(
|
|
|
63
69
|
|
|
64
70
|
return {
|
|
65
71
|
_internal: {
|
|
66
|
-
instance,
|
|
72
|
+
instance: parameters.instance,
|
|
67
73
|
},
|
|
68
74
|
async destroy(key) {
|
|
69
75
|
const destroyPromise = promises.destroy.get(key)
|
|
@@ -71,16 +77,14 @@ export function definePool<key = number>(
|
|
|
71
77
|
|
|
72
78
|
const resolver = Promise.withResolvers<void>()
|
|
73
79
|
|
|
74
|
-
|
|
75
|
-
promises.destroy.set(key, resolver.promise)
|
|
80
|
+
promises.destroy.set(key, resolver.promise)
|
|
76
81
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
resolver.reject
|
|
83
|
-
}
|
|
82
|
+
this.stop(key)
|
|
83
|
+
.then(() => {
|
|
84
|
+
instances.delete(key)
|
|
85
|
+
resolver.resolve()
|
|
86
|
+
})
|
|
87
|
+
.catch(resolver.reject)
|
|
84
88
|
|
|
85
89
|
return resolver.promise
|
|
86
90
|
},
|
|
@@ -89,17 +93,35 @@ export function definePool<key = number>(
|
|
|
89
93
|
|
|
90
94
|
const resolver = Promise.withResolvers<void>()
|
|
91
95
|
|
|
92
|
-
|
|
93
|
-
|
|
96
|
+
promises.destroyAll = resolver.promise
|
|
97
|
+
|
|
98
|
+
Promise.all([...instances.keys()].map((key) => this.destroy(key)))
|
|
99
|
+
.then(() => {
|
|
100
|
+
promises.destroyAll = undefined
|
|
101
|
+
resolver.resolve()
|
|
102
|
+
})
|
|
103
|
+
.catch(resolver.reject)
|
|
104
|
+
|
|
105
|
+
return resolver.promise
|
|
106
|
+
},
|
|
107
|
+
async restart(key) {
|
|
108
|
+
const restartPromise = promises.restart.get(key)
|
|
109
|
+
if (restartPromise) return restartPromise
|
|
110
|
+
|
|
111
|
+
const resolver = Promise.withResolvers<void>()
|
|
112
|
+
|
|
113
|
+
const instance_ = instances.get(key)
|
|
114
|
+
if (!instance_) return
|
|
94
115
|
|
|
95
|
-
|
|
116
|
+
promises.restart.set(key, resolver.promise)
|
|
96
117
|
|
|
97
|
-
|
|
118
|
+
instance_
|
|
119
|
+
.restart()
|
|
120
|
+
.then(resolver.resolve)
|
|
121
|
+
.catch(resolver.reject)
|
|
122
|
+
.finally(() => promises.restart.delete(key))
|
|
98
123
|
|
|
99
|
-
|
|
100
|
-
} catch (error) {
|
|
101
|
-
resolver.reject(error)
|
|
102
|
-
}
|
|
124
|
+
return resolver.promise
|
|
103
125
|
},
|
|
104
126
|
async start(key, options = {}) {
|
|
105
127
|
const startPromise = promises.start.get(key)
|
|
@@ -107,24 +129,26 @@ export function definePool<key = number>(
|
|
|
107
129
|
|
|
108
130
|
const resolver = Promise.withResolvers<Instance_>()
|
|
109
131
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (limit && instances.size >= limit)
|
|
114
|
-
throw new Error(`Instance limit of ${limit} reached.`)
|
|
132
|
+
if (limit && instances.size >= limit)
|
|
133
|
+
throw new Error(`Instance limit of ${limit} reached.`)
|
|
115
134
|
|
|
116
|
-
|
|
135
|
+
promises.start.set(key, resolver.promise)
|
|
117
136
|
|
|
118
|
-
|
|
119
|
-
|
|
137
|
+
const instance =
|
|
138
|
+
typeof parameters.instance === 'function'
|
|
139
|
+
? parameters.instance(key)
|
|
140
|
+
: parameters.instance
|
|
141
|
+
const { port = await getPort() } = options
|
|
120
142
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
143
|
+
const instance_ = instances.get(key) || instance.create({ port })
|
|
144
|
+
instance_
|
|
145
|
+
.start()
|
|
146
|
+
.then(() => {
|
|
147
|
+
instances.set(key, instance_)
|
|
148
|
+
resolver.resolve(instance_)
|
|
149
|
+
})
|
|
150
|
+
.catch(resolver.reject)
|
|
151
|
+
.finally(() => promises.start.delete(key))
|
|
128
152
|
|
|
129
153
|
return resolver.promise
|
|
130
154
|
},
|
|
@@ -132,42 +156,35 @@ export function definePool<key = number>(
|
|
|
132
156
|
const stopPromise = promises.stop.get(key)
|
|
133
157
|
if (stopPromise) return stopPromise
|
|
134
158
|
|
|
135
|
-
const
|
|
159
|
+
const instance_ = instances.get(key)
|
|
160
|
+
if (!instance_) return
|
|
136
161
|
|
|
137
|
-
|
|
138
|
-
promises.stop.set(key, resolver.promise)
|
|
139
|
-
|
|
140
|
-
const instance_ = instances.get(key)
|
|
141
|
-
if (!instance_) {
|
|
142
|
-
resolver.resolve()
|
|
143
|
-
return
|
|
144
|
-
}
|
|
162
|
+
const resolver = Promise.withResolvers<void>()
|
|
145
163
|
|
|
146
|
-
|
|
164
|
+
promises.stop.set(key, resolver.promise)
|
|
165
|
+
instance_
|
|
166
|
+
.stop()
|
|
167
|
+
.then(resolver.resolve)
|
|
168
|
+
.catch(resolver.reject)
|
|
169
|
+
.finally(() => promises.stop.delete(key))
|
|
147
170
|
|
|
148
|
-
|
|
149
|
-
} catch (error) {
|
|
150
|
-
resolver.reject(error)
|
|
151
|
-
} finally {
|
|
152
|
-
promises.stop.delete(key)
|
|
153
|
-
}
|
|
171
|
+
return resolver.promise
|
|
154
172
|
},
|
|
155
173
|
async stopAll() {
|
|
156
174
|
if (promises.stopAll) return promises.stopAll
|
|
157
175
|
|
|
158
176
|
const resolver = Promise.withResolvers<void>()
|
|
159
177
|
|
|
160
|
-
|
|
161
|
-
promises.stopAll = resolver.promise
|
|
162
|
-
|
|
163
|
-
await Promise.all([...instances.keys()].map((key) => this.stop(key)))
|
|
178
|
+
promises.stopAll = resolver.promise
|
|
164
179
|
|
|
165
|
-
|
|
180
|
+
Promise.all([...instances.keys()].map((key) => this.stop(key)))
|
|
181
|
+
.then(() => {
|
|
182
|
+
promises.stopAll = undefined
|
|
183
|
+
resolver.resolve()
|
|
184
|
+
})
|
|
185
|
+
.catch(resolver.reject)
|
|
166
186
|
|
|
167
|
-
|
|
168
|
-
} catch (error) {
|
|
169
|
-
resolver.reject(error)
|
|
170
|
-
}
|
|
187
|
+
return resolver.promise
|
|
171
188
|
},
|
|
172
189
|
|
|
173
190
|
get size() {
|