@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 CHANGED
@@ -1,16 +1,14 @@
1
1
  # @orkestrel/pool
2
2
 
3
- A bounded, typed **resource pool**: idle reuse + FIFO waiting. `acquire` leases
4
- a resource reusing a validated idle one, growing up to `max`, or parking on
5
- a FIFO waiter list until a `release` frees one — and the returned token's
6
- `release()` returns it for reuse (or hands it straight to the next waiter).
7
- The FIFO handoff is validated, so a resource that goes bad while leased is
8
- never handed to the next lessee, and a parked `acquire` given an `AbortSignal`
9
- rejects and de-queues itself when the signal fires no leaked waiter. The
10
- pool is observable (a typed `emitter` surfaces `create` / `acquire` /
11
- `release` / `destroy`) and deliberately de-bloated — no warm-floor, no
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/src/pool.md`](guides/src/pool.md).
47
+ and usage patterns — see [`guides/pool.md`](guides/pool.md).
50
48
 
51
49
  ## Package
52
50
 
@@ -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
- * A stable, machine-readable pool failure with the original cause and structured context.
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
- /** Stable machine-readable failure category. */
20
+ /** Holds the stable machine-readable failure category. */
20
21
  code;
21
- /** Optional structured input or aggregate-cleanup details. */
22
+ /** Holds optional structured input or aggregate destroy-hook failure details. */
22
23
  context;
23
24
  /**
24
- * Create a pool failure without coercing a hostile thrown value.
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
- * Test whether an unknown value is a {@link PoolError}, returning `false` for hostile proxies.
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 Whether the value is a real `PoolError` instance
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
- * Test whether a value is a valid finite pool maximum.
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 Whether the value is a positive safe integer
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
- * Test whether a value is a native `AbortSignal`, returning `false` for hostile proxies.
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 Whether the value is a native `AbortSignal`
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
- * A capacity-aware resource pool whose opaque ownership records preserve FIFO settlement,
104
- * cancellation, exact lease release, and deterministic teardown under concurrent hooks.
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
- #cleanup;
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
- * Construct a pool and synchronously validate its capacity contract.
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.#cleanup = options.destroy;
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
- /** The typed synchronous lifecycle observation surface. */
171
+ /** Holds the typed synchronous lifecycle observation surface. */
167
172
  get emitter() {
168
173
  return this.#emitter;
169
174
  }
170
- /** All owned records, including records validating or destroying. */
175
+ /** Counts all owned records, including records validating or destroying. */
171
176
  get size() {
172
177
  return this.#resources.size;
173
178
  }
174
- /** Records immediately available without validation work. */
179
+ /** Counts the records immediately available without validation work. */
175
180
  get idle() {
176
181
  return this.#available.length;
177
182
  }
178
- /** Records represented by unsettled released-once lease tokens. */
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
- * Queue and lease one resource in FIFO settlement order.
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
- * Destroy the records that are idle at this call's synchronous snapshot.
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
- * Permanently tear down the pool and return its stable completion barrier.
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.#cleanup?.(value));
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
- * Create a resource pool with optional bounded capacity, unique ownership, and FIFO settlement.
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 hook and cleanup before destroying the emitter last.
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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"}