@orkestrel/pool 0.0.9 → 0.0.11
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 +10 -12
- package/dist/src/core/index.cjs +49 -26
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +289 -231
- package/dist/src/core/index.d.ts +289 -231
- package/dist/src/core/index.js +49 -26
- package/dist/src/core/index.js.map +1 -1
- package/package.json +11 -13
package/README.md
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
# @orkestrel/pool
|
|
2
2
|
|
|
3
|
-
A
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
eviction timers. Environment-agnostic — no I/O, no browser or server
|
|
13
|
-
assumptions. Part of the `@orkestrel` line.
|
|
3
|
+
> A typed resource pool with optional bounded capacity, unique ownership, FIFO settlement,
|
|
4
|
+
> validated reuse, caller-owned cancellation, explicit cleanup failures, and a stable
|
|
5
|
+
> event-driven teardown barrier.
|
|
6
|
+
|
|
7
|
+
Create a pool with the `createPool` function, hand it the hooks that make, check, and tear
|
|
8
|
+
down one resource, and `await pool.acquire()` wherever the work needs one. Release the token
|
|
9
|
+
in a `finally` block, and `await pool.destroy()` when the process is done with the pool.
|
|
10
|
+
Environment-agnostic — no I/O, no browser or server assumptions. Part of the `@orkestrel`
|
|
11
|
+
line.
|
|
14
12
|
|
|
15
13
|
## Install
|
|
16
14
|
|
|
@@ -46,7 +44,7 @@ try {
|
|
|
46
44
|
## Guide
|
|
47
45
|
|
|
48
46
|
For the full surface — the `Pool` engine, options, the observable `emitter`,
|
|
49
|
-
and usage patterns — see [`guides/
|
|
47
|
+
and usage patterns — see [`guides/pool.md`](guides/pool.md).
|
|
50
48
|
|
|
51
49
|
## Package
|
|
52
50
|
|
package/dist/src/core/index.cjs
CHANGED
|
@@ -2,7 +2,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
let _orkestrel_emitter = require("@orkestrel/emitter");
|
|
3
3
|
//#region src/core/errors.ts
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Represents a stable, machine-readable pool failure that retains the original thrown value as
|
|
6
|
+
* its cause without unsafe coercion, alongside structured context.
|
|
6
7
|
*
|
|
7
8
|
* @example
|
|
8
9
|
* ```ts
|
|
@@ -16,12 +17,12 @@ let _orkestrel_emitter = require("@orkestrel/emitter");
|
|
|
16
17
|
* ```
|
|
17
18
|
*/
|
|
18
19
|
var PoolError = class extends Error {
|
|
19
|
-
/**
|
|
20
|
+
/** Holds the stable machine-readable failure category. */
|
|
20
21
|
code;
|
|
21
|
-
/**
|
|
22
|
+
/** Holds optional structured input or aggregate destroy-hook failure details. */
|
|
22
23
|
context;
|
|
23
24
|
/**
|
|
24
|
-
*
|
|
25
|
+
* Creates a pool failure without coercing a hostile thrown value.
|
|
25
26
|
*
|
|
26
27
|
* @param options - Stable code plus optional cause and structured context
|
|
27
28
|
*/
|
|
@@ -40,10 +41,10 @@ var PoolError = class extends Error {
|
|
|
40
41
|
}
|
|
41
42
|
};
|
|
42
43
|
/**
|
|
43
|
-
*
|
|
44
|
+
* Tests whether an unknown value is a {@link PoolError}, returning `false` for hostile proxies.
|
|
44
45
|
*
|
|
45
46
|
* @param value - The unknown boundary value
|
|
46
|
-
* @returns
|
|
47
|
+
* @returns True if the value is a real `PoolError` instance; false otherwise
|
|
47
48
|
*
|
|
48
49
|
* @example
|
|
49
50
|
* ```ts
|
|
@@ -61,10 +62,10 @@ function isPoolError(value) {
|
|
|
61
62
|
//#endregion
|
|
62
63
|
//#region src/core/validators.ts
|
|
63
64
|
/**
|
|
64
|
-
*
|
|
65
|
+
* Tests whether a value is a positive safe integer, the only valid explicit pool maximum.
|
|
65
66
|
*
|
|
66
67
|
* @param value - The unknown maximum candidate
|
|
67
|
-
* @returns
|
|
68
|
+
* @returns True if the value is a positive safe integer; false otherwise
|
|
68
69
|
*
|
|
69
70
|
* @example
|
|
70
71
|
* ```ts
|
|
@@ -76,10 +77,11 @@ function isPoolMax(value) {
|
|
|
76
77
|
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
77
78
|
}
|
|
78
79
|
/**
|
|
79
|
-
*
|
|
80
|
+
* Tests whether a value is a native `AbortSignal` for the acquire boundary, returning `false`
|
|
81
|
+
* for hostile proxies.
|
|
80
82
|
*
|
|
81
83
|
* @param value - The unknown signal candidate
|
|
82
|
-
* @returns
|
|
84
|
+
* @returns True if the value is a native `AbortSignal`; false otherwise
|
|
83
85
|
*
|
|
84
86
|
* @example
|
|
85
87
|
* ```ts
|
|
@@ -100,8 +102,9 @@ function isPoolSignal(value) {
|
|
|
100
102
|
//#endregion
|
|
101
103
|
//#region src/core/Pool.ts
|
|
102
104
|
/**
|
|
103
|
-
*
|
|
104
|
-
* cancellation, exact lease release, and deterministic teardown under concurrent
|
|
105
|
+
* Represents a capacity-aware resource pool whose opaque ownership records preserve FIFO
|
|
106
|
+
* settlement, cancellation, exact lease release, and deterministic teardown under concurrent
|
|
107
|
+
* hooks.
|
|
105
108
|
*
|
|
106
109
|
* @typeParam T - The pooled resource value
|
|
107
110
|
*
|
|
@@ -121,7 +124,7 @@ function isPoolSignal(value) {
|
|
|
121
124
|
*/
|
|
122
125
|
var Pool = class {
|
|
123
126
|
#create;
|
|
124
|
-
#
|
|
127
|
+
#destroy;
|
|
125
128
|
#validate;
|
|
126
129
|
#max;
|
|
127
130
|
#emitter;
|
|
@@ -142,9 +145,11 @@ var Pool = class {
|
|
|
142
145
|
#pumping = false;
|
|
143
146
|
#repump = false;
|
|
144
147
|
/**
|
|
145
|
-
*
|
|
148
|
+
* Constructs a pool and synchronously validates its capacity contract.
|
|
146
149
|
*
|
|
147
150
|
* @param options - Resource hooks, observation hooks, and optional positive safe `max`
|
|
151
|
+
* @throws {@link PoolError} Thrown when `options.max` is present and is not a positive safe
|
|
152
|
+
* integer, with `code: 'invalid'`.
|
|
148
153
|
*/
|
|
149
154
|
constructor(options) {
|
|
150
155
|
const max = options.max;
|
|
@@ -155,7 +160,7 @@ var Pool = class {
|
|
|
155
160
|
const on = options.on;
|
|
156
161
|
const error = options.error;
|
|
157
162
|
this.#create = options.create;
|
|
158
|
-
this.#
|
|
163
|
+
this.#destroy = options.destroy;
|
|
159
164
|
this.#validate = options.validate;
|
|
160
165
|
this.#max = max;
|
|
161
166
|
this.#emitter = new _orkestrel_emitter.Emitter({
|
|
@@ -163,27 +168,34 @@ var Pool = class {
|
|
|
163
168
|
...error === void 0 ? {} : { error }
|
|
164
169
|
});
|
|
165
170
|
}
|
|
166
|
-
/**
|
|
171
|
+
/** Holds the typed synchronous lifecycle observation surface. */
|
|
167
172
|
get emitter() {
|
|
168
173
|
return this.#emitter;
|
|
169
174
|
}
|
|
170
|
-
/**
|
|
175
|
+
/** Counts all owned records, including records validating or destroying. */
|
|
171
176
|
get size() {
|
|
172
177
|
return this.#resources.size;
|
|
173
178
|
}
|
|
174
|
-
/**
|
|
179
|
+
/** Counts the records immediately available without validation work. */
|
|
175
180
|
get idle() {
|
|
176
181
|
return this.#available.length;
|
|
177
182
|
}
|
|
178
|
-
/**
|
|
183
|
+
/** Counts the records represented by unsettled released-once lease tokens. */
|
|
179
184
|
get active() {
|
|
180
185
|
return this.#leased.size;
|
|
181
186
|
}
|
|
182
187
|
/**
|
|
183
|
-
*
|
|
188
|
+
* Queues and leases one resource in FIFO settlement order.
|
|
184
189
|
*
|
|
185
190
|
* @param signal - Optional native cancellation signal
|
|
186
191
|
* @returns A promise for the unique resource lease
|
|
192
|
+
* @throws {@link PoolError} Thrown when `signal` is present and is not a native `AbortSignal`,
|
|
193
|
+
* with `code: 'invalid'`. This throw is synchronous rather than a rejected promise, so a caller
|
|
194
|
+
* that handles failures with `.catch()` alone misses it.
|
|
195
|
+
* @throws {@link PoolError} Thrown as a rejection when `destroy()` has already begun, with
|
|
196
|
+
* `code: 'destroyed'`; when the create hook fails, with `code: 'create'` and the hook's thrown
|
|
197
|
+
* value as `cause`; and when an invalid record's cleanup fails, with `code: 'cleanup'`. A
|
|
198
|
+
* `signal` that aborts rejects with the caller's exact `signal.reason` instead.
|
|
187
199
|
*/
|
|
188
200
|
acquire(signal) {
|
|
189
201
|
if (signal !== void 0 && !isPoolSignal(signal)) throw new PoolError({
|
|
@@ -211,9 +223,13 @@ var Pool = class {
|
|
|
211
223
|
return waiter.promise;
|
|
212
224
|
}
|
|
213
225
|
/**
|
|
214
|
-
*
|
|
226
|
+
* Destroys the records that are idle at this call's synchronous snapshot.
|
|
215
227
|
*
|
|
216
228
|
* @returns A promise that settles after every snapshot cleanup attempt
|
|
229
|
+
* @throws {@link PoolError} Thrown when `destroy()` has already begun, with `code: 'destroyed'`.
|
|
230
|
+
* @throws {@link PoolError} Thrown when a claimed record's destroy hook fails, with
|
|
231
|
+
* `code: 'cleanup'` and every distinct failure in `context.failures`. Each arrives as a rejected
|
|
232
|
+
* promise rather than a synchronous throw.
|
|
217
233
|
*/
|
|
218
234
|
clear() {
|
|
219
235
|
if (this.#ending !== void 0) return Promise.reject(new PoolError({ code: "destroyed" }));
|
|
@@ -227,9 +243,12 @@ var Pool = class {
|
|
|
227
243
|
return this.#settleClear(cleanups);
|
|
228
244
|
}
|
|
229
245
|
/**
|
|
230
|
-
*
|
|
246
|
+
* Tears down the pool permanently and returns its stable completion barrier.
|
|
231
247
|
*
|
|
232
248
|
* @returns The exact promise shared by every destroy call
|
|
249
|
+
* @throws {@link PoolError} Thrown when a destroy hook failed during teardown, with
|
|
250
|
+
* `code: 'cleanup'` and every distinct failure in `context.failures`. The barrier rejects; it
|
|
251
|
+
* never throws synchronously, and a repeat call receives the same rejected promise.
|
|
233
252
|
*/
|
|
234
253
|
destroy() {
|
|
235
254
|
if (this.#ending !== void 0) return this.#ending.promise;
|
|
@@ -537,7 +556,7 @@ var Pool = class {
|
|
|
537
556
|
async #clean(record, value, cleanup) {
|
|
538
557
|
let attempt;
|
|
539
558
|
try {
|
|
540
|
-
attempt = Promise.resolve(this.#
|
|
559
|
+
attempt = Promise.resolve(this.#destroy?.(value));
|
|
541
560
|
} catch (error) {
|
|
542
561
|
attempt = Promise.reject(error);
|
|
543
562
|
}
|
|
@@ -605,18 +624,22 @@ var Pool = class {
|
|
|
605
624
|
//#endregion
|
|
606
625
|
//#region src/core/factories.ts
|
|
607
626
|
/**
|
|
608
|
-
*
|
|
627
|
+
* Creates a distinct {@link PoolInterface} from resource lifecycle hooks, with optional bounded
|
|
628
|
+
* capacity, unique ownership, and FIFO settlement.
|
|
609
629
|
*
|
|
610
630
|
* @remarks
|
|
611
631
|
* Concurrent create and validation hooks may overlap, while acquire promises settle in
|
|
612
632
|
* request order. `clear` owns its idle snapshot; `destroy` returns one stable barrier and
|
|
613
|
-
* waits for every in-flight
|
|
633
|
+
* waits for every in-flight create, validation, and destroy attempt before destroying the
|
|
634
|
+
* emitter last.
|
|
614
635
|
*
|
|
615
636
|
* @typeParam T - The pooled resource type
|
|
616
637
|
* @param options - Lifecycle hooks, optional positive safe `max`, and observation hooks
|
|
617
638
|
* @returns A working {@link PoolInterface}
|
|
639
|
+
* @throws {@link PoolError} Thrown when `options.max` is present and is not a positive safe
|
|
640
|
+
* integer, with `code: 'invalid'`. Construction validates it synchronously, before the pool exists.
|
|
618
641
|
*
|
|
619
|
-
* @example
|
|
642
|
+
* @example Create a pool
|
|
620
643
|
* ```ts
|
|
621
644
|
* import { createPool } from '@orkestrel/pool'
|
|
622
645
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["#create","#cleanup","#validate","#max","#emitter","#resources","#available","#validating","#leased","#destroying","#waiters","#assigned","#reservations","#signals","#ready","#operations","#owned","#failures","#ending","#state","#createAbort","#abort","#pump","#dispose","#settleClear","#detach","#own","#finish","#release","#createRelease","#recycle","#commit","#pumping","#repump","#startValidation","#startCreate","#createResource","#completeOperation","#failOperation","#prepare","#validateResource","#token","#record","#clean","#cleanupError","#completeCleanup","#failCleanup"],"sources":["../../../src/core/errors.ts","../../../src/core/validators.ts","../../../src/core/Pool.ts","../../../src/core/factories.ts"],"sourcesContent":["import type { PoolErrorOptions } from './types.js'\n\n/**\n * A stable, machine-readable pool failure with the original cause and 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/** Stable machine-readable failure category. */\n\treadonly code\n\t/** Optional structured input or aggregate-cleanup details. */\n\treadonly context\n\n\t/**\n\t * Create 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\ttry {\n\t\t\tif (\n\t\t\t\toptions.cause instanceof Error &&\n\t\t\t\ttypeof options.cause.message === 'string' &&\n\t\t\t\toptions.cause.message.length > 0\n\t\t\t) {\n\t\t\t\tmessage = `${message}: ${options.cause.message}`\n\t\t\t}\n\t\t} catch {}\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 * Test whether an unknown value is a {@link PoolError}, returning `false` for hostile proxies.\n *\n * @param value - The unknown boundary value\n * @returns Whether the value is a real `PoolError` instance\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\ttry {\n\t\treturn value instanceof PoolError\n\t} catch {\n\t\treturn false\n\t}\n}\n","/**\n * Test whether a value is a valid finite pool maximum.\n *\n * @param value - The unknown maximum candidate\n * @returns Whether the value is a positive safe integer\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 typeof value === 'number' && Number.isSafeInteger(value) && value > 0\n}\n\n/**\n * Test whether a value is a native `AbortSignal`, returning `false` for hostile proxies.\n *\n * @param value - The unknown signal candidate\n * @returns Whether the value is a native `AbortSignal`\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\ttry {\n\t\tconst getter = Object.getOwnPropertyDescriptor(AbortSignal.prototype, 'aborted')?.get\n\t\tif (getter === undefined) return false\n\t\tReflect.apply(getter, value, [])\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n","import type { EmitterInterface } from '@orkestrel/emitter'\nimport type { PoolCode, PoolEventMap, PoolInterface, PoolOptions, PoolToken } from './types.js'\nimport { Emitter } from '@orkestrel/emitter'\nimport { PoolError } from './errors.js'\nimport { isPoolMax, isPoolSignal } from './validators.js'\n\n/**\n * A capacity-aware resource pool whose opaque ownership records preserve FIFO settlement,\n * cancellation, exact lease release, and 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 #cleanup: ((value: T) => Promise<void> | void) | undefined\n\treadonly #validate: ((value: T) => Promise<boolean> | boolean) | undefined\n\treadonly #max: number | undefined\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\n\t/**\n\t * Construct a pool and synchronously validate its capacity contract.\n\t *\n\t * @param options - Resource hooks, observation hooks, and optional positive safe `max`\n\t */\n\tconstructor(options: PoolOptions<T>) {\n\t\tconst max = options.max\n\t\tif (max !== undefined && !isPoolMax(max)) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: max } })\n\t\t}\n\t\tconst on = options.on\n\t\tconst error = options.error\n\t\tthis.#create = options.create\n\t\tthis.#cleanup = options.destroy\n\t\tthis.#validate = options.validate\n\t\tthis.#max = max\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/** The typed synchronous lifecycle observation surface. */\n\tget emitter(): EmitterInterface<PoolEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\t/** All owned records, including records validating or destroying. */\n\tget size(): number {\n\t\treturn this.#resources.size\n\t}\n\n\t/** Records immediately available without validation work. */\n\tget idle(): number {\n\t\treturn this.#available.length\n\t}\n\n\t/** 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 * Queue and lease one resource in FIFO settlement order.\n\t *\n\t * @param signal - Optional native cancellation signal\n\t * @returns A promise for the unique resource lease\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 * Destroy the records that are idle at this call's synchronous snapshot.\n\t *\n\t * @returns A promise that settles after every snapshot cleanup attempt\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 * Permanently tear down the pool and return its stable completion barrier.\n\t *\n\t * @returns The exact promise shared by every destroy call\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\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#createRelease(record: object): () => void {\n\t\tlet released = false\n\t\treturn (): void => {\n\t\t\tif (released) return\n\t\t\treleased = true\n\t\t\tthis.#release(record)\n\t\t}\n\t}\n\n\t#token(record: object, value: T): PoolToken<T> {\n\t\treturn { value, release: this.#createRelease(record) }\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.#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} while (this.#repump)\n\t\tthis.#pumping = false\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 = {}\n\t\tthis.#resources.set(record, value)\n\t\tthis.#emitter.emit('create')\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\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\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\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\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.#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\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\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 attempt: Promise<void>\n\t\ttry {\n\t\t\tattempt = Promise.resolve(this.#cleanup?.(value))\n\t\t} catch (error: unknown) {\n\t\t\tattempt = Promise.reject(error)\n\t\t}\n\t\tlet failure: unknown\n\t\tlet failed = false\n\t\ttry {\n\t\t\tawait attempt\n\t\t} catch (error: unknown) {\n\t\t\tfailure = error\n\t\t\tfailed = true\n\t\t}\n\t\tthis.#resources.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\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 (this.#validating.has(record) || this.#destroying.has(record)) continue\n\t\t\tclaimed = true\n\t\t\tthis.#own(this.#dispose(record))\n\t\t}\n\t\tif (claimed || this.#resources.size > 0 || 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 * Create a resource pool with optional bounded 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 hook and cleanup before destroying the emitter last.\n *\n * @typeParam T - The pooled resource type\n * @param options - Lifecycle hooks, optional positive safe `max`, and observation hooks\n * @returns A working {@link PoolInterface}\n *\n * @example\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":[],"sources":["../../../src/core/errors.ts","../../../src/core/validators.ts","../../../src/core/Pool.ts","../../../src/core/factories.ts"],"sourcesContent":["import type { PoolErrorOptions } from './types.js'\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\ttry {\n\t\t\tif (\n\t\t\t\toptions.cause instanceof Error &&\n\t\t\t\ttypeof options.cause.message === 'string' &&\n\t\t\t\toptions.cause.message.length > 0\n\t\t\t) {\n\t\t\t\tmessage = `${message}: ${options.cause.message}`\n\t\t\t}\n\t\t} catch {}\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\ttry {\n\t\treturn value instanceof PoolError\n\t} catch {\n\t\treturn false\n\t}\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 typeof value === 'number' && 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\ttry {\n\t\tconst getter = Object.getOwnPropertyDescriptor(AbortSignal.prototype, 'aborted')?.get\n\t\tif (getter === undefined) return false\n\t\tReflect.apply(getter, value, [])\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n","import type { EmitterInterface } from '@orkestrel/emitter'\nimport type { PoolCode, PoolEventMap, PoolInterface, PoolOptions, PoolToken } from './types.js'\nimport { Emitter } from '@orkestrel/emitter'\nimport { PoolError } from './errors.js'\nimport { isPoolMax, isPoolSignal } from './validators.js'\n\n/**\n * Represents a capacity-aware resource pool whose opaque ownership records preserve FIFO\n * settlement, cancellation, exact lease release, and deterministic teardown under concurrent\n * 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 #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\n\t/**\n\t * Constructs a pool and synchronously validates its capacity contract.\n\t *\n\t * @param options - Resource hooks, observation hooks, and optional positive safe `max`\n\t * @throws {@link PoolError} Thrown when `options.max` is present and is not a positive safe\n\t * integer, with `code: 'invalid'`.\n\t */\n\tconstructor(options: PoolOptions<T>) {\n\t\tconst max = options.max\n\t\tif (max !== undefined && !isPoolMax(max)) {\n\t\t\tthrow new PoolError({ code: 'invalid', context: { value: max } })\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\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 or destroying. */\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 * Queues and leases one resource in FIFO settlement order.\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, with `code: 'create'` and the hook's thrown\n\t * value as `cause`; and when an invalid record's cleanup fails, with `code: 'cleanup'`. A\n\t * `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.\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 failed 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\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#createRelease(record: object): () => void {\n\t\tlet released = false\n\t\treturn (): void => {\n\t\t\tif (released) return\n\t\t\treleased = true\n\t\t\tthis.#release(record)\n\t\t}\n\t}\n\n\t#token(record: object, value: T): PoolToken<T> {\n\t\treturn { value, release: this.#createRelease(record) }\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.#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} while (this.#repump)\n\t\tthis.#pumping = false\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 = {}\n\t\tthis.#resources.set(record, value)\n\t\tthis.#emitter.emit('create')\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\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\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\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\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.#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\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\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 attempt: Promise<void>\n\t\ttry {\n\t\t\tattempt = Promise.resolve(this.#destroy?.(value))\n\t\t} catch (error: unknown) {\n\t\t\tattempt = Promise.reject(error)\n\t\t}\n\t\tlet failure: unknown\n\t\tlet failed = false\n\t\ttry {\n\t\t\tawait attempt\n\t\t} catch (error: unknown) {\n\t\t\tfailure = error\n\t\t\tfailed = true\n\t\t}\n\t\tthis.#resources.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\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 (this.#validating.has(record) || this.#destroying.has(record)) continue\n\t\t\tclaimed = true\n\t\t\tthis.#own(this.#dispose(record))\n\t\t}\n\t\tif (claimed || this.#resources.size > 0 || 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 *\n * @typeParam T - The pooled resource type\n * @param options - Lifecycle hooks, optional positive safe `max`, and observation hooks\n * @returns A working {@link PoolInterface}\n * @throws {@link PoolError} Thrown when `options.max` is present and is not a positive safe\n * integer, with `code: 'invalid'`. Construction validates it 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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"}
|