@vielzeug/familiar 2.2.0 → 26.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +4 -11
  2. package/dist/_pool-core.cjs +1 -1
  3. package/dist/_pool-core.cjs.map +1 -1
  4. package/dist/_pool-core.d.ts +43 -22
  5. package/dist/_pool-core.d.ts.map +1 -1
  6. package/dist/_pool-core.js +1 -104
  7. package/dist/_pool-core.js.map +1 -1
  8. package/dist/_pool.cjs +1 -1
  9. package/dist/_pool.cjs.map +1 -1
  10. package/dist/_pool.d.ts +9 -6
  11. package/dist/_pool.d.ts.map +1 -1
  12. package/dist/_pool.js +1 -151
  13. package/dist/_pool.js.map +1 -1
  14. package/dist/_stream-pool.cjs +1 -1
  15. package/dist/_stream-pool.cjs.map +1 -1
  16. package/dist/_stream-pool.d.ts +10 -6
  17. package/dist/_stream-pool.d.ts.map +1 -1
  18. package/dist/_stream-pool.js +1 -97
  19. package/dist/_stream-pool.js.map +1 -1
  20. package/dist/_timers.cjs +1 -1
  21. package/dist/_timers.cjs.map +1 -1
  22. package/dist/_timers.js +1 -7
  23. package/dist/_timers.js.map +1 -1
  24. package/dist/errors.cjs +1 -1
  25. package/dist/errors.cjs.map +1 -1
  26. package/dist/errors.d.ts +1 -1
  27. package/dist/errors.d.ts.map +1 -1
  28. package/dist/errors.js +1 -23
  29. package/dist/errors.js.map +1 -1
  30. package/dist/familiar.cjs +1 -1
  31. package/dist/familiar.cjs.map +1 -1
  32. package/dist/familiar.iife.js +1 -1
  33. package/dist/familiar.iife.js.map +1 -1
  34. package/dist/familiar.js +1 -1
  35. package/dist/familiar.js.map +1 -1
  36. package/dist/index.cjs +1 -1
  37. package/dist/index.d.ts +4 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -4
  40. package/dist/protocol.cjs +1 -1
  41. package/dist/protocol.cjs.map +1 -1
  42. package/dist/protocol.d.ts +1 -0
  43. package/dist/protocol.d.ts.map +1 -1
  44. package/dist/protocol.js +1 -67
  45. package/dist/protocol.js.map +1 -1
  46. package/dist/testing/index.d.ts +1 -1
  47. package/dist/testing/index.d.ts.map +1 -1
  48. package/dist/testing/testing.cjs +1 -1
  49. package/dist/testing/testing.cjs.map +1 -1
  50. package/dist/testing/testing.d.ts +4 -4
  51. package/dist/testing/testing.d.ts.map +1 -1
  52. package/dist/testing/testing.js +1 -75
  53. package/dist/testing/testing.js.map +1 -1
  54. package/dist/testing.js +1 -3
  55. package/dist/types.d.ts +18 -17
  56. package/dist/types.d.ts.map +1 -1
  57. package/dist/worker.cjs +1 -1
  58. package/dist/worker.cjs.map +1 -1
  59. package/dist/worker.d.ts +1 -8
  60. package/dist/worker.d.ts.map +1 -1
  61. package/dist/worker.js +1 -178
  62. package/dist/worker.js.map +1 -1
  63. package/package.json +11 -9
  64. package/dist/_dev.d.ts +0 -2
  65. package/dist/_dev.d.ts.map +0 -1
  66. package/dist/_queue.cjs +0 -2
  67. package/dist/_queue.cjs.map +0 -1
  68. package/dist/_queue.d.ts +0 -19
  69. package/dist/_queue.d.ts.map +0 -1
  70. package/dist/_queue.js +0 -51
  71. package/dist/_queue.js.map +0 -1
package/dist/_pool.js CHANGED
@@ -1,152 +1,2 @@
1
- import { FamiliarQueueFullError as e, FamiliarTerminatedError as t } from "./errors.js";
2
- import { createPoolCore as n } from "./_pool-core.js";
3
- import { TaskQueue as r } from "./_queue.js";
4
- import { abortError as i } from "@vielzeug/arsenal/async";
5
- //#region src/_pool.ts
6
- function a(a, o) {
7
- let s = [...a], c = new r(), l = !1, u = n({
8
- isIdle: () => s.length === a.length && c.size === 0,
9
- onDispose() {
10
- for (let e of a) e.terminate();
11
- for (; c.size > 0;) {
12
- let e = c.shift();
13
- if (!e) break;
14
- e.cleanupAbort?.(), e.reject(new t());
15
- }
16
- },
17
- onDrainStart() {}
18
- });
19
- function d() {
20
- for (; c.size > 0;) {
21
- let e = c.shift();
22
- if (!e) break;
23
- if (e.signal?.aborted) {
24
- e.cleanupAbort?.(), e.reject(i(e.signal)), u.releaseCapacity();
25
- continue;
26
- }
27
- return e;
28
- }
29
- u.settleIdle();
30
- }
31
- function f() {
32
- if (!(l || u.disposed)) {
33
- for (l = !0; !u.disposed && s.length > 0 && c.size > 0;) {
34
- let e = d();
35
- if (!e) break;
36
- let n = e, r = s.pop(), a = n.timeout ?? o.defaultTimeout;
37
- u.trackActive(1), u.releaseCapacity();
38
- let c = () => r.cancel(i(n.signal));
39
- n.cleanupAbort = () => {
40
- n.signal?.removeEventListener("abort", c), n.cleanupAbort = void 0;
41
- }, n.signal?.addEventListener("abort", c, { once: !0 }), r.run(n.input, n.transferables, a).then((e) => l(e), (e) => p(e));
42
- function l(e) {
43
- n.cleanupAbort?.(), s.push(r), u.trackActive(-1), u.trackCompleted(), n.resolve(e), f(), u.settleIdle();
44
- }
45
- function p(e) {
46
- n.cleanupAbort?.(), s.push(r), u.trackActive(-1), !(e instanceof t) && e instanceof Error && e.name !== "AbortError" && u.trackFailed(), n.reject(e), f(), u.settleIdle();
47
- }
48
- }
49
- l = !1;
50
- }
51
- }
52
- async function p(n, r = {}) {
53
- let { priority: a = 0, signal: s, timeout: l, transferables: d = [] } = r;
54
- if (u.disposed) throw new t();
55
- if (u.drainPromise) throw new t("Worker is draining");
56
- if (s?.aborted) throw i(s);
57
- for (; o.onFull === "wait" && o.maxQueue !== void 0 && c.size >= o.maxQueue;) {
58
- if (await u.waitForCapacity(s), u.disposed) throw new t();
59
- if (u.drainPromise) throw new t("Worker is draining");
60
- if (s?.aborted) throw i(s);
61
- }
62
- let p, m, h = new Promise((e, t) => {
63
- p = e, m = t;
64
- }), g = {
65
- input: n,
66
- priority: a,
67
- reject: m,
68
- resolve: p,
69
- signal: s,
70
- timeout: l,
71
- transferables: d
72
- };
73
- if (!c.enqueue(g, o.onFull === "wait" ? void 0 : o.maxQueue)) throw new e(o.maxQueue);
74
- if (s) {
75
- let e = () => {
76
- c.remove(g) && (g.cleanupAbort?.(), m(i(s)), u.releaseCapacity(), u.settleIdle());
77
- };
78
- g.cleanupAbort = () => {
79
- s.removeEventListener("abort", e), g.cleanupAbort = void 0;
80
- }, s.addEventListener("abort", e, { once: !0 });
81
- }
82
- return f(), h;
83
- }
84
- return {
85
- get disposalSignal() {
86
- return u.disposalSignal;
87
- },
88
- dispose: u.dispose,
89
- get disposed() {
90
- return u.disposed;
91
- },
92
- drain: u.drain,
93
- async prime() {
94
- await u.prime(a);
95
- },
96
- run: p,
97
- get stats() {
98
- return u.stats(c.size);
99
- },
100
- get status() {
101
- return u.status();
102
- },
103
- [Symbol.asyncDispose]: () => u.drain({}),
104
- [Symbol.dispose]: u.dispose
105
- };
106
- }
107
- async function* o(e, t, n = {}) {
108
- let r = new AbortController(), i = () => r.abort(n.signal?.reason);
109
- n.signal?.addEventListener("abort", i, { once: !0 });
110
- let a = t.map((t) => e.run(t, {
111
- ...n,
112
- signal: r.signal
113
- }));
114
- try {
115
- for (let e of a) yield await e;
116
- } catch (e) {
117
- throw r.abort(e), await Promise.allSettled(a), e;
118
- } finally {
119
- n.signal?.removeEventListener("abort", i), r.abort(), await Promise.allSettled(a);
120
- }
121
- }
122
- function s(e, t = void 0, n = {}) {
123
- let r = new AbortController(), i = /* @__PURE__ */ new Set(), a = 0;
124
- return n.signal?.addEventListener("abort", () => r.abort(n.signal?.reason), { once: !0 }), {
125
- abort(e) {
126
- r.abort(e);
127
- },
128
- async drain() {
129
- return Promise.allSettled([...i]);
130
- },
131
- get name() {
132
- return t;
133
- },
134
- get pending() {
135
- return i.size;
136
- },
137
- run(t, n = {}) {
138
- let o = e.run(t, {
139
- ...n,
140
- signal: r.signal
141
- });
142
- return a += 1, i.add(o), o.finally(() => i.delete(o)), o;
143
- },
144
- get size() {
145
- return a;
146
- }
147
- };
148
- }
149
- //#endregion
150
- export { o as batch, a as createPool, s as createTaskGroup };
151
-
1
+ import{FamiliarRuntimeError as e,FamiliarTerminatedError as t}from"./errors.js";import{createPoolCore as n,validatePriority as r,validateTimeout as i}from"./_pool-core.js";import{abortError as a}from"@vielzeug/arsenal";function createPool(e,o){let s=n(e,o);for(let t of e)t.notify=e=>s.emitTap({error:e,type:`worker-error`});function run(e,n={}){let c,l,u;try{c=r(n.priority??0),l=i(n.timeout)??o.defaultTimeout,u=[...n.transferables??[]]}catch(e){return Promise.reject(e)}return s.acquire({priority:c,signal:n.signal},r=>{s.trackActive(1);let onAbort=()=>r.cancel(a(n.signal));n.signal?.addEventListener(`abort`,onAbort,{once:!0});let finish=async()=>{try{let t=await r.run(e,u,l);return s.trackCompleted(),t}catch(e){throw!n.signal?.aborted&&!(e instanceof t)&&s.trackFailed(),e}finally{n.signal?.removeEventListener(`abort`,onAbort),s.trackActive(-1),s.release(r),s.settleIdle()}};return finish()})}return{get disposalSignal(){return s.disposalSignal},dispose:s.dispose,get disposed(){return s.disposed},drain:s.drain,run,get stats(){return s.stats()},get status(){return s.status()},tap:s.tap,[Symbol.asyncDispose]:()=>s.drain({}),[Symbol.dispose]:s.dispose}}function runBatch(n,r,i={}){let o,iterate=async function*(e){let t=[],onAbort=()=>e.abort(i.signal?.reason);i.signal?.aborted?e.abort(i.signal.reason):i.signal?.addEventListener(`abort`,onAbort,{once:!0});try{for(let[a,o]of r.entries()){let r=n.run(o,{priority:i.priority,signal:e.signal,timeout:i.timeout,transferables:i.getTransferables?.(o,a)}).catch(t=>{throw e.abort(t),t});r.catch(()=>void 0),t.push(r)}if(t.length===0&&e.signal.aborted)throw a(e.signal);for(let n of t){if(e.signal.aborted)throw a(e.signal);let t=await n;if(e.signal.aborted)throw a(e.signal);yield t}}catch(t){throw e.abort(t),t}finally{i.signal?.removeEventListener(`abort`,onAbort),e.abort(new DOMException(`Batch consumer stopped`,`AbortError`)),await Promise.allSettled(t)}};return{[Symbol.asyncIterator](){let n={},r=new AbortController,i,start=()=>{if(o??=n,o===n)return i??=iterate(r),i};return{next:()=>start()?.next()??Promise.reject(new e(`Worker batches can only be consumed once`)),return:async e=>!o||o!==n?{done:!0,value:e}:(r.abort(new t(`Batch consumer stopped`)),i?.return(e)??{done:!0,value:e}),throw:async t=>{let n=start();if(!n)throw new e(`Worker batches can only be consumed once`);return r.abort(t),n.throw(t)}}}}}export{createPool,runBatch};
152
2
  //# sourceMappingURL=_pool.js.map
package/dist/_pool.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_pool.js","names":[],"sources":["../src/_pool.ts"],"sourcesContent":["import { abortError } from '@vielzeug/arsenal/async';\nimport { createPoolCore, type PoolCore, type PoolOptions } from './_pool-core';\nimport { type QueueItem, TaskQueue } from './_queue';\nimport { FamiliarQueueFullError, FamiliarTerminatedError } from './errors';\nimport type { RunOptions, SlotStrategy, TaskGroup, TaskGroupOptions, WorkerPool } from './types';\n\nexport type { PoolOptions } from './_pool-core';\n\nexport function createPool<TInput, TOutput>(\n slots: SlotStrategy<TInput, TOutput>[],\n options: PoolOptions,\n): WorkerPool<TInput, TOutput> {\n const freeSlots = [...slots];\n const queue = new TaskQueue<TInput, TOutput>();\n let draining = false;\n\n const isIdle = (): boolean => freeSlots.length === slots.length && queue.size === 0;\n\n const core: PoolCore = createPoolCore({\n isIdle,\n onDispose() {\n for (const slot of slots) slot.terminate();\n\n while (queue.size > 0) {\n const item = queue.shift();\n\n if (!item) break;\n\n item.cleanupAbort?.();\n item.reject(new FamiliarTerminatedError());\n }\n },\n onDrainStart() {\n // No pending waiters to reject for the queue-based pool; capacity waiters\n // are rejected by the core's drain().\n },\n });\n\n function nextItem(): QueueItem<TInput, TOutput> | undefined {\n while (queue.size > 0) {\n const item = queue.shift();\n\n if (!item) break;\n\n if (item.signal?.aborted) {\n item.cleanupAbort?.();\n item.reject(abortError(item.signal));\n core.releaseCapacity();\n continue;\n }\n\n return item;\n }\n\n core.settleIdle();\n\n return undefined;\n }\n\n function drainQueue(): void {\n if (draining || core.disposed) return;\n\n draining = true;\n\n while (!core.disposed && freeSlots.length > 0 && queue.size > 0) {\n const next = nextItem();\n\n if (!next) break;\n\n const item = next;\n const slot = freeSlots.pop()!;\n const timeout = item.timeout ?? options.defaultTimeout;\n\n core.trackActive(1);\n core.releaseCapacity();\n\n const onAbort = () => slot.cancel(abortError(item.signal!));\n\n item.cleanupAbort = () => {\n item.signal?.removeEventListener('abort', onAbort);\n item.cleanupAbort = undefined;\n };\n item.signal?.addEventListener('abort', onAbort, { once: true });\n\n slot.run(item.input, item.transferables, timeout).then(\n (value) => finish(value),\n (error: unknown) => fail(error),\n );\n\n function finish(value: TOutput): void {\n item.cleanupAbort?.();\n freeSlots.push(slot);\n core.trackActive(-1);\n core.trackCompleted();\n item.resolve(value);\n drainQueue();\n core.settleIdle();\n }\n\n function fail(error: unknown): void {\n item.cleanupAbort?.();\n freeSlots.push(slot);\n core.trackActive(-1);\n\n if (!(error instanceof FamiliarTerminatedError) && error instanceof Error && error.name !== 'AbortError')\n core.trackFailed();\n\n item.reject(error);\n drainQueue();\n core.settleIdle();\n }\n }\n\n draining = false;\n }\n\n async function run(input: TInput, runOptions: RunOptions = {}): Promise<TOutput> {\n const { priority = 0, signal, timeout, transferables = [] } = runOptions;\n\n if (core.disposed) throw new FamiliarTerminatedError();\n\n if (core.drainPromise) throw new FamiliarTerminatedError('Worker is draining');\n\n if (signal?.aborted) throw abortError(signal);\n\n while (options.onFull === 'wait' && options.maxQueue !== undefined && queue.size >= options.maxQueue) {\n await core.waitForCapacity(signal);\n\n if (core.disposed) throw new FamiliarTerminatedError();\n\n if (core.drainPromise) throw new FamiliarTerminatedError('Worker is draining');\n\n if (signal?.aborted) throw abortError(signal);\n }\n\n let resolve!: (value: TOutput) => void;\n let reject!: (reason: unknown) => void;\n const promise = new Promise<TOutput>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const item: QueueItem<TInput, TOutput> = { input, priority, reject, resolve, signal, timeout, transferables };\n\n if (!queue.enqueue(item, options.onFull === 'wait' ? undefined : options.maxQueue)) {\n throw new FamiliarQueueFullError(options.maxQueue!);\n }\n\n if (signal) {\n const onAbort = () => {\n if (!queue.remove(item)) return;\n\n item.cleanupAbort?.();\n reject(abortError(signal));\n core.releaseCapacity();\n core.settleIdle();\n };\n\n item.cleanupAbort = () => {\n signal.removeEventListener('abort', onAbort);\n item.cleanupAbort = undefined;\n };\n signal.addEventListener('abort', onAbort, { once: true });\n }\n\n drainQueue();\n\n return promise;\n }\n\n return {\n get disposalSignal() {\n return core.disposalSignal;\n },\n dispose: core.dispose,\n get disposed() {\n return core.disposed;\n },\n drain: core.drain,\n async prime(): Promise<void> {\n await core.prime(slots);\n },\n run,\n get stats() {\n return core.stats(queue.size);\n },\n get status() {\n return core.status();\n },\n [Symbol.asyncDispose]: () => core.drain({}),\n [Symbol.dispose]: core.dispose,\n };\n}\n\nexport async function* batch<TInput, TOutput>(\n pool: WorkerPool<TInput, TOutput>,\n inputs: readonly TInput[],\n options: RunOptions = {},\n): AsyncIterable<TOutput> {\n const controller = new AbortController();\n const onAbort = () => controller.abort(options.signal?.reason);\n\n options.signal?.addEventListener('abort', onAbort, { once: true });\n\n const tasks = inputs.map((input) => pool.run(input, { ...options, signal: controller.signal }));\n\n try {\n for (const task of tasks) yield await task;\n } catch (error) {\n controller.abort(error);\n await Promise.allSettled(tasks);\n throw error;\n } finally {\n options.signal?.removeEventListener('abort', onAbort);\n controller.abort();\n await Promise.allSettled(tasks);\n }\n}\n\nexport function createTaskGroup<TInput, TOutput>(\n pool: WorkerPool<TInput, TOutput>,\n name: string | undefined = undefined,\n options: TaskGroupOptions = {},\n): TaskGroup<TInput, TOutput> {\n const controller = new AbortController();\n const tasks = new Set<Promise<TOutput>>();\n let size = 0;\n const onAbort = () => controller.abort(options.signal?.reason);\n\n options.signal?.addEventListener('abort', onAbort, { once: true });\n\n return {\n abort(reason?: unknown): void {\n controller.abort(reason);\n },\n async drain(): Promise<PromiseSettledResult<TOutput>[]> {\n return Promise.allSettled([...tasks]);\n },\n get name() {\n return name;\n },\n get pending() {\n return tasks.size;\n },\n run(input, runOptions = {}): Promise<TOutput> {\n const task = pool.run(input, { ...runOptions, signal: controller.signal });\n\n size += 1;\n tasks.add(task);\n void task.finally(() => tasks.delete(task));\n\n return task;\n },\n get size() {\n return size;\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_pool.js","names":[],"sources":["../src/_pool.ts"],"sourcesContent":["import { abortError } from '@vielzeug/arsenal';\nimport { createPoolCore, type PoolCore, type PoolOptions, validatePriority, validateTimeout } from './_pool-core.js';\nimport { FamiliarRuntimeError, FamiliarTerminatedError } from './errors.js';\nimport type { RunOptions, SlotStrategy, WorkerPool } from './types.js';\n\nexport type { PoolOptions } from './_pool-core.js';\n\nexport function createPool<TInput, TOutput>(\n slots: readonly SlotStrategy<TInput, TOutput>[],\n options: PoolOptions,\n): WorkerPool<TInput, TOutput> {\n const core: PoolCore<SlotStrategy<TInput, TOutput>> = createPoolCore(slots, options);\n\n for (const slot of slots) slot.notify = (error) => core.emitTap({ error, type: 'worker-error' });\n\n function run(input: TInput, runOptions: RunOptions = {}): Promise<TOutput> {\n let priority: number;\n let timeout: number | undefined;\n let transferables: Transferable[];\n\n try {\n priority = validatePriority(runOptions.priority ?? 0);\n timeout = validateTimeout(runOptions.timeout) ?? options.defaultTimeout;\n transferables = [...(runOptions.transferables ?? [])];\n } catch (error) {\n return Promise.reject(error);\n }\n\n return core.acquire({ priority, signal: runOptions.signal }, (slot) => {\n core.trackActive(1);\n\n const onAbort = () => slot.cancel(abortError(runOptions.signal!));\n runOptions.signal?.addEventListener('abort', onAbort, { once: true });\n\n const finish = async (): Promise<TOutput> => {\n try {\n const value = await slot.run(input, transferables, timeout);\n\n core.trackCompleted();\n\n return value;\n } catch (error) {\n if (!runOptions.signal?.aborted && !(error instanceof FamiliarTerminatedError)) core.trackFailed();\n\n throw error;\n } finally {\n runOptions.signal?.removeEventListener('abort', onAbort);\n core.trackActive(-1);\n core.release(slot);\n core.settleIdle();\n }\n };\n\n return finish();\n });\n }\n\n return {\n get disposalSignal() {\n return core.disposalSignal;\n },\n dispose: core.dispose,\n get disposed() {\n return core.disposed;\n },\n drain: core.drain,\n run,\n get stats() {\n return core.stats();\n },\n get status() {\n return core.status();\n },\n tap: core.tap,\n [Symbol.asyncDispose]: () => core.drain({}),\n [Symbol.dispose]: core.dispose,\n };\n}\n\nexport type BatchOptions<TInput> = Pick<RunOptions, 'priority' | 'signal' | 'timeout'> & {\n getTransferables?: (input: TInput, index: number) => readonly Transferable[];\n};\n\n/** Run related tasks concurrently and yield their results in input order. */\nexport function runBatch<TInput, TOutput>(\n pool: WorkerPool<TInput, TOutput>,\n inputs: readonly TInput[],\n options: BatchOptions<TInput> = {},\n): AsyncIterable<TOutput> {\n let owner: object | undefined;\n\n const iterate = async function* (controller: AbortController): AsyncGenerator<TOutput> {\n const tasks: Promise<TOutput>[] = [];\n const onAbort = () => controller.abort(options.signal?.reason);\n\n if (options.signal?.aborted) controller.abort(options.signal.reason);\n else options.signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n for (const [index, input] of inputs.entries()) {\n const task = pool\n .run(input, {\n priority: options.priority,\n signal: controller.signal,\n timeout: options.timeout,\n transferables: options.getTransferables?.(input, index),\n })\n .catch((error: unknown) => {\n controller.abort(error);\n throw error;\n });\n\n void task.catch(() => undefined);\n tasks.push(task);\n }\n\n if (tasks.length === 0 && controller.signal.aborted) throw abortError(controller.signal);\n for (const task of tasks) {\n if (controller.signal.aborted) throw abortError(controller.signal);\n const value = await task;\n if (controller.signal.aborted) throw abortError(controller.signal);\n yield value;\n }\n } catch (error) {\n controller.abort(error);\n throw error;\n } finally {\n options.signal?.removeEventListener('abort', onAbort);\n controller.abort(new DOMException('Batch consumer stopped', 'AbortError'));\n await Promise.allSettled(tasks);\n }\n };\n\n return {\n [Symbol.asyncIterator]() {\n const token = {};\n const controller = new AbortController();\n let iterator: AsyncGenerator<TOutput> | undefined;\n const start = (): AsyncGenerator<TOutput> | undefined => {\n owner ??= token;\n if (owner !== token) return undefined;\n iterator ??= iterate(controller);\n return iterator;\n };\n\n return {\n next: () =>\n start()?.next() ?? Promise.reject(new FamiliarRuntimeError('Worker batches can only be consumed once')),\n return: async (value?: unknown) => {\n if (!owner || owner !== token) return { done: true, value: value as TOutput };\n controller.abort(new FamiliarTerminatedError('Batch consumer stopped'));\n return iterator?.return(value as TOutput) ?? { done: true, value: value as TOutput };\n },\n throw: async (error?: unknown) => {\n const active = start();\n if (!active) throw new FamiliarRuntimeError('Worker batches can only be consumed once');\n controller.abort(error);\n return active.throw(error);\n },\n };\n },\n };\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("./errors.cjs"),t=require("./_pool-core.cjs");let n=require("@vielzeug/arsenal/async");function r(r,i){let a=[...r],o=[],s=0,c=t.createPoolCore({isIdle:()=>a.length===r.length&&o.length===0,onDispose(){for(let e of r)e.terminate();for(let t of o.splice(0))t.reject(new e.FamiliarTerminatedError)},onDrainStart(){for(let t of o.splice(0))t.reject(new e.FamiliarTerminatedError(`Worker is draining`))}});function l(e){let t=o.shift();t?(t.resolve(e),c.releaseCapacity()):a.push(e)}async function u(t){if(c.disposed)throw new e.FamiliarTerminatedError;if(c.drainPromise)throw new e.FamiliarTerminatedError(`Worker is draining`);if(t.signal?.aborted)throw(0,n.abortError)(t.signal);for(;i.maxQueue!==void 0&&o.length>=i.maxQueue;){if(i.onFull===`reject`)throw new e.FamiliarQueueFullError(i.maxQueue);if(await c.waitForCapacity(t.signal),c.disposed)throw new e.FamiliarTerminatedError;if(c.drainPromise)throw new e.FamiliarTerminatedError(`Worker is draining`);if(t.signal?.aborted)throw(0,n.abortError)(t.signal)}return a.pop()||new Promise((e,r)=>{let i={cleanup(){i.signal?.removeEventListener(`abort`,a)},priority:t.priority??0,reject(e){i.cleanup();let t=o.indexOf(i);t!==-1&&(o.splice(t,1),c.releaseCapacity()),r(e),c.settleIdle()},resolve(t){i.cleanup(),e(t)},sequence:s++,signal:t.signal},a=()=>i.reject((0,n.abortError)(i.signal));i.signal?.addEventListener(`abort`,a,{once:!0}),o.push(i),o.sort((e,t)=>t.priority-e.priority||e.sequence-t.sequence)})}return{get disposalSignal(){return c.disposalSignal},dispose:c.dispose,get disposed(){return c.disposed},drain:c.drain,async prime(){await c.prime(r)},runStream(t,r={}){let a=new AbortController,o=()=>a.abort(r.signal?.reason);return r.signal?.addEventListener(`abort`,o,{once:!0}),{[Symbol.asyncIterator]:async function*(){let s,d;try{s=await u({...r,signal:a.signal}),c.trackActive(1),d=()=>s?.cancel((0,n.abortError)(a.signal)),a.signal.addEventListener(`abort`,d,{once:!0});let e=s.stream(t,{...r,signal:a.signal,timeout:r.timeout??i.defaultTimeout});for await(let t of e.iterable)yield t;await e.done,c.trackCompleted()}catch(t){throw t instanceof Error&&t.name!==`AbortError`&&!(t instanceof e.FamiliarTerminatedError)&&c.trackFailed(),t}finally{r.signal?.removeEventListener(`abort`,o),s&&(d&&a.signal.removeEventListener(`abort`,d),c.trackActive(-1),l(s),c.settleIdle())}}}},get stats(){return c.stats(o.length)},get status(){return c.status()},[Symbol.asyncDispose]:()=>c.drain({}),[Symbol.dispose]:c.dispose}}exports.createStreamPool=r;
1
+ const e=require("./errors.cjs"),t=require("./_pool-core.cjs");let n=require("@vielzeug/arsenal");function createStreamPool(r,i){let a=t.createPoolCore(r,i);for(let e of r)e.notify=e=>a.emitTap({error:e,type:`worker-error`});function runStream(r,o={}){let s=t.validatePriority(o.priority??0),c=t.validateTimeout(o.timeout)??i.defaultTimeout,l=[...o.transferables??[]],u,iterate=async function*(t){let onAbort=()=>t.abort(o.signal?.reason),i,onCancel;o.signal?.aborted?t.abort(o.signal.reason):o.signal?.addEventListener(`abort`,onAbort,{once:!0});try{let e=await a.acquire({priority:s,signal:t.signal},e=>(i=e,a.trackActive(1),onCancel=()=>i?.cancel((0,n.abortError)(t.signal)),t.signal.addEventListener(`abort`,onCancel,{once:!0}),e.stream(r,{priority:s,signal:t.signal,timeout:c,transferables:l})));for await(let t of e.iterable)yield t;await e.done,a.trackCompleted()}catch(n){throw i&&!t.signal.aborted&&!(n instanceof e.FamiliarTerminatedError)&&a.trackFailed(),n}finally{o.signal?.removeEventListener(`abort`,onAbort),i&&(onCancel&&t.signal.removeEventListener(`abort`,onCancel),a.trackActive(-1),a.release(i),a.settleIdle())}};return{[Symbol.asyncIterator](){let t={},n=new AbortController,r,start=()=>{if(u??=t,u===t)return r??=iterate(n),r};return{next:()=>start()?.next()??Promise.reject(new e.FamiliarRuntimeError(`Worker streams can only be consumed once`)),return:async i=>!u||u!==t?{done:!0,value:i}:(n.abort(new e.FamiliarTerminatedError(`Stream consumer stopped`)),r?.return(i)??{done:!0,value:i}),throw:async t=>{let r=start();if(!r)throw new e.FamiliarRuntimeError(`Worker streams can only be consumed once`);return n.abort(t),r.throw(t)}}}}}return{get disposalSignal(){return a.disposalSignal},dispose:a.dispose,get disposed(){return a.disposed},drain:a.drain,runStream,get stats(){return a.stats()},get status(){return a.status()},tap:a.tap,[Symbol.asyncDispose]:()=>a.drain({}),[Symbol.dispose]:a.dispose}}exports.createStreamPool=createStreamPool;
2
2
  //# sourceMappingURL=_stream-pool.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_stream-pool.cjs","names":[],"sources":["../src/_stream-pool.ts"],"sourcesContent":["import { abortError } from '@vielzeug/arsenal/async';\n\nimport { createPoolCore, type PoolCore, type PoolOptions } from './_pool-core';\nimport { FamiliarQueueFullError, FamiliarTerminatedError } from './errors';\nimport type { RunOptions, StreamWorkerPool } from './types';\nimport type { RunningStream } from './worker';\n\nexport type StreamSlot<TInput, TChunk> = {\n cancel(reason: unknown): void;\n prime(): Promise<void>;\n stream(input: TInput, options: RunOptions): RunningStream<TChunk>;\n terminate(): void;\n};\n\ntype Waiter<TSlot> = {\n cleanup(): void;\n priority: number;\n reject(reason: unknown): void;\n resolve(slot: TSlot): void;\n sequence: number;\n signal?: AbortSignal;\n};\n\nexport function createStreamPool<TInput, TChunk>(\n slots: StreamSlot<TInput, TChunk>[],\n options: PoolOptions,\n): StreamWorkerPool<TInput, TChunk> {\n const freeSlots = [...slots];\n const waiters: Waiter<StreamSlot<TInput, TChunk>>[] = [];\n let sequence = 0;\n\n const isIdle = (): boolean => freeSlots.length === slots.length && waiters.length === 0;\n\n const core: PoolCore = createPoolCore({\n isIdle,\n onDispose() {\n for (const slot of slots) slot.terminate();\n for (const waiter of waiters.splice(0)) waiter.reject(new FamiliarTerminatedError());\n },\n onDrainStart() {\n for (const waiter of waiters.splice(0)) waiter.reject(new FamiliarTerminatedError('Worker is draining'));\n },\n });\n\n function release(slot: StreamSlot<TInput, TChunk>): void {\n const next = waiters.shift();\n\n if (next) {\n next.resolve(slot);\n core.releaseCapacity();\n } else {\n freeSlots.push(slot);\n }\n }\n\n async function acquire(runOptions: RunOptions): Promise<StreamSlot<TInput, TChunk>> {\n if (core.disposed) throw new FamiliarTerminatedError();\n\n if (core.drainPromise) throw new FamiliarTerminatedError('Worker is draining');\n\n if (runOptions.signal?.aborted) throw abortError(runOptions.signal);\n\n while (options.maxQueue !== undefined && waiters.length >= options.maxQueue) {\n if (options.onFull === 'reject') throw new FamiliarQueueFullError(options.maxQueue);\n\n await core.waitForCapacity(runOptions.signal);\n\n if (core.disposed) throw new FamiliarTerminatedError();\n\n if (core.drainPromise) throw new FamiliarTerminatedError('Worker is draining');\n\n if (runOptions.signal?.aborted) throw abortError(runOptions.signal);\n }\n\n const free = freeSlots.pop();\n\n if (free) return free;\n\n return new Promise<StreamSlot<TInput, TChunk>>((resolve, reject) => {\n const waiter: Waiter<StreamSlot<TInput, TChunk>> = {\n cleanup() {\n waiter.signal?.removeEventListener('abort', onAbort);\n },\n priority: runOptions.priority ?? 0,\n reject(reason) {\n waiter.cleanup();\n\n const index = waiters.indexOf(waiter);\n\n if (index !== -1) {\n waiters.splice(index, 1);\n core.releaseCapacity();\n }\n\n reject(reason);\n core.settleIdle();\n },\n resolve(slot) {\n waiter.cleanup();\n resolve(slot);\n },\n sequence: sequence++,\n signal: runOptions.signal,\n };\n const onAbort = () => waiter.reject(abortError(waiter.signal!));\n\n waiter.signal?.addEventListener('abort', onAbort, { once: true });\n waiters.push(waiter);\n waiters.sort((a, b) => b.priority - a.priority || a.sequence - b.sequence);\n });\n }\n\n return {\n get disposalSignal() {\n return core.disposalSignal;\n },\n dispose: core.dispose,\n get disposed() {\n return core.disposed;\n },\n drain: core.drain,\n async prime(): Promise<void> {\n await core.prime(slots);\n },\n runStream(input, runOptions = {}): AsyncIterable<TChunk> {\n const controller = new AbortController();\n const onAbort = () => controller.abort(runOptions.signal?.reason);\n\n runOptions.signal?.addEventListener('abort', onAbort, { once: true });\n\n return {\n [Symbol.asyncIterator]: async function* () {\n let slot: StreamSlot<TInput, TChunk> | undefined;\n let onCancel: (() => void) | undefined;\n\n try {\n slot = await acquire({ ...runOptions, signal: controller.signal });\n core.trackActive(1);\n onCancel = () => slot?.cancel(abortError(controller.signal));\n controller.signal.addEventListener('abort', onCancel, { once: true });\n\n const running = slot.stream(input, {\n ...runOptions,\n signal: controller.signal,\n timeout: runOptions.timeout ?? options.defaultTimeout,\n });\n\n for await (const value of running.iterable) yield value;\n await running.done;\n core.trackCompleted();\n } catch (error) {\n if (error instanceof Error && error.name !== 'AbortError' && !(error instanceof FamiliarTerminatedError))\n core.trackFailed();\n\n throw error;\n } finally {\n runOptions.signal?.removeEventListener('abort', onAbort);\n\n if (slot) {\n if (onCancel) controller.signal.removeEventListener('abort', onCancel);\n\n core.trackActive(-1);\n release(slot);\n core.settleIdle();\n }\n }\n },\n };\n },\n get stats() {\n return core.stats(waiters.length);\n },\n get status() {\n return core.status();\n },\n [Symbol.asyncDispose]: () => core.drain({}),\n [Symbol.dispose]: core.dispose,\n };\n}\n"],"mappings":"uGAuBA,SAAgB,EACd,EACA,EACkC,CAClC,IAAM,EAAY,CAAC,GAAG,CAAK,EACrB,EAAgD,CAAC,EACnD,EAAW,EAIT,EAAiB,EAAA,eAAe,CACpC,WAH4B,EAAU,SAAW,EAAM,QAAU,EAAQ,SAAW,EAIpF,WAAY,CACV,IAAK,IAAM,KAAQ,EAAO,EAAK,UAAU,EACzC,IAAK,IAAM,KAAU,EAAQ,OAAO,CAAC,EAAG,EAAO,OAAO,IAAI,EAAA,uBAAyB,CACrF,EACA,cAAe,CACb,IAAK,IAAM,KAAU,EAAQ,OAAO,CAAC,EAAG,EAAO,OAAO,IAAI,EAAA,wBAAwB,oBAAoB,CAAC,CACzG,CACF,CAAC,EAED,SAAS,EAAQ,EAAwC,CACvD,IAAM,EAAO,EAAQ,MAAM,EAEvB,GACF,EAAK,QAAQ,CAAI,EACjB,EAAK,gBAAgB,GAErB,EAAU,KAAK,CAAI,CAEvB,CAEA,eAAe,EAAQ,EAA6D,CAClF,GAAI,EAAK,SAAU,MAAM,IAAI,EAAA,wBAE7B,GAAI,EAAK,aAAc,MAAM,IAAI,EAAA,wBAAwB,oBAAoB,EAE7E,GAAI,EAAW,QAAQ,QAAS,MAAA,EAAM,EAAA,WAAA,CAAW,EAAW,MAAM,EAElE,KAAO,EAAQ,WAAa,IAAA,IAAa,EAAQ,QAAU,EAAQ,UAAU,CAC3E,GAAI,EAAQ,SAAW,SAAU,MAAM,IAAI,EAAA,uBAAuB,EAAQ,QAAQ,EAIlF,GAFA,MAAM,EAAK,gBAAgB,EAAW,MAAM,EAExC,EAAK,SAAU,MAAM,IAAI,EAAA,wBAE7B,GAAI,EAAK,aAAc,MAAM,IAAI,EAAA,wBAAwB,oBAAoB,EAE7E,GAAI,EAAW,QAAQ,QAAS,MAAA,EAAM,EAAA,WAAA,CAAW,EAAW,MAAM,CACpE,CAMA,OAJa,EAAU,IAEnB,GAEG,IAAI,SAAqC,EAAS,IAAW,CAClE,IAAM,EAA6C,CACjD,SAAU,CACR,EAAO,QAAQ,oBAAoB,QAAS,CAAO,CACrD,EACA,SAAU,EAAW,UAAY,EACjC,OAAO,EAAQ,CACb,EAAO,QAAQ,EAEf,IAAM,EAAQ,EAAQ,QAAQ,CAAM,EAEhC,IAAU,KACZ,EAAQ,OAAO,EAAO,CAAC,EACvB,EAAK,gBAAgB,GAGvB,EAAO,CAAM,EACb,EAAK,WAAW,CAClB,EACA,QAAQ,EAAM,CACZ,EAAO,QAAQ,EACf,EAAQ,CAAI,CACd,EACA,SAAU,IACV,OAAQ,EAAW,MACrB,EACM,MAAgB,EAAO,QAAA,EAAO,EAAA,WAAA,CAAW,EAAO,MAAO,CAAC,EAE9D,EAAO,QAAQ,iBAAiB,QAAS,EAAS,CAAE,KAAM,EAAK,CAAC,EAChE,EAAQ,KAAK,CAAM,EACnB,EAAQ,MAAM,EAAG,IAAM,EAAE,SAAW,EAAE,UAAY,EAAE,SAAW,EAAE,QAAQ,CAC3E,CAAC,CACH,CAEA,MAAO,CACL,IAAI,gBAAiB,CACnB,OAAO,EAAK,cACd,EACA,QAAS,EAAK,QACd,IAAI,UAAW,CACb,OAAO,EAAK,QACd,EACA,MAAO,EAAK,MACZ,MAAM,OAAuB,CAC3B,MAAM,EAAK,MAAM,CAAK,CACxB,EACA,UAAU,EAAO,EAAa,CAAC,EAA0B,CACvD,IAAM,EAAa,IAAI,gBACjB,MAAgB,EAAW,MAAM,EAAW,QAAQ,MAAM,EAIhE,OAFA,EAAW,QAAQ,iBAAiB,QAAS,EAAS,CAAE,KAAM,EAAK,CAAC,EAE7D,CACL,CAAC,OAAO,eAAgB,iBAAmB,CACzC,IAAI,EACA,EAEJ,GAAI,CACF,EAAO,MAAM,EAAQ,CAAE,GAAG,EAAY,OAAQ,EAAW,MAAO,CAAC,EACjE,EAAK,YAAY,CAAC,EAClB,MAAiB,GAAM,QAAA,EAAO,EAAA,WAAA,CAAW,EAAW,MAAM,CAAC,EAC3D,EAAW,OAAO,iBAAiB,QAAS,EAAU,CAAE,KAAM,EAAK,CAAC,EAEpE,IAAM,EAAU,EAAK,OAAO,EAAO,CACjC,GAAG,EACH,OAAQ,EAAW,OACnB,QAAS,EAAW,SAAW,EAAQ,cACzC,CAAC,EAED,UAAW,IAAM,KAAS,EAAQ,SAAU,MAAM,EAClD,MAAM,EAAQ,KACd,EAAK,eAAe,CACtB,OAAS,EAAO,CAId,MAHI,aAAiB,OAAS,EAAM,OAAS,cAAgB,EAAE,aAAiB,EAAA,0BAC9E,EAAK,YAAY,EAEb,CACR,QAAU,CACR,EAAW,QAAQ,oBAAoB,QAAS,CAAO,EAEnD,IACE,GAAU,EAAW,OAAO,oBAAoB,QAAS,CAAQ,EAErE,EAAK,YAAY,EAAE,EACnB,EAAQ,CAAI,EACZ,EAAK,WAAW,EAEpB,CACF,CACF,CACF,EACA,IAAI,OAAQ,CACV,OAAO,EAAK,MAAM,EAAQ,MAAM,CAClC,EACA,IAAI,QAAS,CACX,OAAO,EAAK,OAAO,CACrB,GACC,OAAO,kBAAqB,EAAK,MAAM,CAAC,CAAC,GACzC,OAAO,SAAU,EAAK,OACzB,CACF"}
1
+ {"version":3,"file":"_stream-pool.cjs","names":[],"sources":["../src/_stream-pool.ts"],"sourcesContent":["import { abortError } from '@vielzeug/arsenal';\nimport { createPoolCore, type PoolCore, type PoolOptions, validatePriority, validateTimeout } from './_pool-core.js';\nimport { FamiliarRuntimeError, FamiliarTerminatedError } from './errors.js';\nimport type { RunOptions, StreamWorkerPool } from './types.js';\n\nexport type StreamSlot<TInput, TChunk> = {\n cancel(reason: unknown): void;\n /** Wired by the pool factory to report unhandled worker runtime errors through `tap()`. */\n notify?(error: FamiliarRuntimeError): void;\n stream(input: TInput, options: RunOptions): { done: Promise<void>; iterable: AsyncIterable<TChunk> };\n terminate(): void;\n};\n\nexport function createStreamPool<TInput, TChunk>(\n slots: readonly StreamSlot<TInput, TChunk>[],\n options: PoolOptions,\n): StreamWorkerPool<TInput, TChunk> {\n const core: PoolCore<StreamSlot<TInput, TChunk>> = createPoolCore(slots, options);\n\n for (const slot of slots) slot.notify = (error) => core.emitTap({ error, type: 'worker-error' });\n\n function runStream(input: TInput, runOptions: RunOptions = {}): AsyncIterable<TChunk> {\n const priority = validatePriority(runOptions.priority ?? 0);\n const timeout = validateTimeout(runOptions.timeout) ?? options.defaultTimeout;\n const transferables = [...(runOptions.transferables ?? [])];\n let owner: object | undefined;\n\n const iterate = async function* (controller: AbortController): AsyncGenerator<TChunk> {\n const onAbort = () => controller.abort(runOptions.signal?.reason);\n let slot: StreamSlot<TInput, TChunk> | undefined;\n let onCancel: (() => void) | undefined;\n\n if (runOptions.signal?.aborted) controller.abort(runOptions.signal.reason);\n else runOptions.signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n const running = await core.acquire({ priority, signal: controller.signal }, (acquired) => {\n slot = acquired;\n core.trackActive(1);\n onCancel = () => slot?.cancel(abortError(controller.signal));\n controller.signal.addEventListener('abort', onCancel, { once: true });\n\n return acquired.stream(input, { priority, signal: controller.signal, timeout, transferables });\n });\n\n for await (const value of running.iterable) yield value;\n await running.done;\n core.trackCompleted();\n } catch (error) {\n if (slot && !controller.signal.aborted && !(error instanceof FamiliarTerminatedError)) core.trackFailed();\n throw error;\n } finally {\n runOptions.signal?.removeEventListener('abort', onAbort);\n\n if (slot) {\n if (onCancel) controller.signal.removeEventListener('abort', onCancel);\n\n core.trackActive(-1);\n core.release(slot);\n core.settleIdle();\n }\n }\n };\n\n return {\n [Symbol.asyncIterator]() {\n const token = {};\n const controller = new AbortController();\n let iterator: AsyncGenerator<TChunk> | undefined;\n const start = (): AsyncGenerator<TChunk> | undefined => {\n owner ??= token;\n if (owner !== token) return undefined;\n iterator ??= iterate(controller);\n return iterator;\n };\n\n return {\n next: () =>\n start()?.next() ?? Promise.reject(new FamiliarRuntimeError('Worker streams can only be consumed once')),\n return: async (value?: unknown) => {\n if (!owner || owner !== token) return { done: true, value: value as TChunk };\n controller.abort(new FamiliarTerminatedError('Stream consumer stopped'));\n return iterator?.return(value as TChunk) ?? { done: true, value: value as TChunk };\n },\n throw: async (error?: unknown) => {\n const active = start();\n if (!active) throw new FamiliarRuntimeError('Worker streams can only be consumed once');\n controller.abort(error);\n return active.throw(error);\n },\n };\n },\n };\n }\n\n return {\n get disposalSignal() {\n return core.disposalSignal;\n },\n dispose: core.dispose,\n get disposed() {\n return core.disposed;\n },\n drain: core.drain,\n runStream,\n get stats() {\n return core.stats();\n },\n get status() {\n return core.status();\n },\n tap: core.tap,\n [Symbol.asyncDispose]: () => core.drain({}),\n [Symbol.dispose]: core.dispose,\n };\n}\n"],"mappings":"iGAaA,SAAgB,iBACd,EACA,EACkC,CAClC,IAAM,EAA6C,EAAA,eAAe,EAAO,CAAO,EAEhF,IAAK,IAAM,KAAQ,EAAO,EAAK,OAAU,GAAU,EAAK,QAAQ,CAAE,QAAO,KAAM,cAAe,CAAC,EAE/F,SAAS,UAAU,EAAe,EAAyB,CAAC,EAA0B,CACpF,IAAM,EAAW,EAAA,iBAAiB,EAAW,UAAY,CAAC,EACpD,EAAU,EAAA,gBAAgB,EAAW,OAAO,GAAK,EAAQ,eACzD,EAAgB,CAAC,GAAI,EAAW,eAAiB,CAAC,CAAE,EACtD,EAEE,QAAU,gBAAiB,EAAqD,CACpF,IAAM,YAAgB,EAAW,MAAM,EAAW,QAAQ,MAAM,EAC5D,EACA,SAEA,EAAW,QAAQ,QAAS,EAAW,MAAM,EAAW,OAAO,MAAM,EACpE,EAAW,QAAQ,iBAAiB,QAAS,QAAS,CAAE,KAAM,EAAK,CAAC,EAEzE,GAAI,CACF,IAAM,EAAU,MAAM,EAAK,QAAQ,CAAE,WAAU,OAAQ,EAAW,MAAO,EAAI,IAC3E,EAAO,EACP,EAAK,YAAY,CAAC,EAClB,aAAiB,GAAM,QAAA,EAAO,EAAA,WAAA,CAAW,EAAW,MAAM,CAAC,EAC3D,EAAW,OAAO,iBAAiB,QAAS,SAAU,CAAE,KAAM,EAAK,CAAC,EAE7D,EAAS,OAAO,EAAO,CAAE,WAAU,OAAQ,EAAW,OAAQ,UAAS,eAAc,CAAC,EAC9F,EAED,UAAW,IAAM,KAAS,EAAQ,SAAU,MAAM,EAClD,MAAM,EAAQ,KACd,EAAK,eAAe,CACtB,OAAS,EAAO,CAEd,MADI,GAAQ,CAAC,EAAW,OAAO,SAAW,EAAE,aAAiB,EAAA,0BAA0B,EAAK,YAAY,EAClG,CACR,QAAU,CACR,EAAW,QAAQ,oBAAoB,QAAS,OAAO,EAEnD,IACE,UAAU,EAAW,OAAO,oBAAoB,QAAS,QAAQ,EAErE,EAAK,YAAY,EAAE,EACnB,EAAK,QAAQ,CAAI,EACjB,EAAK,WAAW,EAEpB,CACF,EAEA,MAAO,CACL,CAAC,OAAO,gBAAiB,CACvB,IAAM,EAAQ,CAAC,EACT,EAAa,IAAI,gBACnB,EACE,UAAkD,CACtD,OAAU,EACN,IAAU,EAEd,MADA,KAAa,QAAQ,CAAU,EACxB,CACT,EAEA,MAAO,CACL,SACE,MAAM,CAAC,EAAE,KAAK,GAAK,QAAQ,OAAO,IAAI,EAAA,qBAAqB,0CAA0C,CAAC,EACxG,OAAQ,KAAO,IACT,CAAC,GAAS,IAAU,EAAc,CAAE,KAAM,GAAa,OAAgB,GAC3E,EAAW,MAAM,IAAI,EAAA,wBAAwB,yBAAyB,CAAC,EAChE,GAAU,OAAO,CAAe,GAAK,CAAE,KAAM,GAAa,OAAgB,GAEnF,MAAO,KAAO,IAAoB,CAChC,IAAM,EAAS,MAAM,EACrB,GAAI,CAAC,EAAQ,MAAM,IAAI,EAAA,qBAAqB,0CAA0C,EAEtF,OADA,EAAW,MAAM,CAAK,EACf,EAAO,MAAM,CAAK,CAC3B,CACF,CACF,CACF,CACF,CAEA,MAAO,CACL,IAAI,gBAAiB,CACnB,OAAO,EAAK,cACd,EACA,QAAS,EAAK,QACd,IAAI,UAAW,CACb,OAAO,EAAK,QACd,EACA,MAAO,EAAK,MACZ,UACA,IAAI,OAAQ,CACV,OAAO,EAAK,MAAM,CACpB,EACA,IAAI,QAAS,CACX,OAAO,EAAK,OAAO,CACrB,EACA,IAAK,EAAK,KACT,OAAO,kBAAqB,EAAK,MAAM,CAAC,CAAC,GACzC,OAAO,SAAU,EAAK,OACzB,CACF"}
@@ -1,11 +1,15 @@
1
- import { type PoolOptions } from './_pool-core';
2
- import type { RunOptions, StreamWorkerPool } from './types';
3
- import type { RunningStream } from './worker';
1
+ import { type PoolOptions } from './_pool-core.js';
2
+ import { FamiliarRuntimeError } from './errors.js';
3
+ import type { RunOptions, StreamWorkerPool } from './types.js';
4
4
  export type StreamSlot<TInput, TChunk> = {
5
5
  cancel(reason: unknown): void;
6
- prime(): Promise<void>;
7
- stream(input: TInput, options: RunOptions): RunningStream<TChunk>;
6
+ /** Wired by the pool factory to report unhandled worker runtime errors through `tap()`. */
7
+ notify?(error: FamiliarRuntimeError): void;
8
+ stream(input: TInput, options: RunOptions): {
9
+ done: Promise<void>;
10
+ iterable: AsyncIterable<TChunk>;
11
+ };
8
12
  terminate(): void;
9
13
  };
10
- export declare function createStreamPool<TInput, TChunk>(slots: StreamSlot<TInput, TChunk>[], options: PoolOptions): StreamWorkerPool<TInput, TChunk>;
14
+ export declare function createStreamPool<TInput, TChunk>(slots: readonly StreamSlot<TInput, TChunk>[], options: PoolOptions): StreamWorkerPool<TInput, TChunk>;
11
15
  //# sourceMappingURL=_stream-pool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_stream-pool.d.ts","sourceRoot":"","sources":["../src/_stream-pool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE/E,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM,IAAI;IACvC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAClE,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC;AAWF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAC7C,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EACnC,OAAO,EAAE,WAAW,GACnB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAwJlC"}
1
+ {"version":3,"file":"_stream-pool.d.ts","sourceRoot":"","sources":["../src/_stream-pool.ts"],"names":[],"mappings":"AACA,OAAO,EAAiC,KAAK,WAAW,EAAqC,MAAM,iBAAiB,CAAC;AACrH,OAAO,EAAE,oBAAoB,EAA2B,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM,IAAI;IACvC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,2FAA2F;IAC3F,MAAM,CAAC,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC3C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;IACrG,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAC7C,KAAK,EAAE,SAAS,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAC5C,OAAO,EAAE,WAAW,GACnB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAmGlC"}
@@ -1,98 +1,2 @@
1
- import { FamiliarQueueFullError as e, FamiliarTerminatedError as t } from "./errors.js";
2
- import { createPoolCore as n } from "./_pool-core.js";
3
- import { abortError as r } from "@vielzeug/arsenal/async";
4
- //#region src/_stream-pool.ts
5
- function i(i, a) {
6
- let o = [...i], s = [], c = 0, l = n({
7
- isIdle: () => o.length === i.length && s.length === 0,
8
- onDispose() {
9
- for (let e of i) e.terminate();
10
- for (let e of s.splice(0)) e.reject(new t());
11
- },
12
- onDrainStart() {
13
- for (let e of s.splice(0)) e.reject(new t("Worker is draining"));
14
- }
15
- });
16
- function u(e) {
17
- let t = s.shift();
18
- t ? (t.resolve(e), l.releaseCapacity()) : o.push(e);
19
- }
20
- async function d(n) {
21
- if (l.disposed) throw new t();
22
- if (l.drainPromise) throw new t("Worker is draining");
23
- if (n.signal?.aborted) throw r(n.signal);
24
- for (; a.maxQueue !== void 0 && s.length >= a.maxQueue;) {
25
- if (a.onFull === "reject") throw new e(a.maxQueue);
26
- if (await l.waitForCapacity(n.signal), l.disposed) throw new t();
27
- if (l.drainPromise) throw new t("Worker is draining");
28
- if (n.signal?.aborted) throw r(n.signal);
29
- }
30
- return o.pop() || new Promise((e, t) => {
31
- let i = {
32
- cleanup() {
33
- i.signal?.removeEventListener("abort", a);
34
- },
35
- priority: n.priority ?? 0,
36
- reject(e) {
37
- i.cleanup();
38
- let n = s.indexOf(i);
39
- n !== -1 && (s.splice(n, 1), l.releaseCapacity()), t(e), l.settleIdle();
40
- },
41
- resolve(t) {
42
- i.cleanup(), e(t);
43
- },
44
- sequence: c++,
45
- signal: n.signal
46
- }, a = () => i.reject(r(i.signal));
47
- i.signal?.addEventListener("abort", a, { once: !0 }), s.push(i), s.sort((e, t) => t.priority - e.priority || e.sequence - t.sequence);
48
- });
49
- }
50
- return {
51
- get disposalSignal() {
52
- return l.disposalSignal;
53
- },
54
- dispose: l.dispose,
55
- get disposed() {
56
- return l.disposed;
57
- },
58
- drain: l.drain,
59
- async prime() {
60
- await l.prime(i);
61
- },
62
- runStream(e, n = {}) {
63
- let i = new AbortController(), o = () => i.abort(n.signal?.reason);
64
- return n.signal?.addEventListener("abort", o, { once: !0 }), { [Symbol.asyncIterator]: async function* () {
65
- let s, c;
66
- try {
67
- s = await d({
68
- ...n,
69
- signal: i.signal
70
- }), l.trackActive(1), c = () => s?.cancel(r(i.signal)), i.signal.addEventListener("abort", c, { once: !0 });
71
- let t = s.stream(e, {
72
- ...n,
73
- signal: i.signal,
74
- timeout: n.timeout ?? a.defaultTimeout
75
- });
76
- for await (let e of t.iterable) yield e;
77
- await t.done, l.trackCompleted();
78
- } catch (e) {
79
- throw e instanceof Error && e.name !== "AbortError" && !(e instanceof t) && l.trackFailed(), e;
80
- } finally {
81
- n.signal?.removeEventListener("abort", o), s && (c && i.signal.removeEventListener("abort", c), l.trackActive(-1), u(s), l.settleIdle());
82
- }
83
- } };
84
- },
85
- get stats() {
86
- return l.stats(s.length);
87
- },
88
- get status() {
89
- return l.status();
90
- },
91
- [Symbol.asyncDispose]: () => l.drain({}),
92
- [Symbol.dispose]: l.dispose
93
- };
94
- }
95
- //#endregion
96
- export { i as createStreamPool };
97
-
1
+ import{FamiliarRuntimeError as e,FamiliarTerminatedError as t}from"./errors.js";import{createPoolCore as n,validatePriority as r,validateTimeout as i}from"./_pool-core.js";import{abortError as a}from"@vielzeug/arsenal";function createStreamPool(o,s){let c=n(o,s);for(let e of o)e.notify=e=>c.emitTap({error:e,type:`worker-error`});function runStream(n,o={}){let l=r(o.priority??0),u=i(o.timeout)??s.defaultTimeout,d=[...o.transferables??[]],f,iterate=async function*(e){let onAbort=()=>e.abort(o.signal?.reason),r,onCancel;o.signal?.aborted?e.abort(o.signal.reason):o.signal?.addEventListener(`abort`,onAbort,{once:!0});try{let t=await c.acquire({priority:l,signal:e.signal},t=>(r=t,c.trackActive(1),onCancel=()=>r?.cancel(a(e.signal)),e.signal.addEventListener(`abort`,onCancel,{once:!0}),t.stream(n,{priority:l,signal:e.signal,timeout:u,transferables:d})));for await(let e of t.iterable)yield e;await t.done,c.trackCompleted()}catch(n){throw r&&!e.signal.aborted&&!(n instanceof t)&&c.trackFailed(),n}finally{o.signal?.removeEventListener(`abort`,onAbort),r&&(onCancel&&e.signal.removeEventListener(`abort`,onCancel),c.trackActive(-1),c.release(r),c.settleIdle())}};return{[Symbol.asyncIterator](){let n={},r=new AbortController,i,start=()=>{if(f??=n,f===n)return i??=iterate(r),i};return{next:()=>start()?.next()??Promise.reject(new e(`Worker streams can only be consumed once`)),return:async e=>!f||f!==n?{done:!0,value:e}:(r.abort(new t(`Stream consumer stopped`)),i?.return(e)??{done:!0,value:e}),throw:async t=>{let n=start();if(!n)throw new e(`Worker streams can only be consumed once`);return r.abort(t),n.throw(t)}}}}}return{get disposalSignal(){return c.disposalSignal},dispose:c.dispose,get disposed(){return c.disposed},drain:c.drain,runStream,get stats(){return c.stats()},get status(){return c.status()},tap:c.tap,[Symbol.asyncDispose]:()=>c.drain({}),[Symbol.dispose]:c.dispose}}export{createStreamPool};
98
2
  //# sourceMappingURL=_stream-pool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_stream-pool.js","names":[],"sources":["../src/_stream-pool.ts"],"sourcesContent":["import { abortError } from '@vielzeug/arsenal/async';\n\nimport { createPoolCore, type PoolCore, type PoolOptions } from './_pool-core';\nimport { FamiliarQueueFullError, FamiliarTerminatedError } from './errors';\nimport type { RunOptions, StreamWorkerPool } from './types';\nimport type { RunningStream } from './worker';\n\nexport type StreamSlot<TInput, TChunk> = {\n cancel(reason: unknown): void;\n prime(): Promise<void>;\n stream(input: TInput, options: RunOptions): RunningStream<TChunk>;\n terminate(): void;\n};\n\ntype Waiter<TSlot> = {\n cleanup(): void;\n priority: number;\n reject(reason: unknown): void;\n resolve(slot: TSlot): void;\n sequence: number;\n signal?: AbortSignal;\n};\n\nexport function createStreamPool<TInput, TChunk>(\n slots: StreamSlot<TInput, TChunk>[],\n options: PoolOptions,\n): StreamWorkerPool<TInput, TChunk> {\n const freeSlots = [...slots];\n const waiters: Waiter<StreamSlot<TInput, TChunk>>[] = [];\n let sequence = 0;\n\n const isIdle = (): boolean => freeSlots.length === slots.length && waiters.length === 0;\n\n const core: PoolCore = createPoolCore({\n isIdle,\n onDispose() {\n for (const slot of slots) slot.terminate();\n for (const waiter of waiters.splice(0)) waiter.reject(new FamiliarTerminatedError());\n },\n onDrainStart() {\n for (const waiter of waiters.splice(0)) waiter.reject(new FamiliarTerminatedError('Worker is draining'));\n },\n });\n\n function release(slot: StreamSlot<TInput, TChunk>): void {\n const next = waiters.shift();\n\n if (next) {\n next.resolve(slot);\n core.releaseCapacity();\n } else {\n freeSlots.push(slot);\n }\n }\n\n async function acquire(runOptions: RunOptions): Promise<StreamSlot<TInput, TChunk>> {\n if (core.disposed) throw new FamiliarTerminatedError();\n\n if (core.drainPromise) throw new FamiliarTerminatedError('Worker is draining');\n\n if (runOptions.signal?.aborted) throw abortError(runOptions.signal);\n\n while (options.maxQueue !== undefined && waiters.length >= options.maxQueue) {\n if (options.onFull === 'reject') throw new FamiliarQueueFullError(options.maxQueue);\n\n await core.waitForCapacity(runOptions.signal);\n\n if (core.disposed) throw new FamiliarTerminatedError();\n\n if (core.drainPromise) throw new FamiliarTerminatedError('Worker is draining');\n\n if (runOptions.signal?.aborted) throw abortError(runOptions.signal);\n }\n\n const free = freeSlots.pop();\n\n if (free) return free;\n\n return new Promise<StreamSlot<TInput, TChunk>>((resolve, reject) => {\n const waiter: Waiter<StreamSlot<TInput, TChunk>> = {\n cleanup() {\n waiter.signal?.removeEventListener('abort', onAbort);\n },\n priority: runOptions.priority ?? 0,\n reject(reason) {\n waiter.cleanup();\n\n const index = waiters.indexOf(waiter);\n\n if (index !== -1) {\n waiters.splice(index, 1);\n core.releaseCapacity();\n }\n\n reject(reason);\n core.settleIdle();\n },\n resolve(slot) {\n waiter.cleanup();\n resolve(slot);\n },\n sequence: sequence++,\n signal: runOptions.signal,\n };\n const onAbort = () => waiter.reject(abortError(waiter.signal!));\n\n waiter.signal?.addEventListener('abort', onAbort, { once: true });\n waiters.push(waiter);\n waiters.sort((a, b) => b.priority - a.priority || a.sequence - b.sequence);\n });\n }\n\n return {\n get disposalSignal() {\n return core.disposalSignal;\n },\n dispose: core.dispose,\n get disposed() {\n return core.disposed;\n },\n drain: core.drain,\n async prime(): Promise<void> {\n await core.prime(slots);\n },\n runStream(input, runOptions = {}): AsyncIterable<TChunk> {\n const controller = new AbortController();\n const onAbort = () => controller.abort(runOptions.signal?.reason);\n\n runOptions.signal?.addEventListener('abort', onAbort, { once: true });\n\n return {\n [Symbol.asyncIterator]: async function* () {\n let slot: StreamSlot<TInput, TChunk> | undefined;\n let onCancel: (() => void) | undefined;\n\n try {\n slot = await acquire({ ...runOptions, signal: controller.signal });\n core.trackActive(1);\n onCancel = () => slot?.cancel(abortError(controller.signal));\n controller.signal.addEventListener('abort', onCancel, { once: true });\n\n const running = slot.stream(input, {\n ...runOptions,\n signal: controller.signal,\n timeout: runOptions.timeout ?? options.defaultTimeout,\n });\n\n for await (const value of running.iterable) yield value;\n await running.done;\n core.trackCompleted();\n } catch (error) {\n if (error instanceof Error && error.name !== 'AbortError' && !(error instanceof FamiliarTerminatedError))\n core.trackFailed();\n\n throw error;\n } finally {\n runOptions.signal?.removeEventListener('abort', onAbort);\n\n if (slot) {\n if (onCancel) controller.signal.removeEventListener('abort', onCancel);\n\n core.trackActive(-1);\n release(slot);\n core.settleIdle();\n }\n }\n },\n };\n },\n get stats() {\n return core.stats(waiters.length);\n },\n get status() {\n return core.status();\n },\n [Symbol.asyncDispose]: () => core.drain({}),\n [Symbol.dispose]: core.dispose,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_stream-pool.js","names":[],"sources":["../src/_stream-pool.ts"],"sourcesContent":["import { abortError } from '@vielzeug/arsenal';\nimport { createPoolCore, type PoolCore, type PoolOptions, validatePriority, validateTimeout } from './_pool-core.js';\nimport { FamiliarRuntimeError, FamiliarTerminatedError } from './errors.js';\nimport type { RunOptions, StreamWorkerPool } from './types.js';\n\nexport type StreamSlot<TInput, TChunk> = {\n cancel(reason: unknown): void;\n /** Wired by the pool factory to report unhandled worker runtime errors through `tap()`. */\n notify?(error: FamiliarRuntimeError): void;\n stream(input: TInput, options: RunOptions): { done: Promise<void>; iterable: AsyncIterable<TChunk> };\n terminate(): void;\n};\n\nexport function createStreamPool<TInput, TChunk>(\n slots: readonly StreamSlot<TInput, TChunk>[],\n options: PoolOptions,\n): StreamWorkerPool<TInput, TChunk> {\n const core: PoolCore<StreamSlot<TInput, TChunk>> = createPoolCore(slots, options);\n\n for (const slot of slots) slot.notify = (error) => core.emitTap({ error, type: 'worker-error' });\n\n function runStream(input: TInput, runOptions: RunOptions = {}): AsyncIterable<TChunk> {\n const priority = validatePriority(runOptions.priority ?? 0);\n const timeout = validateTimeout(runOptions.timeout) ?? options.defaultTimeout;\n const transferables = [...(runOptions.transferables ?? [])];\n let owner: object | undefined;\n\n const iterate = async function* (controller: AbortController): AsyncGenerator<TChunk> {\n const onAbort = () => controller.abort(runOptions.signal?.reason);\n let slot: StreamSlot<TInput, TChunk> | undefined;\n let onCancel: (() => void) | undefined;\n\n if (runOptions.signal?.aborted) controller.abort(runOptions.signal.reason);\n else runOptions.signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n const running = await core.acquire({ priority, signal: controller.signal }, (acquired) => {\n slot = acquired;\n core.trackActive(1);\n onCancel = () => slot?.cancel(abortError(controller.signal));\n controller.signal.addEventListener('abort', onCancel, { once: true });\n\n return acquired.stream(input, { priority, signal: controller.signal, timeout, transferables });\n });\n\n for await (const value of running.iterable) yield value;\n await running.done;\n core.trackCompleted();\n } catch (error) {\n if (slot && !controller.signal.aborted && !(error instanceof FamiliarTerminatedError)) core.trackFailed();\n throw error;\n } finally {\n runOptions.signal?.removeEventListener('abort', onAbort);\n\n if (slot) {\n if (onCancel) controller.signal.removeEventListener('abort', onCancel);\n\n core.trackActive(-1);\n core.release(slot);\n core.settleIdle();\n }\n }\n };\n\n return {\n [Symbol.asyncIterator]() {\n const token = {};\n const controller = new AbortController();\n let iterator: AsyncGenerator<TChunk> | undefined;\n const start = (): AsyncGenerator<TChunk> | undefined => {\n owner ??= token;\n if (owner !== token) return undefined;\n iterator ??= iterate(controller);\n return iterator;\n };\n\n return {\n next: () =>\n start()?.next() ?? Promise.reject(new FamiliarRuntimeError('Worker streams can only be consumed once')),\n return: async (value?: unknown) => {\n if (!owner || owner !== token) return { done: true, value: value as TChunk };\n controller.abort(new FamiliarTerminatedError('Stream consumer stopped'));\n return iterator?.return(value as TChunk) ?? { done: true, value: value as TChunk };\n },\n throw: async (error?: unknown) => {\n const active = start();\n if (!active) throw new FamiliarRuntimeError('Worker streams can only be consumed once');\n controller.abort(error);\n return active.throw(error);\n },\n };\n },\n };\n }\n\n return {\n get disposalSignal() {\n return core.disposalSignal;\n },\n dispose: core.dispose,\n get disposed() {\n return core.disposed;\n },\n drain: core.drain,\n runStream,\n get stats() {\n return core.stats();\n },\n get status() {\n return core.status();\n },\n tap: core.tap,\n [Symbol.asyncDispose]: () => core.drain({}),\n [Symbol.dispose]: core.dispose,\n };\n}\n"],"mappings":"2NAaA,SAAgB,iBACd,EACA,EACkC,CAClC,IAAM,EAA6C,EAAe,EAAO,CAAO,EAEhF,IAAK,IAAM,KAAQ,EAAO,EAAK,OAAU,GAAU,EAAK,QAAQ,CAAE,QAAO,KAAM,cAAe,CAAC,EAE/F,SAAS,UAAU,EAAe,EAAyB,CAAC,EAA0B,CACpF,IAAM,EAAW,EAAiB,EAAW,UAAY,CAAC,EACpD,EAAU,EAAgB,EAAW,OAAO,GAAK,EAAQ,eACzD,EAAgB,CAAC,GAAI,EAAW,eAAiB,CAAC,CAAE,EACtD,EAEE,QAAU,gBAAiB,EAAqD,CACpF,IAAM,YAAgB,EAAW,MAAM,EAAW,QAAQ,MAAM,EAC5D,EACA,SAEA,EAAW,QAAQ,QAAS,EAAW,MAAM,EAAW,OAAO,MAAM,EACpE,EAAW,QAAQ,iBAAiB,QAAS,QAAS,CAAE,KAAM,EAAK,CAAC,EAEzE,GAAI,CACF,IAAM,EAAU,MAAM,EAAK,QAAQ,CAAE,WAAU,OAAQ,EAAW,MAAO,EAAI,IAC3E,EAAO,EACP,EAAK,YAAY,CAAC,EAClB,aAAiB,GAAM,OAAO,EAAW,EAAW,MAAM,CAAC,EAC3D,EAAW,OAAO,iBAAiB,QAAS,SAAU,CAAE,KAAM,EAAK,CAAC,EAE7D,EAAS,OAAO,EAAO,CAAE,WAAU,OAAQ,EAAW,OAAQ,UAAS,eAAc,CAAC,EAC9F,EAED,UAAW,IAAM,KAAS,EAAQ,SAAU,MAAM,EAClD,MAAM,EAAQ,KACd,EAAK,eAAe,CACtB,OAAS,EAAO,CAEd,MADI,GAAQ,CAAC,EAAW,OAAO,SAAW,EAAE,aAAiB,IAA0B,EAAK,YAAY,EAClG,CACR,QAAU,CACR,EAAW,QAAQ,oBAAoB,QAAS,OAAO,EAEnD,IACE,UAAU,EAAW,OAAO,oBAAoB,QAAS,QAAQ,EAErE,EAAK,YAAY,EAAE,EACnB,EAAK,QAAQ,CAAI,EACjB,EAAK,WAAW,EAEpB,CACF,EAEA,MAAO,CACL,CAAC,OAAO,gBAAiB,CACvB,IAAM,EAAQ,CAAC,EACT,EAAa,IAAI,gBACnB,EACE,UAAkD,CACtD,OAAU,EACN,IAAU,EAEd,MADA,KAAa,QAAQ,CAAU,EACxB,CACT,EAEA,MAAO,CACL,SACE,MAAM,CAAC,EAAE,KAAK,GAAK,QAAQ,OAAO,IAAI,EAAqB,0CAA0C,CAAC,EACxG,OAAQ,KAAO,IACT,CAAC,GAAS,IAAU,EAAc,CAAE,KAAM,GAAa,OAAgB,GAC3E,EAAW,MAAM,IAAI,EAAwB,yBAAyB,CAAC,EAChE,GAAU,OAAO,CAAe,GAAK,CAAE,KAAM,GAAa,OAAgB,GAEnF,MAAO,KAAO,IAAoB,CAChC,IAAM,EAAS,MAAM,EACrB,GAAI,CAAC,EAAQ,MAAM,IAAI,EAAqB,0CAA0C,EAEtF,OADA,EAAW,MAAM,CAAK,EACf,EAAO,MAAM,CAAK,CAC3B,CACF,CACF,CACF,CACF,CAEA,MAAO,CACL,IAAI,gBAAiB,CACnB,OAAO,EAAK,cACd,EACA,QAAS,EAAK,QACd,IAAI,UAAW,CACb,OAAO,EAAK,QACd,EACA,MAAO,EAAK,MACZ,UACA,IAAI,OAAQ,CACV,OAAO,EAAK,MAAM,CACpB,EACA,IAAI,QAAS,CACX,OAAO,EAAK,OAAO,CACrB,EACA,IAAK,EAAK,KACT,OAAO,kBAAqB,EAAK,MAAM,CAAC,CAAC,GACzC,OAAO,SAAU,EAAK,OACzB,CACF"}
package/dist/_timers.cjs CHANGED
@@ -1,2 +1,2 @@
1
- function e(e){typeof e==`object`&&e&&`unref`in e&&e.unref()}exports.unrefTimer=e;
1
+ function unrefTimer(e){typeof e==`object`&&e&&`unref`in e&&e.unref()}exports.unrefTimer=unrefTimer;
2
2
  //# sourceMappingURL=_timers.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_timers.cjs","names":[],"sources":["../src/_timers.ts"],"sourcesContent":["/**\n * Node compatibility helper: `unref()`s a timer so a pending per-task timeout/watchdog does not\n * keep a Node event loop (e.g. a Worker polyfill) alive. Browsers return a plain number from\n * `setTimeout`/`setInterval`, so this is a no-op there.\n *\n * Not part of the public API surface.\n */\nexport function unrefTimer(timer: ReturnType<typeof setTimeout> | ReturnType<typeof setInterval>): void {\n if (typeof timer === 'object' && timer !== null && 'unref' in timer) {\n (timer as { unref(): void }).unref();\n }\n}\n"],"mappings":"AAOA,SAAgB,EAAW,EAA6E,CAClG,OAAO,GAAU,UAAY,GAAkB,UAAW,GAC5D,EAA6B,MAAM,CAEvC"}
1
+ {"version":3,"file":"_timers.cjs","names":[],"sources":["../src/_timers.ts"],"sourcesContent":["/**\n * Node compatibility helper: `unref()`s a timer so a pending per-task timeout/watchdog does not\n * keep a Node event loop (e.g. a Worker polyfill) alive. Browsers return a plain number from\n * `setTimeout`/`setInterval`, so this is a no-op there.\n *\n * Not part of the public API surface.\n */\nexport function unrefTimer(timer: ReturnType<typeof setTimeout> | ReturnType<typeof setInterval>): void {\n if (typeof timer === 'object' && timer !== null && 'unref' in timer) {\n (timer as { unref(): void }).unref();\n }\n}\n"],"mappings":"AAOA,SAAgB,WAAW,EAA6E,CAClG,OAAO,GAAU,UAAY,GAAkB,UAAW,GAC5D,EAA6B,MAAM,CAEvC"}
package/dist/_timers.js CHANGED
@@ -1,8 +1,2 @@
1
- //#region src/_timers.ts
2
- function e(e) {
3
- typeof e == "object" && e && "unref" in e && e.unref();
4
- }
5
- //#endregion
6
- export { e as unrefTimer };
7
-
1
+ function unrefTimer(e){typeof e==`object`&&e&&`unref`in e&&e.unref()}export{unrefTimer};
8
2
  //# sourceMappingURL=_timers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_timers.js","names":[],"sources":["../src/_timers.ts"],"sourcesContent":["/**\n * Node compatibility helper: `unref()`s a timer so a pending per-task timeout/watchdog does not\n * keep a Node event loop (e.g. a Worker polyfill) alive. Browsers return a plain number from\n * `setTimeout`/`setInterval`, so this is a no-op there.\n *\n * Not part of the public API surface.\n */\nexport function unrefTimer(timer: ReturnType<typeof setTimeout> | ReturnType<typeof setInterval>): void {\n if (typeof timer === 'object' && timer !== null && 'unref' in timer) {\n (timer as { unref(): void }).unref();\n }\n}\n"],"mappings":";AAOA,SAAgB,EAAW,GAA6E;CACtG,AAAI,OAAO,KAAU,YAAY,KAAkB,WAAW,KAC5D,EAA6B,MAAM;AAEvC"}
1
+ {"version":3,"file":"_timers.js","names":[],"sources":["../src/_timers.ts"],"sourcesContent":["/**\n * Node compatibility helper: `unref()`s a timer so a pending per-task timeout/watchdog does not\n * keep a Node event loop (e.g. a Worker polyfill) alive. Browsers return a plain number from\n * `setTimeout`/`setInterval`, so this is a no-op there.\n *\n * Not part of the public API surface.\n */\nexport function unrefTimer(timer: ReturnType<typeof setTimeout> | ReturnType<typeof setInterval>): void {\n if (typeof timer === 'object' && timer !== null && 'unref' in timer) {\n (timer as { unref(): void }).unref();\n }\n}\n"],"mappings":"AAOA,SAAgB,WAAW,EAA6E,CAClG,OAAO,GAAU,UAAY,GAAkB,UAAW,GAC5D,EAA6B,MAAM,CAEvC"}
package/dist/errors.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{},n=class extends e{maxQueue;constructor(e){super(`Queue is full (maxQueue=${e})`),this.maxQueue=e}},r=class extends e{},i=class extends e{constructor(e=`Worker was terminated`){super(e)}},a=class extends e{timeoutMs;constructor(e){super(`Task timed out after ${e}ms`),this.timeoutMs=e}},o=class extends e{};exports.FamiliarError=e,exports.FamiliarInvalidOptionsError=t,exports.FamiliarQueueFullError=n,exports.FamiliarRuntimeError=o,exports.FamiliarTaskError=r,exports.FamiliarTerminatedError=i,exports.FamiliarTimeoutError=a;
1
+ var FamiliarError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},FamiliarInvalidOptionsError=class extends FamiliarError{},FamiliarQueueFullError=class extends FamiliarError{maxQueue;constructor(e){super(`Queue is full (maxQueue=${e})`),this.maxQueue=e}},FamiliarTaskError=class extends FamiliarError{},FamiliarTerminatedError=class extends FamiliarError{constructor(e=`Worker was terminated`){super(e)}},FamiliarTimeoutError=class extends FamiliarError{timeoutMs;constructor(e,t=`Task`){super(`${t} timed out after ${e}ms`),this.timeoutMs=e}},FamiliarRuntimeError=class extends FamiliarError{};exports.FamiliarError=FamiliarError,exports.FamiliarInvalidOptionsError=FamiliarInvalidOptionsError,exports.FamiliarQueueFullError=FamiliarQueueFullError,exports.FamiliarRuntimeError=FamiliarRuntimeError,exports.FamiliarTaskError=FamiliarTaskError,exports.FamiliarTerminatedError=FamiliarTerminatedError,exports.FamiliarTimeoutError=FamiliarTimeoutError;
2
2
  //# sourceMappingURL=errors.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all familiar errors. Use `instanceof FamiliarError` to catch any familiar-originated error. */\nexport class FamiliarError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when invalid options are passed to a Familiar pool factory. */\nexport class FamiliarInvalidOptionsError extends FamiliarError {}\n\n/** Thrown when run() is called and the queue is full (`onFull='reject'`). */\nexport class FamiliarQueueFullError extends FamiliarError {\n /** The configured `maxQueue` value. */\n readonly maxQueue: number;\n\n constructor(maxQueue: number) {\n super(`Queue is full (maxQueue=${maxQueue})`);\n this.maxQueue = maxQueue;\n }\n}\n\n/** Thrown when the task function throws. The original error is available as `.cause`. */\nexport class FamiliarTaskError extends FamiliarError {}\n\n/** Thrown when a task or operation is rejected because the worker was terminated. */\nexport class FamiliarTerminatedError extends FamiliarError {\n constructor(message = 'Worker was terminated') {\n super(message);\n }\n}\n\n/** Thrown when a task exceeds its timeout or `drain()` times out. */\nexport class FamiliarTimeoutError extends FamiliarError {\n /** The configured timeout in milliseconds. */\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Task timed out after ${timeoutMs}ms`);\n this.timeoutMs = timeoutMs;\n }\n}\n\n/** Thrown when the Worker API is unavailable or an unhandled error occurs in the worker thread. */\nexport class FamiliarRuntimeError extends FamiliarError {}\n"],"mappings":"AACA,IAAa,EAAb,cAAmC,KAAM,CACvC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAGa,EAAb,cAAiD,CAAc,CAAC,EAGnD,EAAb,cAA4C,CAAc,CAExD,SAEA,YAAY,EAAkB,CAC5B,MAAM,2BAA2B,EAAS,EAAE,EAC5C,KAAK,SAAW,CAClB,CACF,EAGa,EAAb,cAAuC,CAAc,CAAC,EAGzC,EAAb,cAA6C,CAAc,CACzD,YAAY,EAAU,wBAAyB,CAC7C,MAAM,CAAO,CACf,CACF,EAGa,EAAb,cAA0C,CAAc,CAEtD,UAEA,YAAY,EAAmB,CAC7B,MAAM,wBAAwB,EAAU,GAAG,EAC3C,KAAK,UAAY,CACnB,CACF,EAGa,EAAb,cAA0C,CAAc,CAAC"}
1
+ {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all familiar errors. Use `instanceof FamiliarError` to catch any familiar-originated error. */\nexport class FamiliarError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when invalid options are passed to a Familiar pool factory. */\nexport class FamiliarInvalidOptionsError extends FamiliarError {}\n\n/** Thrown when run() is called and the queue is full (`onFull='reject'`). */\nexport class FamiliarQueueFullError extends FamiliarError {\n /** The configured `maxQueue` value. */\n readonly maxQueue: number;\n\n constructor(maxQueue: number) {\n super(`Queue is full (maxQueue=${maxQueue})`);\n this.maxQueue = maxQueue;\n }\n}\n\n/** Thrown when the task function throws. The original error is available as `.cause`. */\nexport class FamiliarTaskError extends FamiliarError {}\n\n/** Thrown when a task or operation is rejected because the worker was terminated. */\nexport class FamiliarTerminatedError extends FamiliarError {\n constructor(message = 'Worker was terminated') {\n super(message);\n }\n}\n\n/** Thrown when a task exceeds its timeout or `drain()` times out. */\nexport class FamiliarTimeoutError extends FamiliarError {\n /** The configured timeout in milliseconds. */\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number, operation = 'Task') {\n super(`${operation} timed out after ${timeoutMs}ms`);\n this.timeoutMs = timeoutMs;\n }\n}\n\n/** Thrown when the Worker API is unavailable or an unhandled error occurs in the worker thread. */\nexport class FamiliarRuntimeError extends FamiliarError {}\n"],"mappings":"AACA,IAAa,cAAb,cAAmC,KAAM,CACvC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAGa,4BAAb,cAAiD,aAAc,CAAC,EAGnD,uBAAb,cAA4C,aAAc,CAExD,SAEA,YAAY,EAAkB,CAC5B,MAAM,2BAA2B,EAAS,EAAE,EAC5C,KAAK,SAAW,CAClB,CACF,EAGa,kBAAb,cAAuC,aAAc,CAAC,EAGzC,wBAAb,cAA6C,aAAc,CACzD,YAAY,EAAU,wBAAyB,CAC7C,MAAM,CAAO,CACf,CACF,EAGa,qBAAb,cAA0C,aAAc,CAEtD,UAEA,YAAY,EAAmB,EAAY,OAAQ,CACjD,MAAM,GAAG,EAAU,mBAAmB,EAAU,GAAG,EACnD,KAAK,UAAY,CACnB,CACF,EAGa,qBAAb,cAA0C,aAAc,CAAC"}
package/dist/errors.d.ts CHANGED
@@ -22,7 +22,7 @@ export declare class FamiliarTerminatedError extends FamiliarError {
22
22
  export declare class FamiliarTimeoutError extends FamiliarError {
23
23
  /** The configured timeout in milliseconds. */
24
24
  readonly timeoutMs: number;
25
- constructor(timeoutMs: number);
25
+ constructor(timeoutMs: number, operation?: string);
26
26
  }
27
27
  /** Thrown when the Worker API is unavailable or an unhandled error occurs in the worker thread. */
28
28
  export declare class FamiliarRuntimeError extends FamiliarError {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;CAKjD;AAED,yEAAyE;AACzE,qBAAa,2BAA4B,SAAQ,aAAa;CAAG;AAEjE,6EAA6E;AAC7E,qBAAa,sBAAuB,SAAQ,aAAa;IACvD,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,QAAQ,EAAE,MAAM;CAI7B;AAED,yFAAyF;AACzF,qBAAa,iBAAkB,SAAQ,aAAa;CAAG;AAEvD,qFAAqF;AACrF,qBAAa,uBAAwB,SAAQ,aAAa;gBAC5C,OAAO,SAA0B;CAG9C;AAED,qEAAqE;AACrE,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,SAAS,EAAE,MAAM;CAI9B;AAED,mGAAmG;AACnG,qBAAa,oBAAqB,SAAQ,aAAa;CAAG"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;CAKjD;AAED,yEAAyE;AACzE,qBAAa,2BAA4B,SAAQ,aAAa;CAAG;AAEjE,6EAA6E;AAC7E,qBAAa,sBAAuB,SAAQ,aAAa;IACvD,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,QAAQ,EAAE,MAAM;CAI7B;AAED,yFAAyF;AACzF,qBAAa,iBAAkB,SAAQ,aAAa;CAAG;AAEvD,qFAAqF;AACrF,qBAAa,uBAAwB,SAAQ,aAAa;gBAC5C,OAAO,SAA0B;CAG9C;AAED,qEAAqE;AACrE,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,SAAS,EAAE,MAAM,EAAE,SAAS,SAAS;CAIlD;AAED,mGAAmG;AACnG,qBAAa,oBAAqB,SAAQ,aAAa;CAAG"}
package/dist/errors.js CHANGED
@@ -1,24 +1,2 @@
1
- //#region src/errors.ts
2
- var e = class extends Error {
3
- constructor(e, t) {
4
- super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
5
- }
6
- }, t = class extends e {}, n = class extends e {
7
- maxQueue;
8
- constructor(e) {
9
- super(`Queue is full (maxQueue=${e})`), this.maxQueue = e;
10
- }
11
- }, r = class extends e {}, i = class extends e {
12
- constructor(e = "Worker was terminated") {
13
- super(e);
14
- }
15
- }, a = class extends e {
16
- timeoutMs;
17
- constructor(e) {
18
- super(`Task timed out after ${e}ms`), this.timeoutMs = e;
19
- }
20
- }, o = class extends e {};
21
- //#endregion
22
- export { e as FamiliarError, t as FamiliarInvalidOptionsError, n as FamiliarQueueFullError, o as FamiliarRuntimeError, r as FamiliarTaskError, i as FamiliarTerminatedError, a as FamiliarTimeoutError };
23
-
1
+ var FamiliarError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},FamiliarInvalidOptionsError=class extends FamiliarError{},FamiliarQueueFullError=class extends FamiliarError{maxQueue;constructor(e){super(`Queue is full (maxQueue=${e})`),this.maxQueue=e}},FamiliarTaskError=class extends FamiliarError{},FamiliarTerminatedError=class extends FamiliarError{constructor(e=`Worker was terminated`){super(e)}},FamiliarTimeoutError=class extends FamiliarError{timeoutMs;constructor(e,t=`Task`){super(`${t} timed out after ${e}ms`),this.timeoutMs=e}},FamiliarRuntimeError=class extends FamiliarError{};export{FamiliarError,FamiliarInvalidOptionsError,FamiliarQueueFullError,FamiliarRuntimeError,FamiliarTaskError,FamiliarTerminatedError,FamiliarTimeoutError};
24
2
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all familiar errors. Use `instanceof FamiliarError` to catch any familiar-originated error. */\nexport class FamiliarError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when invalid options are passed to a Familiar pool factory. */\nexport class FamiliarInvalidOptionsError extends FamiliarError {}\n\n/** Thrown when run() is called and the queue is full (`onFull='reject'`). */\nexport class FamiliarQueueFullError extends FamiliarError {\n /** The configured `maxQueue` value. */\n readonly maxQueue: number;\n\n constructor(maxQueue: number) {\n super(`Queue is full (maxQueue=${maxQueue})`);\n this.maxQueue = maxQueue;\n }\n}\n\n/** Thrown when the task function throws. The original error is available as `.cause`. */\nexport class FamiliarTaskError extends FamiliarError {}\n\n/** Thrown when a task or operation is rejected because the worker was terminated. */\nexport class FamiliarTerminatedError extends FamiliarError {\n constructor(message = 'Worker was terminated') {\n super(message);\n }\n}\n\n/** Thrown when a task exceeds its timeout or `drain()` times out. */\nexport class FamiliarTimeoutError extends FamiliarError {\n /** The configured timeout in milliseconds. */\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Task timed out after ${timeoutMs}ms`);\n this.timeoutMs = timeoutMs;\n }\n}\n\n/** Thrown when the Worker API is unavailable or an unhandled error occurs in the worker thread. */\nexport class FamiliarRuntimeError extends FamiliarError {}\n"],"mappings":";AACA,IAAa,IAAb,cAAmC,MAAM;CACvC,YAAY,GAAiB,GAAqB;EAGhD,AAFA,MAAM,GAAS,CAAI,GACnB,KAAK,OAAO,WAAW,MACvB,OAAO,eAAe,MAAM,WAAW,SAAS;CAClD;AACF,GAGa,IAAb,cAAiD,EAAc,CAAC,GAGnD,IAAb,cAA4C,EAAc;CAExD;CAEA,YAAY,GAAkB;EAE5B,AADA,MAAM,2BAA2B,EAAS,EAAE,GAC5C,KAAK,WAAW;CAClB;AACF,GAGa,IAAb,cAAuC,EAAc,CAAC,GAGzC,IAAb,cAA6C,EAAc;CACzD,YAAY,IAAU,yBAAyB;EAC7C,MAAM,CAAO;CACf;AACF,GAGa,IAAb,cAA0C,EAAc;CAEtD;CAEA,YAAY,GAAmB;EAE7B,AADA,MAAM,wBAAwB,EAAU,GAAG,GAC3C,KAAK,YAAY;CACnB;AACF,GAGa,IAAb,cAA0C,EAAc,CAAC"}
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all familiar errors. Use `instanceof FamiliarError` to catch any familiar-originated error. */\nexport class FamiliarError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when invalid options are passed to a Familiar pool factory. */\nexport class FamiliarInvalidOptionsError extends FamiliarError {}\n\n/** Thrown when run() is called and the queue is full (`onFull='reject'`). */\nexport class FamiliarQueueFullError extends FamiliarError {\n /** The configured `maxQueue` value. */\n readonly maxQueue: number;\n\n constructor(maxQueue: number) {\n super(`Queue is full (maxQueue=${maxQueue})`);\n this.maxQueue = maxQueue;\n }\n}\n\n/** Thrown when the task function throws. The original error is available as `.cause`. */\nexport class FamiliarTaskError extends FamiliarError {}\n\n/** Thrown when a task or operation is rejected because the worker was terminated. */\nexport class FamiliarTerminatedError extends FamiliarError {\n constructor(message = 'Worker was terminated') {\n super(message);\n }\n}\n\n/** Thrown when a task exceeds its timeout or `drain()` times out. */\nexport class FamiliarTimeoutError extends FamiliarError {\n /** The configured timeout in milliseconds. */\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number, operation = 'Task') {\n super(`${operation} timed out after ${timeoutMs}ms`);\n this.timeoutMs = timeoutMs;\n }\n}\n\n/** Thrown when the Worker API is unavailable or an unhandled error occurs in the worker thread. */\nexport class FamiliarRuntimeError extends FamiliarError {}\n"],"mappings":"AACA,IAAa,cAAb,cAAmC,KAAM,CACvC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAGa,4BAAb,cAAiD,aAAc,CAAC,EAGnD,uBAAb,cAA4C,aAAc,CAExD,SAEA,YAAY,EAAkB,CAC5B,MAAM,2BAA2B,EAAS,EAAE,EAC5C,KAAK,SAAW,CAClB,CACF,EAGa,kBAAb,cAAuC,aAAc,CAAC,EAGzC,wBAAb,cAA6C,aAAc,CACzD,YAAY,EAAU,wBAAyB,CAC7C,MAAM,CAAO,CACf,CACF,EAGa,qBAAb,cAA0C,aAAc,CAEtD,UAEA,YAAY,EAAmB,EAAY,OAAQ,CACjD,MAAM,GAAG,EAAU,mBAAmB,EAAU,GAAG,EACnD,KAAK,UAAY,CACnB,CACF,EAGa,qBAAb,cAA0C,aAAc,CAAC"}