@orkestrel/pool 0.0.8 → 0.0.10
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 +5 -4
- package/dist/src/core/index.cjs +46 -25
- package/dist/src/core/index.cjs.map +1 -0
- package/dist/src/core/index.d.cts +263 -228
- package/dist/src/core/index.d.ts +263 -228
- package/dist/src/core/index.js +46 -25
- package/dist/src/core/index.js.map +1 -0
- package/package.json +21 -16
package/dist/src/core/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Emitter } from "@orkestrel/emitter";
|
|
2
2
|
//#region src/core/errors.ts
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Represents a stable, machine-readable pool failure with the original cause and structured
|
|
5
|
+
* context.
|
|
5
6
|
*
|
|
6
7
|
* @example
|
|
7
8
|
* ```ts
|
|
@@ -15,12 +16,12 @@ import { Emitter } from "@orkestrel/emitter";
|
|
|
15
16
|
* ```
|
|
16
17
|
*/
|
|
17
18
|
var PoolError = class extends Error {
|
|
18
|
-
/**
|
|
19
|
+
/** Holds the stable machine-readable failure category. */
|
|
19
20
|
code;
|
|
20
|
-
/**
|
|
21
|
+
/** Holds optional structured input or aggregate destroy-hook failure details. */
|
|
21
22
|
context;
|
|
22
23
|
/**
|
|
23
|
-
*
|
|
24
|
+
* Creates a pool failure without coercing a hostile thrown value.
|
|
24
25
|
*
|
|
25
26
|
* @param options - Stable code plus optional cause and structured context
|
|
26
27
|
*/
|
|
@@ -39,10 +40,10 @@ var PoolError = class extends Error {
|
|
|
39
40
|
}
|
|
40
41
|
};
|
|
41
42
|
/**
|
|
42
|
-
*
|
|
43
|
+
* Tests whether an unknown value is a {@link PoolError}, returning `false` for hostile proxies.
|
|
43
44
|
*
|
|
44
45
|
* @param value - The unknown boundary value
|
|
45
|
-
* @returns
|
|
46
|
+
* @returns True if the value is a real `PoolError` instance; false otherwise
|
|
46
47
|
*
|
|
47
48
|
* @example
|
|
48
49
|
* ```ts
|
|
@@ -60,10 +61,10 @@ function isPoolError(value) {
|
|
|
60
61
|
//#endregion
|
|
61
62
|
//#region src/core/validators.ts
|
|
62
63
|
/**
|
|
63
|
-
*
|
|
64
|
+
* Tests whether a value is a valid finite pool maximum.
|
|
64
65
|
*
|
|
65
66
|
* @param value - The unknown maximum candidate
|
|
66
|
-
* @returns
|
|
67
|
+
* @returns True if the value is a positive safe integer; false otherwise
|
|
67
68
|
*
|
|
68
69
|
* @example
|
|
69
70
|
* ```ts
|
|
@@ -75,10 +76,10 @@ function isPoolMax(value) {
|
|
|
75
76
|
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
76
77
|
}
|
|
77
78
|
/**
|
|
78
|
-
*
|
|
79
|
+
* Tests whether a value is a native `AbortSignal`, returning `false` for hostile proxies.
|
|
79
80
|
*
|
|
80
81
|
* @param value - The unknown signal candidate
|
|
81
|
-
* @returns
|
|
82
|
+
* @returns True if the value is a native `AbortSignal`; false otherwise
|
|
82
83
|
*
|
|
83
84
|
* @example
|
|
84
85
|
* ```ts
|
|
@@ -99,8 +100,9 @@ function isPoolSignal(value) {
|
|
|
99
100
|
//#endregion
|
|
100
101
|
//#region src/core/Pool.ts
|
|
101
102
|
/**
|
|
102
|
-
*
|
|
103
|
-
* cancellation, exact lease release, and deterministic teardown under concurrent
|
|
103
|
+
* Represents a capacity-aware resource pool whose opaque ownership records preserve FIFO
|
|
104
|
+
* settlement, cancellation, exact lease release, and deterministic teardown under concurrent
|
|
105
|
+
* hooks.
|
|
104
106
|
*
|
|
105
107
|
* @typeParam T - The pooled resource value
|
|
106
108
|
*
|
|
@@ -120,7 +122,7 @@ function isPoolSignal(value) {
|
|
|
120
122
|
*/
|
|
121
123
|
var Pool = class {
|
|
122
124
|
#create;
|
|
123
|
-
#
|
|
125
|
+
#destroy;
|
|
124
126
|
#validate;
|
|
125
127
|
#max;
|
|
126
128
|
#emitter;
|
|
@@ -141,9 +143,11 @@ var Pool = class {
|
|
|
141
143
|
#pumping = false;
|
|
142
144
|
#repump = false;
|
|
143
145
|
/**
|
|
144
|
-
*
|
|
146
|
+
* Constructs a pool and synchronously validates its capacity contract.
|
|
145
147
|
*
|
|
146
148
|
* @param options - Resource hooks, observation hooks, and optional positive safe `max`
|
|
149
|
+
* @throws {@link PoolError} Thrown when `options.max` is present and is not a positive safe
|
|
150
|
+
* integer, with `code: 'invalid'`.
|
|
147
151
|
*/
|
|
148
152
|
constructor(options) {
|
|
149
153
|
const max = options.max;
|
|
@@ -154,7 +158,7 @@ var Pool = class {
|
|
|
154
158
|
const on = options.on;
|
|
155
159
|
const error = options.error;
|
|
156
160
|
this.#create = options.create;
|
|
157
|
-
this.#
|
|
161
|
+
this.#destroy = options.destroy;
|
|
158
162
|
this.#validate = options.validate;
|
|
159
163
|
this.#max = max;
|
|
160
164
|
this.#emitter = new Emitter({
|
|
@@ -162,27 +166,34 @@ var Pool = class {
|
|
|
162
166
|
...error === void 0 ? {} : { error }
|
|
163
167
|
});
|
|
164
168
|
}
|
|
165
|
-
/**
|
|
169
|
+
/** Holds the typed synchronous lifecycle observation surface. */
|
|
166
170
|
get emitter() {
|
|
167
171
|
return this.#emitter;
|
|
168
172
|
}
|
|
169
|
-
/**
|
|
173
|
+
/** Counts all owned records, including records validating or destroying. */
|
|
170
174
|
get size() {
|
|
171
175
|
return this.#resources.size;
|
|
172
176
|
}
|
|
173
|
-
/**
|
|
177
|
+
/** Counts the records immediately available without validation work. */
|
|
174
178
|
get idle() {
|
|
175
179
|
return this.#available.length;
|
|
176
180
|
}
|
|
177
|
-
/**
|
|
181
|
+
/** Counts the records represented by unsettled released-once lease tokens. */
|
|
178
182
|
get active() {
|
|
179
183
|
return this.#leased.size;
|
|
180
184
|
}
|
|
181
185
|
/**
|
|
182
|
-
*
|
|
186
|
+
* Queues and leases one resource in FIFO settlement order.
|
|
183
187
|
*
|
|
184
188
|
* @param signal - Optional native cancellation signal
|
|
185
189
|
* @returns A promise for the unique resource lease
|
|
190
|
+
* @throws {@link PoolError} Thrown when `signal` is present and is not a native `AbortSignal`,
|
|
191
|
+
* with `code: 'invalid'`. This throw is synchronous rather than a rejected promise, so a caller
|
|
192
|
+
* that handles failures with `.catch()` alone misses it.
|
|
193
|
+
* @throws {@link PoolError} Thrown as a rejection when `destroy()` has already begun, with
|
|
194
|
+
* `code: 'destroyed'`; when the create hook fails, with `code: 'create'` and the hook's thrown
|
|
195
|
+
* value as `cause`; and when an invalid record's cleanup fails, with `code: 'cleanup'`. A
|
|
196
|
+
* `signal` that aborts rejects with the caller's exact `signal.reason` instead.
|
|
186
197
|
*/
|
|
187
198
|
acquire(signal) {
|
|
188
199
|
if (signal !== void 0 && !isPoolSignal(signal)) throw new PoolError({
|
|
@@ -210,9 +221,13 @@ var Pool = class {
|
|
|
210
221
|
return waiter.promise;
|
|
211
222
|
}
|
|
212
223
|
/**
|
|
213
|
-
*
|
|
224
|
+
* Destroys the records that are idle at this call's synchronous snapshot.
|
|
214
225
|
*
|
|
215
226
|
* @returns A promise that settles after every snapshot cleanup attempt
|
|
227
|
+
* @throws {@link PoolError} Thrown when `destroy()` has already begun, with `code: 'destroyed'`.
|
|
228
|
+
* @throws {@link PoolError} Thrown when a claimed record's destroy hook fails, with
|
|
229
|
+
* `code: 'cleanup'` and every distinct failure in `context.failures`. Each arrives as a rejected
|
|
230
|
+
* promise rather than a synchronous throw.
|
|
216
231
|
*/
|
|
217
232
|
clear() {
|
|
218
233
|
if (this.#ending !== void 0) return Promise.reject(new PoolError({ code: "destroyed" }));
|
|
@@ -226,9 +241,12 @@ var Pool = class {
|
|
|
226
241
|
return this.#settleClear(cleanups);
|
|
227
242
|
}
|
|
228
243
|
/**
|
|
229
|
-
*
|
|
244
|
+
* Tears down the pool permanently and returns its stable completion barrier.
|
|
230
245
|
*
|
|
231
246
|
* @returns The exact promise shared by every destroy call
|
|
247
|
+
* @throws {@link PoolError} Thrown when a destroy hook failed during teardown, with
|
|
248
|
+
* `code: 'cleanup'` and every distinct failure in `context.failures`. The barrier rejects; it
|
|
249
|
+
* never throws synchronously, and a repeat call receives the same rejected promise.
|
|
232
250
|
*/
|
|
233
251
|
destroy() {
|
|
234
252
|
if (this.#ending !== void 0) return this.#ending.promise;
|
|
@@ -536,7 +554,7 @@ var Pool = class {
|
|
|
536
554
|
async #clean(record, value, cleanup) {
|
|
537
555
|
let attempt;
|
|
538
556
|
try {
|
|
539
|
-
attempt = Promise.resolve(this.#
|
|
557
|
+
attempt = Promise.resolve(this.#destroy?.(value));
|
|
540
558
|
} catch (error) {
|
|
541
559
|
attempt = Promise.reject(error);
|
|
542
560
|
}
|
|
@@ -604,16 +622,19 @@ var Pool = class {
|
|
|
604
622
|
//#endregion
|
|
605
623
|
//#region src/core/factories.ts
|
|
606
624
|
/**
|
|
607
|
-
*
|
|
625
|
+
* Creates a resource pool with optional bounded capacity, unique ownership, and FIFO settlement.
|
|
608
626
|
*
|
|
609
627
|
* @remarks
|
|
610
628
|
* Concurrent create and validation hooks may overlap, while acquire promises settle in
|
|
611
629
|
* request order. `clear` owns its idle snapshot; `destroy` returns one stable barrier and
|
|
612
|
-
* waits for every in-flight
|
|
630
|
+
* waits for every in-flight create, validation, and destroy attempt before destroying the
|
|
631
|
+
* emitter last.
|
|
613
632
|
*
|
|
614
633
|
* @typeParam T - The pooled resource type
|
|
615
634
|
* @param options - Lifecycle hooks, optional positive safe `max`, and observation hooks
|
|
616
635
|
* @returns A working {@link PoolInterface}
|
|
636
|
+
* @throws {@link PoolError} Thrown when `options.max` is present and is not a positive safe
|
|
637
|
+
* integer, with `code: 'invalid'`. Construction validates it synchronously, before the pool exists.
|
|
617
638
|
*
|
|
618
639
|
* @example
|
|
619
640
|
* ```ts
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["#create","#destroy","#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 * Represents a stable, machine-readable pool failure with the original cause and structured\n * 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 valid finite 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`, returning `false` 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 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 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\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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orkestrel/pool",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.10",
|
|
4
4
|
"description": "A typed resource pool with optional bounded capacity, FIFO abort-cancellable waiting, validated idle reuse, and an observable lifecycle. Part of the @orkestrel line.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"connection-pool",
|
|
@@ -52,33 +52,38 @@
|
|
|
52
52
|
"format": "oxfmt --config .oxfmtrc.json --write .",
|
|
53
53
|
"format:check": "oxfmt --config .oxfmtrc.json --check .",
|
|
54
54
|
"lint:check": "oxlint --config .oxlintrc.json --deny-warnings .",
|
|
55
|
-
"test": "npm run test:src && npm run test:policy && npm run test:config && npm run test:guides",
|
|
55
|
+
"test": "npm run test:src && npm run test:policy && npm run test:config && npm run test:setup && npm run test:guides",
|
|
56
56
|
"test:src": "vitest run --config vite.config.ts --no-cache --reporter=dot --project src:core",
|
|
57
57
|
"test:src:core": "vitest run --config vite.config.ts --no-cache --reporter=dot --project src:core",
|
|
58
58
|
"test:policy": "vitest run --config vite.config.ts --no-cache --reporter=dot --project policy",
|
|
59
59
|
"test:config": "vitest run --config vite.config.ts --no-cache --reporter=dot --project config",
|
|
60
|
-
"test:guides": "vitest run --config vite.config.ts --reporter=dot --project guides",
|
|
60
|
+
"test:guides": "vitest run --config vite.config.ts --no-cache --reporter=dot --project guides",
|
|
61
61
|
"build": "npm run clean && npm run build:src",
|
|
62
62
|
"build:src": "npm run build:src:core",
|
|
63
63
|
"build:src:core": "vite build --config configs/src/vite.core.config.ts && npm run copy dist/src/core/index.d.ts dist/src/core/index.d.cts",
|
|
64
|
-
"prepublishOnly": "npm run format:check && npm run lint:check && npm run check && npm run build && npm test"
|
|
64
|
+
"prepublishOnly": "npm run format:check && npm run lint:check && npm run check && npm run build && npm test && npm run test:distribution -- --mode release",
|
|
65
|
+
"test:distribution": "vitest run --config vite.config.ts --no-cache --reporter=dot --project distribution",
|
|
66
|
+
"test:probe": "vitest run --config vite.config.ts --no-cache --reporter=verbose --project probe",
|
|
67
|
+
"test:bench": "vitest bench --config vite.config.ts --no-cache --project probe",
|
|
68
|
+
"prepack": "npm run build",
|
|
69
|
+
"test:setup": "vitest run --config vite.config.ts --no-cache --reporter=dot --project setup"
|
|
65
70
|
},
|
|
66
71
|
"dependencies": {
|
|
67
|
-
"@orkestrel/emitter": "^0.0.
|
|
72
|
+
"@orkestrel/emitter": "^0.0.9"
|
|
68
73
|
},
|
|
69
74
|
"devDependencies": {
|
|
70
|
-
"@microsoft/api-extractor": "^7.
|
|
71
|
-
"@orkestrel/guide": "^0.0.
|
|
72
|
-
"@orkestrel/
|
|
73
|
-
"@orkestrel/
|
|
74
|
-
"@
|
|
75
|
-
"@
|
|
76
|
-
"oxfmt": "^0.
|
|
77
|
-
"oxlint": "^1.
|
|
75
|
+
"@microsoft/api-extractor": "^7.59.0",
|
|
76
|
+
"@orkestrel/guide": "^0.0.16",
|
|
77
|
+
"@orkestrel/probe": "^0.0.11",
|
|
78
|
+
"@orkestrel/scaffold": "^0.0.61",
|
|
79
|
+
"@orkestrel/test": "^0.0.13",
|
|
80
|
+
"@types/node": "^26.4.1",
|
|
81
|
+
"oxfmt": "^0.66.0",
|
|
82
|
+
"oxlint": "^1.81.0",
|
|
78
83
|
"typescript": "^6.0.3",
|
|
79
|
-
"vite": "^8.2.
|
|
80
|
-
"vite-plugin-dts": "^5.0
|
|
81
|
-
"vitest": "^4.1.
|
|
84
|
+
"vite": "^8.2.2",
|
|
85
|
+
"vite-plugin-dts": "^5.1.0",
|
|
86
|
+
"vitest": "^4.1.11"
|
|
82
87
|
},
|
|
83
88
|
"engines": {
|
|
84
89
|
"node": ">=22.12.0"
|