@vielzeug/flux 2.4.0 → 3.0.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.
- package/README.md +12 -22
- package/dist/_iterator.cjs +1 -1
- package/dist/_iterator.cjs.map +1 -1
- package/dist/_iterator.d.ts +1 -1
- package/dist/_iterator.d.ts.map +1 -1
- package/dist/_iterator.js +35 -31
- package/dist/_iterator.js.map +1 -1
- package/dist/_link.cjs.map +1 -1
- package/dist/_link.d.ts +1 -1
- package/dist/_link.d.ts.map +1 -1
- package/dist/_link.js.map +1 -1
- package/dist/_numeric.cjs +1 -1
- package/dist/_numeric.cjs.map +1 -1
- package/dist/_numeric.js +1 -1
- package/dist/_numeric.js.map +1 -1
- package/dist/_subscription.cjs.map +1 -1
- package/dist/_subscription.d.ts +1 -1
- package/dist/_subscription.d.ts.map +1 -1
- package/dist/_subscription.js.map +1 -1
- package/dist/async.cjs.map +1 -1
- package/dist/async.d.ts +1 -1
- package/dist/async.d.ts.map +1 -1
- package/dist/async.js.map +1 -1
- package/dist/channel.cjs +1 -1
- package/dist/channel.cjs.map +1 -1
- package/dist/channel.d.ts +1 -1
- package/dist/channel.d.ts.map +1 -1
- package/dist/channel.js +1 -1
- package/dist/channel.js.map +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +8 -1
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +30 -1
- package/dist/core.js.map +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +4 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +5 -1
- package/dist/errors.js.map +1 -1
- package/dist/flux.cjs +1 -1
- package/dist/flux.cjs.map +1 -1
- package/dist/flux.iife.js +1 -1
- package/dist/flux.iife.js.map +1 -1
- package/dist/flux.js +1 -1
- package/dist/flux.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +13 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -10
- package/dist/operators/combination.cjs +1 -1
- package/dist/operators/combination.cjs.map +1 -1
- package/dist/operators/combination.d.ts +1 -1
- package/dist/operators/combination.d.ts.map +1 -1
- package/dist/operators/combination.js +28 -13
- package/dist/operators/combination.js.map +1 -1
- package/dist/operators/creation.cjs +1 -1
- package/dist/operators/creation.cjs.map +1 -1
- package/dist/operators/creation.d.ts +1 -1
- package/dist/operators/creation.d.ts.map +1 -1
- package/dist/operators/creation.js +36 -30
- package/dist/operators/creation.js.map +1 -1
- package/dist/operators/filtering.cjs +1 -1
- package/dist/operators/filtering.cjs.map +1 -1
- package/dist/operators/filtering.d.ts +1 -1
- package/dist/operators/filtering.d.ts.map +1 -1
- package/dist/operators/filtering.js +31 -28
- package/dist/operators/filtering.js.map +1 -1
- package/dist/operators/transformation.cjs +1 -1
- package/dist/operators/transformation.cjs.map +1 -1
- package/dist/operators/transformation.d.ts +1 -1
- package/dist/operators/transformation.d.ts.map +1 -1
- package/dist/operators/transformation.js +50 -50
- package/dist/operators/transformation.js.map +1 -1
- package/dist/operators/utility.cjs +1 -1
- package/dist/operators/utility.cjs.map +1 -1
- package/dist/operators/utility.d.ts +5 -5
- package/dist/operators/utility.d.ts.map +1 -1
- package/dist/operators/utility.js +57 -57
- package/dist/operators/utility.js.map +1 -1
- package/dist/pipe.cjs.map +1 -1
- package/dist/pipe.d.ts +1 -1
- package/dist/pipe.d.ts.map +1 -1
- package/dist/pipe.js.map +1 -1
- package/dist/subjects.d.ts +2 -2
- package/dist/subjects.d.ts.map +1 -1
- package/package.json +10 -62
- package/dist/adapters/courier.cjs +0 -2
- package/dist/adapters/courier.cjs.map +0 -1
- package/dist/adapters/courier.d.ts +0 -4
- package/dist/adapters/courier.d.ts.map +0 -1
- package/dist/adapters/courier.js +0 -12
- package/dist/adapters/courier.js.map +0 -1
- package/dist/adapters/herald.cjs +0 -2
- package/dist/adapters/herald.cjs.map +0 -1
- package/dist/adapters/herald.d.ts +0 -5
- package/dist/adapters/herald.d.ts.map +0 -1
- package/dist/adapters/herald.js +0 -22
- package/dist/adapters/herald.js.map +0 -1
- package/dist/adapters/pulse.cjs +0 -2
- package/dist/adapters/pulse.cjs.map +0 -1
- package/dist/adapters/pulse.d.ts +0 -5
- package/dist/adapters/pulse.d.ts.map +0 -1
- package/dist/adapters/pulse.js +0 -18
- package/dist/adapters/pulse.js.map +0 -1
- package/dist/adapters/ripple.cjs +0 -2
- package/dist/adapters/ripple.cjs.map +0 -1
- package/dist/adapters/ripple.d.ts +0 -19
- package/dist/adapters/ripple.d.ts.map +0 -1
- package/dist/adapters/ripple.js +0 -46
- package/dist/adapters/ripple.js.map +0 -1
- package/dist/courier.cjs +0 -1
- package/dist/courier.d.ts +0 -2
- package/dist/courier.d.ts.map +0 -1
- package/dist/courier.js +0 -2
- package/dist/herald.cjs +0 -1
- package/dist/herald.d.ts +0 -2
- package/dist/herald.d.ts.map +0 -1
- package/dist/herald.js +0 -2
- package/dist/pulse.cjs +0 -1
- package/dist/pulse.d.ts +0 -2
- package/dist/pulse.d.ts.map +0 -1
- package/dist/pulse.js +0 -2
- package/dist/ripple.cjs +0 -1
- package/dist/ripple.d.ts +0 -3
- package/dist/ripple.d.ts.map +0 -1
- package/dist/ripple.js +0 -2
package/README.md
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
# @vielzeug/flux
|
|
2
2
|
|
|
3
|
-
Minimal push streams
|
|
3
|
+
> Minimal push streams with explicit ownership, bounded buffering, and structural bridges
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Installation
|
|
6
6
|
|
|
7
7
|
```sh
|
|
8
8
|
pnpm add @vielzeug/flux
|
|
9
|
+
npm install @vielzeug/flux
|
|
10
|
+
yarn add @vielzeug/flux
|
|
9
11
|
```
|
|
10
12
|
|
|
11
|
-
##
|
|
13
|
+
## Quick Start
|
|
12
14
|
|
|
13
15
|
```ts
|
|
14
16
|
import { toArray, interval, map, pipe, take } from '@vielzeug/flux';
|
|
@@ -22,26 +24,14 @@ const values = pipe(
|
|
|
22
24
|
console.log(await toArray(values, { maxItems: 3 })); // [0, 2, 4]
|
|
23
25
|
```
|
|
24
26
|
|
|
25
|
-
##
|
|
27
|
+
## Documentation
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
events.send('connected');
|
|
33
|
-
events.dispose();
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Adapters
|
|
37
|
-
|
|
38
|
-
```ts
|
|
39
|
-
import { fromQuery } from '@vielzeug/flux/courier';
|
|
40
|
-
import { fromBus } from '@vielzeug/flux/herald';
|
|
41
|
-
import { fromRoomPresence } from '@vielzeug/flux/pulse';
|
|
42
|
-
import { fromSignal, toSignal } from '@vielzeug/flux/ripple';
|
|
43
|
-
```
|
|
29
|
+
- [Overview](https://vielzeug.dev/flux/)
|
|
30
|
+
- [Usage Guide](https://vielzeug.dev/flux/usage)
|
|
31
|
+
- [API Reference](https://vielzeug.dev/flux/api)
|
|
32
|
+
- [Examples](https://vielzeug.dev/flux/examples)
|
|
33
|
+
- [Migration Guide](https://vielzeug.dev/flux/migration)
|
|
44
34
|
|
|
45
35
|
## License
|
|
46
36
|
|
|
47
|
-
MIT
|
|
37
|
+
MIT © [Helmuth Saatkamp](https://github.com/helmuthdu) — part of the [Vielzeug](https://github.com/helmuthdu/vielzeug) monorepo.
|
package/dist/_iterator.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./_numeric.cjs");function
|
|
1
|
+
const e=require("./_numeric.cjs"),t=require("./errors.cjs");let n=require("@vielzeug/arsenal");function r(r,i){if(e.assertPositiveInteger(i.capacity,`Async iterable capacity`),i.overflow!==`drop-newest`&&i.overflow!==`drop-oldest`&&i.overflow!==`error`)throw RangeError(`Async iterable overflow must be "drop-newest", "drop-oldest", or "error"`);let a=new AbortController,o=[],s={kind:`open`,queue:[]},c=()=>i.signal?.removeEventListener(`abort`,f),l=()=>{for(;o.length>0;)o.shift()?.resolve({done:!0,value:void 0})},u=()=>{s.kind===`open`&&(s.kind=`complete`,c(),l())},d=e=>{if(s.kind===`open`)for(s={kind:`error`,queue:s.queue,reason:e},a.abort(),c();o.length>0;)o.shift()?.reject(e)},f=()=>{d((0,n.abortError)(i.signal,`Async iteration aborted`))},p=()=>{a.abort(),c(),s={kind:`returned`},l()},m={complete:u,error:d,next(e){if(s.kind!==`open`)return;let n=o.shift();if(n){n.resolve({done:!1,value:e});return}if(s.queue.length<i.capacity){s.queue.push(e);return}i.overflow===`drop-oldest`?(s.queue.shift(),s.queue.push(e)):i.overflow===`error`&&d(new t.FluxCapacityError(i.capacity,`Async iterable buffer capacity exceeded`))}};return i.signal?.aborted?f():i.signal?.addEventListener(`abort`,f,{once:!0}),r.subscribe(m,{signal:a.signal}),{next(){return s.kind===`returned`?Promise.resolve({done:!0,value:void 0}):s.queue.length>0?Promise.resolve({done:!1,value:s.queue.shift()}):s.kind===`error`?Promise.reject(s.reason):s.kind===`complete`?Promise.resolve({done:!0,value:void 0}):new Promise((e,t)=>o.push({reject:t,resolve:e}))},return(){return p(),Promise.resolve({done:!0,value:void 0})},[Symbol.asyncIterator](){return this}}}exports.toIterator=r;
|
|
2
2
|
//# sourceMappingURL=_iterator.cjs.map
|
package/dist/_iterator.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_iterator.cjs","names":[],"sources":["../src/_iterator.ts"],"sourcesContent":["import { assertPositiveInteger } from './_numeric';\nimport type { AsyncIterableOptions, Observer, Stream } from './types';\n\ntype Pending<T> = {\n reject(reason: unknown): void;\n resolve(result: IteratorResult<T>): void;\n};\n\ntype IteratorState<T> =\n | { kind: 'complete' | 'open'; queue: T[] }\n | { kind: 'error'; queue: T[]; reason: unknown }\n | { kind: 'returned' };\n\n/** Async iteration requires explicit queue policy because streams are push based. */\nexport function toIterator<T>(source: Stream<T>, options: AsyncIterableOptions): AsyncIterableIterator<T> {\n assertPositiveInteger(options.capacity, 'Async iterable capacity');\n\n const controller = new AbortController();\n const pending: Pending<T>[] = [];\n let state: IteratorState<T> = { kind: 'open', queue: [] };\n\n const detach = (): void => options.signal?.removeEventListener('abort',
|
|
1
|
+
{"version":3,"file":"_iterator.cjs","names":[],"sources":["../src/_iterator.ts"],"sourcesContent":["import { abortError } from '@vielzeug/arsenal';\nimport { assertPositiveInteger } from './_numeric.js';\n\nimport { FluxCapacityError } from './errors.js';\nimport type { AsyncIterableOptions, Observer, Stream } from './types.js';\n\ntype Pending<T> = {\n reject(reason: unknown): void;\n resolve(result: IteratorResult<T>): void;\n};\n\ntype IteratorState<T> =\n | { kind: 'complete' | 'open'; queue: T[] }\n | { kind: 'error'; queue: T[]; reason: unknown }\n | { kind: 'returned' };\n\n/** Async iteration requires explicit queue policy because streams are push based. */\nexport function toIterator<T>(source: Stream<T>, options: AsyncIterableOptions): AsyncIterableIterator<T> {\n assertPositiveInteger(options.capacity, 'Async iterable capacity');\n if (options.overflow !== 'drop-newest' && options.overflow !== 'drop-oldest' && options.overflow !== 'error') {\n throw new RangeError('Async iterable overflow must be \"drop-newest\", \"drop-oldest\", or \"error\"');\n }\n\n const controller = new AbortController();\n const pending: Pending<T>[] = [];\n let state: IteratorState<T> = { kind: 'open', queue: [] };\n\n const detach = (): void => options.signal?.removeEventListener('abort', abort);\n\n const resolveDone = (): void => {\n while (pending.length > 0) pending.shift()?.resolve({ done: true, value: undefined as T });\n };\n\n const complete = (): void => {\n if (state.kind !== 'open') return;\n\n state.kind = 'complete';\n detach();\n resolveDone();\n };\n\n const fail = (reason: unknown): void => {\n if (state.kind !== 'open') return;\n\n state = { kind: 'error', queue: state.queue, reason };\n controller.abort();\n detach();\n\n while (pending.length > 0) pending.shift()?.reject(reason);\n };\n\n const abort = (): void => {\n fail(abortError(options.signal, 'Async iteration aborted'));\n };\n\n const stop = (): void => {\n controller.abort();\n detach();\n state = { kind: 'returned' };\n resolveDone();\n };\n\n const observer: Observer<T> = {\n complete,\n error: fail,\n next(value) {\n if (state.kind !== 'open') return;\n\n const waiter = pending.shift();\n\n if (waiter) {\n waiter.resolve({ done: false, value });\n\n return;\n }\n\n if (state.queue.length < options.capacity) {\n state.queue.push(value);\n\n return;\n }\n\n if (options.overflow === 'drop-oldest') {\n state.queue.shift();\n state.queue.push(value);\n } else if (options.overflow === 'error') {\n fail(new FluxCapacityError(options.capacity, 'Async iterable buffer capacity exceeded'));\n }\n },\n };\n\n if (options.signal?.aborted) abort();\n else options.signal?.addEventListener('abort', abort, { once: true });\n\n source.subscribe(observer, { signal: controller.signal });\n\n return {\n next(): Promise<IteratorResult<T>> {\n if (state.kind === 'returned') return Promise.resolve({ done: true, value: undefined as T });\n\n if (state.queue.length > 0) return Promise.resolve({ done: false, value: state.queue.shift()! });\n\n if (state.kind === 'error') return Promise.reject(state.reason);\n\n if (state.kind === 'complete') return Promise.resolve({ done: true, value: undefined as T });\n\n return new Promise<IteratorResult<T>>((resolve, reject) => pending.push({ reject, resolve }));\n },\n return(): Promise<IteratorResult<T>> {\n stop();\n\n return Promise.resolve({ done: true, value: undefined as T });\n },\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return this;\n },\n };\n}\n"],"mappings":"+FAiBA,SAAgB,EAAc,EAAmB,EAAyD,CAExG,GADA,EAAA,sBAAsB,EAAQ,SAAU,yBAAyB,EAC7D,EAAQ,WAAa,eAAiB,EAAQ,WAAa,eAAiB,EAAQ,WAAa,QACnG,MAAU,WAAW,0EAA0E,EAGjG,IAAM,EAAa,IAAI,gBACjB,EAAwB,CAAC,EAC3B,EAA0B,CAAE,KAAM,OAAQ,MAAO,CAAC,CAAE,EAElD,MAAqB,EAAQ,QAAQ,oBAAoB,QAAS,CAAK,EAEvE,MAA0B,CAC9B,KAAO,EAAQ,OAAS,GAAG,EAAQ,MAAM,CAAC,EAAE,QAAQ,CAAE,KAAM,GAAM,MAAO,IAAA,EAAe,CAAC,CAC3F,EAEM,MAAuB,CACvB,EAAM,OAAS,SAEnB,EAAM,KAAO,WACb,EAAO,EACP,EAAY,EACd,EAEM,EAAQ,GAA0B,CAClC,KAAM,OAAS,OAMnB,IAJA,EAAQ,CAAE,KAAM,QAAS,MAAO,EAAM,MAAO,QAAO,EACpD,EAAW,MAAM,EACjB,EAAO,EAEA,EAAQ,OAAS,GAAG,EAAQ,MAAM,CAAC,EAAE,OAAO,CAAM,CAC3D,EAEM,MAAoB,CACxB,GAAA,EAAK,EAAA,WAAA,CAAW,EAAQ,OAAQ,yBAAyB,CAAC,CAC5D,EAEM,MAAmB,CACvB,EAAW,MAAM,EACjB,EAAO,EACP,EAAQ,CAAE,KAAM,UAAW,EAC3B,EAAY,CACd,EAEM,EAAwB,CAC5B,WACA,MAAO,EACP,KAAK,EAAO,CACV,GAAI,EAAM,OAAS,OAAQ,OAE3B,IAAM,EAAS,EAAQ,MAAM,EAE7B,GAAI,EAAQ,CACV,EAAO,QAAQ,CAAE,KAAM,GAAO,OAAM,CAAC,EAErC,MACF,CAEA,GAAI,EAAM,MAAM,OAAS,EAAQ,SAAU,CACzC,EAAM,MAAM,KAAK,CAAK,EAEtB,MACF,CAEI,EAAQ,WAAa,eACvB,EAAM,MAAM,MAAM,EAClB,EAAM,MAAM,KAAK,CAAK,GACb,EAAQ,WAAa,SAC9B,EAAK,IAAI,EAAA,kBAAkB,EAAQ,SAAU,yCAAyC,CAAC,CAE3F,CACF,EAOA,OALI,EAAQ,QAAQ,QAAS,EAAM,EAC9B,EAAQ,QAAQ,iBAAiB,QAAS,EAAO,CAAE,KAAM,EAAK,CAAC,EAEpE,EAAO,UAAU,EAAU,CAAE,OAAQ,EAAW,MAAO,CAAC,EAEjD,CACL,MAAmC,CASjC,OARI,EAAM,OAAS,WAAmB,QAAQ,QAAQ,CAAE,KAAM,GAAM,MAAO,IAAA,EAAe,CAAC,EAEvF,EAAM,MAAM,OAAS,EAAU,QAAQ,QAAQ,CAAE,KAAM,GAAO,MAAO,EAAM,MAAM,MAAM,CAAG,CAAC,EAE3F,EAAM,OAAS,QAAgB,QAAQ,OAAO,EAAM,MAAM,EAE1D,EAAM,OAAS,WAAmB,QAAQ,QAAQ,CAAE,KAAM,GAAM,MAAO,IAAA,EAAe,CAAC,EAEpF,IAAI,SAA4B,EAAS,IAAW,EAAQ,KAAK,CAAE,SAAQ,SAAQ,CAAC,CAAC,CAC9F,EACA,QAAqC,CAGnC,OAFA,EAAK,EAEE,QAAQ,QAAQ,CAAE,KAAM,GAAM,MAAO,IAAA,EAAe,CAAC,CAC9D,EACA,CAAC,OAAO,gBAA2C,CACjD,OAAO,IACT,CACF,CACF"}
|
package/dist/_iterator.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AsyncIterableOptions, Stream } from './types';
|
|
1
|
+
import type { AsyncIterableOptions, Stream } from './types.js';
|
|
2
2
|
/** Async iteration requires explicit queue policy because streams are push based. */
|
|
3
3
|
export declare function toIterator<T>(source: Stream<T>, options: AsyncIterableOptions): AsyncIterableIterator<T>;
|
|
4
4
|
//# sourceMappingURL=_iterator.d.ts.map
|
package/dist/_iterator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_iterator.d.ts","sourceRoot":"","sources":["../src/_iterator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"_iterator.d.ts","sourceRoot":"","sources":["../src/_iterator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAY,MAAM,EAAE,MAAM,YAAY,CAAC;AAYzE,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAoGxG"}
|
package/dist/_iterator.js
CHANGED
|
@@ -1,63 +1,67 @@
|
|
|
1
1
|
import { assertPositiveInteger as e } from "./_numeric.js";
|
|
2
|
+
import { FluxCapacityError as t } from "./errors.js";
|
|
3
|
+
import { abortError as n } from "@vielzeug/arsenal";
|
|
2
4
|
//#region src/_iterator.ts
|
|
3
|
-
function
|
|
4
|
-
e(
|
|
5
|
-
let
|
|
5
|
+
function r(r, i) {
|
|
6
|
+
if (e(i.capacity, "Async iterable capacity"), i.overflow !== "drop-newest" && i.overflow !== "drop-oldest" && i.overflow !== "error") throw RangeError("Async iterable overflow must be \"drop-newest\", \"drop-oldest\", or \"error\"");
|
|
7
|
+
let a = new AbortController(), o = [], s = {
|
|
6
8
|
kind: "open",
|
|
7
9
|
queue: []
|
|
8
|
-
},
|
|
9
|
-
for (;
|
|
10
|
+
}, c = () => i.signal?.removeEventListener("abort", f), l = () => {
|
|
11
|
+
for (; o.length > 0;) o.shift()?.resolve({
|
|
10
12
|
done: !0,
|
|
11
13
|
value: void 0
|
|
12
14
|
});
|
|
13
|
-
},
|
|
14
|
-
|
|
15
|
-
},
|
|
16
|
-
if (
|
|
15
|
+
}, u = () => {
|
|
16
|
+
s.kind === "open" && (s.kind = "complete", c(), l());
|
|
17
|
+
}, d = (e) => {
|
|
18
|
+
if (s.kind === "open") for (s = {
|
|
17
19
|
kind: "error",
|
|
18
|
-
queue:
|
|
20
|
+
queue: s.queue,
|
|
19
21
|
reason: e
|
|
20
|
-
},
|
|
21
|
-
},
|
|
22
|
-
|
|
23
|
-
},
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
}, a.abort(), c(); o.length > 0;) o.shift()?.reject(e);
|
|
23
|
+
}, f = () => {
|
|
24
|
+
d(n(i.signal, "Async iteration aborted"));
|
|
25
|
+
}, p = () => {
|
|
26
|
+
a.abort(), c(), s = { kind: "returned" }, l();
|
|
27
|
+
}, m = {
|
|
28
|
+
complete: u,
|
|
29
|
+
error: d,
|
|
26
30
|
next(e) {
|
|
27
|
-
if (
|
|
28
|
-
let
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
+
if (s.kind !== "open") return;
|
|
32
|
+
let n = o.shift();
|
|
33
|
+
if (n) {
|
|
34
|
+
n.resolve({
|
|
31
35
|
done: !1,
|
|
32
36
|
value: e
|
|
33
37
|
});
|
|
34
38
|
return;
|
|
35
39
|
}
|
|
36
|
-
if (
|
|
37
|
-
|
|
40
|
+
if (s.queue.length < i.capacity) {
|
|
41
|
+
s.queue.push(e);
|
|
38
42
|
return;
|
|
39
43
|
}
|
|
40
|
-
|
|
44
|
+
i.overflow === "drop-oldest" ? (s.queue.shift(), s.queue.push(e)) : i.overflow === "error" && d(new t(i.capacity, "Async iterable buffer capacity exceeded"));
|
|
41
45
|
}
|
|
42
46
|
};
|
|
43
|
-
return
|
|
47
|
+
return i.signal?.aborted ? f() : i.signal?.addEventListener("abort", f, { once: !0 }), r.subscribe(m, { signal: a.signal }), {
|
|
44
48
|
next() {
|
|
45
|
-
return
|
|
49
|
+
return s.kind === "returned" ? Promise.resolve({
|
|
46
50
|
done: !0,
|
|
47
51
|
value: void 0
|
|
48
|
-
}) :
|
|
52
|
+
}) : s.queue.length > 0 ? Promise.resolve({
|
|
49
53
|
done: !1,
|
|
50
|
-
value:
|
|
51
|
-
}) :
|
|
54
|
+
value: s.queue.shift()
|
|
55
|
+
}) : s.kind === "error" ? Promise.reject(s.reason) : s.kind === "complete" ? Promise.resolve({
|
|
52
56
|
done: !0,
|
|
53
57
|
value: void 0
|
|
54
|
-
}) : new Promise((e, t) =>
|
|
58
|
+
}) : new Promise((e, t) => o.push({
|
|
55
59
|
reject: t,
|
|
56
60
|
resolve: e
|
|
57
61
|
}));
|
|
58
62
|
},
|
|
59
63
|
return() {
|
|
60
|
-
return
|
|
64
|
+
return p(), Promise.resolve({
|
|
61
65
|
done: !0,
|
|
62
66
|
value: void 0
|
|
63
67
|
});
|
|
@@ -68,6 +72,6 @@ function t(t, n) {
|
|
|
68
72
|
};
|
|
69
73
|
}
|
|
70
74
|
//#endregion
|
|
71
|
-
export {
|
|
75
|
+
export { r as toIterator };
|
|
72
76
|
|
|
73
77
|
//# sourceMappingURL=_iterator.js.map
|
package/dist/_iterator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_iterator.js","names":[],"sources":["../src/_iterator.ts"],"sourcesContent":["import { assertPositiveInteger } from './_numeric';\nimport type { AsyncIterableOptions, Observer, Stream } from './types';\n\ntype Pending<T> = {\n reject(reason: unknown): void;\n resolve(result: IteratorResult<T>): void;\n};\n\ntype IteratorState<T> =\n | { kind: 'complete' | 'open'; queue: T[] }\n | { kind: 'error'; queue: T[]; reason: unknown }\n | { kind: 'returned' };\n\n/** Async iteration requires explicit queue policy because streams are push based. */\nexport function toIterator<T>(source: Stream<T>, options: AsyncIterableOptions): AsyncIterableIterator<T> {\n assertPositiveInteger(options.capacity, 'Async iterable capacity');\n\n const controller = new AbortController();\n const pending: Pending<T>[] = [];\n let state: IteratorState<T> = { kind: 'open', queue: [] };\n\n const detach = (): void => options.signal?.removeEventListener('abort',
|
|
1
|
+
{"version":3,"file":"_iterator.js","names":[],"sources":["../src/_iterator.ts"],"sourcesContent":["import { abortError } from '@vielzeug/arsenal';\nimport { assertPositiveInteger } from './_numeric.js';\n\nimport { FluxCapacityError } from './errors.js';\nimport type { AsyncIterableOptions, Observer, Stream } from './types.js';\n\ntype Pending<T> = {\n reject(reason: unknown): void;\n resolve(result: IteratorResult<T>): void;\n};\n\ntype IteratorState<T> =\n | { kind: 'complete' | 'open'; queue: T[] }\n | { kind: 'error'; queue: T[]; reason: unknown }\n | { kind: 'returned' };\n\n/** Async iteration requires explicit queue policy because streams are push based. */\nexport function toIterator<T>(source: Stream<T>, options: AsyncIterableOptions): AsyncIterableIterator<T> {\n assertPositiveInteger(options.capacity, 'Async iterable capacity');\n if (options.overflow !== 'drop-newest' && options.overflow !== 'drop-oldest' && options.overflow !== 'error') {\n throw new RangeError('Async iterable overflow must be \"drop-newest\", \"drop-oldest\", or \"error\"');\n }\n\n const controller = new AbortController();\n const pending: Pending<T>[] = [];\n let state: IteratorState<T> = { kind: 'open', queue: [] };\n\n const detach = (): void => options.signal?.removeEventListener('abort', abort);\n\n const resolveDone = (): void => {\n while (pending.length > 0) pending.shift()?.resolve({ done: true, value: undefined as T });\n };\n\n const complete = (): void => {\n if (state.kind !== 'open') return;\n\n state.kind = 'complete';\n detach();\n resolveDone();\n };\n\n const fail = (reason: unknown): void => {\n if (state.kind !== 'open') return;\n\n state = { kind: 'error', queue: state.queue, reason };\n controller.abort();\n detach();\n\n while (pending.length > 0) pending.shift()?.reject(reason);\n };\n\n const abort = (): void => {\n fail(abortError(options.signal, 'Async iteration aborted'));\n };\n\n const stop = (): void => {\n controller.abort();\n detach();\n state = { kind: 'returned' };\n resolveDone();\n };\n\n const observer: Observer<T> = {\n complete,\n error: fail,\n next(value) {\n if (state.kind !== 'open') return;\n\n const waiter = pending.shift();\n\n if (waiter) {\n waiter.resolve({ done: false, value });\n\n return;\n }\n\n if (state.queue.length < options.capacity) {\n state.queue.push(value);\n\n return;\n }\n\n if (options.overflow === 'drop-oldest') {\n state.queue.shift();\n state.queue.push(value);\n } else if (options.overflow === 'error') {\n fail(new FluxCapacityError(options.capacity, 'Async iterable buffer capacity exceeded'));\n }\n },\n };\n\n if (options.signal?.aborted) abort();\n else options.signal?.addEventListener('abort', abort, { once: true });\n\n source.subscribe(observer, { signal: controller.signal });\n\n return {\n next(): Promise<IteratorResult<T>> {\n if (state.kind === 'returned') return Promise.resolve({ done: true, value: undefined as T });\n\n if (state.queue.length > 0) return Promise.resolve({ done: false, value: state.queue.shift()! });\n\n if (state.kind === 'error') return Promise.reject(state.reason);\n\n if (state.kind === 'complete') return Promise.resolve({ done: true, value: undefined as T });\n\n return new Promise<IteratorResult<T>>((resolve, reject) => pending.push({ reject, resolve }));\n },\n return(): Promise<IteratorResult<T>> {\n stop();\n\n return Promise.resolve({ done: true, value: undefined as T });\n },\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return this;\n },\n };\n}\n"],"mappings":";;;;AAiBA,SAAgB,EAAc,GAAmB,GAAyD;CAExG,IADA,EAAsB,EAAQ,UAAU,yBAAyB,GAC7D,EAAQ,aAAa,iBAAiB,EAAQ,aAAa,iBAAiB,EAAQ,aAAa,SACnG,MAAU,WAAW,gFAA0E;CAGjG,IAAM,IAAa,IAAI,gBAAgB,GACjC,IAAwB,CAAC,GAC3B,IAA0B;EAAE,MAAM;EAAQ,OAAO,CAAC;CAAE,GAElD,UAAqB,EAAQ,QAAQ,oBAAoB,SAAS,CAAK,GAEvE,UAA0B;EAC9B,OAAO,EAAQ,SAAS,IAAG,EAAQ,MAAM,CAAC,EAAE,QAAQ;GAAE,MAAM;GAAM,OAAO,KAAA;EAAe,CAAC;CAC3F,GAEM,UAAuB;EACvB,EAAM,SAAS,WAEnB,EAAM,OAAO,YACb,EAAO,GACP,EAAY;CACd,GAEM,KAAQ,MAA0B;EAClC,MAAM,SAAS,QAMnB,KAJA,IAAQ;GAAE,MAAM;GAAS,OAAO,EAAM;GAAO;EAAO,GACpD,EAAW,MAAM,GACjB,EAAO,GAEA,EAAQ,SAAS,IAAG,EAAQ,MAAM,CAAC,EAAE,OAAO,CAAM;CAC3D,GAEM,UAAoB;EACxB,EAAK,EAAW,EAAQ,QAAQ,yBAAyB,CAAC;CAC5D,GAEM,UAAmB;EAIvB,AAHA,EAAW,MAAM,GACjB,EAAO,GACP,IAAQ,EAAE,MAAM,WAAW,GAC3B,EAAY;CACd,GAEM,IAAwB;EAC5B;EACA,OAAO;EACP,KAAK,GAAO;GACV,IAAI,EAAM,SAAS,QAAQ;GAE3B,IAAM,IAAS,EAAQ,MAAM;GAE7B,IAAI,GAAQ;IACV,EAAO,QAAQ;KAAE,MAAM;KAAO;IAAM,CAAC;IAErC;GACF;GAEA,IAAI,EAAM,MAAM,SAAS,EAAQ,UAAU;IACzC,EAAM,MAAM,KAAK,CAAK;IAEtB;GACF;GAEA,AAAI,EAAQ,aAAa,iBACvB,EAAM,MAAM,MAAM,GAClB,EAAM,MAAM,KAAK,CAAK,KACb,EAAQ,aAAa,WAC9B,EAAK,IAAI,EAAkB,EAAQ,UAAU,yCAAyC,CAAC;EAE3F;CACF;CAOA,OALI,EAAQ,QAAQ,UAAS,EAAM,IAC9B,EAAQ,QAAQ,iBAAiB,SAAS,GAAO,EAAE,MAAM,GAAK,CAAC,GAEpE,EAAO,UAAU,GAAU,EAAE,QAAQ,EAAW,OAAO,CAAC,GAEjD;EACL,OAAmC;GASjC,OARI,EAAM,SAAS,aAAmB,QAAQ,QAAQ;IAAE,MAAM;IAAM,OAAO,KAAA;GAAe,CAAC,IAEvF,EAAM,MAAM,SAAS,IAAU,QAAQ,QAAQ;IAAE,MAAM;IAAO,OAAO,EAAM,MAAM,MAAM;GAAG,CAAC,IAE3F,EAAM,SAAS,UAAgB,QAAQ,OAAO,EAAM,MAAM,IAE1D,EAAM,SAAS,aAAmB,QAAQ,QAAQ;IAAE,MAAM;IAAM,OAAO,KAAA;GAAe,CAAC,IAEpF,IAAI,SAA4B,GAAS,MAAW,EAAQ,KAAK;IAAE;IAAQ;GAAQ,CAAC,CAAC;EAC9F;EACA,SAAqC;GAGnC,OAFA,EAAK,GAEE,QAAQ,QAAQ;IAAE,MAAM;IAAM,OAAO,KAAA;GAAe,CAAC;EAC9D;EACA,CAAC,OAAO,iBAA2C;GACjD,OAAO;EACT;CACF;AACF"}
|
package/dist/_link.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_link.cjs","names":[],"sources":["../src/_link.ts"],"sourcesContent":["import type { Observer, Stream, Subscription } from './types';\n\n/** Every operator forwards its own lifetime to every upstream subscription. */\nexport function link<T>(source: Stream<T>, observer: Observer<T>, signal: AbortSignal): Subscription {\n return source.subscribe(observer, { signal });\n}\n"],"mappings":"AAGA,SAAgB,EAAQ,EAAmB,EAAuB,EAAmC,CACnG,OAAO,EAAO,UAAU,EAAU,CAAE,QAAO,CAAC,CAC9C"}
|
|
1
|
+
{"version":3,"file":"_link.cjs","names":[],"sources":["../src/_link.ts"],"sourcesContent":["import type { Observer, Stream, Subscription } from './types.js';\n\n/** Every operator forwards its own lifetime to every upstream subscription. */\nexport function link<T>(source: Stream<T>, observer: Observer<T>, signal: AbortSignal): Subscription {\n return source.subscribe(observer, { signal });\n}\n"],"mappings":"AAGA,SAAgB,EAAQ,EAAmB,EAAuB,EAAmC,CACnG,OAAO,EAAO,UAAU,EAAU,CAAE,QAAO,CAAC,CAC9C"}
|
package/dist/_link.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Observer, Stream, Subscription } from './types';
|
|
1
|
+
import type { Observer, Stream, Subscription } from './types.js';
|
|
2
2
|
/** Every operator forwards its own lifetime to every upstream subscription. */
|
|
3
3
|
export declare function link<T>(source: Stream<T>, observer: Observer<T>, signal: AbortSignal): Subscription;
|
|
4
4
|
//# sourceMappingURL=_link.d.ts.map
|
package/dist/_link.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_link.d.ts","sourceRoot":"","sources":["../src/_link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"_link.d.ts","sourceRoot":"","sources":["../src/_link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE,+EAA+E;AAC/E,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,YAAY,CAEnG"}
|
package/dist/_link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_link.js","names":[],"sources":["../src/_link.ts"],"sourcesContent":["import type { Observer, Stream, Subscription } from './types';\n\n/** Every operator forwards its own lifetime to every upstream subscription. */\nexport function link<T>(source: Stream<T>, observer: Observer<T>, signal: AbortSignal): Subscription {\n return source.subscribe(observer, { signal });\n}\n"],"mappings":";AAGA,SAAgB,EAAQ,GAAmB,GAAuB,GAAmC;CACnG,OAAO,EAAO,UAAU,GAAU,EAAE,UAAO,CAAC;AAC9C"}
|
|
1
|
+
{"version":3,"file":"_link.js","names":[],"sources":["../src/_link.ts"],"sourcesContent":["import type { Observer, Stream, Subscription } from './types.js';\n\n/** Every operator forwards its own lifetime to every upstream subscription. */\nexport function link<T>(source: Stream<T>, observer: Observer<T>, signal: AbortSignal): Subscription {\n return source.subscribe(observer, { signal });\n}\n"],"mappings":";AAGA,SAAgB,EAAQ,GAAmB,GAAuB,GAAmC;CACnG,OAAO,EAAO,UAAU,GAAU,EAAE,UAAO,CAAC;AAC9C"}
|
package/dist/_numeric.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function e(e,t){if(!Number.isInteger(e)||e<0)throw RangeError(`${t} must be a non-negative integer`)}function t(e,t){if(!Number.isInteger(e)||e<1)throw RangeError(`${t} must be a positive integer`)}function n(e,t){if(!Number.isFinite(e)||e<0)throw RangeError(`${t} must be
|
|
1
|
+
function e(e,t){if(!Number.isInteger(e)||e<0)throw RangeError(`${t} must be a non-negative integer`)}function t(e,t){if(!Number.isInteger(e)||e<1)throw RangeError(`${t} must be a positive integer`)}function n(e,t){if(!Number.isFinite(e)||e<0||e>2147483647)throw RangeError(`${t} must be between 0 and 2147483647 milliseconds`)}exports.assertDuration=n,exports.assertNonNegativeInteger=e,exports.assertPositiveInteger=t;
|
|
2
2
|
//# sourceMappingURL=_numeric.cjs.map
|
package/dist/_numeric.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_numeric.cjs","names":[],"sources":["../src/_numeric.ts"],"sourcesContent":["export function assertNonNegativeInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`${name} must be a non-negative integer`);\n }\n}\n\nexport function assertPositiveInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 1) {\n throw new RangeError(`${name} must be a positive integer`);\n }\n}\n\nexport function assertDuration(milliseconds: number, name: string): void {\n if (!Number.isFinite(milliseconds) || milliseconds < 0) {\n throw new RangeError(`${name} must be
|
|
1
|
+
{"version":3,"file":"_numeric.cjs","names":[],"sources":["../src/_numeric.ts"],"sourcesContent":["export function assertNonNegativeInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`${name} must be a non-negative integer`);\n }\n}\n\nexport function assertPositiveInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 1) {\n throw new RangeError(`${name} must be a positive integer`);\n }\n}\n\nexport function assertDuration(milliseconds: number, name: string): void {\n if (!Number.isFinite(milliseconds) || milliseconds < 0 || milliseconds > 2_147_483_647) {\n throw new RangeError(`${name} must be between 0 and 2147483647 milliseconds`);\n }\n}\n"],"mappings":"AAAA,SAAgB,EAAyB,EAAe,EAAoB,CAC1E,GAAI,CAAC,OAAO,UAAU,CAAK,GAAK,EAAQ,EACtC,MAAU,WAAW,GAAG,EAAK,gCAAgC,CAEjE,CAEA,SAAgB,EAAsB,EAAe,EAAoB,CACvE,GAAI,CAAC,OAAO,UAAU,CAAK,GAAK,EAAQ,EACtC,MAAU,WAAW,GAAG,EAAK,4BAA4B,CAE7D,CAEA,SAAgB,EAAe,EAAsB,EAAoB,CACvE,GAAI,CAAC,OAAO,SAAS,CAAY,GAAK,EAAe,GAAK,EAAe,WACvE,MAAU,WAAW,GAAG,EAAK,+CAA+C,CAEhF"}
|
package/dist/_numeric.js
CHANGED
|
@@ -6,7 +6,7 @@ function t(e, t) {
|
|
|
6
6
|
if (!Number.isInteger(e) || e < 1) throw RangeError(`${t} must be a positive integer`);
|
|
7
7
|
}
|
|
8
8
|
function n(e, t) {
|
|
9
|
-
if (!Number.isFinite(e) || e < 0) throw RangeError(`${t} must be
|
|
9
|
+
if (!Number.isFinite(e) || e < 0 || e > 2147483647) throw RangeError(`${t} must be between 0 and 2147483647 milliseconds`);
|
|
10
10
|
}
|
|
11
11
|
//#endregion
|
|
12
12
|
export { n as assertDuration, e as assertNonNegativeInteger, t as assertPositiveInteger };
|
package/dist/_numeric.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_numeric.js","names":[],"sources":["../src/_numeric.ts"],"sourcesContent":["export function assertNonNegativeInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`${name} must be a non-negative integer`);\n }\n}\n\nexport function assertPositiveInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 1) {\n throw new RangeError(`${name} must be a positive integer`);\n }\n}\n\nexport function assertDuration(milliseconds: number, name: string): void {\n if (!Number.isFinite(milliseconds) || milliseconds < 0) {\n throw new RangeError(`${name} must be
|
|
1
|
+
{"version":3,"file":"_numeric.js","names":[],"sources":["../src/_numeric.ts"],"sourcesContent":["export function assertNonNegativeInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`${name} must be a non-negative integer`);\n }\n}\n\nexport function assertPositiveInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 1) {\n throw new RangeError(`${name} must be a positive integer`);\n }\n}\n\nexport function assertDuration(milliseconds: number, name: string): void {\n if (!Number.isFinite(milliseconds) || milliseconds < 0 || milliseconds > 2_147_483_647) {\n throw new RangeError(`${name} must be between 0 and 2147483647 milliseconds`);\n }\n}\n"],"mappings":";AAAA,SAAgB,EAAyB,GAAe,GAAoB;CAC1E,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,GACtC,MAAU,WAAW,GAAG,EAAK,gCAAgC;AAEjE;AAEA,SAAgB,EAAsB,GAAe,GAAoB;CACvE,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,GACtC,MAAU,WAAW,GAAG,EAAK,4BAA4B;AAE7D;AAEA,SAAgB,EAAe,GAAsB,GAAoB;CACvE,IAAI,CAAC,OAAO,SAAS,CAAY,KAAK,IAAe,KAAK,IAAe,YACvE,MAAU,WAAW,GAAG,EAAK,+CAA+C;AAEhF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_subscription.cjs","names":[],"sources":["../src/_subscription.ts"],"sourcesContent":["import type { Observer, Sink, Subscription, Teardown } from './types';\n\n/** @internal Reports an unhandled stream error through the platform's error reporting channel. */\nexport function reportUnhandledError(reason: unknown): void {\n const reportError = (globalThis as { reportError?: (value: unknown) => void }).reportError;\n\n if (reportError) {\n reportError(reason);\n\n return;\n }\n\n queueMicrotask(() => {\n throw reason;\n });\n}\n\nexport function createSubscription<T>(\n observerOrNext: Observer<T> | ((value: T) => void),\n signal?: AbortSignal,\n): { add(teardown: Teardown | undefined): void; signal: AbortSignal; sink: Sink<T>; subscription: Subscription } {\n const observer: Observer<T> = typeof observerOrNext === 'function' ? { next: observerOrNext } : observerOrNext;\n const controller = new AbortController();\n let closed = false;\n let teardown: Teardown | undefined;\n\n const unsubscribe = (): void => {\n if (closed) return;\n\n closed = true;\n controller.abort();\n signal?.removeEventListener('abort', unsubscribe);\n\n try {\n teardown?.();\n } catch (reason) {\n reportUnhandledError(reason);\n }\n };\n\n const sink: Sink<T> = {\n complete(): void {\n if (closed) return;\n\n try {\n observer.complete?.();\n } catch (reason) {\n reportUnhandledError(reason);\n }\n\n unsubscribe();\n },\n\n error(reason: unknown): void {\n if (closed) return;\n\n if (observer.error) {\n try {\n observer.error(reason);\n } catch (callbackError) {\n reportUnhandledError(callbackError);\n }\n } else {\n reportUnhandledError(reason);\n }\n\n unsubscribe();\n },\n\n next(value: T): void {\n if (closed) return;\n\n try {\n observer.next(value);\n } catch (reason) {\n unsubscribe();\n reportUnhandledError(reason);\n }\n },\n };\n\n const add = (nextTeardown: Teardown | undefined): void => {\n if (!nextTeardown) return;\n\n if (closed) {\n try {\n nextTeardown();\n } catch (reason) {\n reportUnhandledError(reason);\n }\n\n return;\n }\n\n teardown = nextTeardown;\n };\n\n if (signal?.aborted) {\n unsubscribe();\n } else {\n signal?.addEventListener('abort', unsubscribe, { once: true });\n }\n\n return {\n add,\n signal: controller.signal,\n sink,\n subscription: {\n get closed(): boolean {\n return closed;\n },\n [Symbol.dispose]: unsubscribe,\n unsubscribe,\n },\n };\n}\n"],"mappings":"AAGA,SAAgB,EAAqB,EAAuB,CAC1D,IAAM,EAAe,WAA0D,YAE/E,GAAI,EAAa,CACf,EAAY,CAAM,EAElB,MACF,CAEA,mBAAqB,CACnB,MAAM,CACR,CAAC,CACH,CAEA,SAAgB,EACd,EACA,EAC+G,CAC/G,IAAM,EAAwB,OAAO,GAAmB,WAAa,CAAE,KAAM,CAAe,EAAI,EAC1F,EAAa,IAAI,gBACnB,EAAS,GACT,EAEE,MAA0B,CAC1B,MAIJ,CAFA,EAAS,GACT,EAAW,MAAM,EACjB,GAAQ,oBAAoB,QAAS,CAAW,EAEhD,GAAI,CACF,IAAW,CACb,OAAS,EAAQ,CACf,EAAqB,CAAM,CAC7B,CANgD,CAOlD,EAiEA,OANI,GAAQ,QACV,EAAY,EAEZ,GAAQ,iBAAiB,QAAS,EAAa,CAAE,KAAM,EAAK,CAAC,EAGxD,CACL,IAvBW,GAA6C,CACnD,KAEL,IAAI,EAAQ,CACV,GAAI,CACF,EAAa,CACf,OAAS,EAAQ,CACf,EAAqB,CAAM,CAC7B,CAEA,MACF,CAEA,EAAW,CAFX,CAGF,EAUE,OAAQ,EAAW,OACnB,MAjEA,UAAiB,CACX,MAEJ,IAAI,CACF,EAAS,WAAW,CACtB,OAAS,EAAQ,CACf,EAAqB,CAAM,CAC7B,CAEA,EAAY,CAFZ,CAGF,EAEA,MAAM,EAAuB,CACvB,MAEJ,IAAI,EAAS,MACX,GAAI,CACF,EAAS,MAAM,CAAM,CACvB,OAAS,EAAe,CACtB,EAAqB,CAAa,CACpC,MAEA,EAAqB,CAAM,EAG7B,EAAY,CAHiB,CAI/B,EAEA,KAAK,EAAgB,CACf,MAEJ,GAAI,CACF,EAAS,KAAK,CAAK,CACrB,OAAS,EAAQ,CACf,EAAY,EACZ,EAAqB,CAAM,CAC7B,CACF,CA4BA,EACA,aAAc,CACZ,IAAI,QAAkB,CACpB,OAAO,CACT,GACC,OAAO,SAAU,EAClB,aACF,CACF,CACF"}
|
|
1
|
+
{"version":3,"file":"_subscription.cjs","names":[],"sources":["../src/_subscription.ts"],"sourcesContent":["import type { Observer, Sink, Subscription, Teardown } from './types.js';\n\n/** @internal Reports an unhandled stream error through the platform's error reporting channel. */\nexport function reportUnhandledError(reason: unknown): void {\n const reportError = (globalThis as { reportError?: (value: unknown) => void }).reportError;\n\n if (reportError) {\n reportError(reason);\n\n return;\n }\n\n queueMicrotask(() => {\n throw reason;\n });\n}\n\nexport function createSubscription<T>(\n observerOrNext: Observer<T> | ((value: T) => void),\n signal?: AbortSignal,\n): { add(teardown: Teardown | undefined): void; signal: AbortSignal; sink: Sink<T>; subscription: Subscription } {\n const observer: Observer<T> = typeof observerOrNext === 'function' ? { next: observerOrNext } : observerOrNext;\n const controller = new AbortController();\n let closed = false;\n let teardown: Teardown | undefined;\n\n const unsubscribe = (): void => {\n if (closed) return;\n\n closed = true;\n controller.abort();\n signal?.removeEventListener('abort', unsubscribe);\n\n try {\n teardown?.();\n } catch (reason) {\n reportUnhandledError(reason);\n }\n };\n\n const sink: Sink<T> = {\n complete(): void {\n if (closed) return;\n\n try {\n observer.complete?.();\n } catch (reason) {\n reportUnhandledError(reason);\n }\n\n unsubscribe();\n },\n\n error(reason: unknown): void {\n if (closed) return;\n\n if (observer.error) {\n try {\n observer.error(reason);\n } catch (callbackError) {\n reportUnhandledError(callbackError);\n }\n } else {\n reportUnhandledError(reason);\n }\n\n unsubscribe();\n },\n\n next(value: T): void {\n if (closed) return;\n\n try {\n observer.next(value);\n } catch (reason) {\n unsubscribe();\n reportUnhandledError(reason);\n }\n },\n };\n\n const add = (nextTeardown: Teardown | undefined): void => {\n if (!nextTeardown) return;\n\n if (closed) {\n try {\n nextTeardown();\n } catch (reason) {\n reportUnhandledError(reason);\n }\n\n return;\n }\n\n teardown = nextTeardown;\n };\n\n if (signal?.aborted) {\n unsubscribe();\n } else {\n signal?.addEventListener('abort', unsubscribe, { once: true });\n }\n\n return {\n add,\n signal: controller.signal,\n sink,\n subscription: {\n get closed(): boolean {\n return closed;\n },\n [Symbol.dispose]: unsubscribe,\n unsubscribe,\n },\n };\n}\n"],"mappings":"AAGA,SAAgB,EAAqB,EAAuB,CAC1D,IAAM,EAAe,WAA0D,YAE/E,GAAI,EAAa,CACf,EAAY,CAAM,EAElB,MACF,CAEA,mBAAqB,CACnB,MAAM,CACR,CAAC,CACH,CAEA,SAAgB,EACd,EACA,EAC+G,CAC/G,IAAM,EAAwB,OAAO,GAAmB,WAAa,CAAE,KAAM,CAAe,EAAI,EAC1F,EAAa,IAAI,gBACnB,EAAS,GACT,EAEE,MAA0B,CAC1B,MAIJ,CAFA,EAAS,GACT,EAAW,MAAM,EACjB,GAAQ,oBAAoB,QAAS,CAAW,EAEhD,GAAI,CACF,IAAW,CACb,OAAS,EAAQ,CACf,EAAqB,CAAM,CAC7B,CANgD,CAOlD,EAiEA,OANI,GAAQ,QACV,EAAY,EAEZ,GAAQ,iBAAiB,QAAS,EAAa,CAAE,KAAM,EAAK,CAAC,EAGxD,CACL,IAvBW,GAA6C,CACnD,KAEL,IAAI,EAAQ,CACV,GAAI,CACF,EAAa,CACf,OAAS,EAAQ,CACf,EAAqB,CAAM,CAC7B,CAEA,MACF,CAEA,EAAW,CAFX,CAGF,EAUE,OAAQ,EAAW,OACnB,MAjEA,UAAiB,CACX,MAEJ,IAAI,CACF,EAAS,WAAW,CACtB,OAAS,EAAQ,CACf,EAAqB,CAAM,CAC7B,CAEA,EAAY,CAFZ,CAGF,EAEA,MAAM,EAAuB,CACvB,MAEJ,IAAI,EAAS,MACX,GAAI,CACF,EAAS,MAAM,CAAM,CACvB,OAAS,EAAe,CACtB,EAAqB,CAAa,CACpC,MAEA,EAAqB,CAAM,EAG7B,EAAY,CAHiB,CAI/B,EAEA,KAAK,EAAgB,CACf,MAEJ,GAAI,CACF,EAAS,KAAK,CAAK,CACrB,OAAS,EAAQ,CACf,EAAY,EACZ,EAAqB,CAAM,CAC7B,CACF,CA4BA,EACA,aAAc,CACZ,IAAI,QAAkB,CACpB,OAAO,CACT,GACC,OAAO,SAAU,EAClB,aACF,CACF,CACF"}
|
package/dist/_subscription.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Observer, Sink, Subscription, Teardown } from './types';
|
|
1
|
+
import type { Observer, Sink, Subscription, Teardown } from './types.js';
|
|
2
2
|
export declare function createSubscription<T>(observerOrNext: Observer<T> | ((value: T) => void), signal?: AbortSignal): {
|
|
3
3
|
add(teardown: Teardown | undefined): void;
|
|
4
4
|
signal: AbortSignal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_subscription.d.ts","sourceRoot":"","sources":["../src/_subscription.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"_subscription.d.ts","sourceRoot":"","sources":["../src/_subscription.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAiBzE,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,EAClD,MAAM,CAAC,EAAE,WAAW,GACnB;IAAE,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,YAAY,EAAE,YAAY,CAAA;CAAE,CA+F/G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_subscription.js","names":[],"sources":["../src/_subscription.ts"],"sourcesContent":["import type { Observer, Sink, Subscription, Teardown } from './types';\n\n/** @internal Reports an unhandled stream error through the platform's error reporting channel. */\nexport function reportUnhandledError(reason: unknown): void {\n const reportError = (globalThis as { reportError?: (value: unknown) => void }).reportError;\n\n if (reportError) {\n reportError(reason);\n\n return;\n }\n\n queueMicrotask(() => {\n throw reason;\n });\n}\n\nexport function createSubscription<T>(\n observerOrNext: Observer<T> | ((value: T) => void),\n signal?: AbortSignal,\n): { add(teardown: Teardown | undefined): void; signal: AbortSignal; sink: Sink<T>; subscription: Subscription } {\n const observer: Observer<T> = typeof observerOrNext === 'function' ? { next: observerOrNext } : observerOrNext;\n const controller = new AbortController();\n let closed = false;\n let teardown: Teardown | undefined;\n\n const unsubscribe = (): void => {\n if (closed) return;\n\n closed = true;\n controller.abort();\n signal?.removeEventListener('abort', unsubscribe);\n\n try {\n teardown?.();\n } catch (reason) {\n reportUnhandledError(reason);\n }\n };\n\n const sink: Sink<T> = {\n complete(): void {\n if (closed) return;\n\n try {\n observer.complete?.();\n } catch (reason) {\n reportUnhandledError(reason);\n }\n\n unsubscribe();\n },\n\n error(reason: unknown): void {\n if (closed) return;\n\n if (observer.error) {\n try {\n observer.error(reason);\n } catch (callbackError) {\n reportUnhandledError(callbackError);\n }\n } else {\n reportUnhandledError(reason);\n }\n\n unsubscribe();\n },\n\n next(value: T): void {\n if (closed) return;\n\n try {\n observer.next(value);\n } catch (reason) {\n unsubscribe();\n reportUnhandledError(reason);\n }\n },\n };\n\n const add = (nextTeardown: Teardown | undefined): void => {\n if (!nextTeardown) return;\n\n if (closed) {\n try {\n nextTeardown();\n } catch (reason) {\n reportUnhandledError(reason);\n }\n\n return;\n }\n\n teardown = nextTeardown;\n };\n\n if (signal?.aborted) {\n unsubscribe();\n } else {\n signal?.addEventListener('abort', unsubscribe, { once: true });\n }\n\n return {\n add,\n signal: controller.signal,\n sink,\n subscription: {\n get closed(): boolean {\n return closed;\n },\n [Symbol.dispose]: unsubscribe,\n unsubscribe,\n },\n };\n}\n"],"mappings":";AAGA,SAAgB,EAAqB,GAAuB;CAC1D,IAAM,IAAe,WAA0D;CAE/E,IAAI,GAAa;EACf,EAAY,CAAM;EAElB;CACF;CAEA,qBAAqB;EACnB,MAAM;CACR,CAAC;AACH;AAEA,SAAgB,EACd,GACA,GAC+G;CAC/G,IAAM,IAAwB,OAAO,KAAmB,aAAa,EAAE,MAAM,EAAe,IAAI,GAC1F,IAAa,IAAI,gBAAgB,GACnC,IAAS,IACT,GAEE,UAA0B;EAC1B,QAIJ;GAFA,IAAS,IACT,EAAW,MAAM,GACjB,GAAQ,oBAAoB,SAAS,CAAW;GAEhD,IAAI;IACF,IAAW;GACb,SAAS,GAAQ;IACf,EAAqB,CAAM;GAC7B;EANgD;CAOlD;CAiEA,OANI,GAAQ,UACV,EAAY,IAEZ,GAAQ,iBAAiB,SAAS,GAAa,EAAE,MAAM,GAAK,CAAC,GAGxD;EACL,MAvBW,MAA6C;GACnD,OAEL;QAAI,GAAQ;KACV,IAAI;MACF,EAAa;KACf,SAAS,GAAQ;MACf,EAAqB,CAAM;KAC7B;KAEA;IACF;IAEA,IAAW;GAFX;EAGF;EAUE,QAAQ,EAAW;EACnB;GAjEA,WAAiB;IACX,QAEJ;SAAI;MACF,EAAS,WAAW;KACtB,SAAS,GAAQ;MACf,EAAqB,CAAM;KAC7B;KAEA,EAAY;IAFZ;GAGF;GAEA,MAAM,GAAuB;IACvB,QAEJ;SAAI,EAAS,OACX,IAAI;MACF,EAAS,MAAM,CAAM;KACvB,SAAS,GAAe;MACtB,EAAqB,CAAa;KACpC;UAEA,EAAqB,CAAM;KAG7B,EAAY;IAHiB;GAI/B;GAEA,KAAK,GAAgB;IACf,QAEJ,IAAI;KACF,EAAS,KAAK,CAAK;IACrB,SAAS,GAAQ;KAEf,AADA,EAAY,GACZ,EAAqB,CAAM;IAC7B;GACF;EA4BA;EACA,cAAc;GACZ,IAAI,SAAkB;IACpB,OAAO;GACT;IACC,OAAO,UAAU;GAClB;EACF;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"_subscription.js","names":[],"sources":["../src/_subscription.ts"],"sourcesContent":["import type { Observer, Sink, Subscription, Teardown } from './types.js';\n\n/** @internal Reports an unhandled stream error through the platform's error reporting channel. */\nexport function reportUnhandledError(reason: unknown): void {\n const reportError = (globalThis as { reportError?: (value: unknown) => void }).reportError;\n\n if (reportError) {\n reportError(reason);\n\n return;\n }\n\n queueMicrotask(() => {\n throw reason;\n });\n}\n\nexport function createSubscription<T>(\n observerOrNext: Observer<T> | ((value: T) => void),\n signal?: AbortSignal,\n): { add(teardown: Teardown | undefined): void; signal: AbortSignal; sink: Sink<T>; subscription: Subscription } {\n const observer: Observer<T> = typeof observerOrNext === 'function' ? { next: observerOrNext } : observerOrNext;\n const controller = new AbortController();\n let closed = false;\n let teardown: Teardown | undefined;\n\n const unsubscribe = (): void => {\n if (closed) return;\n\n closed = true;\n controller.abort();\n signal?.removeEventListener('abort', unsubscribe);\n\n try {\n teardown?.();\n } catch (reason) {\n reportUnhandledError(reason);\n }\n };\n\n const sink: Sink<T> = {\n complete(): void {\n if (closed) return;\n\n try {\n observer.complete?.();\n } catch (reason) {\n reportUnhandledError(reason);\n }\n\n unsubscribe();\n },\n\n error(reason: unknown): void {\n if (closed) return;\n\n if (observer.error) {\n try {\n observer.error(reason);\n } catch (callbackError) {\n reportUnhandledError(callbackError);\n }\n } else {\n reportUnhandledError(reason);\n }\n\n unsubscribe();\n },\n\n next(value: T): void {\n if (closed) return;\n\n try {\n observer.next(value);\n } catch (reason) {\n unsubscribe();\n reportUnhandledError(reason);\n }\n },\n };\n\n const add = (nextTeardown: Teardown | undefined): void => {\n if (!nextTeardown) return;\n\n if (closed) {\n try {\n nextTeardown();\n } catch (reason) {\n reportUnhandledError(reason);\n }\n\n return;\n }\n\n teardown = nextTeardown;\n };\n\n if (signal?.aborted) {\n unsubscribe();\n } else {\n signal?.addEventListener('abort', unsubscribe, { once: true });\n }\n\n return {\n add,\n signal: controller.signal,\n sink,\n subscription: {\n get closed(): boolean {\n return closed;\n },\n [Symbol.dispose]: unsubscribe,\n unsubscribe,\n },\n };\n}\n"],"mappings":";AAGA,SAAgB,EAAqB,GAAuB;CAC1D,IAAM,IAAe,WAA0D;CAE/E,IAAI,GAAa;EACf,EAAY,CAAM;EAElB;CACF;CAEA,qBAAqB;EACnB,MAAM;CACR,CAAC;AACH;AAEA,SAAgB,EACd,GACA,GAC+G;CAC/G,IAAM,IAAwB,OAAO,KAAmB,aAAa,EAAE,MAAM,EAAe,IAAI,GAC1F,IAAa,IAAI,gBAAgB,GACnC,IAAS,IACT,GAEE,UAA0B;EAC1B,QAIJ;GAFA,IAAS,IACT,EAAW,MAAM,GACjB,GAAQ,oBAAoB,SAAS,CAAW;GAEhD,IAAI;IACF,IAAW;GACb,SAAS,GAAQ;IACf,EAAqB,CAAM;GAC7B;EANgD;CAOlD;CAiEA,OANI,GAAQ,UACV,EAAY,IAEZ,GAAQ,iBAAiB,SAAS,GAAa,EAAE,MAAM,GAAK,CAAC,GAGxD;EACL,MAvBW,MAA6C;GACnD,OAEL;QAAI,GAAQ;KACV,IAAI;MACF,EAAa;KACf,SAAS,GAAQ;MACf,EAAqB,CAAM;KAC7B;KAEA;IACF;IAEA,IAAW;GAFX;EAGF;EAUE,QAAQ,EAAW;EACnB;GAjEA,WAAiB;IACX,QAEJ;SAAI;MACF,EAAS,WAAW;KACtB,SAAS,GAAQ;MACf,EAAqB,CAAM;KAC7B;KAEA,EAAY;IAFZ;GAGF;GAEA,MAAM,GAAuB;IACvB,QAEJ;SAAI,EAAS,OACX,IAAI;MACF,EAAS,MAAM,CAAM;KACvB,SAAS,GAAe;MACtB,EAAqB,CAAa;KACpC;UAEA,EAAqB,CAAM;KAG7B,EAAY;IAHiB;GAI/B;GAEA,KAAK,GAAgB;IACf,QAEJ,IAAI;KACF,EAAS,KAAK,CAAK;IACrB,SAAS,GAAQ;KAEf,AADA,EAAY,GACZ,EAAqB,CAAM;IAC7B;GACF;EA4BA;EACA,cAAc;GACZ,IAAI,SAAkB;IACpB,OAAO;GACT;IACC,OAAO,UAAU;GAClB;EACF;CACF;AACF"}
|
package/dist/async.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.cjs","names":[],"sources":["../src/async.ts"],"sourcesContent":["import { toIterator } from './_iterator';\nimport type { AsyncIterableOptions, Stream } from './types';\n\n/** Converts a push stream into an async iterable with an explicit overflow policy. */\nexport function toAsyncIterable<T>(source: Stream<T>, options: AsyncIterableOptions): AsyncIterable<T> {\n return {\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return toIterator(source, options);\n },\n };\n}\n"],"mappings":"sGAIA,SAAgB,EAAmB,EAAmB,EAAiD,CACrG,MAAO,CACL,CAAC,OAAO,gBAA2C,CACjD,OAAO,EAAA,WAAW,EAAQ,CAAO,CACnC,CACF,CACF"}
|
|
1
|
+
{"version":3,"file":"async.cjs","names":[],"sources":["../src/async.ts"],"sourcesContent":["import { toIterator } from './_iterator.js';\nimport type { AsyncIterableOptions, Stream } from './types.js';\n\n/** Converts a push stream into an async iterable with an explicit overflow policy. */\nexport function toAsyncIterable<T>(source: Stream<T>, options: AsyncIterableOptions): AsyncIterable<T> {\n return {\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return toIterator(source, options);\n },\n };\n}\n"],"mappings":"sGAIA,SAAgB,EAAmB,EAAmB,EAAiD,CACrG,MAAO,CACL,CAAC,OAAO,gBAA2C,CACjD,OAAO,EAAA,WAAW,EAAQ,CAAO,CACnC,CACF,CACF"}
|
package/dist/async.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AsyncIterableOptions, Stream } from './types';
|
|
1
|
+
import type { AsyncIterableOptions, Stream } from './types.js';
|
|
2
2
|
/** Converts a push stream into an async iterable with an explicit overflow policy. */
|
|
3
3
|
export declare function toAsyncIterable<T>(source: Stream<T>, options: AsyncIterableOptions): AsyncIterable<T>;
|
|
4
4
|
//# sourceMappingURL=async.d.ts.map
|
package/dist/async.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE/D,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAAC,CAAC,CAAC,CAMrG"}
|
package/dist/async.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.js","names":[],"sources":["../src/async.ts"],"sourcesContent":["import { toIterator } from './_iterator';\nimport type { AsyncIterableOptions, Stream } from './types';\n\n/** Converts a push stream into an async iterable with an explicit overflow policy. */\nexport function toAsyncIterable<T>(source: Stream<T>, options: AsyncIterableOptions): AsyncIterable<T> {\n return {\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return toIterator(source, options);\n },\n };\n}\n"],"mappings":";;AAIA,SAAgB,EAAmB,GAAmB,GAAiD;CACrG,OAAO,EACL,CAAC,OAAO,iBAA2C;EACjD,OAAO,EAAW,GAAQ,CAAO;CACnC,EACF;AACF"}
|
|
1
|
+
{"version":3,"file":"async.js","names":[],"sources":["../src/async.ts"],"sourcesContent":["import { toIterator } from './_iterator.js';\nimport type { AsyncIterableOptions, Stream } from './types.js';\n\n/** Converts a push stream into an async iterable with an explicit overflow policy. */\nexport function toAsyncIterable<T>(source: Stream<T>, options: AsyncIterableOptions): AsyncIterable<T> {\n return {\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return toIterator(source, options);\n },\n };\n}\n"],"mappings":";;AAIA,SAAgB,EAAmB,GAAmB,GAAiD;CACrG,OAAO,EACL,CAAC,OAAO,iBAA2C;EACjD,OAAO,EAAW,GAAQ,CAAO;CACnC,EACF;AACF"}
|
package/dist/channel.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./_numeric.cjs"),t=require("./core.cjs");function n(t){let n=`initial`in t,r=t.replay??+!!n;if(e.assertNonNegativeInteger(r,`Channel replay`),n&&r===0)throw RangeError(`Channel replay cannot be 0 when initial is provided — the initial value would be immediately dropped`);return r}function r(e={}){let r=n(e),i=new AbortController,a=new Set,o=[];`initial`in e&&r>0&&o.push(e.initial);let s=t.stream(e=>{if(i.signal.aborted){e.complete();return}for(let t of o)e.next(t);return a.add(e),()=>a.delete(e)}),c=()=>{if(!i.signal.aborted){i.abort();for(let e of[...a])e.complete();a.clear()}},l=!1,u=[],d=()=>{l=!0;try{for(;u.length>0;){let e=u.shift();r>0&&(o.length===r&&o.shift(),o.push(e));for(let t of[...a])t.next(e)}}finally{l=!1}};return{get disposalSignal(){return i.signal},dispose:c,get disposed(){return i.signal.aborted},send(e){i.signal.aborted||(u.push(e),l||d())},stream:s,[Symbol.dispose]:c}}exports.createChannel=r;
|
|
1
|
+
const e=require("./_numeric.cjs"),t=require("./core.cjs");function n(t){let n=`initial`in t,r=t.replay??+!!n;if(e.assertNonNegativeInteger(r,`Channel replay`),n&&r===0)throw RangeError(`Channel replay cannot be 0 when initial is provided — the initial value would be immediately dropped`);return r}function r(e={}){let r=n(e),i=new AbortController,a=new Set,o=[];`initial`in e&&r>0&&o.push(e.initial);let s=t.stream(e=>{if(i.signal.aborted){e.complete();return}for(let t of o)e.next(t);return a.add(e),()=>a.delete(e)}),c=()=>{if(!i.signal.aborted){i.abort();for(let e of[...a])e.complete();a.clear(),o.length=0,u.length=0}},l=!1,u=[],d=()=>{l=!0;try{for(;u.length>0;){let e=u.shift();r>0&&(o.length===r&&o.shift(),o.push(e));for(let t of[...a])t.next(e)}}finally{l=!1}};return{get disposalSignal(){return i.signal},dispose:c,get disposed(){return i.signal.aborted},send(e){i.signal.aborted||(u.push(e),l||d())},stream:s,[Symbol.dispose]:c}}exports.createChannel=r;
|
|
2
2
|
//# sourceMappingURL=channel.cjs.map
|
package/dist/channel.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.cjs","names":[],"sources":["../src/channel.ts"],"sourcesContent":["import { assertNonNegativeInteger } from './_numeric';\nimport { stream } from './core';\nimport type { Sink, Stream } from './types';\n\nexport type ChannelOptions<T> = {\n initial?: T;\n replay?: number;\n};\n\nexport type Channel<T> = {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n send(value: T): void;\n readonly stream: Stream<T>;\n};\n\nfunction replayCapacity<T>(options: ChannelOptions<T>): number {\n const hasInitial = 'initial' in options;\n const capacity = options.replay ?? (hasInitial ? 1 : 0);\n\n assertNonNegativeInteger(capacity, 'Channel replay');\n\n if (hasInitial && capacity === 0) {\n throw new RangeError(\n 'Channel replay cannot be 0 when initial is provided — the initial value would be immediately dropped',\n );\n }\n\n return capacity;\n}\n\n/** Channels own mutable multicast state; disposal is their only terminal event. */\nexport function createChannel<T>(options: ChannelOptions<T> = {}): Channel<T> {\n const capacity = replayCapacity(options);\n const controller = new AbortController();\n const listeners = new Set<Sink<T>>();\n const replay: T[] = [];\n\n if ('initial' in options && capacity > 0) replay.push(options.initial as T);\n\n const source = stream<T>((sink) => {\n // Disposed channels complete new subscribers immediately without replaying\n // retained values — a late subscriber never observes stale state.\n if (controller.signal.aborted) {\n sink.complete();\n\n return;\n }\n\n for (const value of replay) sink.next(value);\n\n listeners.add(sink);\n\n return () => listeners.delete(sink);\n });\n\n const dispose = (): void => {\n if (controller.signal.aborted) return;\n\n controller.abort();\n\n for (const listener of [...listeners]) listener.complete();\n\n listeners.clear();\n };\n\n let dispatching = false;\n const pending: T[] = [];\n\n const flush = (): void => {\n dispatching = true;\n\n try {\n while (pending.length > 0) {\n const value = pending.shift()!;\n\n if (capacity > 0) {\n if (replay.length === capacity) replay.shift();\n\n replay.push(value);\n }\n\n for (const listener of [...listeners]) listener.next(value);\n }\n } finally {\n dispatching = false;\n }\n };\n\n return {\n get disposalSignal(): AbortSignal {\n return controller.signal;\n },\n dispose,\n get disposed(): boolean {\n return controller.signal.aborted;\n },\n send(value: T): void {\n if (controller.signal.aborted) return;\n\n pending.push(value);\n\n // Reentrant sends (a listener calling `send` while receiving a previous\n // value) are queued so every listener observes one global FIFO order.\n if (!dispatching) flush();\n },\n stream: source,\n [Symbol.dispose]: dispose,\n };\n}\n"],"mappings":"0DAkBA,SAAS,EAAkB,EAAoC,CAC7D,IAAM,EAAa,YAAa,EAC1B,EAAW,EAAQ,QAAW,KAIpC,GAFA,EAAA,yBAAyB,EAAU,gBAAgB,EAE/C,GAAc,IAAa,EAC7B,MAAU,WACR,sGACF,EAGF,OAAO,CACT,CAGA,SAAgB,EAAiB,EAA6B,CAAC,EAAe,CAC5E,IAAM,EAAW,EAAe,CAAO,EACjC,EAAa,IAAI,gBACjB,EAAY,IAAI,IAChB,EAAc,CAAC,EAEjB,YAAa,GAAW,EAAW,GAAG,EAAO,KAAK,EAAQ,OAAY,EAE1E,IAAM,EAAS,EAAA,OAAW,GAAS,CAGjC,GAAI,EAAW,OAAO,QAAS,CAC7B,EAAK,SAAS,EAEd,MACF,CAEA,IAAK,IAAM,KAAS,EAAQ,EAAK,KAAK,CAAK,EAI3C,OAFA,EAAU,IAAI,CAAI,MAEL,EAAU,OAAO,CAAI,CACpC,CAAC,EAEK,MAAsB,CACtB,MAAW,OAAO,QAEtB,GAAW,MAAM,EAEjB,IAAK,IAAM,IAAY,CAAC,GAAG,CAAS,EAAG,EAAS,SAAS,EAEzD,EAAU,MAAM,
|
|
1
|
+
{"version":3,"file":"channel.cjs","names":[],"sources":["../src/channel.ts"],"sourcesContent":["import { assertNonNegativeInteger } from './_numeric.js';\nimport { stream } from './core.js';\nimport type { Sink, Stream } from './types.js';\n\nexport type ChannelOptions<T> = {\n initial?: T;\n replay?: number;\n};\n\nexport type Channel<T> = {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n send(value: T): void;\n readonly stream: Stream<T>;\n};\n\nfunction replayCapacity<T>(options: ChannelOptions<T>): number {\n const hasInitial = 'initial' in options;\n const capacity = options.replay ?? (hasInitial ? 1 : 0);\n\n assertNonNegativeInteger(capacity, 'Channel replay');\n\n if (hasInitial && capacity === 0) {\n throw new RangeError(\n 'Channel replay cannot be 0 when initial is provided — the initial value would be immediately dropped',\n );\n }\n\n return capacity;\n}\n\n/** Channels own mutable multicast state; disposal is their only terminal event. */\nexport function createChannel<T>(options: ChannelOptions<T> = {}): Channel<T> {\n const capacity = replayCapacity(options);\n const controller = new AbortController();\n const listeners = new Set<Sink<T>>();\n const replay: T[] = [];\n\n if ('initial' in options && capacity > 0) replay.push(options.initial as T);\n\n const source = stream<T>((sink) => {\n // Disposed channels complete new subscribers immediately without replaying\n // retained values — a late subscriber never observes stale state.\n if (controller.signal.aborted) {\n sink.complete();\n\n return;\n }\n\n for (const value of replay) sink.next(value);\n\n listeners.add(sink);\n\n return () => listeners.delete(sink);\n });\n\n const dispose = (): void => {\n if (controller.signal.aborted) return;\n\n controller.abort();\n\n for (const listener of [...listeners]) listener.complete();\n\n listeners.clear();\n replay.length = 0;\n pending.length = 0;\n };\n\n let dispatching = false;\n const pending: T[] = [];\n\n const flush = (): void => {\n dispatching = true;\n\n try {\n while (pending.length > 0) {\n const value = pending.shift()!;\n\n if (capacity > 0) {\n if (replay.length === capacity) replay.shift();\n\n replay.push(value);\n }\n\n for (const listener of [...listeners]) listener.next(value);\n }\n } finally {\n dispatching = false;\n }\n };\n\n return {\n get disposalSignal(): AbortSignal {\n return controller.signal;\n },\n dispose,\n get disposed(): boolean {\n return controller.signal.aborted;\n },\n send(value: T): void {\n if (controller.signal.aborted) return;\n\n pending.push(value);\n\n // Reentrant sends (a listener calling `send` while receiving a previous\n // value) are queued so every listener observes one global FIFO order.\n if (!dispatching) flush();\n },\n stream: source,\n [Symbol.dispose]: dispose,\n };\n}\n"],"mappings":"0DAkBA,SAAS,EAAkB,EAAoC,CAC7D,IAAM,EAAa,YAAa,EAC1B,EAAW,EAAQ,QAAW,KAIpC,GAFA,EAAA,yBAAyB,EAAU,gBAAgB,EAE/C,GAAc,IAAa,EAC7B,MAAU,WACR,sGACF,EAGF,OAAO,CACT,CAGA,SAAgB,EAAiB,EAA6B,CAAC,EAAe,CAC5E,IAAM,EAAW,EAAe,CAAO,EACjC,EAAa,IAAI,gBACjB,EAAY,IAAI,IAChB,EAAc,CAAC,EAEjB,YAAa,GAAW,EAAW,GAAG,EAAO,KAAK,EAAQ,OAAY,EAE1E,IAAM,EAAS,EAAA,OAAW,GAAS,CAGjC,GAAI,EAAW,OAAO,QAAS,CAC7B,EAAK,SAAS,EAEd,MACF,CAEA,IAAK,IAAM,KAAS,EAAQ,EAAK,KAAK,CAAK,EAI3C,OAFA,EAAU,IAAI,CAAI,MAEL,EAAU,OAAO,CAAI,CACpC,CAAC,EAEK,MAAsB,CACtB,MAAW,OAAO,QAEtB,GAAW,MAAM,EAEjB,IAAK,IAAM,IAAY,CAAC,GAAG,CAAS,EAAG,EAAS,SAAS,EAEzD,EAAU,MAAM,EAChB,EAAO,OAAS,EAChB,EAAQ,OAAS,CANA,CAOnB,EAEI,EAAc,GACZ,EAAe,CAAC,EAEhB,MAAoB,CACxB,EAAc,GAEd,GAAI,CACF,KAAO,EAAQ,OAAS,GAAG,CACzB,IAAM,EAAQ,EAAQ,MAAM,EAExB,EAAW,IACT,EAAO,SAAW,GAAU,EAAO,MAAM,EAE7C,EAAO,KAAK,CAAK,GAGnB,IAAK,IAAM,IAAY,CAAC,GAAG,CAAS,EAAG,EAAS,KAAK,CAAK,CAC5D,CACF,QAAU,CACR,EAAc,EAChB,CACF,EAEA,MAAO,CACL,IAAI,gBAA8B,CAChC,OAAO,EAAW,MACpB,EACA,UACA,IAAI,UAAoB,CACtB,OAAO,EAAW,OAAO,OAC3B,EACA,KAAK,EAAgB,CACf,EAAW,OAAO,UAEtB,EAAQ,KAAK,CAAK,EAIb,GAAa,EAAM,EAC1B,EACA,OAAQ,GACP,OAAO,SAAU,CACpB,CACF"}
|
package/dist/channel.d.ts
CHANGED
package/dist/channel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IACvB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CAC5B,CAAC;AAiBF,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAE,cAAc,CAAC,CAAC,CAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CA+E5E"}
|
package/dist/channel.js
CHANGED
package/dist/channel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.js","names":[],"sources":["../src/channel.ts"],"sourcesContent":["import { assertNonNegativeInteger } from './_numeric';\nimport { stream } from './core';\nimport type { Sink, Stream } from './types';\n\nexport type ChannelOptions<T> = {\n initial?: T;\n replay?: number;\n};\n\nexport type Channel<T> = {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n send(value: T): void;\n readonly stream: Stream<T>;\n};\n\nfunction replayCapacity<T>(options: ChannelOptions<T>): number {\n const hasInitial = 'initial' in options;\n const capacity = options.replay ?? (hasInitial ? 1 : 0);\n\n assertNonNegativeInteger(capacity, 'Channel replay');\n\n if (hasInitial && capacity === 0) {\n throw new RangeError(\n 'Channel replay cannot be 0 when initial is provided — the initial value would be immediately dropped',\n );\n }\n\n return capacity;\n}\n\n/** Channels own mutable multicast state; disposal is their only terminal event. */\nexport function createChannel<T>(options: ChannelOptions<T> = {}): Channel<T> {\n const capacity = replayCapacity(options);\n const controller = new AbortController();\n const listeners = new Set<Sink<T>>();\n const replay: T[] = [];\n\n if ('initial' in options && capacity > 0) replay.push(options.initial as T);\n\n const source = stream<T>((sink) => {\n // Disposed channels complete new subscribers immediately without replaying\n // retained values — a late subscriber never observes stale state.\n if (controller.signal.aborted) {\n sink.complete();\n\n return;\n }\n\n for (const value of replay) sink.next(value);\n\n listeners.add(sink);\n\n return () => listeners.delete(sink);\n });\n\n const dispose = (): void => {\n if (controller.signal.aborted) return;\n\n controller.abort();\n\n for (const listener of [...listeners]) listener.complete();\n\n listeners.clear();\n };\n\n let dispatching = false;\n const pending: T[] = [];\n\n const flush = (): void => {\n dispatching = true;\n\n try {\n while (pending.length > 0) {\n const value = pending.shift()!;\n\n if (capacity > 0) {\n if (replay.length === capacity) replay.shift();\n\n replay.push(value);\n }\n\n for (const listener of [...listeners]) listener.next(value);\n }\n } finally {\n dispatching = false;\n }\n };\n\n return {\n get disposalSignal(): AbortSignal {\n return controller.signal;\n },\n dispose,\n get disposed(): boolean {\n return controller.signal.aborted;\n },\n send(value: T): void {\n if (controller.signal.aborted) return;\n\n pending.push(value);\n\n // Reentrant sends (a listener calling `send` while receiving a previous\n // value) are queued so every listener observes one global FIFO order.\n if (!dispatching) flush();\n },\n stream: source,\n [Symbol.dispose]: dispose,\n };\n}\n"],"mappings":";;;AAkBA,SAAS,EAAkB,GAAoC;CAC7D,IAAM,IAAa,aAAa,GAC1B,IAAW,EAAQ,UAAW;CAIpC,IAFA,EAAyB,GAAU,gBAAgB,GAE/C,KAAc,MAAa,GAC7B,MAAU,WACR,sGACF;CAGF,OAAO;AACT;AAGA,SAAgB,EAAiB,IAA6B,CAAC,GAAe;CAC5E,IAAM,IAAW,EAAe,CAAO,GACjC,IAAa,IAAI,gBAAgB,GACjC,oBAAY,IAAI,IAAa,GAC7B,IAAc,CAAC;CAErB,AAAI,aAAa,KAAW,IAAW,KAAG,EAAO,KAAK,EAAQ,OAAY;CAE1E,IAAM,IAAS,GAAW,MAAS;EAGjC,IAAI,EAAW,OAAO,SAAS;GAC7B,EAAK,SAAS;GAEd;EACF;EAEA,KAAK,IAAM,KAAS,GAAQ,EAAK,KAAK,CAAK;EAI3C,OAFA,EAAU,IAAI,CAAI,SAEL,EAAU,OAAO,CAAI;CACpC,CAAC,GAEK,UAAsB;EACtB,OAAW,OAAO,SAEtB;KAAW,MAAM;GAEjB,KAAK,IAAM,KAAY,CAAC,GAAG,CAAS,GAAG,EAAS,SAAS;
|
|
1
|
+
{"version":3,"file":"channel.js","names":[],"sources":["../src/channel.ts"],"sourcesContent":["import { assertNonNegativeInteger } from './_numeric.js';\nimport { stream } from './core.js';\nimport type { Sink, Stream } from './types.js';\n\nexport type ChannelOptions<T> = {\n initial?: T;\n replay?: number;\n};\n\nexport type Channel<T> = {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n send(value: T): void;\n readonly stream: Stream<T>;\n};\n\nfunction replayCapacity<T>(options: ChannelOptions<T>): number {\n const hasInitial = 'initial' in options;\n const capacity = options.replay ?? (hasInitial ? 1 : 0);\n\n assertNonNegativeInteger(capacity, 'Channel replay');\n\n if (hasInitial && capacity === 0) {\n throw new RangeError(\n 'Channel replay cannot be 0 when initial is provided — the initial value would be immediately dropped',\n );\n }\n\n return capacity;\n}\n\n/** Channels own mutable multicast state; disposal is their only terminal event. */\nexport function createChannel<T>(options: ChannelOptions<T> = {}): Channel<T> {\n const capacity = replayCapacity(options);\n const controller = new AbortController();\n const listeners = new Set<Sink<T>>();\n const replay: T[] = [];\n\n if ('initial' in options && capacity > 0) replay.push(options.initial as T);\n\n const source = stream<T>((sink) => {\n // Disposed channels complete new subscribers immediately without replaying\n // retained values — a late subscriber never observes stale state.\n if (controller.signal.aborted) {\n sink.complete();\n\n return;\n }\n\n for (const value of replay) sink.next(value);\n\n listeners.add(sink);\n\n return () => listeners.delete(sink);\n });\n\n const dispose = (): void => {\n if (controller.signal.aborted) return;\n\n controller.abort();\n\n for (const listener of [...listeners]) listener.complete();\n\n listeners.clear();\n replay.length = 0;\n pending.length = 0;\n };\n\n let dispatching = false;\n const pending: T[] = [];\n\n const flush = (): void => {\n dispatching = true;\n\n try {\n while (pending.length > 0) {\n const value = pending.shift()!;\n\n if (capacity > 0) {\n if (replay.length === capacity) replay.shift();\n\n replay.push(value);\n }\n\n for (const listener of [...listeners]) listener.next(value);\n }\n } finally {\n dispatching = false;\n }\n };\n\n return {\n get disposalSignal(): AbortSignal {\n return controller.signal;\n },\n dispose,\n get disposed(): boolean {\n return controller.signal.aborted;\n },\n send(value: T): void {\n if (controller.signal.aborted) return;\n\n pending.push(value);\n\n // Reentrant sends (a listener calling `send` while receiving a previous\n // value) are queued so every listener observes one global FIFO order.\n if (!dispatching) flush();\n },\n stream: source,\n [Symbol.dispose]: dispose,\n };\n}\n"],"mappings":";;;AAkBA,SAAS,EAAkB,GAAoC;CAC7D,IAAM,IAAa,aAAa,GAC1B,IAAW,EAAQ,UAAW;CAIpC,IAFA,EAAyB,GAAU,gBAAgB,GAE/C,KAAc,MAAa,GAC7B,MAAU,WACR,sGACF;CAGF,OAAO;AACT;AAGA,SAAgB,EAAiB,IAA6B,CAAC,GAAe;CAC5E,IAAM,IAAW,EAAe,CAAO,GACjC,IAAa,IAAI,gBAAgB,GACjC,oBAAY,IAAI,IAAa,GAC7B,IAAc,CAAC;CAErB,AAAI,aAAa,KAAW,IAAW,KAAG,EAAO,KAAK,EAAQ,OAAY;CAE1E,IAAM,IAAS,GAAW,MAAS;EAGjC,IAAI,EAAW,OAAO,SAAS;GAC7B,EAAK,SAAS;GAEd;EACF;EAEA,KAAK,IAAM,KAAS,GAAQ,EAAK,KAAK,CAAK;EAI3C,OAFA,EAAU,IAAI,CAAI,SAEL,EAAU,OAAO,CAAI;CACpC,CAAC,GAEK,UAAsB;EACtB,OAAW,OAAO,SAEtB;KAAW,MAAM;GAEjB,KAAK,IAAM,KAAY,CAAC,GAAG,CAAS,GAAG,EAAS,SAAS;GAIzD,AAFA,EAAU,MAAM,GAChB,EAAO,SAAS,GAChB,EAAQ,SAAS;EANA;CAOnB,GAEI,IAAc,IACZ,IAAe,CAAC,GAEhB,UAAoB;EACxB,IAAc;EAEd,IAAI;GACF,OAAO,EAAQ,SAAS,IAAG;IACzB,IAAM,IAAQ,EAAQ,MAAM;IAE5B,AAAI,IAAW,MACT,EAAO,WAAW,KAAU,EAAO,MAAM,GAE7C,EAAO,KAAK,CAAK;IAGnB,KAAK,IAAM,KAAY,CAAC,GAAG,CAAS,GAAG,EAAS,KAAK,CAAK;GAC5D;EACF,UAAU;GACR,IAAc;EAChB;CACF;CAEA,OAAO;EACL,IAAI,iBAA8B;GAChC,OAAO,EAAW;EACpB;EACA;EACA,IAAI,WAAoB;GACtB,OAAO,EAAW,OAAO;EAC3B;EACA,KAAK,GAAgB;GACf,EAAW,OAAO,YAEtB,EAAQ,KAAK,CAAK,GAIb,KAAa,EAAM;EAC1B;EACA,QAAQ;GACP,OAAO,UAAU;CACpB;AACF"}
|
package/dist/core.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./_subscription.cjs");function t(t){return{subscribe(n,r){let i=e.createSubscription(n,r?.signal);if(i.subscription.closed)return i.subscription;try{i.add(t(i.sink,i.signal))}catch(e){i.sink.error(e)}return i.subscription}}}exports.stream=t;
|
|
1
|
+
const e=require("./_subscription.cjs");function t(t){return{subscribe(n,r){let i=e.createSubscription(n,r?.signal);if(i.subscription.closed)return i.subscription;try{i.add(t(i.sink,i.signal))}catch(e){i.sink.error(e)}return i.subscription}}}function n(e){return t(t=>e(t.next))}function r(e){return t((t,n)=>{let r;try{if(r=e.getSnapshot(),t.next(r),n.aborted)return}catch(e){t.error(e);return}let i=e.subscribe(()=>{try{r=e.getSnapshot(),t.next(r)}catch(e){t.error(e)}});if(n.aborted)return i;try{let n=e.getSnapshot();Object.is(r,n)||t.next(n)}catch(e){t.error(e)}return i})}exports.fromStore=r,exports.fromSubscribe=n,exports.stream=t;
|
|
2
2
|
//# sourceMappingURL=core.cjs.map
|
package/dist/core.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.cjs","names":[],"sources":["../src/core.ts"],"sourcesContent":["import { createSubscription } from './_subscription';\nimport type { Observer, Producer, Stream, SubscribeOptions, Subscription } from './types';\n\n/** Creates lazy work. Producer cleanup belongs to each individual subscription. */\nexport function stream<T>(producer: Producer<T>): Stream<T> {\n return {\n subscribe(observer: Observer<T> | ((value: T) => void), options?: SubscribeOptions): Subscription {\n const subscription = createSubscription(observer, options?.signal);\n\n if (subscription.subscription.closed) return subscription.subscription;\n\n try {\n subscription.add(producer(subscription.sink, subscription.signal));\n } catch (reason) {\n subscription.sink.error(reason);\n }\n\n return subscription.subscription;\n },\n };\n}\n"],"mappings":"uCAIA,SAAgB,EAAU,EAAkC,CAC1D,MAAO,CACL,UAAU,EAA8C,EAA0C,CAChG,IAAM,EAAe,EAAA,mBAAmB,EAAU,GAAS,MAAM,EAEjE,GAAI,EAAa,aAAa,OAAQ,OAAO,EAAa,aAE1D,GAAI,CACF,EAAa,IAAI,EAAS,EAAa,KAAM,EAAa,MAAM,CAAC,CACnE,OAAS,EAAQ,CACf,EAAa,KAAK,MAAM,CAAM,CAChC,CAEA,OAAO,EAAa,YACtB,CACF,CACF"}
|
|
1
|
+
{"version":3,"file":"core.cjs","names":[],"sources":["../src/core.ts"],"sourcesContent":["import { createSubscription } from './_subscription.js';\nimport type { Observer, Producer, Stream, SubscribeOptions, Subscription, Teardown } from './types.js';\n\n/** Creates lazy work. Producer cleanup belongs to each individual subscription. */\nexport function stream<T>(producer: Producer<T>): Stream<T> {\n return {\n subscribe(observer: Observer<T> | ((value: T) => void), options?: SubscribeOptions): Subscription {\n const subscription = createSubscription(observer, options?.signal);\n\n if (subscription.subscription.closed) return subscription.subscription;\n\n try {\n subscription.add(producer(subscription.sink, subscription.signal));\n } catch (reason) {\n subscription.sink.error(reason);\n }\n\n return subscription.subscription;\n },\n };\n}\n\n/** Bridge a callback-based value subscription into a Flux stream. */\nexport function fromSubscribe<T>(subscribe: (listener: (value: T) => void) => Teardown): Stream<T> {\n return stream((sink) => subscribe(sink.next));\n}\n\n/** Bridge a snapshot/subscription state source into a Flux stream. */\nexport function fromStore<T>(source: { getSnapshot(): T; subscribe(listener: () => void): Teardown }): Stream<T> {\n return stream((sink, signal) => {\n let current: T;\n\n try {\n current = source.getSnapshot();\n sink.next(current);\n if (signal.aborted) return;\n } catch (reason) {\n sink.error(reason);\n return;\n }\n\n const teardown = source.subscribe(() => {\n try {\n current = source.getSnapshot();\n sink.next(current);\n } catch (reason) {\n sink.error(reason);\n }\n });\n\n if (signal.aborted) return teardown;\n\n try {\n const latest = source.getSnapshot();\n if (!Object.is(current, latest)) sink.next(latest);\n } catch (reason) {\n sink.error(reason);\n }\n\n return teardown;\n });\n}\n"],"mappings":"uCAIA,SAAgB,EAAU,EAAkC,CAC1D,MAAO,CACL,UAAU,EAA8C,EAA0C,CAChG,IAAM,EAAe,EAAA,mBAAmB,EAAU,GAAS,MAAM,EAEjE,GAAI,EAAa,aAAa,OAAQ,OAAO,EAAa,aAE1D,GAAI,CACF,EAAa,IAAI,EAAS,EAAa,KAAM,EAAa,MAAM,CAAC,CACnE,OAAS,EAAQ,CACf,EAAa,KAAK,MAAM,CAAM,CAChC,CAEA,OAAO,EAAa,YACtB,CACF,CACF,CAGA,SAAgB,EAAiB,EAAkE,CACjG,OAAO,EAAQ,GAAS,EAAU,EAAK,IAAI,CAAC,CAC9C,CAGA,SAAgB,EAAa,EAAoF,CAC/G,OAAO,GAAQ,EAAM,IAAW,CAC9B,IAAI,EAEJ,GAAI,CAGF,GAFA,EAAU,EAAO,YAAY,EAC7B,EAAK,KAAK,CAAO,EACb,EAAO,QAAS,MACtB,OAAS,EAAQ,CACf,EAAK,MAAM,CAAM,EACjB,MACF,CAEA,IAAM,EAAW,EAAO,cAAgB,CACtC,GAAI,CACF,EAAU,EAAO,YAAY,EAC7B,EAAK,KAAK,CAAO,CACnB,OAAS,EAAQ,CACf,EAAK,MAAM,CAAM,CACnB,CACF,CAAC,EAED,GAAI,EAAO,QAAS,OAAO,EAE3B,GAAI,CACF,IAAM,EAAS,EAAO,YAAY,EAC7B,OAAO,GAAG,EAAS,CAAM,GAAG,EAAK,KAAK,CAAM,CACnD,OAAS,EAAQ,CACf,EAAK,MAAM,CAAM,CACnB,CAEA,OAAO,CACT,CAAC,CACH"}
|
package/dist/core.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import type { Producer, Stream } from './types';
|
|
1
|
+
import type { Producer, Stream, Teardown } from './types.js';
|
|
2
2
|
/** Creates lazy work. Producer cleanup belongs to each individual subscription. */
|
|
3
3
|
export declare function stream<T>(producer: Producer<T>): Stream<T>;
|
|
4
|
+
/** Bridge a callback-based value subscription into a Flux stream. */
|
|
5
|
+
export declare function fromSubscribe<T>(subscribe: (listener: (value: T) => void) => Teardown): Stream<T>;
|
|
6
|
+
/** Bridge a snapshot/subscription state source into a Flux stream. */
|
|
7
|
+
export declare function fromStore<T>(source: {
|
|
8
|
+
getSnapshot(): T;
|
|
9
|
+
subscribe(listener: () => void): Teardown;
|
|
10
|
+
}): Stream<T>;
|
|
4
11
|
//# sourceMappingURL=core.d.ts.map
|
package/dist/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,EAAkC,MAAM,
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,EAAkC,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvG,mFAAmF;AACnF,wBAAgB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAgB1D;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAEjG;AAED,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE;IAAE,WAAW,IAAI,CAAC,CAAC;IAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,QAAQ,CAAA;CAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAiC/G"}
|
package/dist/core.js
CHANGED
|
@@ -12,7 +12,36 @@ function t(t) {
|
|
|
12
12
|
return i.subscription;
|
|
13
13
|
} };
|
|
14
14
|
}
|
|
15
|
+
function n(e) {
|
|
16
|
+
return t((t) => e(t.next));
|
|
17
|
+
}
|
|
18
|
+
function r(e) {
|
|
19
|
+
return t((t, n) => {
|
|
20
|
+
let r;
|
|
21
|
+
try {
|
|
22
|
+
if (r = e.getSnapshot(), t.next(r), n.aborted) return;
|
|
23
|
+
} catch (e) {
|
|
24
|
+
t.error(e);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
let i = e.subscribe(() => {
|
|
28
|
+
try {
|
|
29
|
+
r = e.getSnapshot(), t.next(r);
|
|
30
|
+
} catch (e) {
|
|
31
|
+
t.error(e);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
if (n.aborted) return i;
|
|
35
|
+
try {
|
|
36
|
+
let n = e.getSnapshot();
|
|
37
|
+
Object.is(r, n) || t.next(n);
|
|
38
|
+
} catch (e) {
|
|
39
|
+
t.error(e);
|
|
40
|
+
}
|
|
41
|
+
return i;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
15
44
|
//#endregion
|
|
16
|
-
export { t as stream };
|
|
45
|
+
export { r as fromStore, n as fromSubscribe, t as stream };
|
|
17
46
|
|
|
18
47
|
//# sourceMappingURL=core.js.map
|
package/dist/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","names":[],"sources":["../src/core.ts"],"sourcesContent":["import { createSubscription } from './_subscription';\nimport type { Observer, Producer, Stream, SubscribeOptions, Subscription } from './types';\n\n/** Creates lazy work. Producer cleanup belongs to each individual subscription. */\nexport function stream<T>(producer: Producer<T>): Stream<T> {\n return {\n subscribe(observer: Observer<T> | ((value: T) => void), options?: SubscribeOptions): Subscription {\n const subscription = createSubscription(observer, options?.signal);\n\n if (subscription.subscription.closed) return subscription.subscription;\n\n try {\n subscription.add(producer(subscription.sink, subscription.signal));\n } catch (reason) {\n subscription.sink.error(reason);\n }\n\n return subscription.subscription;\n },\n };\n}\n"],"mappings":";;AAIA,SAAgB,EAAU,GAAkC;CAC1D,OAAO,EACL,UAAU,GAA8C,GAA0C;EAChG,IAAM,IAAe,EAAmB,GAAU,GAAS,MAAM;EAEjE,IAAI,EAAa,aAAa,QAAQ,OAAO,EAAa;EAE1D,IAAI;GACF,EAAa,IAAI,EAAS,EAAa,MAAM,EAAa,MAAM,CAAC;EACnE,SAAS,GAAQ;GACf,EAAa,KAAK,MAAM,CAAM;EAChC;EAEA,OAAO,EAAa;CACtB,EACF;AACF"}
|
|
1
|
+
{"version":3,"file":"core.js","names":[],"sources":["../src/core.ts"],"sourcesContent":["import { createSubscription } from './_subscription.js';\nimport type { Observer, Producer, Stream, SubscribeOptions, Subscription, Teardown } from './types.js';\n\n/** Creates lazy work. Producer cleanup belongs to each individual subscription. */\nexport function stream<T>(producer: Producer<T>): Stream<T> {\n return {\n subscribe(observer: Observer<T> | ((value: T) => void), options?: SubscribeOptions): Subscription {\n const subscription = createSubscription(observer, options?.signal);\n\n if (subscription.subscription.closed) return subscription.subscription;\n\n try {\n subscription.add(producer(subscription.sink, subscription.signal));\n } catch (reason) {\n subscription.sink.error(reason);\n }\n\n return subscription.subscription;\n },\n };\n}\n\n/** Bridge a callback-based value subscription into a Flux stream. */\nexport function fromSubscribe<T>(subscribe: (listener: (value: T) => void) => Teardown): Stream<T> {\n return stream((sink) => subscribe(sink.next));\n}\n\n/** Bridge a snapshot/subscription state source into a Flux stream. */\nexport function fromStore<T>(source: { getSnapshot(): T; subscribe(listener: () => void): Teardown }): Stream<T> {\n return stream((sink, signal) => {\n let current: T;\n\n try {\n current = source.getSnapshot();\n sink.next(current);\n if (signal.aborted) return;\n } catch (reason) {\n sink.error(reason);\n return;\n }\n\n const teardown = source.subscribe(() => {\n try {\n current = source.getSnapshot();\n sink.next(current);\n } catch (reason) {\n sink.error(reason);\n }\n });\n\n if (signal.aborted) return teardown;\n\n try {\n const latest = source.getSnapshot();\n if (!Object.is(current, latest)) sink.next(latest);\n } catch (reason) {\n sink.error(reason);\n }\n\n return teardown;\n });\n}\n"],"mappings":";;AAIA,SAAgB,EAAU,GAAkC;CAC1D,OAAO,EACL,UAAU,GAA8C,GAA0C;EAChG,IAAM,IAAe,EAAmB,GAAU,GAAS,MAAM;EAEjE,IAAI,EAAa,aAAa,QAAQ,OAAO,EAAa;EAE1D,IAAI;GACF,EAAa,IAAI,EAAS,EAAa,MAAM,EAAa,MAAM,CAAC;EACnE,SAAS,GAAQ;GACf,EAAa,KAAK,MAAM,CAAM;EAChC;EAEA,OAAO,EAAa;CACtB,EACF;AACF;AAGA,SAAgB,EAAiB,GAAkE;CACjG,OAAO,GAAQ,MAAS,EAAU,EAAK,IAAI,CAAC;AAC9C;AAGA,SAAgB,EAAa,GAAoF;CAC/G,OAAO,GAAQ,GAAM,MAAW;EAC9B,IAAI;EAEJ,IAAI;GAGF,IAFA,IAAU,EAAO,YAAY,GAC7B,EAAK,KAAK,CAAO,GACb,EAAO,SAAS;EACtB,SAAS,GAAQ;GACf,EAAK,MAAM,CAAM;GACjB;EACF;EAEA,IAAM,IAAW,EAAO,gBAAgB;GACtC,IAAI;IAEF,AADA,IAAU,EAAO,YAAY,GAC7B,EAAK,KAAK,CAAO;GACnB,SAAS,GAAQ;IACf,EAAK,MAAM,CAAM;GACnB;EACF,CAAC;EAED,IAAI,EAAO,SAAS,OAAO;EAE3B,IAAI;GACF,IAAM,IAAS,EAAO,YAAY;GAClC,AAAK,OAAO,GAAG,GAAS,CAAM,KAAG,EAAK,KAAK,CAAM;EACnD,SAAS,GAAQ;GACf,EAAK,MAAM,CAAM;EACnB;EAEA,OAAO;CACT,CAAC;AACH"}
|
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.
|
|
1
|
+
var e=class extends Error{static errorName=`FluxError`;constructor(e,t){super(e,t),this.name=new.target.errorName,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{static errorName=`FluxTimeoutError`;ms;constructor(e){super(`Timeout after ${e}ms`),this.ms=e}},n=class extends e{static errorName=`FluxEmptyError`;constructor(e=`Stream completed without emitting any value`){super(e)}},r=class extends e{static errorName=`FluxCapacityError`;capacity;constructor(e,t){super(t),this.capacity=e}};exports.FluxCapacityError=r,exports.FluxEmptyError=n,exports.FluxError=e,exports.FluxTimeoutError=t;
|
|
2
2
|
//# sourceMappingURL=errors.cjs.map
|
package/dist/errors.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class FluxError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.
|
|
1
|
+
{"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class FluxError extends Error {\n protected static readonly errorName: string = 'FluxError';\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = (new.target as typeof FluxError).errorName;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class FluxTimeoutError extends FluxError {\n protected static override readonly errorName = 'FluxTimeoutError';\n /** The timeout duration in milliseconds that was exceeded. */\n readonly ms: number;\n\n constructor(ms: number) {\n super(`Timeout after ${ms}ms`);\n this.ms = ms;\n }\n}\n\n/** Thrown by `first()` and `last()` when the source completes without emitting any value. */\nexport class FluxEmptyError extends FluxError {\n protected static override readonly errorName = 'FluxEmptyError';\n\n constructor(message = 'Stream completed without emitting any value') {\n super(message);\n }\n}\n\n/** Thrown when a bounded buffer (`mergeMap`, `concatMap`, `toArray`, async iteration) overflows. */\nexport class FluxCapacityError extends FluxError {\n protected static override readonly errorName = 'FluxCapacityError';\n /** The configured capacity that was exceeded. */\n readonly capacity: number;\n\n constructor(capacity: number, message: string) {\n super(message);\n this.capacity = capacity;\n }\n}\n"],"mappings":"AAAA,IAAa,EAAb,cAA+B,KAAM,CACnC,OAA0B,UAAoB,YAE9C,YAAY,EAAiB,EAAwB,CACnD,MAAM,EAAS,CAAO,EACtB,KAAK,KAAQ,WAAgC,UAC7C,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAEa,EAAb,cAAsC,CAAU,CAC9C,OAAmC,UAAY,mBAE/C,GAEA,YAAY,EAAY,CACtB,MAAM,iBAAiB,EAAG,GAAG,EAC7B,KAAK,GAAK,CACZ,CACF,EAGa,EAAb,cAAoC,CAAU,CAC5C,OAAmC,UAAY,iBAE/C,YAAY,EAAU,8CAA+C,CACnE,MAAM,CAAO,CACf,CACF,EAGa,EAAb,cAAuC,CAAU,CAC/C,OAAmC,UAAY,oBAE/C,SAEA,YAAY,EAAkB,EAAiB,CAC7C,MAAM,CAAO,EACb,KAAK,SAAW,CAClB,CACF"}
|