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.
Files changed (52) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/_lib/exports/index.d.ts +1 -1
  3. package/_lib/exports/processes.d.ts +2 -0
  4. package/_lib/exports/processes.d.ts.map +1 -0
  5. package/_lib/exports/processes.js +2 -0
  6. package/_lib/exports/processes.js.map +1 -0
  7. package/_lib/instance.d.ts +9 -6
  8. package/_lib/instance.d.ts.map +1 -1
  9. package/_lib/instance.js +22 -3
  10. package/_lib/instance.js.map +1 -1
  11. package/_lib/instances/anvil.d.ts +1 -5
  12. package/_lib/instances/anvil.d.ts.map +1 -1
  13. package/_lib/instances/anvil.js +18 -44
  14. package/_lib/instances/anvil.js.map +1 -1
  15. package/_lib/instances/stackup.d.ts +86 -0
  16. package/_lib/instances/stackup.d.ts.map +1 -0
  17. package/_lib/instances/stackup.js +89 -0
  18. package/_lib/instances/stackup.js.map +1 -0
  19. package/_lib/pool.d.ts +7 -6
  20. package/_lib/pool.d.ts.map +1 -1
  21. package/_lib/pool.js +60 -53
  22. package/_lib/pool.js.map +1 -1
  23. package/_lib/processes/execa.d.ts +27 -0
  24. package/_lib/processes/execa.d.ts.map +1 -0
  25. package/_lib/processes/execa.js +63 -0
  26. package/_lib/processes/execa.js.map +1 -0
  27. package/_lib/server.d.ts +3 -3
  28. package/_lib/server.d.ts.map +1 -1
  29. package/_lib/server.js +42 -34
  30. package/_lib/server.js.map +1 -1
  31. package/_lib/utils.d.ts +4 -3
  32. package/_lib/utils.d.ts.map +1 -1
  33. package/_lib/utils.js +2 -2
  34. package/_lib/utils.js.map +1 -1
  35. package/exports/index.ts +2 -2
  36. package/exports/processes.test.ts +10 -0
  37. package/exports/processes.ts +8 -0
  38. package/instance.test.ts +34 -2
  39. package/instance.ts +46 -13
  40. package/instances/anvil.test.ts +5 -3
  41. package/instances/anvil.ts +21 -49
  42. package/instances/stackup.test.ts +106 -0
  43. package/instances/stackup.ts +162 -0
  44. package/package.json +6 -2
  45. package/pool.test.ts +203 -138
  46. package/pool.ts +83 -66
  47. package/processes/execa.test.ts +143 -0
  48. package/processes/execa.ts +100 -0
  49. package/server.test.ts +162 -85
  50. package/server.ts +46 -38
  51. package/tsconfig.build.tsbuildinfo +1 -1
  52. 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([{ instance: anvil() }])(
17
- 'instance: $instance.name',
18
- ({ instance }) => {
19
- test('default', async () => {
20
- pool = definePool({
21
- instance,
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
- expect(pool).toBeDefined()
36
+ test('start', async () => {
37
+ pool = definePool({
38
+ instance,
25
39
  })
26
40
 
27
- test('start', async () => {
28
- pool = definePool({
29
- instance,
30
- })
41
+ expect(pool.size).toEqual(0)
31
42
 
32
- expect(pool.size).toEqual(0)
43
+ const instance_1 = await pool.start(1)
44
+ expect(instance_1.status).toBe('started')
45
+ expect(pool.size).toEqual(1)
33
46
 
34
- const instance_1 = await pool.start(1)
35
- expect(instance_1.status).toBe('started')
36
- expect(pool.size).toEqual(1)
47
+ const instance_2 = await pool.start(2)
48
+ expect(instance_2.status).toBe('started')
49
+ expect(pool.size).toEqual(2)
37
50
 
38
- const instance_2 = await pool.start(2)
39
- expect(instance_2.status).toBe('started')
40
- expect(pool.size).toEqual(2)
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
- const instance_3 = await pool.start(1337)
43
- expect(instance_3.status).toBe('started')
44
- expect(pool.size).toEqual(3)
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
- test('stop / destroy', async () => {
48
- pool = definePool({
49
- instance,
50
- })
65
+ await pool.start(1)
66
+ await pool.start(2)
67
+ await pool.start(1337)
51
68
 
52
- const instance_1 = await pool.start(1)
53
- const instance_2 = await pool.start(2)
54
- const instance_3 = await pool.start(3)
69
+ expect(keys).toStrictEqual([1, 2, 1337])
70
+ })
55
71
 
56
- expect(instance_1.status).toBe('started')
57
- expect(instance_2.status).toBe('started')
58
- expect(instance_3.status).toBe('started')
59
- expect(pool.size).toEqual(3)
72
+ test('stop / destroy', async () => {
73
+ pool = definePool({
74
+ instance,
75
+ })
60
76
 
61
- await pool.stop(1)
62
- expect(instance_1.status).toBe('stopped')
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
- await pool.stop(2)
65
- expect(instance_2.status).toBe('stopped')
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
- await pool.stop(3)
68
- expect(instance_3.status).toBe('stopped')
86
+ await pool.stop(1)
87
+ expect(instance_1.status).toBe('stopped')
69
88
 
70
- await pool.stop(1)
71
- await pool.stop(2)
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
- expect(pool.size).toEqual(3)
92
+ await pool.stop(3)
93
+ expect(instance_3.status).toBe('stopped')
76
94
 
77
- await pool.destroy(1)
78
- expect(pool.size).toEqual(2)
79
- await pool.destroy(2)
80
- expect(pool.size).toEqual(1)
81
- await pool.destroy(3)
82
- expect(pool.size).toEqual(0)
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
- test('start > stop > start', async () => {
86
- pool = definePool({
87
- instance,
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
- const instance_1 = await pool.start(1)
91
- expect(instance_1.status).toBe('started')
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
- await pool.stop(1)
94
- expect(instance_1.status).toBe('stopped')
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
- await pool.start(1)
97
- expect(instance_1.status).toBe('started')
130
+ test('start > stop > start', async () => {
131
+ pool = definePool({
132
+ instance,
98
133
  })
99
134
 
100
- test('stopAll / destroyAll', async () => {
101
- pool = definePool({
102
- instance,
103
- })
135
+ const instance_1 = await pool.start(1)
136
+ expect(instance_1.status).toBe('started')
104
137
 
105
- await pool.start(1)
106
- await pool.start(2)
107
- await pool.start(3)
138
+ await pool.stop(1)
139
+ expect(instance_1.status).toBe('stopped')
108
140
 
109
- expect(pool.size).toEqual(3)
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
- await pool.stopAll()
112
- expect(pool.size).toEqual(3)
150
+ await pool.start(1)
151
+ await pool.start(2)
152
+ await pool.start(3)
113
153
 
114
- await pool.destroyAll()
115
- expect(pool.size).toEqual(0)
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
- test('get', async () => {
119
- pool = definePool({
120
- instance,
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
- const instance_1 = await pool.start(1)
124
- const instance_2 = await pool.start(2)
125
- const instance_3 = await pool.start(3)
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
- expect(pool.get(1)).toStrictEqual(instance_1)
128
- expect(pool.get(2)).toStrictEqual(instance_2)
129
- expect(pool.get(3)).toStrictEqual(instance_3)
177
+ test('behavior: start more than once', async () => {
178
+ pool = definePool({
179
+ instance,
130
180
  })
131
181
 
132
- test('behavior: start more than once', async () => {
133
- pool = definePool({
134
- instance,
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
- const promise_1 = pool.start(1)
138
- const promise_2 = pool.start(1)
139
- expect(promise_1).toStrictEqual(promise_2)
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
- const instance_1 = await promise_1
142
- const instance_2 = await promise_2
143
- expect(instance_1).toStrictEqual(instance_2)
191
+ test('behavior: clear more than once', async () => {
192
+ pool = definePool({
193
+ instance,
144
194
  })
145
195
 
146
- test('behavior: clear more than once', async () => {
147
- pool = definePool({
148
- instance,
149
- })
196
+ await pool.start(1)
197
+ await pool.start(2)
198
+ await pool.start(3)
150
199
 
151
- await pool.start(1)
152
- await pool.start(2)
153
- await pool.start(3)
200
+ const promise_1 = pool.stopAll()
201
+ const promise_2 = pool.stopAll()
202
+ expect(promise_1).toStrictEqual(promise_2)
154
203
 
155
- const promise_1 = pool.stopAll()
156
- const promise_2 = pool.stopAll()
157
- expect(promise_1).toStrictEqual(promise_2)
204
+ await promise_1
205
+ await promise_2
206
+ })
158
207
 
159
- await promise_1
160
- await promise_2
208
+ test('behavior: restart more than once', async () => {
209
+ pool = definePool({
210
+ instance,
161
211
  })
162
212
 
163
- test('behavior: stop more than once', async () => {
164
- pool = definePool({
165
- instance,
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
- await pool.start(1)
221
+ expect(promise_1).toStrictEqual(promise_2)
169
222
 
170
- const promise_1 = pool.stop(1)
171
- const promise_2 = pool.stop(1)
172
- expect(promise_1).toStrictEqual(promise_2)
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
- await promise_1
175
- await promise_2
229
+ test('behavior: stop more than once', async () => {
230
+ pool = definePool({
231
+ instance,
176
232
  })
177
233
 
178
- test('error: start more than once on same port', async () => {
179
- const port = await getPort()
234
+ await pool.start(1)
180
235
 
181
- pool = definePool({
182
- instance,
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
- await pool.start(1, { port })
240
+ await promise_1
241
+ await promise_2
242
+ })
186
243
 
187
- const promise_1 = pool.start(2, { port })
188
- const promise_2 = pool.start(2, { port })
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
- await expect(() => promise_1).rejects.toThrowError()
192
- await expect(() => promise_2).rejects.toThrowError()
247
+ pool = definePool({
248
+ instance,
193
249
  })
194
250
 
195
- test('error: instance limit reached', async () => {
196
- pool = definePool({
197
- instance,
198
- limit: 2,
199
- })
251
+ await pool.start(1, { port })
200
252
 
201
- await pool.start(1)
202
- await pool.start(2)
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
- await expect(() => pool.start(3)).rejects.toThrowError(
205
- 'Instance limit of 2 reached.',
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<key = number> = Pool<key>
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 { instance, limit } = parameters
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
- try {
75
- promises.destroy.set(key, resolver.promise)
80
+ promises.destroy.set(key, resolver.promise)
76
81
 
77
- await this.stop(key)
78
- instances.delete(key)
79
-
80
- resolver.resolve()
81
- } catch (error) {
82
- resolver.reject(error)
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
- try {
93
- promises.destroyAll = resolver.promise
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
- await Promise.all([...instances.keys()].map((key) => this.destroy(key)))
116
+ promises.restart.set(key, resolver.promise)
96
117
 
97
- promises.destroyAll = undefined
118
+ instance_
119
+ .restart()
120
+ .then(resolver.resolve)
121
+ .catch(resolver.reject)
122
+ .finally(() => promises.restart.delete(key))
98
123
 
99
- resolver.resolve()
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
- try {
111
- promises.start.set(key, resolver.promise)
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
- const { port = await getPort() } = options
135
+ promises.start.set(key, resolver.promise)
117
136
 
118
- const instance_ = instances.get(key) || instance.create({ port })
119
- await instance_.start()
137
+ const instance =
138
+ typeof parameters.instance === 'function'
139
+ ? parameters.instance(key)
140
+ : parameters.instance
141
+ const { port = await getPort() } = options
120
142
 
121
- instances.set(key, instance_)
122
- resolver.resolve(instance_)
123
- } catch (error) {
124
- resolver.reject(error)
125
- } finally {
126
- promises.start.delete(key)
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 resolver = Promise.withResolvers<void>()
159
+ const instance_ = instances.get(key)
160
+ if (!instance_) return
136
161
 
137
- try {
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
- await instance_.stop()
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
- resolver.resolve()
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
- try {
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
- promises.stopAll = undefined
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
- resolver.resolve()
168
- } catch (error) {
169
- resolver.reject(error)
170
- }
187
+ return resolver.promise
171
188
  },
172
189
 
173
190
  get size() {