@orkestrel/pool 0.0.15 → 0.0.16
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 +2 -2
- package/dist/src/core/index.cjs +62 -33
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +39 -28
- package/dist/src/core/index.d.ts +39 -28
- package/dist/src/core/index.js +62 -33
- package/dist/src/core/index.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @orkestrel/pool
|
|
2
2
|
|
|
3
3
|
> A typed resource pool with optional bounded capacity, a warm floor, bounded loss recovery,
|
|
4
|
-
>
|
|
4
|
+
> exclusive leases by default, FIFO settlement, validated idle reuse, caller-owned cancellation, and explicit cleanup.
|
|
5
5
|
|
|
6
6
|
Create a pool with the `createPool` function, hand it the hooks that make, check, and tear
|
|
7
7
|
down one resource, and `await pool.acquire()` wherever the work needs one. Release the token
|
|
@@ -10,7 +10,7 @@ Environment-agnostic — no I/O, no browser or server assumptions. Part of the `
|
|
|
10
10
|
line.
|
|
11
11
|
|
|
12
12
|
For eager resources, set `min` and the required `restarts` bound on failed refills and losses
|
|
13
|
-
of
|
|
13
|
+
of idle records between strike resets, then call `start()`.
|
|
14
14
|
The `watch(value, signal)` hook reports loss; a holder can also call its token's `destroy()`.
|
|
15
15
|
The pool disposes lost records before replacing them and keeps a record whose cleanup fails
|
|
16
16
|
counted against `max`.
|
package/dist/src/core/index.cjs
CHANGED
|
@@ -57,18 +57,18 @@ function isPoolError(value) {
|
|
|
57
57
|
//#endregion
|
|
58
58
|
//#region src/core/validators.ts
|
|
59
59
|
/**
|
|
60
|
-
* Tests whether a value is a positive safe integer
|
|
60
|
+
* Tests whether a value is a positive safe integer for a pool record or lease limit.
|
|
61
61
|
*
|
|
62
|
-
* @param value - The unknown
|
|
62
|
+
* @param value - The unknown record or lease limit candidate
|
|
63
63
|
* @returns True if the value is a positive safe integer; false otherwise
|
|
64
64
|
*
|
|
65
65
|
* @example
|
|
66
66
|
* ```ts
|
|
67
|
-
*
|
|
68
|
-
*
|
|
67
|
+
* isPoolLimit(8) // true
|
|
68
|
+
* isPoolLimit(Infinity) // false
|
|
69
69
|
* ```
|
|
70
70
|
*/
|
|
71
|
-
function
|
|
71
|
+
function isPoolLimit(value) {
|
|
72
72
|
return (0, _orkestrel_contract.isNumber)(value) && Number.isSafeInteger(value) && value > 0;
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
@@ -120,12 +120,12 @@ var Pool = class {
|
|
|
120
120
|
#destroy;
|
|
121
121
|
#validate;
|
|
122
122
|
#max;
|
|
123
|
+
#capacity;
|
|
123
124
|
#min;
|
|
124
125
|
#restarts;
|
|
125
126
|
#watch;
|
|
126
127
|
#error;
|
|
127
128
|
#watches = /* @__PURE__ */ new Map();
|
|
128
|
-
#used = /* @__PURE__ */ new WeakSet();
|
|
129
129
|
#births = /* @__PURE__ */ new WeakMap();
|
|
130
130
|
#settled = /* @__PURE__ */ new WeakSet();
|
|
131
131
|
#survivors = /* @__PURE__ */ new Map();
|
|
@@ -134,7 +134,7 @@ var Pool = class {
|
|
|
134
134
|
#resources = /* @__PURE__ */ new Map();
|
|
135
135
|
#available = [];
|
|
136
136
|
#validating = /* @__PURE__ */ new Set();
|
|
137
|
-
#leased = /* @__PURE__ */ new
|
|
137
|
+
#leased = /* @__PURE__ */ new Map();
|
|
138
138
|
#destroying = /* @__PURE__ */ new Map();
|
|
139
139
|
#waiters = [];
|
|
140
140
|
#assigned = /* @__PURE__ */ new Set();
|
|
@@ -158,20 +158,25 @@ var Pool = class {
|
|
|
158
158
|
* Constructs a pool and synchronously validates its capacity contract.
|
|
159
159
|
*
|
|
160
160
|
* @param options - Resource hooks, observation hooks, capacity, and optional bounded warm floor
|
|
161
|
-
* @throws {@link PoolError} Thrown with `code: 'invalid'` when `min
|
|
162
|
-
* safe integer,
|
|
161
|
+
* @throws {@link PoolError} Thrown with `code: 'invalid'` when `capacity`, `min`, or `max` is not a positive
|
|
162
|
+
* safe integer, explicit `min` and `max` differ, `restarts` is absent with `min`, present without
|
|
163
163
|
* `min`, or not a non-negative safe integer, or `watch` is not callable.
|
|
164
164
|
*/
|
|
165
165
|
constructor(options) {
|
|
166
166
|
const max = options.max;
|
|
167
|
+
const capacity = options.capacity;
|
|
167
168
|
const min = options.min;
|
|
168
169
|
const restarts = options.restarts;
|
|
169
170
|
const watch = options.watch;
|
|
170
|
-
if (max !== void 0 && !
|
|
171
|
+
if (max !== void 0 && !isPoolLimit(max)) throw new PoolError({
|
|
171
172
|
code: "invalid",
|
|
172
173
|
context: { value: max }
|
|
173
174
|
});
|
|
174
|
-
if (
|
|
175
|
+
if (capacity !== void 0 && !isPoolLimit(capacity)) throw new PoolError({
|
|
176
|
+
code: "invalid",
|
|
177
|
+
context: { value: capacity }
|
|
178
|
+
});
|
|
179
|
+
if (min !== void 0 && (!isPoolLimit(min) || max !== void 0 && min !== max)) throw new PoolError({
|
|
175
180
|
code: "invalid",
|
|
176
181
|
context: { value: min }
|
|
177
182
|
});
|
|
@@ -189,6 +194,7 @@ var Pool = class {
|
|
|
189
194
|
this.#destroy = options.destroy;
|
|
190
195
|
this.#validate = options.validate;
|
|
191
196
|
this.#max = max ?? min;
|
|
197
|
+
this.#capacity = capacity ?? 1;
|
|
192
198
|
this.#min = min;
|
|
193
199
|
this.#restarts = restarts;
|
|
194
200
|
this.#watch = watch;
|
|
@@ -206,11 +212,11 @@ var Pool = class {
|
|
|
206
212
|
get size() {
|
|
207
213
|
return this.#resources.size;
|
|
208
214
|
}
|
|
209
|
-
/** Counts
|
|
215
|
+
/** Counts available records with no live lease or pending handout. */
|
|
210
216
|
get idle() {
|
|
211
217
|
return this.#available.length;
|
|
212
218
|
}
|
|
213
|
-
/** Counts
|
|
219
|
+
/** Counts records with live leases, counting a shared record once rather than counting its leases. */
|
|
214
220
|
get active() {
|
|
215
221
|
return this.#leased.size;
|
|
216
222
|
}
|
|
@@ -234,8 +240,8 @@ var Pool = class {
|
|
|
234
240
|
return starting.promise;
|
|
235
241
|
}
|
|
236
242
|
/**
|
|
237
|
-
* Queues the caller in FIFO order,
|
|
238
|
-
* creates on demand
|
|
243
|
+
* Queues the caller in FIFO order, shares an occupied record or validates an idle record, and
|
|
244
|
+
* waits for a floor refill or creates on demand without a floor.
|
|
239
245
|
*
|
|
240
246
|
* @param signal - Optional native cancellation signal
|
|
241
247
|
* @returns A promise for the unique resource lease
|
|
@@ -243,9 +249,9 @@ var Pool = class {
|
|
|
243
249
|
* with `code: 'invalid'`. This throw is synchronous rather than a rejected promise, so a caller
|
|
244
250
|
* that handles failures with `.catch()` alone misses it.
|
|
245
251
|
* @throws {@link PoolError} Thrown as a rejection when `destroy()` has already begun, with
|
|
246
|
-
* `code: 'destroyed'`; when the create hook fails or the floor is spent without an
|
|
252
|
+
* `code: 'destroyed'`; when the create hook fails or the floor is spent without an eligible record,
|
|
247
253
|
* with `code: 'create'` and the last cause; and when an invalid record's cleanup fails or
|
|
248
|
-
* a floor retains a record, owns `min` records, has nothing
|
|
254
|
+
* a floor retains a record, owns `min` records, has nothing eligible, and has no refill or disposal
|
|
249
255
|
* pending, even with live leases, with `code: 'cleanup'` and the retained cleanup failure as cause.
|
|
250
256
|
* A `signal` that aborts rejects with the caller's exact `signal.reason` instead.
|
|
251
257
|
*/
|
|
@@ -350,8 +356,7 @@ var Pool = class {
|
|
|
350
356
|
});
|
|
351
357
|
}
|
|
352
358
|
}
|
|
353
|
-
#token(record, value) {
|
|
354
|
-
const lease = {};
|
|
359
|
+
#token(record, value, lease) {
|
|
355
360
|
return {
|
|
356
361
|
value,
|
|
357
362
|
release: this.#createRelease(record, lease),
|
|
@@ -362,7 +367,7 @@ var Pool = class {
|
|
|
362
367
|
return () => {
|
|
363
368
|
if (this.#settled.has(lease)) return;
|
|
364
369
|
this.#settled.add(lease);
|
|
365
|
-
this.#release(record);
|
|
370
|
+
this.#release(record, lease);
|
|
366
371
|
};
|
|
367
372
|
}
|
|
368
373
|
#createDestroy(record, lease) {
|
|
@@ -407,10 +412,12 @@ var Pool = class {
|
|
|
407
412
|
this.#repump = false;
|
|
408
413
|
for (const waiter of this.#waiters) {
|
|
409
414
|
if (this.#assigned.has(waiter) || this.#ready.has(waiter)) continue;
|
|
410
|
-
const record = this.#
|
|
415
|
+
const record = this.#select();
|
|
411
416
|
if (record !== void 0) {
|
|
412
417
|
this.#assigned.add(waiter);
|
|
413
|
-
this.#
|
|
418
|
+
const index = this.#available.indexOf(record);
|
|
419
|
+
if (index >= 0) this.#available.splice(index, 1);
|
|
420
|
+
if (this.#occupancy(record) === 0) this.#validating.add(record);
|
|
414
421
|
this.#startValidation(waiter, record);
|
|
415
422
|
continue;
|
|
416
423
|
}
|
|
@@ -451,6 +458,25 @@ var Pool = class {
|
|
|
451
458
|
this.#pumping = false;
|
|
452
459
|
this.#fill();
|
|
453
460
|
}
|
|
461
|
+
#occupancy(record) {
|
|
462
|
+
let count = this.#leased.get(record)?.size ?? 0;
|
|
463
|
+
for (const result of this.#ready.values()) if (result.success && result.record === record) count += 1;
|
|
464
|
+
return count;
|
|
465
|
+
}
|
|
466
|
+
#select() {
|
|
467
|
+
let selected;
|
|
468
|
+
let least = this.#capacity;
|
|
469
|
+
for (const record of this.#resources.keys()) {
|
|
470
|
+
if (this.#validating.has(record) || this.#destroying.has(record) || this.#survivors.has(record)) continue;
|
|
471
|
+
const count = this.#occupancy(record);
|
|
472
|
+
if (count === 0 && !this.#available.includes(record)) continue;
|
|
473
|
+
if (count < least) {
|
|
474
|
+
selected = record;
|
|
475
|
+
least = count;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
return this.#available[0] ?? selected;
|
|
479
|
+
}
|
|
454
480
|
#spent() {
|
|
455
481
|
return this.#restarts !== void 0 && this.#strikes > this.#restarts;
|
|
456
482
|
}
|
|
@@ -523,7 +549,7 @@ var Pool = class {
|
|
|
523
549
|
this.#pump();
|
|
524
550
|
}
|
|
525
551
|
#strike(record, cause) {
|
|
526
|
-
if (this.#min !== void 0 && !this.#
|
|
552
|
+
if (this.#min !== void 0 && !this.#leased.has(record)) this.#addStrike(cause);
|
|
527
553
|
}
|
|
528
554
|
#addStrike(cause) {
|
|
529
555
|
this.#strikes += 1;
|
|
@@ -538,7 +564,7 @@ var Pool = class {
|
|
|
538
564
|
#startValidation(waiter, record) {
|
|
539
565
|
for (const [owned, value] of this.#resources) {
|
|
540
566
|
if (owned !== record) continue;
|
|
541
|
-
if (this.#validate === void 0) {
|
|
567
|
+
if (!this.#validating.has(record) || this.#validate === void 0) {
|
|
542
568
|
this.#validating.delete(record);
|
|
543
569
|
this.#prepare(waiter, record, value);
|
|
544
570
|
return;
|
|
@@ -586,7 +612,7 @@ var Pool = class {
|
|
|
586
612
|
this.#ready.set(waiter, {
|
|
587
613
|
success: true,
|
|
588
614
|
record,
|
|
589
|
-
token: this.#token(record, value)
|
|
615
|
+
token: this.#token(record, value, waiter)
|
|
590
616
|
});
|
|
591
617
|
this.#commit();
|
|
592
618
|
}
|
|
@@ -654,7 +680,7 @@ var Pool = class {
|
|
|
654
680
|
this.#ready.set(waiter, {
|
|
655
681
|
success: true,
|
|
656
682
|
record,
|
|
657
|
-
token: this.#token(record, value)
|
|
683
|
+
token: this.#token(record, value, waiter)
|
|
658
684
|
});
|
|
659
685
|
this.#commit();
|
|
660
686
|
}
|
|
@@ -679,8 +705,9 @@ var Pool = class {
|
|
|
679
705
|
waiter.reject(result.error);
|
|
680
706
|
continue;
|
|
681
707
|
}
|
|
682
|
-
this.#leased.
|
|
683
|
-
|
|
708
|
+
const leases = this.#leased.get(result.record) ?? /* @__PURE__ */ new Set();
|
|
709
|
+
leases.add(waiter);
|
|
710
|
+
this.#leased.set(result.record, leases);
|
|
684
711
|
if (this.#births.get(result.record) === this.#epoch) this.#strikes = 0;
|
|
685
712
|
waiter.resolve(result.token);
|
|
686
713
|
this.#emitter.emit("acquire");
|
|
@@ -707,8 +734,10 @@ var Pool = class {
|
|
|
707
734
|
this.#pump();
|
|
708
735
|
this.#finish();
|
|
709
736
|
}
|
|
710
|
-
#release(record) {
|
|
711
|
-
|
|
737
|
+
#release(record, lease) {
|
|
738
|
+
const leases = this.#leased.get(record);
|
|
739
|
+
if (leases === void 0 || !leases.delete(lease)) return;
|
|
740
|
+
if (leases.size === 0) this.#leased.delete(record);
|
|
712
741
|
this.#recycle(record);
|
|
713
742
|
}
|
|
714
743
|
#recycle(record) {
|
|
@@ -717,7 +746,7 @@ var Pool = class {
|
|
|
717
746
|
this.#own(this.#dispose(record));
|
|
718
747
|
return;
|
|
719
748
|
}
|
|
720
|
-
this.#available.push(record);
|
|
749
|
+
if (this.#occupancy(record) === 0 && !this.#validating.has(record) && !this.#available.includes(record)) this.#available.push(record);
|
|
721
750
|
this.#pump();
|
|
722
751
|
if (this.#available.includes(record)) this.#emitter.emit("release");
|
|
723
752
|
}
|
|
@@ -821,7 +850,7 @@ var Pool = class {
|
|
|
821
850
|
//#region src/core/factories.ts
|
|
822
851
|
/**
|
|
823
852
|
* Creates a distinct {@link PoolInterface} from resource lifecycle hooks, with optional bounded
|
|
824
|
-
* capacity,
|
|
853
|
+
* capacity, exclusive leases by default, and FIFO settlement.
|
|
825
854
|
*
|
|
826
855
|
* @remarks
|
|
827
856
|
* Concurrent create and validation hooks may overlap, while acquire promises settle in
|
|
@@ -865,7 +894,7 @@ exports.Pool = Pool;
|
|
|
865
894
|
exports.PoolError = PoolError;
|
|
866
895
|
exports.createPool = createPool;
|
|
867
896
|
exports.isPoolError = isPoolError;
|
|
868
|
-
exports.
|
|
897
|
+
exports.isPoolLimit = isPoolLimit;
|
|
869
898
|
exports.isPoolSignal = isPoolSignal;
|
|
870
899
|
|
|
871
900
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["isError","isString","isInstance","isNumber","holds","isFunction","isNumber","isFunction","Emitter","attempt"],"sources":["../../../src/core/errors.ts","../../../src/core/validators.ts","../../../src/core/Pool.ts","../../../src/core/factories.ts"],"sourcesContent":["import type { PoolErrorOptions } from './types.js'\nimport { isError, isInstance, isString } from '@orkestrel/contract'\n\n/**\n * Represents a stable, machine-readable pool failure that retains the original thrown value as\n * its cause without unsafe coercion, alongside structured context.\n *\n * @example\n * ```ts\n * import { PoolError, isPoolError } from '@orkestrel/pool'\n *\n * try {\n * \tawait pool.acquire()\n * } catch (error: unknown) {\n * \tif (isPoolError(error)) console.error(error.code, error.cause)\n * }\n * ```\n */\nexport class PoolError extends Error {\n\t/** Holds the stable machine-readable failure category. */\n\treadonly code\n\t/** Holds optional structured input or aggregate destroy-hook failure details. */\n\treadonly context\n\n\t/**\n\t * Creates a pool failure without coercing a hostile thrown value.\n\t *\n\t * @param options - Stable code plus optional cause and structured context\n\t */\n\tconstructor(options: PoolErrorOptions) {\n\t\tlet message = 'pool input is invalid'\n\t\tif (options.code === 'destroyed') message = 'pool is destroyed'\n\t\tif (options.code === 'create') message = 'pool create failed'\n\t\tif (options.code === 'cleanup') message = 'pool cleanup failed'\n\t\tif (\n\t\t\tisError(options.cause) &&\n\t\t\tisString(options.cause.message) &&\n\t\t\toptions.cause.message.length > 0\n\t\t) {\n\t\t\tmessage = `${message}: ${options.cause.message}`\n\t\t}\n\t\tsuper(message, options.cause === undefined ? undefined : { cause: options.cause })\n\t\tthis.name = 'PoolError'\n\t\tthis.code = options.code\n\t\tthis.context = options.context\n\t}\n}\n\n/**\n * Tests whether an unknown value is a {@link PoolError}, returning `false` for hostile proxies.\n *\n * @param value - The unknown boundary value\n * @returns True if the value is a real `PoolError` instance; false otherwise\n *\n * @example\n * ```ts\n * isPoolError(new PoolError({ code: 'destroyed' })) // true\n * isPoolError(new Error('other')) // false\n * ```\n */\nexport function isPoolError(value: unknown): value is PoolError {\n\treturn isInstance(value, PoolError)\n}\n","import { holds, isFunction, isNumber } from '@orkestrel/contract'\n\n/**\n * Tests whether a value is a positive safe integer, the only valid explicit pool maximum.\n *\n * @param value - The unknown maximum candidate\n * @returns True if the value is a positive safe integer; false otherwise\n *\n * @example\n * ```ts\n * isPoolMax(8) // true\n * isPoolMax(Infinity) // false\n * ```\n */\nexport function isPoolMax(value: unknown): value is number {\n\treturn isNumber(value) && Number.isSafeInteger(value) && value > 0\n}\n\n/**\n * Tests whether a value is a native `AbortSignal` for the acquire boundary, returning `false`\n * for hostile proxies.\n *\n * @param value - The unknown signal candidate\n * @returns True if the value is a native `AbortSignal`; false otherwise\n *\n * @example\n * ```ts\n * isPoolSignal(new AbortController().signal) // true\n * isPoolSignal({ aborted: false }) // false\n * ```\n */\nexport function isPoolSignal(value: unknown): value is AbortSignal {\n\treturn holds(() => {\n\t\tconst getter = Object.getOwnPropertyDescriptor(AbortSignal.prototype, 'aborted')?.get\n\t\tif (!isFunction(getter)) return false\n\t\tReflect.apply(getter, value, [])\n\t\treturn true\n\t})\n}\n","import type { EmitterErrorHandler, EmitterInterface } from '@orkestrel/emitter'\nimport type { PoolCode, PoolEventMap, PoolInterface, PoolOptions, PoolToken } from './types.js'\nimport { Emitter } from '@orkestrel/emitter'\nimport { attempt, isFunction, isNumber } from '@orkestrel/contract'\nimport { PoolError } from './errors.js'\nimport { isPoolMax, isPoolSignal } from './validators.js'\n\n/**\n * Represents a resource pool with optional bounded capacity and a warm floor, whose opaque\n * ownership records preserve FIFO settlement, cancellation, exact lease release, and\n * deterministic teardown under concurrent hooks.\n *\n * @typeParam T - The pooled resource value\n *\n * @example\n * ```ts\n * import { Pool } from '@orkestrel/pool'\n *\n * const pool = new Pool({ create: () => new Uint8Array(64), max: 2 })\n * const token = await pool.acquire()\n * try {\n * \tconsume(token.value)\n * } finally {\n * \ttoken.release()\n * }\n * await pool.destroy()\n * ```\n */\nexport class Pool<T> implements PoolInterface<T> {\n\treadonly #create: () => Promise<T> | T\n\treadonly #destroy: ((value: T) => Promise<void> | void) | undefined\n\treadonly #validate: ((value: T) => Promise<boolean> | boolean) | undefined\n\treadonly #max: number | undefined\n\treadonly #min: number | undefined\n\treadonly #restarts: number | undefined\n\treadonly #watch: PoolOptions<T>['watch']\n\treadonly #error: EmitterErrorHandler | undefined\n\treadonly #watches = new Map<object, AbortController>()\n\treadonly #used = new WeakSet<object>()\n\treadonly #births = new WeakMap<object, object>()\n\treadonly #settled = new WeakSet<object>()\n\treadonly #survivors = new Map<object, unknown>()\n\treadonly #owing = new Set<object>()\n\treadonly #emitter: Emitter<PoolEventMap>\n\treadonly #resources = new Map<object, T>()\n\treadonly #available: object[] = []\n\treadonly #validating = new Set<object>()\n\treadonly #leased = new Set<object>()\n\treadonly #destroying = new Map<object, Promise<void>>()\n\treadonly #waiters: Array<PromiseWithResolvers<PoolToken<T>>> = []\n\treadonly #assigned = new Set<PromiseWithResolvers<PoolToken<T>>>()\n\treadonly #reservations = new Set<PromiseWithResolvers<PoolToken<T>>>()\n\treadonly #signals = new Map<\n\t\tPromiseWithResolvers<PoolToken<T>>,\n\t\t{ readonly signal: AbortSignal; readonly listener: () => void }\n\t>()\n\treadonly #ready = new Map<\n\t\tPromiseWithResolvers<PoolToken<T>>,\n\t\t| { readonly success: true; readonly record: object; readonly token: PoolToken<T> }\n\t\t| { readonly success: false; readonly error: unknown }\n\t>()\n\treadonly #operations = new Set<Promise<void>>()\n\treadonly #owned = new Set<Promise<void>>()\n\treadonly #failures: unknown[] = []\n\t#ending: PromiseWithResolvers<void> | undefined\n\t#pumping = false\n\t#repump = false\n\t#started = false\n\t#starting: PromiseWithResolvers<void> | undefined\n\t#refilling = false\n\t#strikes = 0\n\t#epoch = {}\n\t#owed = 0\n\t#cause: unknown\n\n\t/**\n\t * Constructs a pool and synchronously validates its capacity contract.\n\t *\n\t * @param options - Resource hooks, observation hooks, capacity, and optional bounded warm floor\n\t * @throws {@link PoolError} Thrown with `code: 'invalid'` when `min` or `max` is not a positive\n\t * safe integer, their explicit values differ, `restarts` is absent with `min`, present without\n\t * `min`, or not a non-negative safe integer, or `watch` is not callable.\n\t */\n\tconstructor(options: PoolOptions<T>) {\n\t\tconst max = options.max\n\t\tconst min = options.min\n\t\tconst restarts = options.restarts\n\t\tconst watch = options.watch\n\t\tif (max !== undefined && !isPoolMax(max)) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: max } })\n\t\t}\n\t\tif (min !== undefined && (!isPoolMax(min) || (max !== undefined && min !== max))) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: min } })\n\t\t}\n\t\tif (\n\t\t\t(min !== undefined && restarts === undefined) ||\n\t\t\t(restarts !== undefined &&\n\t\t\t\t(min === undefined ||\n\t\t\t\t\t!isNumber(restarts) ||\n\t\t\t\t\t!Number.isSafeInteger(restarts) ||\n\t\t\t\t\trestarts < 0))\n\t\t) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: restarts } })\n\t\t}\n\t\tif (watch !== undefined && !isFunction(watch)) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: watch } })\n\t\t}\n\t\tconst on = options.on\n\t\tconst error = options.error\n\t\tthis.#create = options.create\n\t\tthis.#destroy = options.destroy\n\t\tthis.#validate = options.validate\n\t\tthis.#max = max ?? min\n\t\tthis.#min = min\n\t\tthis.#restarts = restarts\n\t\tthis.#watch = watch\n\t\tthis.#error = error\n\t\tthis.#emitter = new Emitter({\n\t\t\t...(on === undefined ? {} : { on }),\n\t\t\t...(error === undefined ? {} : { error }),\n\t\t})\n\t}\n\n\t/** Holds the typed synchronous lifecycle observation surface. */\n\tget emitter(): EmitterInterface<PoolEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\t/** Counts all owned records, including records validating, destroying, or retained after failed cleanup. */\n\tget size(): number {\n\t\treturn this.#resources.size\n\t}\n\n\t/** Counts the records immediately available without validation work. */\n\tget idle(): number {\n\t\treturn this.#available.length\n\t}\n\n\t/** Counts the records represented by unsettled released-once lease tokens. */\n\tget active(): number {\n\t\treturn this.#leased.size\n\t}\n\n\t/**\n\t * Fills the warm floor and resets the strikes of a spent floor; without a floor, resolves immediately.\n\t *\n\t * @returns A promise that resolves when the floor owns `min` live records\n\t * @throws {@link PoolError} Thrown as a rejection with `code: 'create'` and the last cause\n\t * when the bound is spent, `code: 'cleanup'` when retained failed cleanup prevents filling,\n\t * or `code: 'destroyed'` when teardown begins.\n\t */\n\tstart(): Promise<void> {\n\t\tif (this.#ending !== undefined) return Promise.reject(new PoolError({ code: 'destroyed' }))\n\t\tif (this.#min === undefined) return Promise.resolve()\n\t\tif (this.#starting !== undefined) return this.#starting.promise\n\t\tconst starting = Promise.withResolvers<void>()\n\t\tthis.#starting = starting\n\t\tthis.#started = true\n\t\tif (this.#spent()) this.#strikes = 0\n\t\tthis.#pump()\n\t\treturn starting.promise\n\t}\n\n\t/**\n\t * Queues the caller in FIFO order, validates an idle record or waits for a floor refill, and\n\t * creates on demand only without a floor.\n\t *\n\t * @param signal - Optional native cancellation signal\n\t * @returns A promise for the unique resource lease\n\t * @throws {@link PoolError} Thrown when `signal` is present and is not a native `AbortSignal`,\n\t * with `code: 'invalid'`. This throw is synchronous rather than a rejected promise, so a caller\n\t * that handles failures with `.catch()` alone misses it.\n\t * @throws {@link PoolError} Thrown as a rejection when `destroy()` has already begun, with\n\t * `code: 'destroyed'`; when the create hook fails or the floor is spent without an idle record,\n\t * with `code: 'create'` and the last cause; and when an invalid record's cleanup fails or\n\t * a floor retains a record, owns `min` records, has nothing idle, and has no refill or disposal\n\t * pending, even with live leases, with `code: 'cleanup'` and the retained cleanup failure as cause.\n\t * A `signal` that aborts rejects with the caller's exact `signal.reason` instead.\n\t */\n\tacquire(signal?: AbortSignal): Promise<PoolToken<T>> {\n\t\tif (signal !== undefined && !isPoolSignal(signal)) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: signal } })\n\t\t}\n\t\tif (this.#ending !== undefined) return Promise.reject(new PoolError({ code: 'destroyed' }))\n\t\tif (signal !== undefined) {\n\t\t\tconst state = this.#state(signal)\n\t\t\tif (state[0]) return Promise.reject(state[1])\n\t\t}\n\n\t\tconst waiter = Promise.withResolvers<PoolToken<T>>()\n\t\tthis.#waiters.push(waiter)\n\t\tif (signal !== undefined) {\n\t\t\tconst listener = this.#createAbort(waiter, signal)\n\t\t\tAbortSignal.prototype.addEventListener.call(signal, 'abort', listener, { once: true })\n\t\t\tthis.#signals.set(waiter, { signal, listener })\n\t\t\tconst state = this.#state(signal)\n\t\t\tif (state[0]) this.#abort(waiter, state[1])\n\t\t}\n\t\tthis.#pump()\n\t\treturn waiter.promise\n\t}\n\n\t/**\n\t * Destroys the records that are idle at this call's synchronous snapshot and restores a started floor.\n\t *\n\t * @returns A promise that settles after every snapshot cleanup attempt\n\t * @throws {@link PoolError} Thrown when `destroy()` has already begun, with `code: 'destroyed'`.\n\t * @throws {@link PoolError} Thrown when a claimed record's destroy hook fails, with\n\t * `code: 'cleanup'` and every distinct failure in `context.failures`. Each arrives as a rejected\n\t * promise rather than a synchronous throw.\n\t */\n\tclear(): Promise<void> {\n\t\tif (this.#ending !== undefined) return Promise.reject(new PoolError({ code: 'destroyed' }))\n\t\tconst records = this.#available.splice(0)\n\t\tconst cleanups: Array<Promise<void>> = []\n\t\tfor (const record of records) {\n\t\t\tconst cleanup = this.#dispose(record)\n\t\t\tcleanups.push(cleanup)\n\t\t\tvoid cleanup.then(\n\t\t\t\t() => this.#pump(),\n\t\t\t\t() => this.#pump(),\n\t\t\t)\n\t\t}\n\t\treturn this.#settleClear(cleanups)\n\t}\n\n\t/**\n\t * Tears down the pool permanently and returns its stable completion barrier.\n\t *\n\t * @returns The exact promise shared by every destroy call\n\t * @throws {@link PoolError} Thrown when a destroy hook failure was retained or occurred during teardown, with\n\t * `code: 'cleanup'` and every distinct failure in `context.failures`. The barrier rejects; it\n\t * never throws synchronously, and a repeat call receives the same rejected promise.\n\t */\n\tdestroy(): Promise<void> {\n\t\tif (this.#ending !== undefined) return this.#ending.promise\n\n\t\tconst ending = Promise.withResolvers<void>()\n\t\tthis.#ending = ending\n\t\tthis.#starting?.reject(new PoolError({ code: 'destroyed' }))\n\t\tthis.#starting = undefined\n\t\tconst waiters = this.#waiters.splice(0)\n\t\tfor (const waiter of waiters) {\n\t\t\tthis.#detach(waiter)\n\t\t\twaiter.reject(new PoolError({ code: 'destroyed' }))\n\t\t}\n\t\tthis.#ready.clear()\n\t\tthis.#assigned.clear()\n\t\tthis.#available.splice(0)\n\t\tfor (const cleanup of this.#destroying.values()) this.#own(cleanup)\n\t\tfor (const record of this.#resources.keys()) {\n\t\t\tif (!this.#validating.has(record)) this.#own(this.#dispose(record))\n\t\t}\n\t\tthis.#finish()\n\t\treturn ending.promise\n\t}\n\n\t#createAbort(waiter: PromiseWithResolvers<PoolToken<T>>, signal: AbortSignal): () => void {\n\t\treturn (): void => {\n\t\t\tlet reason: unknown\n\t\t\ttry {\n\t\t\t\treason = this.#state(signal)[1]\n\t\t\t} catch (error: unknown) {\n\t\t\t\treason = error\n\t\t\t}\n\t\t\tthis.#abort(waiter, reason)\n\t\t}\n\t}\n\n\t#state(signal: AbortSignal): readonly [aborted: boolean, reason: unknown] {\n\t\tconst aborted = Object.getOwnPropertyDescriptor(AbortSignal.prototype, 'aborted')?.get\n\t\tconst reason = Object.getOwnPropertyDescriptor(AbortSignal.prototype, 'reason')?.get\n\t\tif (aborted === undefined || reason === undefined) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: signal } })\n\t\t}\n\t\ttry {\n\t\t\tconst stopped = Reflect.apply(aborted, signal, []) === true\n\t\t\treturn [stopped, stopped ? Reflect.apply(reason, signal, []) : undefined]\n\t\t} catch (error: unknown) {\n\t\t\tthrow new PoolError({ code: 'invalid', cause: error, context: { value: signal } })\n\t\t}\n\t}\n\n\t#token(record: object, value: T): PoolToken<T> {\n\t\tconst lease = {}\n\t\treturn {\n\t\t\tvalue,\n\t\t\trelease: this.#createRelease(record, lease),\n\t\t\tdestroy: this.#createDestroy(record, lease),\n\t\t}\n\t}\n\n\t#createRelease(record: object, lease: object): () => void {\n\t\treturn (): void => {\n\t\t\tif (this.#settled.has(lease)) return\n\t\t\tthis.#settled.add(lease)\n\t\t\tthis.#release(record)\n\t\t}\n\t}\n\n\t#createDestroy(record: object, lease: object): () => Promise<void> {\n\t\treturn (): Promise<void> => {\n\t\t\tif (this.#settled.has(lease)) return Promise.resolve()\n\t\t\tthis.#settled.add(lease)\n\t\t\treturn (this.#destroying.get(record) ?? this.#lose(record)).catch((error: unknown) => {\n\t\t\t\tthrow new PoolError({ code: 'cleanup', cause: error })\n\t\t\t})\n\t\t}\n\t}\n\n\t#abort(waiter: PromiseWithResolvers<PoolToken<T>>, reason: unknown): void {\n\t\tconst index = this.#waiters.indexOf(waiter)\n\t\tif (index < 0) return\n\t\tthis.#waiters.splice(index, 1)\n\t\tthis.#detach(waiter)\n\t\tconst ready = this.#ready.get(waiter)\n\t\tthis.#ready.delete(waiter)\n\t\tthis.#assigned.delete(waiter)\n\t\tif (ready?.success === true) {\n\t\t\tthis.#recycle(ready.record)\n\t\t}\n\t\twaiter.reject(reason)\n\t\tthis.#commit()\n\t\tthis.#pump()\n\t}\n\n\t#detach(waiter: PromiseWithResolvers<PoolToken<T>>): void {\n\t\tconst entry = this.#signals.get(waiter)\n\t\tif (entry === undefined) return\n\t\tAbortSignal.prototype.removeEventListener.call(entry.signal, 'abort', entry.listener)\n\t\tthis.#signals.delete(waiter)\n\t}\n\n\t#pump(): void {\n\t\tif (this.#ending !== undefined) return\n\t\tif (this.#pumping) {\n\t\t\tthis.#repump = true\n\t\t\treturn\n\t\t}\n\n\t\tthis.#pumping = true\n\t\tdo {\n\t\t\tthis.#repump = false\n\t\t\tfor (const waiter of this.#waiters) {\n\t\t\t\tif (this.#assigned.has(waiter) || this.#ready.has(waiter)) continue\n\t\t\t\tconst record = this.#available.shift()\n\t\t\t\tif (record !== undefined) {\n\t\t\t\t\tthis.#assigned.add(waiter)\n\t\t\t\t\tthis.#validating.add(record)\n\t\t\t\t\tthis.#startValidation(waiter, record)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (this.#min !== undefined) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!this.#refilling &&\n\t\t\t\t\t\tthis.#destroying.size === 0 &&\n\t\t\t\t\t\tthis.#resources.size >= this.#min &&\n\t\t\t\t\t\tthis.#survivors.size > 0\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.#ready.set(waiter, {\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\terror: new PoolError({\n\t\t\t\t\t\t\t\tcode: 'cleanup',\n\t\t\t\t\t\t\t\tcause: this.#survivors.values().next().value,\n\t\t\t\t\t\t\t\tcontext: { failures: [...this.#failures] },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t})\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.#spent() &&\n\t\t\t\t\t\t!this.#refilling &&\n\t\t\t\t\t\tthis.#destroying.size === 0 &&\n\t\t\t\t\t\tthis.#owed === 0\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.#ready.set(waiter, {\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\terror: new PoolError({ code: 'create', cause: this.#cause }),\n\t\t\t\t\t\t})\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif (this.#max === undefined || this.#resources.size + this.#reservations.size < this.#max) {\n\t\t\t\t\tthis.#assigned.add(waiter)\n\t\t\t\t\tthis.#reservations.add(waiter)\n\t\t\t\t\tthis.#startCreate(waiter)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tthis.#commit()\n\t\t} while (this.#repump)\n\t\tthis.#pumping = false\n\t\tthis.#fill()\n\t}\n\n\t#spent(): boolean {\n\t\treturn this.#restarts !== undefined && this.#strikes > this.#restarts\n\t}\n\n\t#fill(): void {\n\t\tif (this.#ending !== undefined || !this.#started || this.#min === undefined) return\n\t\tif (this.#refilling) return\n\t\tconst live = this.#resources.size - this.#destroying.size - this.#survivors.size\n\t\tif (live >= this.#min) {\n\t\t\tthis.#starting?.resolve()\n\t\t\tthis.#starting = undefined\n\t\t}\n\t\tif (this.#resources.size < this.#min && (!this.#spent() || this.#owed > 0)) {\n\t\t\tif (this.#owed > 0) this.#owed -= 1\n\t\t\tthis.#refilling = true\n\t\t\tconst operation = Promise.resolve().then(() => this.#refill())\n\t\t\tthis.#operations.add(operation)\n\t\t\t// Refill never rejects: create failures are caught, and watch/emitter callbacks isolate errors.\n\t\t\tvoid operation.then(() => {\n\t\t\t\tthis.#refilling = false\n\t\t\t\tthis.#completeOperation(operation)\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t\tif (this.#destroying.size > 0) return\n\t\tif (this.#spent() || this.#survivors.size > 0) {\n\t\t\tthis.#starting?.reject(\n\t\t\t\tthis.#spent()\n\t\t\t\t\t? new PoolError({ code: 'create', cause: this.#cause })\n\t\t\t\t\t: this.#cleanupError(this.#failures),\n\t\t\t)\n\t\t\tthis.#starting = undefined\n\t\t}\n\t}\n\n\tasync #refill(): Promise<void> {\n\t\tif (this.#ending !== undefined) return\n\t\tlet value: T\n\t\ttry {\n\t\t\tvalue = await this.#create()\n\t\t} catch (error: unknown) {\n\t\t\tthis.#addStrike(error)\n\t\t\treturn\n\t\t}\n\t\tconst record = this.#insert(value)\n\t\tthis.#recycle(record)\n\t}\n\n\t#insert(value: T): object {\n\t\tconst record = {}\n\t\tthis.#births.set(record, this.#epoch)\n\t\tthis.#resources.set(record, value)\n\t\tif (this.#watch !== undefined) {\n\t\t\tconst controller = new AbortController()\n\t\t\tthis.#watches.set(record, controller)\n\t\t\tconst watching = attempt(() => this.#watch?.(value, controller.signal))\n\t\t\tconst settled = watching.success\n\t\t\t\t? Promise.resolve(watching.value)\n\t\t\t\t: Promise.reject(watching.error)\n\t\t\tvoid settled.then(\n\t\t\t\t() => this.#own(this.#lose(record)),\n\t\t\t\t(error: unknown) => {\n\t\t\t\t\tif (controller.signal.aborted) return\n\t\t\t\t\tthis.#own(this.#lose(record, error))\n\t\t\t\t\tattempt(() => this.#error?.(error, 'watch'))\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tthis.#emitter.emit('create')\n\t\treturn record\n\t}\n\n\tasync #lose(record: object, cause?: unknown): Promise<void> {\n\t\tif (\n\t\t\tthis.#ending !== undefined ||\n\t\t\t!this.#resources.has(record) ||\n\t\t\tthis.#destroying.has(record) ||\n\t\t\tthis.#survivors.has(record)\n\t\t)\n\t\t\treturn\n\t\tif (this.#leased.has(record) && this.#min !== undefined) this.#owing.add(record)\n\t\tthis.#strike(record, cause)\n\t\ttry {\n\t\t\tawait this.#dispose(record)\n\t\t} catch (error: unknown) {\n\t\t\tthis.#pump()\n\t\t\tthrow error\n\t\t}\n\t\tthis.#pump()\n\t}\n\n\t#strike(record: object, cause?: unknown): void {\n\t\tif (this.#min !== undefined && !this.#used.has(record)) {\n\t\t\tthis.#addStrike(cause)\n\t\t}\n\t}\n\n\t#addStrike(cause: unknown): void {\n\t\tthis.#strikes += 1\n\t\tthis.#cause = cause\n\t\tthis.#epoch = {}\n\t}\n\n\t#startCreate(waiter: PromiseWithResolvers<PoolToken<T>>): void {\n\t\tconst operation = Promise.resolve().then(() => this.#createResource(waiter))\n\t\tthis.#operations.add(operation)\n\t\tvoid operation.then(\n\t\t\t() => this.#completeOperation(operation),\n\t\t\t(error: unknown) => this.#failOperation(operation, waiter, error, 'create'),\n\t\t)\n\t}\n\n\t#startValidation(waiter: PromiseWithResolvers<PoolToken<T>>, record: object): void {\n\t\tfor (const [owned, value] of this.#resources) {\n\t\t\tif (owned !== record) continue\n\t\t\tif (this.#validate === undefined) {\n\t\t\t\tthis.#validating.delete(record)\n\t\t\t\tthis.#prepare(waiter, record, value)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst operation = Promise.resolve().then(() => this.#validateResource(waiter, record, value))\n\t\t\tthis.#operations.add(operation)\n\t\t\tvoid operation.then(\n\t\t\t\t() => this.#completeOperation(operation),\n\t\t\t\t(error: unknown) => this.#failOperation(operation, waiter, error, 'invalid'),\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tthis.#validating.delete(record)\n\t\tthis.#assigned.delete(waiter)\n\t\tthis.#repump = true\n\t}\n\n\tasync #createResource(waiter: PromiseWithResolvers<PoolToken<T>>): Promise<void> {\n\t\tlet value: T\n\t\ttry {\n\t\t\tvalue = await this.#create()\n\t\t} catch (error: unknown) {\n\t\t\tthis.#reservations.delete(waiter)\n\t\t\tif (this.#waiters.includes(waiter)) {\n\t\t\t\tthis.#ready.set(waiter, {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: new PoolError({ code: 'create', cause: error }),\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tthis.#assigned.delete(waiter)\n\t\t\t}\n\t\t\tthis.#commit()\n\t\t\treturn\n\t\t}\n\n\t\tthis.#reservations.delete(waiter)\n\t\tconst record = this.#insert(value)\n\t\tif (this.#ending !== undefined) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\ttry {\n\t\t\t\tawait this.#dispose(record)\n\t\t\t} catch {}\n\t\t\treturn\n\t\t}\n\t\tif (!this.#waiters.includes(waiter)) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\tthis.#recycle(record)\n\t\t\treturn\n\t\t}\n\t\tthis.#ready.set(waiter, {\n\t\t\tsuccess: true,\n\t\t\trecord,\n\t\t\ttoken: this.#token(record, value),\n\t\t})\n\t\tthis.#commit()\n\t}\n\n\tasync #validateResource(\n\t\twaiter: PromiseWithResolvers<PoolToken<T>>,\n\t\trecord: object,\n\t\tvalue: T,\n\t): Promise<void> {\n\t\tlet valid = false\n\t\ttry {\n\t\t\tvalid = (await this.#validate?.(value)) === true\n\t\t} catch {}\n\t\tthis.#validating.delete(record)\n\t\tif (\n\t\t\t!this.#resources.has(record) ||\n\t\t\tthis.#destroying.has(record) ||\n\t\t\tthis.#survivors.has(record)\n\t\t) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\tthis.#pump()\n\t\t\treturn\n\t\t}\n\n\t\tif (this.#ending !== undefined) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\ttry {\n\t\t\t\tawait this.#dispose(record)\n\t\t\t} catch {}\n\t\t\treturn\n\t\t}\n\t\tif (!valid) this.#strike(record)\n\t\tif (!this.#waiters.includes(waiter)) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\tif (valid) this.#recycle(record)\n\t\t\telse {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#dispose(record)\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tthis.#record(error)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tif (valid) {\n\t\t\tthis.#prepare(waiter, record, value)\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.#dispose(record)\n\t\t} catch (error: unknown) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\tif (this.#waiters.includes(waiter)) {\n\t\t\t\tthis.#ready.set(waiter, {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: new PoolError({ code: 'cleanup', cause: error }),\n\t\t\t\t})\n\t\t\t\tthis.#commit()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#record(error)\n\t\t\tthis.#pump()\n\t\t\treturn\n\t\t}\n\t\tthis.#assigned.delete(waiter)\n\t\tthis.#pump()\n\t}\n\n\t#prepare(waiter: PromiseWithResolvers<PoolToken<T>>, record: object, value: T): void {\n\t\tif (!this.#waiters.includes(waiter) || this.#ending !== undefined) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\tthis.#recycle(record)\n\t\t\treturn\n\t\t}\n\t\tthis.#ready.set(waiter, {\n\t\t\tsuccess: true,\n\t\t\trecord,\n\t\t\ttoken: this.#token(record, value),\n\t\t})\n\t\tthis.#commit()\n\t}\n\n\t#commit(): void {\n\t\twhile (this.#ending === undefined) {\n\t\t\tconst waiter = this.#waiters[0]\n\t\t\tif (waiter === undefined) return\n\t\t\tconst result = this.#ready.get(waiter)\n\t\t\tif (result === undefined) return\n\t\t\tif (\n\t\t\t\tresult.success &&\n\t\t\t\t(!this.#resources.has(result.record) ||\n\t\t\t\t\tthis.#destroying.has(result.record) ||\n\t\t\t\t\tthis.#survivors.has(result.record))\n\t\t\t) {\n\t\t\t\tthis.#ready.delete(waiter)\n\t\t\t\tthis.#assigned.delete(waiter)\n\t\t\t\tthis.#repump = true\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#waiters.shift()\n\t\t\tthis.#repump = true\n\t\t\tthis.#ready.delete(waiter)\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\tthis.#detach(waiter)\n\t\t\tif (!result.success) {\n\t\t\t\twaiter.reject(result.error)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.#leased.add(result.record)\n\t\t\tthis.#used.add(result.record)\n\t\t\tif (this.#births.get(result.record) === this.#epoch) this.#strikes = 0\n\t\t\twaiter.resolve(result.token)\n\t\t\tthis.#emitter.emit('acquire')\n\t\t}\n\t}\n\n\t#completeOperation(operation: Promise<void>): void {\n\t\tthis.#operations.delete(operation)\n\t\tthis.#commit()\n\t\tthis.#pump()\n\t\tthis.#finish()\n\t}\n\n\t#failOperation(\n\t\toperation: Promise<void>,\n\t\twaiter: PromiseWithResolvers<PoolToken<T>>,\n\t\terror: unknown,\n\t\tcode: PoolCode,\n\t): void {\n\t\tthis.#operations.delete(operation)\n\t\tthis.#reservations.delete(waiter)\n\t\tthis.#assigned.delete(waiter)\n\t\tif (this.#waiters.includes(waiter)) {\n\t\t\tthis.#ready.set(waiter, { success: false, error: new PoolError({ code, cause: error }) })\n\t\t}\n\t\tthis.#commit()\n\t\tthis.#pump()\n\t\tthis.#finish()\n\t}\n\n\t#release(record: object): void {\n\t\tif (!this.#leased.delete(record)) return\n\t\tthis.#recycle(record)\n\t}\n\n\t#recycle(record: object): void {\n\t\tif (!this.#resources.has(record) || this.#destroying.has(record) || this.#survivors.has(record))\n\t\t\treturn\n\t\tif (this.#ending !== undefined) {\n\t\t\tthis.#own(this.#dispose(record))\n\t\t\treturn\n\t\t}\n\t\tthis.#available.push(record)\n\t\tthis.#pump()\n\t\tif (this.#available.includes(record)) this.#emitter.emit('release')\n\t}\n\n\t#dispose(record: object): Promise<void> {\n\t\tif (this.#survivors.has(record)) return Promise.resolve()\n\t\tconst existing = this.#destroying.get(record)\n\t\tif (existing !== undefined) return existing\n\t\tfor (const [owned, value] of this.#resources) {\n\t\t\tif (owned !== record) continue\n\t\t\tconst cleanup = Promise.withResolvers<void>()\n\t\t\tthis.#destroying.set(record, cleanup.promise)\n\t\t\tconst index = this.#available.indexOf(record)\n\t\t\tif (index >= 0) this.#available.splice(index, 1)\n\t\t\tthis.#validating.delete(record)\n\t\t\tthis.#leased.delete(record)\n\t\t\tthis.#watches.get(record)?.abort()\n\t\t\tthis.#watches.delete(record)\n\t\t\tif (this.#ending !== undefined) this.#own(cleanup.promise)\n\t\t\tvoid this.#clean(record, value, cleanup)\n\t\t\treturn cleanup.promise\n\t\t}\n\t\treturn Promise.resolve()\n\t}\n\n\tasync #clean(record: object, value: T, cleanup: PromiseWithResolvers<void>): Promise<void> {\n\t\tlet disposal: Promise<void>\n\t\ttry {\n\t\t\tdisposal = Promise.resolve(this.#destroy?.(value))\n\t\t} catch (error: unknown) {\n\t\t\tdisposal = Promise.reject(error)\n\t\t}\n\t\tlet failure: unknown\n\t\tlet failed = false\n\t\ttry {\n\t\t\tawait disposal\n\t\t} catch (error: unknown) {\n\t\t\tfailure = error\n\t\t\tfailed = true\n\t\t}\n\t\tif (failed && this.#min !== undefined) {\n\t\t\tthis.#survivors.set(record, failure)\n\t\t\tthis.#record(failure)\n\t\t} else {\n\t\t\tthis.#resources.delete(record)\n\t\t\tif (this.#owing.has(record)) this.#owed += 1\n\t\t}\n\t\tthis.#owing.delete(record)\n\t\tif (failed) cleanup.reject(failure)\n\t\telse cleanup.resolve()\n\t\t// Cleanup owners must bind outcomes before destroy observers can reenter.\n\t\tawait Promise.resolve()\n\t\tthis.#emitter.emit('destroy')\n\t\tthis.#destroying.delete(record)\n\t\tif (this.#min !== undefined) this.#pump()\n\t\tthis.#finish()\n\t}\n\n\tasync #settleClear(cleanups: ReadonlyArray<Promise<void>>): Promise<void> {\n\t\tconst settled = await Promise.allSettled(cleanups)\n\t\tconst failures: unknown[] = []\n\t\tfor (const result of settled) {\n\t\t\tif (\n\t\t\t\tresult.status === 'rejected' &&\n\t\t\t\t!failures.some((failure) => Object.is(failure, result.reason))\n\t\t\t) {\n\t\t\t\tfailures.push(result.reason)\n\t\t\t}\n\t\t}\n\t\tif (failures.length > 0) throw this.#cleanupError(failures)\n\t}\n\n\t#own(cleanup: Promise<void>): void {\n\t\tif (this.#owned.has(cleanup)) return\n\t\tthis.#owned.add(cleanup)\n\t\tvoid cleanup.then(\n\t\t\t() => this.#completeCleanup(cleanup),\n\t\t\t(error: unknown) => this.#failCleanup(cleanup, error),\n\t\t)\n\t}\n\n\t#completeCleanup(cleanup: Promise<void>): void {\n\t\tthis.#owned.delete(cleanup)\n\t\tthis.#finish()\n\t}\n\n\t#failCleanup(cleanup: Promise<void>, error: unknown): void {\n\t\tthis.#owned.delete(cleanup)\n\t\tthis.#record(error)\n\t\tthis.#finish()\n\t}\n\n\t#record(error: unknown): void {\n\t\tif (!this.#failures.some((failure) => Object.is(failure, error))) this.#failures.push(error)\n\t}\n\n\t#cleanupError(failures: readonly unknown[]): PoolError {\n\t\treturn new PoolError({\n\t\t\tcode: 'cleanup',\n\t\t\t...(failures[0] === undefined ? {} : { cause: failures[0] }),\n\t\t\tcontext: { failures: [...failures] },\n\t\t})\n\t}\n\n\t#finish(): void {\n\t\tconst ending = this.#ending\n\t\tif (ending === undefined || this.#operations.size > 0 || this.#owned.size > 0) return\n\t\tlet claimed = false\n\t\tfor (const record of this.#resources.keys()) {\n\t\t\tif (\n\t\t\t\tthis.#validating.has(record) ||\n\t\t\t\tthis.#destroying.has(record) ||\n\t\t\t\tthis.#survivors.has(record)\n\t\t\t)\n\t\t\t\tcontinue\n\t\t\tclaimed = true\n\t\t\tthis.#own(this.#dispose(record))\n\t\t}\n\t\tif (claimed || this.#resources.size > this.#survivors.size || this.#destroying.size > 0) return\n\t\tthis.#emitter.destroy()\n\t\tif (this.#failures.length > 0) ending.reject(this.#cleanupError(this.#failures))\n\t\telse ending.resolve()\n\t}\n}\n","import type { PoolInterface, PoolOptions } from './types.js'\nimport { Pool } from './Pool.js'\n\n/**\n * Creates a distinct {@link PoolInterface} from resource lifecycle hooks, with optional bounded\n * capacity, unique ownership, and FIFO settlement.\n *\n * @remarks\n * Concurrent create and validation hooks may overlap, while acquire promises settle in\n * request order. `clear` owns its idle snapshot; `destroy` returns one stable barrier and\n * waits for every in-flight create, validation, and destroy attempt before destroying the\n * emitter last.\n * Set `min` with its required `restarts` bound and call `start()` to warm resources and\n * refill losses independently of queued acquires. `watch` observes loss and its signal\n * aborts at disposal; a token can declare loss through `destroy()`.\n *\n * @typeParam T - The pooled resource type\n * @param options - Lifecycle hooks, capacity, optional bounded warm floor, and observation hooks\n * @returns A working {@link PoolInterface}\n * @throws {@link PoolError} Thrown with `code: 'invalid'` when capacity, restart bounds, or\n * the watch hook are invalid. Construction validates them synchronously, before the pool exists.\n *\n * @example Create a pool\n * ```ts\n * import { createPool } from '@orkestrel/pool'\n *\n * const pool = createPool<Connection>({\n * \tcreate: () => connect(),\n * \tdestroy: (connection) => connection.close(),\n * \tvalidate: (connection) => connection.alive,\n * \tmax: 8,\n * })\n *\n * const token = await pool.acquire()\n * try {\n * \tawait token.value.query('select 1')\n * } finally {\n * \ttoken.release()\n * }\n * ```\n */\nexport function createPool<T>(options: PoolOptions<T>): PoolInterface<T> {\n\treturn new Pool(options)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["isError","isString","isInstance","isNumber","holds","isFunction","isNumber","isFunction","Emitter","attempt"],"sources":["../../../src/core/errors.ts","../../../src/core/validators.ts","../../../src/core/Pool.ts","../../../src/core/factories.ts"],"sourcesContent":["import type { PoolErrorOptions } from './types.js'\nimport { isError, isInstance, isString } from '@orkestrel/contract'\n\n/**\n * Represents a stable, machine-readable pool failure that retains the original thrown value as\n * its cause without unsafe coercion, alongside structured context.\n *\n * @example\n * ```ts\n * import { PoolError, isPoolError } from '@orkestrel/pool'\n *\n * try {\n * \tawait pool.acquire()\n * } catch (error: unknown) {\n * \tif (isPoolError(error)) console.error(error.code, error.cause)\n * }\n * ```\n */\nexport class PoolError extends Error {\n\t/** Holds the stable machine-readable failure category. */\n\treadonly code\n\t/** Holds optional structured input or aggregate destroy-hook failure details. */\n\treadonly context\n\n\t/**\n\t * Creates a pool failure without coercing a hostile thrown value.\n\t *\n\t * @param options - Stable code plus optional cause and structured context\n\t */\n\tconstructor(options: PoolErrorOptions) {\n\t\tlet message = 'pool input is invalid'\n\t\tif (options.code === 'destroyed') message = 'pool is destroyed'\n\t\tif (options.code === 'create') message = 'pool create failed'\n\t\tif (options.code === 'cleanup') message = 'pool cleanup failed'\n\t\tif (\n\t\t\tisError(options.cause) &&\n\t\t\tisString(options.cause.message) &&\n\t\t\toptions.cause.message.length > 0\n\t\t) {\n\t\t\tmessage = `${message}: ${options.cause.message}`\n\t\t}\n\t\tsuper(message, options.cause === undefined ? undefined : { cause: options.cause })\n\t\tthis.name = 'PoolError'\n\t\tthis.code = options.code\n\t\tthis.context = options.context\n\t}\n}\n\n/**\n * Tests whether an unknown value is a {@link PoolError}, returning `false` for hostile proxies.\n *\n * @param value - The unknown boundary value\n * @returns True if the value is a real `PoolError` instance; false otherwise\n *\n * @example\n * ```ts\n * isPoolError(new PoolError({ code: 'destroyed' })) // true\n * isPoolError(new Error('other')) // false\n * ```\n */\nexport function isPoolError(value: unknown): value is PoolError {\n\treturn isInstance(value, PoolError)\n}\n","import { holds, isFunction, isNumber } from '@orkestrel/contract'\n\n/**\n * Tests whether a value is a positive safe integer for a pool record or lease limit.\n *\n * @param value - The unknown record or lease limit candidate\n * @returns True if the value is a positive safe integer; false otherwise\n *\n * @example\n * ```ts\n * isPoolLimit(8) // true\n * isPoolLimit(Infinity) // false\n * ```\n */\nexport function isPoolLimit(value: unknown): value is number {\n\treturn isNumber(value) && Number.isSafeInteger(value) && value > 0\n}\n\n/**\n * Tests whether a value is a native `AbortSignal` for the acquire boundary, returning `false`\n * for hostile proxies.\n *\n * @param value - The unknown signal candidate\n * @returns True if the value is a native `AbortSignal`; false otherwise\n *\n * @example\n * ```ts\n * isPoolSignal(new AbortController().signal) // true\n * isPoolSignal({ aborted: false }) // false\n * ```\n */\nexport function isPoolSignal(value: unknown): value is AbortSignal {\n\treturn holds(() => {\n\t\tconst getter = Object.getOwnPropertyDescriptor(AbortSignal.prototype, 'aborted')?.get\n\t\tif (!isFunction(getter)) return false\n\t\tReflect.apply(getter, value, [])\n\t\treturn true\n\t})\n}\n","import type { EmitterErrorHandler, EmitterInterface } from '@orkestrel/emitter'\nimport type { PoolCode, PoolEventMap, PoolInterface, PoolOptions, PoolToken } from './types.js'\nimport { Emitter } from '@orkestrel/emitter'\nimport { attempt, isFunction, isNumber } from '@orkestrel/contract'\nimport { PoolError } from './errors.js'\nimport { isPoolLimit, isPoolSignal } from './validators.js'\n\n/**\n * Represents a resource pool with optional bounded capacity and a warm floor, whose opaque\n * ownership records preserve FIFO settlement, cancellation, exact lease release, and\n * deterministic teardown under concurrent hooks.\n *\n * @typeParam T - The pooled resource value\n *\n * @example\n * ```ts\n * import { Pool } from '@orkestrel/pool'\n *\n * const pool = new Pool({ create: () => new Uint8Array(64), max: 2 })\n * const token = await pool.acquire()\n * try {\n * \tconsume(token.value)\n * } finally {\n * \ttoken.release()\n * }\n * await pool.destroy()\n * ```\n */\nexport class Pool<T> implements PoolInterface<T> {\n\treadonly #create: () => Promise<T> | T\n\treadonly #destroy: ((value: T) => Promise<void> | void) | undefined\n\treadonly #validate: ((value: T) => Promise<boolean> | boolean) | undefined\n\treadonly #max: number | undefined\n\treadonly #capacity: number\n\treadonly #min: number | undefined\n\treadonly #restarts: number | undefined\n\treadonly #watch: PoolOptions<T>['watch']\n\treadonly #error: EmitterErrorHandler | undefined\n\treadonly #watches = new Map<object, AbortController>()\n\treadonly #births = new WeakMap<object, object>()\n\treadonly #settled = new WeakSet<object>()\n\treadonly #survivors = new Map<object, unknown>()\n\treadonly #owing = new Set<object>()\n\treadonly #emitter: Emitter<PoolEventMap>\n\treadonly #resources = new Map<object, T>()\n\treadonly #available: object[] = []\n\treadonly #validating = new Set<object>()\n\treadonly #leased = new Map<object, Set<object>>()\n\treadonly #destroying = new Map<object, Promise<void>>()\n\treadonly #waiters: Array<PromiseWithResolvers<PoolToken<T>>> = []\n\treadonly #assigned = new Set<PromiseWithResolvers<PoolToken<T>>>()\n\treadonly #reservations = new Set<PromiseWithResolvers<PoolToken<T>>>()\n\treadonly #signals = new Map<\n\t\tPromiseWithResolvers<PoolToken<T>>,\n\t\t{ readonly signal: AbortSignal; readonly listener: () => void }\n\t>()\n\treadonly #ready = new Map<\n\t\tPromiseWithResolvers<PoolToken<T>>,\n\t\t| { readonly success: true; readonly record: object; readonly token: PoolToken<T> }\n\t\t| { readonly success: false; readonly error: unknown }\n\t>()\n\treadonly #operations = new Set<Promise<void>>()\n\treadonly #owned = new Set<Promise<void>>()\n\treadonly #failures: unknown[] = []\n\t#ending: PromiseWithResolvers<void> | undefined\n\t#pumping = false\n\t#repump = false\n\t#started = false\n\t#starting: PromiseWithResolvers<void> | undefined\n\t#refilling = false\n\t#strikes = 0\n\t#epoch = {}\n\t#owed = 0\n\t#cause: unknown\n\n\t/**\n\t * Constructs a pool and synchronously validates its capacity contract.\n\t *\n\t * @param options - Resource hooks, observation hooks, capacity, and optional bounded warm floor\n\t * @throws {@link PoolError} Thrown with `code: 'invalid'` when `capacity`, `min`, or `max` is not a positive\n\t * safe integer, explicit `min` and `max` differ, `restarts` is absent with `min`, present without\n\t * `min`, or not a non-negative safe integer, or `watch` is not callable.\n\t */\n\tconstructor(options: PoolOptions<T>) {\n\t\tconst max = options.max\n\t\tconst capacity = options.capacity\n\t\tconst min = options.min\n\t\tconst restarts = options.restarts\n\t\tconst watch = options.watch\n\t\tif (max !== undefined && !isPoolLimit(max)) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: max } })\n\t\t}\n\t\tif (capacity !== undefined && !isPoolLimit(capacity)) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: capacity } })\n\t\t}\n\t\tif (min !== undefined && (!isPoolLimit(min) || (max !== undefined && min !== max))) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: min } })\n\t\t}\n\t\tif (\n\t\t\t(min !== undefined && restarts === undefined) ||\n\t\t\t(restarts !== undefined &&\n\t\t\t\t(min === undefined ||\n\t\t\t\t\t!isNumber(restarts) ||\n\t\t\t\t\t!Number.isSafeInteger(restarts) ||\n\t\t\t\t\trestarts < 0))\n\t\t) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: restarts } })\n\t\t}\n\t\tif (watch !== undefined && !isFunction(watch)) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: watch } })\n\t\t}\n\t\tconst on = options.on\n\t\tconst error = options.error\n\t\tthis.#create = options.create\n\t\tthis.#destroy = options.destroy\n\t\tthis.#validate = options.validate\n\t\tthis.#max = max ?? min\n\t\tthis.#capacity = capacity ?? 1\n\t\tthis.#min = min\n\t\tthis.#restarts = restarts\n\t\tthis.#watch = watch\n\t\tthis.#error = error\n\t\tthis.#emitter = new Emitter({\n\t\t\t...(on === undefined ? {} : { on }),\n\t\t\t...(error === undefined ? {} : { error }),\n\t\t})\n\t}\n\n\t/** Holds the typed synchronous lifecycle observation surface. */\n\tget emitter(): EmitterInterface<PoolEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\t/** Counts all owned records, including records validating, destroying, or retained after failed cleanup. */\n\tget size(): number {\n\t\treturn this.#resources.size\n\t}\n\n\t/** Counts available records with no live lease or pending handout. */\n\tget idle(): number {\n\t\treturn this.#available.length\n\t}\n\n\t/** Counts records with live leases, counting a shared record once rather than counting its leases. */\n\tget active(): number {\n\t\treturn this.#leased.size\n\t}\n\n\t/**\n\t * Fills the warm floor and resets the strikes of a spent floor; without a floor, resolves immediately.\n\t *\n\t * @returns A promise that resolves when the floor owns `min` live records\n\t * @throws {@link PoolError} Thrown as a rejection with `code: 'create'` and the last cause\n\t * when the bound is spent, `code: 'cleanup'` when retained failed cleanup prevents filling,\n\t * or `code: 'destroyed'` when teardown begins.\n\t */\n\tstart(): Promise<void> {\n\t\tif (this.#ending !== undefined) return Promise.reject(new PoolError({ code: 'destroyed' }))\n\t\tif (this.#min === undefined) return Promise.resolve()\n\t\tif (this.#starting !== undefined) return this.#starting.promise\n\t\tconst starting = Promise.withResolvers<void>()\n\t\tthis.#starting = starting\n\t\tthis.#started = true\n\t\tif (this.#spent()) this.#strikes = 0\n\t\tthis.#pump()\n\t\treturn starting.promise\n\t}\n\n\t/**\n\t * Queues the caller in FIFO order, shares an occupied record or validates an idle record, and\n\t * waits for a floor refill or creates on demand without a floor.\n\t *\n\t * @param signal - Optional native cancellation signal\n\t * @returns A promise for the unique resource lease\n\t * @throws {@link PoolError} Thrown when `signal` is present and is not a native `AbortSignal`,\n\t * with `code: 'invalid'`. This throw is synchronous rather than a rejected promise, so a caller\n\t * that handles failures with `.catch()` alone misses it.\n\t * @throws {@link PoolError} Thrown as a rejection when `destroy()` has already begun, with\n\t * `code: 'destroyed'`; when the create hook fails or the floor is spent without an eligible record,\n\t * with `code: 'create'` and the last cause; and when an invalid record's cleanup fails or\n\t * a floor retains a record, owns `min` records, has nothing eligible, and has no refill or disposal\n\t * pending, even with live leases, with `code: 'cleanup'` and the retained cleanup failure as cause.\n\t * A `signal` that aborts rejects with the caller's exact `signal.reason` instead.\n\t */\n\tacquire(signal?: AbortSignal): Promise<PoolToken<T>> {\n\t\tif (signal !== undefined && !isPoolSignal(signal)) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: signal } })\n\t\t}\n\t\tif (this.#ending !== undefined) return Promise.reject(new PoolError({ code: 'destroyed' }))\n\t\tif (signal !== undefined) {\n\t\t\tconst state = this.#state(signal)\n\t\t\tif (state[0]) return Promise.reject(state[1])\n\t\t}\n\n\t\tconst waiter = Promise.withResolvers<PoolToken<T>>()\n\t\tthis.#waiters.push(waiter)\n\t\tif (signal !== undefined) {\n\t\t\tconst listener = this.#createAbort(waiter, signal)\n\t\t\tAbortSignal.prototype.addEventListener.call(signal, 'abort', listener, { once: true })\n\t\t\tthis.#signals.set(waiter, { signal, listener })\n\t\t\tconst state = this.#state(signal)\n\t\t\tif (state[0]) this.#abort(waiter, state[1])\n\t\t}\n\t\tthis.#pump()\n\t\treturn waiter.promise\n\t}\n\n\t/**\n\t * Destroys the records that are idle at this call's synchronous snapshot and restores a started floor.\n\t *\n\t * @returns A promise that settles after every snapshot cleanup attempt\n\t * @throws {@link PoolError} Thrown when `destroy()` has already begun, with `code: 'destroyed'`.\n\t * @throws {@link PoolError} Thrown when a claimed record's destroy hook fails, with\n\t * `code: 'cleanup'` and every distinct failure in `context.failures`. Each arrives as a rejected\n\t * promise rather than a synchronous throw.\n\t */\n\tclear(): Promise<void> {\n\t\tif (this.#ending !== undefined) return Promise.reject(new PoolError({ code: 'destroyed' }))\n\t\tconst records = this.#available.splice(0)\n\t\tconst cleanups: Array<Promise<void>> = []\n\t\tfor (const record of records) {\n\t\t\tconst cleanup = this.#dispose(record)\n\t\t\tcleanups.push(cleanup)\n\t\t\tvoid cleanup.then(\n\t\t\t\t() => this.#pump(),\n\t\t\t\t() => this.#pump(),\n\t\t\t)\n\t\t}\n\t\treturn this.#settleClear(cleanups)\n\t}\n\n\t/**\n\t * Tears down the pool permanently and returns its stable completion barrier.\n\t *\n\t * @returns The exact promise shared by every destroy call\n\t * @throws {@link PoolError} Thrown when a destroy hook failure was retained or occurred during teardown, with\n\t * `code: 'cleanup'` and every distinct failure in `context.failures`. The barrier rejects; it\n\t * never throws synchronously, and a repeat call receives the same rejected promise.\n\t */\n\tdestroy(): Promise<void> {\n\t\tif (this.#ending !== undefined) return this.#ending.promise\n\n\t\tconst ending = Promise.withResolvers<void>()\n\t\tthis.#ending = ending\n\t\tthis.#starting?.reject(new PoolError({ code: 'destroyed' }))\n\t\tthis.#starting = undefined\n\t\tconst waiters = this.#waiters.splice(0)\n\t\tfor (const waiter of waiters) {\n\t\t\tthis.#detach(waiter)\n\t\t\twaiter.reject(new PoolError({ code: 'destroyed' }))\n\t\t}\n\t\tthis.#ready.clear()\n\t\tthis.#assigned.clear()\n\t\tthis.#available.splice(0)\n\t\tfor (const cleanup of this.#destroying.values()) this.#own(cleanup)\n\t\tfor (const record of this.#resources.keys()) {\n\t\t\tif (!this.#validating.has(record)) this.#own(this.#dispose(record))\n\t\t}\n\t\tthis.#finish()\n\t\treturn ending.promise\n\t}\n\n\t#createAbort(waiter: PromiseWithResolvers<PoolToken<T>>, signal: AbortSignal): () => void {\n\t\treturn (): void => {\n\t\t\tlet reason: unknown\n\t\t\ttry {\n\t\t\t\treason = this.#state(signal)[1]\n\t\t\t} catch (error: unknown) {\n\t\t\t\treason = error\n\t\t\t}\n\t\t\tthis.#abort(waiter, reason)\n\t\t}\n\t}\n\n\t#state(signal: AbortSignal): readonly [aborted: boolean, reason: unknown] {\n\t\tconst aborted = Object.getOwnPropertyDescriptor(AbortSignal.prototype, 'aborted')?.get\n\t\tconst reason = Object.getOwnPropertyDescriptor(AbortSignal.prototype, 'reason')?.get\n\t\tif (aborted === undefined || reason === undefined) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: signal } })\n\t\t}\n\t\ttry {\n\t\t\tconst stopped = Reflect.apply(aborted, signal, []) === true\n\t\t\treturn [stopped, stopped ? Reflect.apply(reason, signal, []) : undefined]\n\t\t} catch (error: unknown) {\n\t\t\tthrow new PoolError({ code: 'invalid', cause: error, context: { value: signal } })\n\t\t}\n\t}\n\n\t#token(record: object, value: T, lease: object): PoolToken<T> {\n\t\treturn {\n\t\t\tvalue,\n\t\t\trelease: this.#createRelease(record, lease),\n\t\t\tdestroy: this.#createDestroy(record, lease),\n\t\t}\n\t}\n\n\t#createRelease(record: object, lease: object): () => void {\n\t\treturn (): void => {\n\t\t\tif (this.#settled.has(lease)) return\n\t\t\tthis.#settled.add(lease)\n\t\t\tthis.#release(record, lease)\n\t\t}\n\t}\n\n\t#createDestroy(record: object, lease: object): () => Promise<void> {\n\t\treturn (): Promise<void> => {\n\t\t\tif (this.#settled.has(lease)) return Promise.resolve()\n\t\t\tthis.#settled.add(lease)\n\t\t\treturn (this.#destroying.get(record) ?? this.#lose(record)).catch((error: unknown) => {\n\t\t\t\tthrow new PoolError({ code: 'cleanup', cause: error })\n\t\t\t})\n\t\t}\n\t}\n\n\t#abort(waiter: PromiseWithResolvers<PoolToken<T>>, reason: unknown): void {\n\t\tconst index = this.#waiters.indexOf(waiter)\n\t\tif (index < 0) return\n\t\tthis.#waiters.splice(index, 1)\n\t\tthis.#detach(waiter)\n\t\tconst ready = this.#ready.get(waiter)\n\t\tthis.#ready.delete(waiter)\n\t\tthis.#assigned.delete(waiter)\n\t\tif (ready?.success === true) {\n\t\t\tthis.#recycle(ready.record)\n\t\t}\n\t\twaiter.reject(reason)\n\t\tthis.#commit()\n\t\tthis.#pump()\n\t}\n\n\t#detach(waiter: PromiseWithResolvers<PoolToken<T>>): void {\n\t\tconst entry = this.#signals.get(waiter)\n\t\tif (entry === undefined) return\n\t\tAbortSignal.prototype.removeEventListener.call(entry.signal, 'abort', entry.listener)\n\t\tthis.#signals.delete(waiter)\n\t}\n\n\t#pump(): void {\n\t\tif (this.#ending !== undefined) return\n\t\tif (this.#pumping) {\n\t\t\tthis.#repump = true\n\t\t\treturn\n\t\t}\n\n\t\tthis.#pumping = true\n\t\tdo {\n\t\t\tthis.#repump = false\n\t\t\tfor (const waiter of this.#waiters) {\n\t\t\t\tif (this.#assigned.has(waiter) || this.#ready.has(waiter)) continue\n\t\t\t\tconst record = this.#select()\n\t\t\t\tif (record !== undefined) {\n\t\t\t\t\tthis.#assigned.add(waiter)\n\t\t\t\t\tconst index = this.#available.indexOf(record)\n\t\t\t\t\tif (index >= 0) this.#available.splice(index, 1)\n\t\t\t\t\tif (this.#occupancy(record) === 0) this.#validating.add(record)\n\t\t\t\t\tthis.#startValidation(waiter, record)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (this.#min !== undefined) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!this.#refilling &&\n\t\t\t\t\t\tthis.#destroying.size === 0 &&\n\t\t\t\t\t\tthis.#resources.size >= this.#min &&\n\t\t\t\t\t\tthis.#survivors.size > 0\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.#ready.set(waiter, {\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\terror: new PoolError({\n\t\t\t\t\t\t\t\tcode: 'cleanup',\n\t\t\t\t\t\t\t\tcause: this.#survivors.values().next().value,\n\t\t\t\t\t\t\t\tcontext: { failures: [...this.#failures] },\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t})\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.#spent() &&\n\t\t\t\t\t\t!this.#refilling &&\n\t\t\t\t\t\tthis.#destroying.size === 0 &&\n\t\t\t\t\t\tthis.#owed === 0\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.#ready.set(waiter, {\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\terror: new PoolError({ code: 'create', cause: this.#cause }),\n\t\t\t\t\t\t})\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif (this.#max === undefined || this.#resources.size + this.#reservations.size < this.#max) {\n\t\t\t\t\tthis.#assigned.add(waiter)\n\t\t\t\t\tthis.#reservations.add(waiter)\n\t\t\t\t\tthis.#startCreate(waiter)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tthis.#commit()\n\t\t} while (this.#repump)\n\t\tthis.#pumping = false\n\t\tthis.#fill()\n\t}\n\n\t#occupancy(record: object): number {\n\t\tlet count = this.#leased.get(record)?.size ?? 0\n\t\tfor (const result of this.#ready.values()) {\n\t\t\tif (result.success && result.record === record) count += 1\n\t\t}\n\t\treturn count\n\t}\n\n\t#select(): object | undefined {\n\t\tlet selected: object | undefined\n\t\tlet least = this.#capacity\n\t\tfor (const record of this.#resources.keys()) {\n\t\t\tif (\n\t\t\t\tthis.#validating.has(record) ||\n\t\t\t\tthis.#destroying.has(record) ||\n\t\t\t\tthis.#survivors.has(record)\n\t\t\t)\n\t\t\t\tcontinue\n\t\t\tconst count = this.#occupancy(record)\n\t\t\tif (count === 0 && !this.#available.includes(record)) continue\n\t\t\tif (count < least) {\n\t\t\t\tselected = record\n\t\t\t\tleast = count\n\t\t\t}\n\t\t}\n\t\treturn this.#available[0] ?? selected\n\t}\n\n\t#spent(): boolean {\n\t\treturn this.#restarts !== undefined && this.#strikes > this.#restarts\n\t}\n\n\t#fill(): void {\n\t\tif (this.#ending !== undefined || !this.#started || this.#min === undefined) return\n\t\tif (this.#refilling) return\n\t\tconst live = this.#resources.size - this.#destroying.size - this.#survivors.size\n\t\tif (live >= this.#min) {\n\t\t\tthis.#starting?.resolve()\n\t\t\tthis.#starting = undefined\n\t\t}\n\t\tif (this.#resources.size < this.#min && (!this.#spent() || this.#owed > 0)) {\n\t\t\tif (this.#owed > 0) this.#owed -= 1\n\t\t\tthis.#refilling = true\n\t\t\tconst operation = Promise.resolve().then(() => this.#refill())\n\t\t\tthis.#operations.add(operation)\n\t\t\t// Refill never rejects: create failures are caught, and watch/emitter callbacks isolate errors.\n\t\t\tvoid operation.then(() => {\n\t\t\t\tthis.#refilling = false\n\t\t\t\tthis.#completeOperation(operation)\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t\tif (this.#destroying.size > 0) return\n\t\tif (this.#spent() || this.#survivors.size > 0) {\n\t\t\tthis.#starting?.reject(\n\t\t\t\tthis.#spent()\n\t\t\t\t\t? new PoolError({ code: 'create', cause: this.#cause })\n\t\t\t\t\t: this.#cleanupError(this.#failures),\n\t\t\t)\n\t\t\tthis.#starting = undefined\n\t\t}\n\t}\n\n\tasync #refill(): Promise<void> {\n\t\tif (this.#ending !== undefined) return\n\t\tlet value: T\n\t\ttry {\n\t\t\tvalue = await this.#create()\n\t\t} catch (error: unknown) {\n\t\t\tthis.#addStrike(error)\n\t\t\treturn\n\t\t}\n\t\tconst record = this.#insert(value)\n\t\tthis.#recycle(record)\n\t}\n\n\t#insert(value: T): object {\n\t\tconst record = {}\n\t\tthis.#births.set(record, this.#epoch)\n\t\tthis.#resources.set(record, value)\n\t\tif (this.#watch !== undefined) {\n\t\t\tconst controller = new AbortController()\n\t\t\tthis.#watches.set(record, controller)\n\t\t\tconst watching = attempt(() => this.#watch?.(value, controller.signal))\n\t\t\tconst settled = watching.success\n\t\t\t\t? Promise.resolve(watching.value)\n\t\t\t\t: Promise.reject(watching.error)\n\t\t\tvoid settled.then(\n\t\t\t\t() => this.#own(this.#lose(record)),\n\t\t\t\t(error: unknown) => {\n\t\t\t\t\tif (controller.signal.aborted) return\n\t\t\t\t\tthis.#own(this.#lose(record, error))\n\t\t\t\t\tattempt(() => this.#error?.(error, 'watch'))\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tthis.#emitter.emit('create')\n\t\treturn record\n\t}\n\n\tasync #lose(record: object, cause?: unknown): Promise<void> {\n\t\tif (\n\t\t\tthis.#ending !== undefined ||\n\t\t\t!this.#resources.has(record) ||\n\t\t\tthis.#destroying.has(record) ||\n\t\t\tthis.#survivors.has(record)\n\t\t)\n\t\t\treturn\n\t\tif (this.#leased.has(record) && this.#min !== undefined) this.#owing.add(record)\n\t\tthis.#strike(record, cause)\n\t\ttry {\n\t\t\tawait this.#dispose(record)\n\t\t} catch (error: unknown) {\n\t\t\tthis.#pump()\n\t\t\tthrow error\n\t\t}\n\t\tthis.#pump()\n\t}\n\n\t#strike(record: object, cause?: unknown): void {\n\t\tif (this.#min !== undefined && !this.#leased.has(record)) {\n\t\t\tthis.#addStrike(cause)\n\t\t}\n\t}\n\n\t#addStrike(cause: unknown): void {\n\t\tthis.#strikes += 1\n\t\tthis.#cause = cause\n\t\tthis.#epoch = {}\n\t}\n\n\t#startCreate(waiter: PromiseWithResolvers<PoolToken<T>>): void {\n\t\tconst operation = Promise.resolve().then(() => this.#createResource(waiter))\n\t\tthis.#operations.add(operation)\n\t\tvoid operation.then(\n\t\t\t() => this.#completeOperation(operation),\n\t\t\t(error: unknown) => this.#failOperation(operation, waiter, error, 'create'),\n\t\t)\n\t}\n\n\t#startValidation(waiter: PromiseWithResolvers<PoolToken<T>>, record: object): void {\n\t\tfor (const [owned, value] of this.#resources) {\n\t\t\tif (owned !== record) continue\n\t\t\tif (!this.#validating.has(record) || this.#validate === undefined) {\n\t\t\t\tthis.#validating.delete(record)\n\t\t\t\tthis.#prepare(waiter, record, value)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst operation = Promise.resolve().then(() => this.#validateResource(waiter, record, value))\n\t\t\tthis.#operations.add(operation)\n\t\t\tvoid operation.then(\n\t\t\t\t() => this.#completeOperation(operation),\n\t\t\t\t(error: unknown) => this.#failOperation(operation, waiter, error, 'invalid'),\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tthis.#validating.delete(record)\n\t\tthis.#assigned.delete(waiter)\n\t\tthis.#repump = true\n\t}\n\n\tasync #createResource(waiter: PromiseWithResolvers<PoolToken<T>>): Promise<void> {\n\t\tlet value: T\n\t\ttry {\n\t\t\tvalue = await this.#create()\n\t\t} catch (error: unknown) {\n\t\t\tthis.#reservations.delete(waiter)\n\t\t\tif (this.#waiters.includes(waiter)) {\n\t\t\t\tthis.#ready.set(waiter, {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: new PoolError({ code: 'create', cause: error }),\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tthis.#assigned.delete(waiter)\n\t\t\t}\n\t\t\tthis.#commit()\n\t\t\treturn\n\t\t}\n\n\t\tthis.#reservations.delete(waiter)\n\t\tconst record = this.#insert(value)\n\t\tif (this.#ending !== undefined) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\ttry {\n\t\t\t\tawait this.#dispose(record)\n\t\t\t} catch {}\n\t\t\treturn\n\t\t}\n\t\tif (!this.#waiters.includes(waiter)) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\tthis.#recycle(record)\n\t\t\treturn\n\t\t}\n\t\tthis.#ready.set(waiter, {\n\t\t\tsuccess: true,\n\t\t\trecord,\n\t\t\ttoken: this.#token(record, value, waiter),\n\t\t})\n\t\tthis.#commit()\n\t}\n\n\tasync #validateResource(\n\t\twaiter: PromiseWithResolvers<PoolToken<T>>,\n\t\trecord: object,\n\t\tvalue: T,\n\t): Promise<void> {\n\t\tlet valid = false\n\t\ttry {\n\t\t\tvalid = (await this.#validate?.(value)) === true\n\t\t} catch {}\n\t\tthis.#validating.delete(record)\n\t\tif (\n\t\t\t!this.#resources.has(record) ||\n\t\t\tthis.#destroying.has(record) ||\n\t\t\tthis.#survivors.has(record)\n\t\t) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\tthis.#pump()\n\t\t\treturn\n\t\t}\n\n\t\tif (this.#ending !== undefined) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\ttry {\n\t\t\t\tawait this.#dispose(record)\n\t\t\t} catch {}\n\t\t\treturn\n\t\t}\n\t\tif (!valid) this.#strike(record)\n\t\tif (!this.#waiters.includes(waiter)) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\tif (valid) this.#recycle(record)\n\t\t\telse {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#dispose(record)\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tthis.#record(error)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tif (valid) {\n\t\t\tthis.#prepare(waiter, record, value)\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.#dispose(record)\n\t\t} catch (error: unknown) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\tif (this.#waiters.includes(waiter)) {\n\t\t\t\tthis.#ready.set(waiter, {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: new PoolError({ code: 'cleanup', cause: error }),\n\t\t\t\t})\n\t\t\t\tthis.#commit()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#record(error)\n\t\t\tthis.#pump()\n\t\t\treturn\n\t\t}\n\t\tthis.#assigned.delete(waiter)\n\t\tthis.#pump()\n\t}\n\n\t#prepare(waiter: PromiseWithResolvers<PoolToken<T>>, record: object, value: T): void {\n\t\tif (!this.#waiters.includes(waiter) || this.#ending !== undefined) {\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\tthis.#recycle(record)\n\t\t\treturn\n\t\t}\n\t\tthis.#ready.set(waiter, {\n\t\t\tsuccess: true,\n\t\t\trecord,\n\t\t\ttoken: this.#token(record, value, waiter),\n\t\t})\n\t\tthis.#commit()\n\t}\n\n\t#commit(): void {\n\t\twhile (this.#ending === undefined) {\n\t\t\tconst waiter = this.#waiters[0]\n\t\t\tif (waiter === undefined) return\n\t\t\tconst result = this.#ready.get(waiter)\n\t\t\tif (result === undefined) return\n\t\t\tif (\n\t\t\t\tresult.success &&\n\t\t\t\t(!this.#resources.has(result.record) ||\n\t\t\t\t\tthis.#destroying.has(result.record) ||\n\t\t\t\t\tthis.#survivors.has(result.record))\n\t\t\t) {\n\t\t\t\tthis.#ready.delete(waiter)\n\t\t\t\tthis.#assigned.delete(waiter)\n\t\t\t\tthis.#repump = true\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#waiters.shift()\n\t\t\tthis.#repump = true\n\t\t\tthis.#ready.delete(waiter)\n\t\t\tthis.#assigned.delete(waiter)\n\t\t\tthis.#detach(waiter)\n\t\t\tif (!result.success) {\n\t\t\t\twaiter.reject(result.error)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst leases = this.#leased.get(result.record) ?? new Set<object>()\n\t\t\tleases.add(waiter)\n\t\t\tthis.#leased.set(result.record, leases)\n\t\t\tif (this.#births.get(result.record) === this.#epoch) this.#strikes = 0\n\t\t\twaiter.resolve(result.token)\n\t\t\tthis.#emitter.emit('acquire')\n\t\t}\n\t}\n\n\t#completeOperation(operation: Promise<void>): void {\n\t\tthis.#operations.delete(operation)\n\t\tthis.#commit()\n\t\tthis.#pump()\n\t\tthis.#finish()\n\t}\n\n\t#failOperation(\n\t\toperation: Promise<void>,\n\t\twaiter: PromiseWithResolvers<PoolToken<T>>,\n\t\terror: unknown,\n\t\tcode: PoolCode,\n\t): void {\n\t\tthis.#operations.delete(operation)\n\t\tthis.#reservations.delete(waiter)\n\t\tthis.#assigned.delete(waiter)\n\t\tif (this.#waiters.includes(waiter)) {\n\t\t\tthis.#ready.set(waiter, { success: false, error: new PoolError({ code, cause: error }) })\n\t\t}\n\t\tthis.#commit()\n\t\tthis.#pump()\n\t\tthis.#finish()\n\t}\n\n\t#release(record: object, lease: object): void {\n\t\tconst leases = this.#leased.get(record)\n\t\tif (leases === undefined || !leases.delete(lease)) return\n\t\tif (leases.size === 0) this.#leased.delete(record)\n\t\tthis.#recycle(record)\n\t}\n\n\t#recycle(record: object): void {\n\t\tif (!this.#resources.has(record) || this.#destroying.has(record) || this.#survivors.has(record))\n\t\t\treturn\n\t\tif (this.#ending !== undefined) {\n\t\t\tthis.#own(this.#dispose(record))\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\tthis.#occupancy(record) === 0 &&\n\t\t\t!this.#validating.has(record) &&\n\t\t\t!this.#available.includes(record)\n\t\t) {\n\t\t\tthis.#available.push(record)\n\t\t}\n\t\tthis.#pump()\n\t\tif (this.#available.includes(record)) this.#emitter.emit('release')\n\t}\n\n\t#dispose(record: object): Promise<void> {\n\t\tif (this.#survivors.has(record)) return Promise.resolve()\n\t\tconst existing = this.#destroying.get(record)\n\t\tif (existing !== undefined) return existing\n\t\tfor (const [owned, value] of this.#resources) {\n\t\t\tif (owned !== record) continue\n\t\t\tconst cleanup = Promise.withResolvers<void>()\n\t\t\tthis.#destroying.set(record, cleanup.promise)\n\t\t\tconst index = this.#available.indexOf(record)\n\t\t\tif (index >= 0) this.#available.splice(index, 1)\n\t\t\tthis.#validating.delete(record)\n\t\t\tthis.#leased.delete(record)\n\t\t\tthis.#watches.get(record)?.abort()\n\t\t\tthis.#watches.delete(record)\n\t\t\tif (this.#ending !== undefined) this.#own(cleanup.promise)\n\t\t\tvoid this.#clean(record, value, cleanup)\n\t\t\treturn cleanup.promise\n\t\t}\n\t\treturn Promise.resolve()\n\t}\n\n\tasync #clean(record: object, value: T, cleanup: PromiseWithResolvers<void>): Promise<void> {\n\t\tlet disposal: Promise<void>\n\t\ttry {\n\t\t\tdisposal = Promise.resolve(this.#destroy?.(value))\n\t\t} catch (error: unknown) {\n\t\t\tdisposal = Promise.reject(error)\n\t\t}\n\t\tlet failure: unknown\n\t\tlet failed = false\n\t\ttry {\n\t\t\tawait disposal\n\t\t} catch (error: unknown) {\n\t\t\tfailure = error\n\t\t\tfailed = true\n\t\t}\n\t\tif (failed && this.#min !== undefined) {\n\t\t\tthis.#survivors.set(record, failure)\n\t\t\tthis.#record(failure)\n\t\t} else {\n\t\t\tthis.#resources.delete(record)\n\t\t\tif (this.#owing.has(record)) this.#owed += 1\n\t\t}\n\t\tthis.#owing.delete(record)\n\t\tif (failed) cleanup.reject(failure)\n\t\telse cleanup.resolve()\n\t\t// Cleanup owners must bind outcomes before destroy observers can reenter.\n\t\tawait Promise.resolve()\n\t\tthis.#emitter.emit('destroy')\n\t\tthis.#destroying.delete(record)\n\t\tif (this.#min !== undefined) this.#pump()\n\t\tthis.#finish()\n\t}\n\n\tasync #settleClear(cleanups: ReadonlyArray<Promise<void>>): Promise<void> {\n\t\tconst settled = await Promise.allSettled(cleanups)\n\t\tconst failures: unknown[] = []\n\t\tfor (const result of settled) {\n\t\t\tif (\n\t\t\t\tresult.status === 'rejected' &&\n\t\t\t\t!failures.some((failure) => Object.is(failure, result.reason))\n\t\t\t) {\n\t\t\t\tfailures.push(result.reason)\n\t\t\t}\n\t\t}\n\t\tif (failures.length > 0) throw this.#cleanupError(failures)\n\t}\n\n\t#own(cleanup: Promise<void>): void {\n\t\tif (this.#owned.has(cleanup)) return\n\t\tthis.#owned.add(cleanup)\n\t\tvoid cleanup.then(\n\t\t\t() => this.#completeCleanup(cleanup),\n\t\t\t(error: unknown) => this.#failCleanup(cleanup, error),\n\t\t)\n\t}\n\n\t#completeCleanup(cleanup: Promise<void>): void {\n\t\tthis.#owned.delete(cleanup)\n\t\tthis.#finish()\n\t}\n\n\t#failCleanup(cleanup: Promise<void>, error: unknown): void {\n\t\tthis.#owned.delete(cleanup)\n\t\tthis.#record(error)\n\t\tthis.#finish()\n\t}\n\n\t#record(error: unknown): void {\n\t\tif (!this.#failures.some((failure) => Object.is(failure, error))) this.#failures.push(error)\n\t}\n\n\t#cleanupError(failures: readonly unknown[]): PoolError {\n\t\treturn new PoolError({\n\t\t\tcode: 'cleanup',\n\t\t\t...(failures[0] === undefined ? {} : { cause: failures[0] }),\n\t\t\tcontext: { failures: [...failures] },\n\t\t})\n\t}\n\n\t#finish(): void {\n\t\tconst ending = this.#ending\n\t\tif (ending === undefined || this.#operations.size > 0 || this.#owned.size > 0) return\n\t\tlet claimed = false\n\t\tfor (const record of this.#resources.keys()) {\n\t\t\tif (\n\t\t\t\tthis.#validating.has(record) ||\n\t\t\t\tthis.#destroying.has(record) ||\n\t\t\t\tthis.#survivors.has(record)\n\t\t\t)\n\t\t\t\tcontinue\n\t\t\tclaimed = true\n\t\t\tthis.#own(this.#dispose(record))\n\t\t}\n\t\tif (claimed || this.#resources.size > this.#survivors.size || this.#destroying.size > 0) return\n\t\tthis.#emitter.destroy()\n\t\tif (this.#failures.length > 0) ending.reject(this.#cleanupError(this.#failures))\n\t\telse ending.resolve()\n\t}\n}\n","import type { PoolInterface, PoolOptions } from './types.js'\nimport { Pool } from './Pool.js'\n\n/**\n * Creates a distinct {@link PoolInterface} from resource lifecycle hooks, with optional bounded\n * capacity, exclusive leases by default, and FIFO settlement.\n *\n * @remarks\n * Concurrent create and validation hooks may overlap, while acquire promises settle in\n * request order. `clear` owns its idle snapshot; `destroy` returns one stable barrier and\n * waits for every in-flight create, validation, and destroy attempt before destroying the\n * emitter last.\n * Set `min` with its required `restarts` bound and call `start()` to warm resources and\n * refill losses independently of queued acquires. `watch` observes loss and its signal\n * aborts at disposal; a token can declare loss through `destroy()`.\n *\n * @typeParam T - The pooled resource type\n * @param options - Lifecycle hooks, capacity, optional bounded warm floor, and observation hooks\n * @returns A working {@link PoolInterface}\n * @throws {@link PoolError} Thrown with `code: 'invalid'` when capacity, restart bounds, or\n * the watch hook are invalid. Construction validates them synchronously, before the pool exists.\n *\n * @example Create a pool\n * ```ts\n * import { createPool } from '@orkestrel/pool'\n *\n * const pool = createPool<Connection>({\n * \tcreate: () => connect(),\n * \tdestroy: (connection) => connection.close(),\n * \tvalidate: (connection) => connection.alive,\n * \tmax: 8,\n * })\n *\n * const token = await pool.acquire()\n * try {\n * \tawait token.value.query('select 1')\n * } finally {\n * \ttoken.release()\n * }\n * ```\n */\nexport function createPool<T>(options: PoolOptions<T>): PoolInterface<T> {\n\treturn new Pool(options)\n}\n"],"mappings":"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"}
|