@vielzeug/familiar 26.11.4 → 26.11.6

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.
@@ -1,7 +1,7 @@
1
1
  import { unrefTimer as e } from "./_timers.js";
2
2
  import { FamiliarInvalidOptionsError as t, FamiliarQueueFullError as n, FamiliarTerminatedError as r, FamiliarTimeoutError as i } from "./errors.js";
3
3
  import { abortError as a, tapper as o } from "@vielzeug/arsenal";
4
- //#region src/_pool-core.ts
4
+ // src/_pool-core.ts
5
5
  var s = 2147483647;
6
6
  function validatePriority(e) {
7
7
  if (!Number.isFinite(e)) throw new t("`priority` must be a finite number");
@@ -166,7 +166,6 @@ function createPoolCore(t, s) {
166
166
  }
167
167
  };
168
168
  }
169
- //#endregion
170
169
  export { s as MAX_TIMEOUT, createPoolCore, validatePriority, validateTimeout };
171
170
 
172
171
  //# sourceMappingURL=_pool-core.js.map
package/dist/_pool.cjs CHANGED
@@ -1,2 +1,2 @@
1
- const e=require("./errors.cjs"),t=require("./_pool-core.cjs");let n=require("@vielzeug/arsenal");function createPool(r,i){let a=t.createPoolCore(r,i);for(let e of r)e.notify=e=>a.emitTap({error:e,type:`worker-error`});function run(r,o={}){let s,c,l;try{s=t.validatePriority(o.priority??0),c=t.validateTimeout(o.timeout)??i.defaultTimeout,l=[...o.transferables??[]]}catch(e){return Promise.reject(e)}return a.acquire({priority:s,signal:o.signal},t=>{a.trackActive(1);let onAbort=()=>t.cancel((0,n.abortError)(o.signal));o.signal?.addEventListener(`abort`,onAbort,{once:!0});let finish=async()=>{try{let e=await t.run(r,l,c);return a.trackCompleted(),e}catch(t){throw!o.signal?.aborted&&!(t instanceof e.FamiliarTerminatedError)&&a.trackFailed(),t}finally{o.signal?.removeEventListener(`abort`,onAbort),a.trackActive(-1),a.release(t),a.settleIdle()}};return finish()})}return{get disposalSignal(){return a.disposalSignal},dispose:a.dispose,get disposed(){return a.disposed},drain:a.drain,run,get stats(){return a.stats()},get status(){return a.status()},tap:a.tap,[Symbol.asyncDispose]:()=>a.drain({}),[Symbol.dispose]:a.dispose}}function runBatch(t,r,i={}){let a,iterate=async function*(e){let a=[],onAbort=()=>e.abort(i.signal?.reason);i.signal?.aborted?e.abort(i.signal.reason):i.signal?.addEventListener(`abort`,onAbort,{once:!0});try{for(let[n,o]of r.entries()){let r=t.run(o,{priority:i.priority,signal:e.signal,timeout:i.timeout,transferables:i.getTransferables?.(o,n)}).catch(t=>{throw e.abort(t),t});r.catch(()=>void 0),a.push(r)}if(a.length===0&&e.signal.aborted)throw(0,n.abortError)(e.signal);for(let t of a){if(e.signal.aborted)throw(0,n.abortError)(e.signal);let r=await t;if(e.signal.aborted)throw(0,n.abortError)(e.signal);yield r}}catch(t){throw e.abort(t),t}finally{i.signal?.removeEventListener(`abort`,onAbort),e.abort(new DOMException(`Batch consumer stopped`,`AbortError`)),await Promise.allSettled(a)}};return{[Symbol.asyncIterator](){let t={},n=new AbortController,r,start=()=>{if(a??=t,a===t)return r??=iterate(n),r};return{next:()=>start()?.next()??Promise.reject(new e.FamiliarRuntimeError(`Worker batches can only be consumed once`)),return:async i=>!a||a!==t?{done:!0,value:i}:(n.abort(new e.FamiliarTerminatedError(`Batch consumer stopped`)),r?.return(i)??{done:!0,value:i}),throw:async t=>{let r=start();if(!r)throw new e.FamiliarRuntimeError(`Worker batches can only be consumed once`);return n.abort(t),r.throw(t)}}}}}exports.createPool=createPool,exports.runBatch=runBatch;
1
+ const e=require("./_pool-core.cjs"),t=require("./errors.cjs");let n=require("@vielzeug/arsenal");function createPool(r,i){let a=e.createPoolCore(r,i);for(let e of r)e.notify=e=>a.emitTap({error:e,type:`worker-error`});function run(r,o={}){let s,c,l;try{s=e.validatePriority(o.priority??0),c=e.validateTimeout(o.timeout)??i.defaultTimeout,l=[...o.transferables??[]]}catch(e){return Promise.reject(e)}return a.acquire({priority:s,signal:o.signal},e=>{a.trackActive(1);let onAbort=()=>e.cancel((0,n.abortError)(o.signal));o.signal?.addEventListener(`abort`,onAbort,{once:!0});let finish=async()=>{try{let t=await e.run(r,l,c);return a.trackCompleted(),t}catch(e){throw!o.signal?.aborted&&!(e instanceof t.FamiliarTerminatedError)&&a.trackFailed(),e}finally{o.signal?.removeEventListener(`abort`,onAbort),a.trackActive(-1),a.release(e),a.settleIdle()}};return finish()})}return{get disposalSignal(){return a.disposalSignal},dispose:a.dispose,get disposed(){return a.disposed},drain:a.drain,run,get stats(){return a.stats()},get status(){return a.status()},tap:a.tap,[Symbol.asyncDispose]:()=>a.drain({}),[Symbol.dispose]:a.dispose}}function runBatch(e,r,i={}){let a,iterate=async function*(t){let a=[],onAbort=()=>t.abort(i.signal?.reason);i.signal?.aborted?t.abort(i.signal.reason):i.signal?.addEventListener(`abort`,onAbort,{once:!0});try{for(let[n,o]of r.entries()){let r=e.run(o,{priority:i.priority,signal:t.signal,timeout:i.timeout,transferables:i.getTransferables?.(o,n)}).catch(e=>{throw t.abort(e),e});r.catch(()=>void 0),a.push(r)}if(a.length===0&&t.signal.aborted)throw(0,n.abortError)(t.signal);for(let e of a){if(t.signal.aborted)throw(0,n.abortError)(t.signal);let r=await e;if(t.signal.aborted)throw(0,n.abortError)(t.signal);yield r}}catch(e){throw t.abort(e),e}finally{i.signal?.removeEventListener(`abort`,onAbort),t.abort(new DOMException(`Batch consumer stopped`,`AbortError`)),await Promise.allSettled(a)}};return{[Symbol.asyncIterator](){let e={},n=new AbortController,r,start=()=>{if(a??=e,a===e)return r??=iterate(n),r};return{next:()=>start()?.next()??Promise.reject(new t.FamiliarRuntimeError(`Worker batches can only be consumed once`)),return:async i=>!a||a!==e?{done:!0,value:i}:(n.abort(new t.FamiliarTerminatedError(`Batch consumer stopped`)),r?.return(i)??{done:!0,value:i}),throw:async e=>{let r=start();if(!r)throw new t.FamiliarRuntimeError(`Worker batches can only be consumed once`);return n.abort(e),r.throw(e)}}}}}exports.createPool=createPool,exports.runBatch=runBatch;
2
2
  //# sourceMappingURL=_pool.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_pool.cjs","names":["createPoolCore","validatePriority","validateTimeout","abortError","FamiliarTerminatedError","FamiliarRuntimeError","require_errors","require__pool_core","_vielzeug_arsenal","core","slots","options","slot","priority","timeout","transferables","runOptions","error","value","input","owner","tasks","controller","index","inputs","task","pool","token","iterator","active"],"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
+ {"version":3,"file":"_pool.cjs","names":["createPoolCore","validatePriority","validateTimeout","abortError","FamiliarTerminatedError","FamiliarRuntimeError","require__pool_core","require_errors","_vielzeug_arsenal","core","slots","options","slot","priority","timeout","transferables","runOptions","error","value","input","owner","tasks","controller","index","inputs","task","pool","token","iterator","active"],"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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"}
package/dist/_pool.js CHANGED
@@ -1,35 +1,35 @@
1
- import { FamiliarRuntimeError as e, FamiliarTerminatedError as t } from "./errors.js";
2
- import { createPoolCore as n, validatePriority as r, validateTimeout as i } from "./_pool-core.js";
1
+ import { createPoolCore as e, validatePriority as t, validateTimeout as n } from "./_pool-core.js";
2
+ import { FamiliarRuntimeError as r, FamiliarTerminatedError as i } from "./errors.js";
3
3
  import { abortError as a } from "@vielzeug/arsenal";
4
- //#region src/_pool.ts
5
- function createPool(e, o) {
6
- let s = n(e, o);
7
- for (let t of e) t.notify = (e) => s.emitTap({
4
+ // src/_pool.ts
5
+ function createPool(r, o) {
6
+ let s = e(r, o);
7
+ for (let e of r) e.notify = (e) => s.emitTap({
8
8
  error: e,
9
9
  type: "worker-error"
10
10
  });
11
- function run(e, n = {}) {
11
+ function run(e, r = {}) {
12
12
  let c, l, u;
13
13
  try {
14
- c = r(n.priority ?? 0), l = i(n.timeout) ?? o.defaultTimeout, u = [...n.transferables ?? []];
14
+ c = t(r.priority ?? 0), l = n(r.timeout) ?? o.defaultTimeout, u = [...r.transferables ?? []];
15
15
  } catch (e) {
16
16
  return Promise.reject(e);
17
17
  }
18
18
  return s.acquire({
19
19
  priority: c,
20
- signal: n.signal
21
- }, (r) => {
20
+ signal: r.signal
21
+ }, (t) => {
22
22
  s.trackActive(1);
23
- let onAbort = () => r.cancel(a(n.signal));
24
- n.signal?.addEventListener("abort", onAbort, { once: !0 });
23
+ let onAbort = () => t.cancel(a(r.signal));
24
+ r.signal?.addEventListener("abort", onAbort, { once: !0 });
25
25
  let finish = async () => {
26
26
  try {
27
- let t = await r.run(e, u, l);
28
- return s.trackCompleted(), t;
27
+ let n = await t.run(e, u, l);
28
+ return s.trackCompleted(), n;
29
29
  } catch (e) {
30
- throw !n.signal?.aborted && !(e instanceof t) && s.trackFailed(), e;
30
+ throw !r.signal?.aborted && !(e instanceof i) && s.trackFailed(), e;
31
31
  } finally {
32
- n.signal?.removeEventListener("abort", onAbort), s.trackActive(-1), s.release(r), s.settleIdle();
32
+ r.signal?.removeEventListener("abort", onAbort), s.trackActive(-1), s.release(t), s.settleIdle();
33
33
  }
34
34
  };
35
35
  return finish();
@@ -56,57 +56,56 @@ function createPool(e, o) {
56
56
  [Symbol.dispose]: s.dispose
57
57
  };
58
58
  }
59
- function runBatch(n, r, i = {}) {
60
- let o, iterate = async function* (e) {
61
- let t = [], onAbort = () => e.abort(i.signal?.reason);
62
- i.signal?.aborted ? e.abort(i.signal.reason) : i.signal?.addEventListener("abort", onAbort, { once: !0 });
59
+ function runBatch(e, t, n = {}) {
60
+ let o, iterate = async function* (r) {
61
+ let i = [], onAbort = () => r.abort(n.signal?.reason);
62
+ n.signal?.aborted ? r.abort(n.signal.reason) : n.signal?.addEventListener("abort", onAbort, { once: !0 });
63
63
  try {
64
- for (let [a, o] of r.entries()) {
65
- let r = n.run(o, {
66
- priority: i.priority,
67
- signal: e.signal,
68
- timeout: i.timeout,
69
- transferables: i.getTransferables?.(o, a)
70
- }).catch((t) => {
71
- throw e.abort(t), t;
64
+ for (let [a, o] of t.entries()) {
65
+ let t = e.run(o, {
66
+ priority: n.priority,
67
+ signal: r.signal,
68
+ timeout: n.timeout,
69
+ transferables: n.getTransferables?.(o, a)
70
+ }).catch((e) => {
71
+ throw r.abort(e), e;
72
72
  });
73
- r.catch(() => void 0), t.push(r);
73
+ t.catch(() => void 0), i.push(t);
74
74
  }
75
- if (t.length === 0 && e.signal.aborted) throw a(e.signal);
76
- for (let n of t) {
77
- if (e.signal.aborted) throw a(e.signal);
78
- let t = await n;
79
- if (e.signal.aborted) throw a(e.signal);
75
+ if (i.length === 0 && r.signal.aborted) throw a(r.signal);
76
+ for (let e of i) {
77
+ if (r.signal.aborted) throw a(r.signal);
78
+ let t = await e;
79
+ if (r.signal.aborted) throw a(r.signal);
80
80
  yield t;
81
81
  }
82
- } catch (t) {
83
- throw e.abort(t), t;
82
+ } catch (e) {
83
+ throw r.abort(e), e;
84
84
  } finally {
85
- i.signal?.removeEventListener("abort", onAbort), e.abort(new DOMException("Batch consumer stopped", "AbortError")), await Promise.allSettled(t);
85
+ n.signal?.removeEventListener("abort", onAbort), r.abort(new DOMException("Batch consumer stopped", "AbortError")), await Promise.allSettled(i);
86
86
  }
87
87
  };
88
88
  return { [Symbol.asyncIterator]() {
89
- let n = {}, r = new AbortController(), i, start = () => {
90
- if (o ??= n, o === n) return i ??= iterate(r), i;
89
+ let e = {}, t = new AbortController(), n, start = () => {
90
+ if (o ??= e, o === e) return n ??= iterate(t), n;
91
91
  };
92
92
  return {
93
- next: () => start()?.next() ?? Promise.reject(new e("Worker batches can only be consumed once")),
94
- return: async (e) => !o || o !== n ? {
93
+ next: () => start()?.next() ?? Promise.reject(new r("Worker batches can only be consumed once")),
94
+ return: async (r) => !o || o !== e ? {
95
95
  done: !0,
96
- value: e
97
- } : (r.abort(new t("Batch consumer stopped")), i?.return(e) ?? {
96
+ value: r
97
+ } : (t.abort(new i("Batch consumer stopped")), n?.return(r) ?? {
98
98
  done: !0,
99
- value: e
99
+ value: r
100
100
  }),
101
- throw: async (t) => {
101
+ throw: async (e) => {
102
102
  let n = start();
103
- if (!n) throw new e("Worker batches can only be consumed once");
104
- return r.abort(t), n.throw(t);
103
+ if (!n) throw new r("Worker batches can only be consumed once");
104
+ return t.abort(e), n.throw(e);
105
105
  }
106
106
  };
107
107
  } };
108
108
  }
109
- //#endregion
110
109
  export { createPool, runBatch };
111
110
 
112
111
  //# sourceMappingURL=_pool.js.map
@@ -1,2 +1,2 @@
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;
1
+ const e=require("./_pool-core.cjs"),t=require("./errors.cjs");let n=require("@vielzeug/arsenal");function createStreamPool(r,i){let a=e.createPoolCore(r,i);for(let e of r)e.notify=e=>a.emitTap({error:e,type:`worker-error`});function runStream(r,o={}){let s=e.validatePriority(o.priority??0),c=e.validateTimeout(o.timeout)??i.defaultTimeout,l=[...o.transferables??[]],u,iterate=async function*(e){let onAbort=()=>e.abort(o.signal?.reason),i,onCancel;o.signal?.aborted?e.abort(o.signal.reason):o.signal?.addEventListener(`abort`,onAbort,{once:!0});try{let t=await a.acquire({priority:s,signal:e.signal},t=>(i=t,a.trackActive(1),onCancel=()=>i?.cancel((0,n.abortError)(e.signal)),e.signal.addEventListener(`abort`,onCancel,{once:!0}),t.stream(r,{priority:s,signal:e.signal,timeout:c,transferables:l})));for await(let e of t.iterable)yield e;await t.done,a.trackCompleted()}catch(n){throw i&&!e.signal.aborted&&!(n instanceof t.FamiliarTerminatedError)&&a.trackFailed(),n}finally{o.signal?.removeEventListener(`abort`,onAbort),i&&(onCancel&&e.signal.removeEventListener(`abort`,onCancel),a.trackActive(-1),a.release(i),a.settleIdle())}};return{[Symbol.asyncIterator](){let e={},n=new AbortController,r,start=()=>{if(u??=e,u===e)return r??=iterate(n),r};return{next:()=>start()?.next()??Promise.reject(new t.FamiliarRuntimeError(`Worker streams can only be consumed once`)),return:async i=>!u||u!==e?{done:!0,value:i}:(n.abort(new t.FamiliarTerminatedError(`Stream consumer stopped`)),r?.return(i)??{done:!0,value:i}),throw:async e=>{let r=start();if(!r)throw new t.FamiliarRuntimeError(`Worker streams can only be consumed once`);return n.abort(e),r.throw(e)}}}}}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":["createPoolCore","validatePriority","validateTimeout","abortError","FamiliarTerminatedError","FamiliarRuntimeError","require_errors","require__pool_core","_vielzeug_arsenal","core","slots","options","slot","priority","runOptions","timeout","transferables","owner","controller","running","acquired","input","value","error","token","iterator","active"],"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":"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"}
1
+ {"version":3,"file":"_stream-pool.cjs","names":["createPoolCore","validatePriority","validateTimeout","abortError","FamiliarTerminatedError","FamiliarRuntimeError","require__pool_core","require_errors","_vielzeug_arsenal","core","slots","options","slot","priority","runOptions","timeout","transferables","owner","controller","running","acquired","input","value","error","token","iterator","active"],"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":"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"}
@@ -1,52 +1,52 @@
1
- import { FamiliarRuntimeError as e, FamiliarTerminatedError as t } from "./errors.js";
2
- import { createPoolCore as n, validatePriority as r, validateTimeout as i } from "./_pool-core.js";
1
+ import { createPoolCore as e, validatePriority as t, validateTimeout as n } from "./_pool-core.js";
2
+ import { FamiliarRuntimeError as r, FamiliarTerminatedError as i } from "./errors.js";
3
3
  import { abortError as a } from "@vielzeug/arsenal";
4
- //#region src/_stream-pool.ts
4
+ // src/_stream-pool.ts
5
5
  function createStreamPool(o, s) {
6
- let c = n(o, s);
6
+ let c = e(o, s);
7
7
  for (let e of o) e.notify = (e) => c.emitTap({
8
8
  error: e,
9
9
  type: "worker-error"
10
10
  });
11
- function runStream(n, o = {}) {
12
- let l = r(o.priority ?? 0), u = i(o.timeout) ?? s.defaultTimeout, d = [...o.transferables ?? []], f, iterate = async function* (e) {
13
- let onAbort = () => e.abort(o.signal?.reason), r, onCancel;
14
- o.signal?.aborted ? e.abort(o.signal.reason) : o.signal?.addEventListener("abort", onAbort, { once: !0 });
11
+ function runStream(e, o = {}) {
12
+ let l = t(o.priority ?? 0), u = n(o.timeout) ?? s.defaultTimeout, d = [...o.transferables ?? []], f, iterate = async function* (t) {
13
+ let onAbort = () => t.abort(o.signal?.reason), n, onCancel;
14
+ o.signal?.aborted ? t.abort(o.signal.reason) : o.signal?.addEventListener("abort", onAbort, { once: !0 });
15
15
  try {
16
- let t = await c.acquire({
16
+ let r = await c.acquire({
17
17
  priority: l,
18
- signal: e.signal
19
- }, (t) => (r = t, c.trackActive(1), onCancel = () => r?.cancel(a(e.signal)), e.signal.addEventListener("abort", onCancel, { once: !0 }), t.stream(n, {
18
+ signal: t.signal
19
+ }, (r) => (n = r, c.trackActive(1), onCancel = () => n?.cancel(a(t.signal)), t.signal.addEventListener("abort", onCancel, { once: !0 }), r.stream(e, {
20
20
  priority: l,
21
- signal: e.signal,
21
+ signal: t.signal,
22
22
  timeout: u,
23
23
  transferables: d
24
24
  })));
25
- for await (let e of t.iterable) yield e;
26
- await t.done, c.trackCompleted();
27
- } catch (n) {
28
- throw r && !e.signal.aborted && !(n instanceof t) && c.trackFailed(), n;
25
+ for await (let e of r.iterable) yield e;
26
+ await r.done, c.trackCompleted();
27
+ } catch (e) {
28
+ throw n && !t.signal.aborted && !(e instanceof i) && c.trackFailed(), e;
29
29
  } finally {
30
- o.signal?.removeEventListener("abort", onAbort), r && (onCancel && e.signal.removeEventListener("abort", onCancel), c.trackActive(-1), c.release(r), c.settleIdle());
30
+ o.signal?.removeEventListener("abort", onAbort), n && (onCancel && t.signal.removeEventListener("abort", onCancel), c.trackActive(-1), c.release(n), c.settleIdle());
31
31
  }
32
32
  };
33
33
  return { [Symbol.asyncIterator]() {
34
- let n = {}, r = new AbortController(), i, start = () => {
35
- if (f ??= n, f === n) return i ??= iterate(r), i;
34
+ let e = {}, t = new AbortController(), n, start = () => {
35
+ if (f ??= e, f === e) return n ??= iterate(t), n;
36
36
  };
37
37
  return {
38
- next: () => start()?.next() ?? Promise.reject(new e("Worker streams can only be consumed once")),
39
- return: async (e) => !f || f !== n ? {
38
+ next: () => start()?.next() ?? Promise.reject(new r("Worker streams can only be consumed once")),
39
+ return: async (r) => !f || f !== e ? {
40
40
  done: !0,
41
- value: e
42
- } : (r.abort(new t("Stream consumer stopped")), i?.return(e) ?? {
41
+ value: r
42
+ } : (t.abort(new i("Stream consumer stopped")), n?.return(r) ?? {
43
43
  done: !0,
44
- value: e
44
+ value: r
45
45
  }),
46
- throw: async (t) => {
46
+ throw: async (e) => {
47
47
  let n = start();
48
- if (!n) throw new e("Worker streams can only be consumed once");
49
- return r.abort(t), n.throw(t);
48
+ if (!n) throw new r("Worker streams can only be consumed once");
49
+ return t.abort(e), n.throw(e);
50
50
  }
51
51
  };
52
52
  } };
@@ -72,7 +72,6 @@ function createStreamPool(o, s) {
72
72
  [Symbol.dispose]: c.dispose
73
73
  };
74
74
  }
75
- //#endregion
76
75
  export { createStreamPool };
77
76
 
78
77
  //# sourceMappingURL=_stream-pool.js.map
package/dist/_timers.js CHANGED
@@ -1,8 +1,7 @@
1
- //#region src/_timers.ts
1
+ // src/_timers.ts
2
2
  function unrefTimer(e) {
3
3
  typeof e == "object" && e && "unref" in e && e.unref();
4
4
  }
5
- //#endregion
6
5
  export { unrefTimer };
7
6
 
8
7
  //# sourceMappingURL=_timers.js.map
package/dist/errors.js CHANGED
@@ -1,4 +1,4 @@
1
- //#region src/errors.ts
1
+ // src/errors.ts
2
2
  var FamiliarError = class extends Error {
3
3
  constructor(e, t) {
4
4
  super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
@@ -18,7 +18,6 @@ var FamiliarError = class extends Error {
18
18
  super(`${t} timed out after ${e}ms`), this.timeoutMs = e;
19
19
  }
20
20
  }, FamiliarRuntimeError = class extends FamiliarError {};
21
- //#endregion
22
21
  export { FamiliarError, FamiliarInvalidOptionsError, FamiliarQueueFullError, FamiliarRuntimeError, FamiliarTaskError, FamiliarTerminatedError, FamiliarTimeoutError };
23
22
 
24
23
  //# sourceMappingURL=errors.js.map
package/dist/familiar.js CHANGED
@@ -1,10 +1,9 @@
1
1
  import { abortError as e, tapper as t } from "@vielzeug/arsenal";
2
- //#region src/_timers.ts
2
+ // src/_timers.ts
3
3
  function unrefTimer(e) {
4
4
  typeof e == "object" && e && "unref" in e && e.unref();
5
5
  }
6
- //#endregion
7
- //#region src/errors.ts
6
+ // src/errors.ts
8
7
  var FamiliarError = class extends Error {
9
8
  constructor(e, t) {
10
9
  super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
@@ -187,8 +186,7 @@ function createPoolCore(n, r) {
187
186
  }
188
187
  };
189
188
  }
190
- //#endregion
191
- //#region src/_pool.ts
189
+ // src/_pool.ts
192
190
  function createPool(t, n) {
193
191
  let r = createPoolCore(t, n);
194
192
  for (let e of t) e.notify = (e) => r.emitTap({
@@ -293,8 +291,7 @@ function runBatch(t, n, r = {}) {
293
291
  };
294
292
  } };
295
293
  }
296
- //#endregion
297
- //#region src/_stream-pool.ts
294
+ // src/_stream-pool.ts
298
295
  function createStreamPool(t, n) {
299
296
  let r = createPoolCore(t, n);
300
297
  for (let e of t) e.notify = (e) => r.emitTap({
@@ -365,8 +362,7 @@ function createStreamPool(t, n) {
365
362
  [Symbol.dispose]: r.dispose
366
363
  };
367
364
  }
368
- //#endregion
369
- //#region src/worker.ts
365
+ // src/worker.ts
370
366
  function resolveOptions(e = {}) {
371
367
  let { concurrency: t = 1, maxQueue: n, onFull: r = "reject", timeout: i } = e, a = t === "auto" ? Math.min(512, Math.max(1, globalThis.navigator?.hardwareConcurrency ?? 1)) : t;
372
368
  if (!Number.isInteger(a) || a < 1 || a > 512) throw new FamiliarInvalidOptionsError("`concurrency` must be a positive integer ≤ 512 or \"auto\"");
@@ -523,7 +519,6 @@ function createStreamWorker(e, t = {}) {
523
519
  onFull: n.onFull
524
520
  });
525
521
  }
526
- //#endregion
527
522
  export { FamiliarError, FamiliarInvalidOptionsError, FamiliarQueueFullError, FamiliarRuntimeError, FamiliarTaskError, FamiliarTerminatedError, FamiliarTimeoutError, createStreamWorker, createWorker, runBatch };
528
523
 
529
524
  //# sourceMappingURL=familiar.js.map