@vielzeug/flux 1.0.7 → 2.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.
Files changed (160) hide show
  1. package/README.md +22 -25
  2. package/dist/_dev.cjs +1 -1
  3. package/dist/_dev.cjs.map +1 -1
  4. package/dist/_dev.js +2 -8
  5. package/dist/_dev.js.map +1 -1
  6. package/dist/_iterator.cjs +1 -1
  7. package/dist/_iterator.cjs.map +1 -1
  8. package/dist/_iterator.d.ts +3 -1
  9. package/dist/_iterator.d.ts.map +1 -1
  10. package/dist/_iterator.js +57 -35
  11. package/dist/_iterator.js.map +1 -1
  12. package/dist/_link.cjs +2 -0
  13. package/dist/_link.cjs.map +1 -0
  14. package/dist/_link.d.ts +4 -0
  15. package/dist/_link.d.ts.map +1 -0
  16. package/dist/_link.js +8 -0
  17. package/dist/_link.js.map +1 -0
  18. package/dist/_numeric.cjs +1 -1
  19. package/dist/_numeric.cjs.map +1 -1
  20. package/dist/_numeric.d.ts +2 -1
  21. package/dist/_numeric.d.ts.map +1 -1
  22. package/dist/_numeric.js +3 -7
  23. package/dist/_numeric.js.map +1 -1
  24. package/dist/_pipe.cjs +1 -1
  25. package/dist/_pipe.cjs.map +1 -1
  26. package/dist/_pipe.d.ts +2 -1
  27. package/dist/_pipe.d.ts.map +1 -1
  28. package/dist/_pipe.js +3 -3
  29. package/dist/_pipe.js.map +1 -1
  30. package/dist/_safe.cjs +1 -1
  31. package/dist/_safe.cjs.map +1 -1
  32. package/dist/_safe.d.ts +1 -1
  33. package/dist/_safe.d.ts.map +1 -1
  34. package/dist/_safe.js +2 -2
  35. package/dist/_safe.js.map +1 -1
  36. package/dist/_scheduler.cjs +1 -1
  37. package/dist/_scheduler.cjs.map +1 -1
  38. package/dist/_scheduler.d.ts +5 -2
  39. package/dist/_scheduler.d.ts.map +1 -1
  40. package/dist/_scheduler.js +1 -1
  41. package/dist/_scheduler.js.map +1 -1
  42. package/dist/_subscription.cjs +2 -0
  43. package/dist/_subscription.cjs.map +1 -0
  44. package/dist/_subscription.d.ts +8 -0
  45. package/dist/_subscription.d.ts.map +1 -0
  46. package/dist/_subscription.js +80 -0
  47. package/dist/_subscription.js.map +1 -0
  48. package/dist/adapters/courier.cjs +1 -1
  49. package/dist/adapters/courier.cjs.map +1 -1
  50. package/dist/adapters/courier.d.ts +35 -21
  51. package/dist/adapters/courier.d.ts.map +1 -1
  52. package/dist/adapters/courier.js +25 -6
  53. package/dist/adapters/courier.js.map +1 -1
  54. package/dist/adapters/herald.cjs +1 -1
  55. package/dist/adapters/herald.cjs.map +1 -1
  56. package/dist/adapters/herald.d.ts +2 -16
  57. package/dist/adapters/herald.d.ts.map +1 -1
  58. package/dist/adapters/herald.js +12 -8
  59. package/dist/adapters/herald.js.map +1 -1
  60. package/dist/adapters/pulse.cjs +1 -1
  61. package/dist/adapters/pulse.cjs.map +1 -1
  62. package/dist/adapters/pulse.d.ts +3 -20
  63. package/dist/adapters/pulse.d.ts.map +1 -1
  64. package/dist/adapters/pulse.js +2 -6
  65. package/dist/adapters/pulse.js.map +1 -1
  66. package/dist/adapters/ripple.cjs +1 -1
  67. package/dist/adapters/ripple.cjs.map +1 -1
  68. package/dist/adapters/ripple.d.ts +3 -39
  69. package/dist/adapters/ripple.d.ts.map +1 -1
  70. package/dist/adapters/ripple.js +22 -29
  71. package/dist/adapters/ripple.js.map +1 -1
  72. package/dist/async.cjs +2 -0
  73. package/dist/async.cjs.map +1 -0
  74. package/dist/async.d.ts +4 -0
  75. package/dist/async.d.ts.map +1 -0
  76. package/dist/async.js +11 -0
  77. package/dist/async.js.map +1 -0
  78. package/dist/core.cjs +1 -1
  79. package/dist/core.cjs.map +1 -1
  80. package/dist/core.d.ts +3 -16
  81. package/dist/core.d.ts.map +1 -1
  82. package/dist/core.js +12 -81
  83. package/dist/core.js.map +1 -1
  84. package/dist/courier.cjs +1 -0
  85. package/dist/courier.d.ts +2 -0
  86. package/dist/courier.d.ts.map +1 -0
  87. package/dist/courier.js +2 -0
  88. package/dist/errors.cjs.map +1 -1
  89. package/dist/errors.js.map +1 -1
  90. package/dist/flux.cjs +1 -1
  91. package/dist/flux.cjs.map +1 -1
  92. package/dist/flux.iife.js +1 -1
  93. package/dist/flux.iife.js.map +1 -1
  94. package/dist/flux.js +1 -1
  95. package/dist/flux.js.map +1 -1
  96. package/dist/herald.cjs +1 -0
  97. package/dist/herald.d.ts +2 -0
  98. package/dist/herald.d.ts.map +1 -0
  99. package/dist/herald.js +2 -0
  100. package/dist/index.cjs +1 -1
  101. package/dist/index.d.ts +13 -15
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +10 -14
  104. package/dist/operators/combination.cjs +1 -1
  105. package/dist/operators/combination.cjs.map +1 -1
  106. package/dist/operators/combination.d.ts +9 -64
  107. package/dist/operators/combination.d.ts.map +1 -1
  108. package/dist/operators/combination.js +46 -160
  109. package/dist/operators/combination.js.map +1 -1
  110. package/dist/operators/creation.cjs +1 -1
  111. package/dist/operators/creation.cjs.map +1 -1
  112. package/dist/operators/creation.d.ts +13 -46
  113. package/dist/operators/creation.d.ts.map +1 -1
  114. package/dist/operators/creation.js +61 -65
  115. package/dist/operators/creation.js.map +1 -1
  116. package/dist/operators/filtering.cjs +1 -1
  117. package/dist/operators/filtering.cjs.map +1 -1
  118. package/dist/operators/filtering.d.ts +10 -60
  119. package/dist/operators/filtering.d.ts.map +1 -1
  120. package/dist/operators/filtering.js +62 -109
  121. package/dist/operators/filtering.js.map +1 -1
  122. package/dist/operators/transformation.cjs +1 -1
  123. package/dist/operators/transformation.cjs.map +1 -1
  124. package/dist/operators/transformation.d.ts +9 -62
  125. package/dist/operators/transformation.d.ts.map +1 -1
  126. package/dist/operators/transformation.js +91 -142
  127. package/dist/operators/transformation.js.map +1 -1
  128. package/dist/operators/utility.cjs +1 -1
  129. package/dist/operators/utility.cjs.map +1 -1
  130. package/dist/operators/utility.d.ts +16 -97
  131. package/dist/operators/utility.d.ts.map +1 -1
  132. package/dist/operators/utility.js +75 -191
  133. package/dist/operators/utility.js.map +1 -1
  134. package/dist/pipe.cjs +2 -0
  135. package/dist/pipe.cjs.map +1 -0
  136. package/dist/pipe.d.ts +15 -0
  137. package/dist/pipe.d.ts.map +1 -0
  138. package/dist/pipe.js +9 -0
  139. package/dist/pipe.js.map +1 -0
  140. package/dist/pulse.cjs +1 -0
  141. package/dist/pulse.d.ts +2 -0
  142. package/dist/pulse.d.ts.map +1 -0
  143. package/dist/pulse.js +2 -0
  144. package/dist/ripple.cjs +1 -0
  145. package/dist/ripple.d.ts +3 -0
  146. package/dist/ripple.d.ts.map +1 -0
  147. package/dist/ripple.js +2 -0
  148. package/dist/subject.cjs +1 -1
  149. package/dist/subject.cjs.map +1 -1
  150. package/dist/subject.d.ts +14 -65
  151. package/dist/subject.d.ts.map +1 -1
  152. package/dist/subject.js +31 -166
  153. package/dist/subject.js.map +1 -1
  154. package/dist/subjects.cjs +1 -0
  155. package/dist/subjects.d.ts +3 -0
  156. package/dist/subjects.d.ts.map +1 -0
  157. package/dist/subjects.js +2 -0
  158. package/dist/types.d.ts +32 -79
  159. package/dist/types.d.ts.map +1 -1
  160. package/package.json +54 -15
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @vielzeug/flux
2
2
 
3
- Composable stream primitive with hot/cold semantics, backpressure, and adapters for the vielzeug ecosystem.
3
+ Minimal push streams for TypeScript. Streams are reusable; subscriptions own cancellation; async buffering is explicit. Provide an `error` observer when caller owns recovery.
4
4
 
5
5
  ## Install
6
6
 
@@ -11,38 +11,35 @@ pnpm add @vielzeug/flux
11
11
  ## Usage
12
12
 
13
13
  ```ts
14
- import { flux, merge, fromBus, fromSignal, debounce, toSignal } from '@vielzeug/flux';
15
-
16
- // Cold stream — each subscriber gets its own producer
17
- const count$ = flux<number>((observer) => {
18
- let i = 0;
19
- const id = setInterval(() => observer.next(i++), 1000);
20
- return () => clearInterval(id);
21
- });
22
-
23
- // Compose with operators
24
- const even$ = count$.pipe(
25
- filter((n) => n % 2 === 0),
26
- map((n) => n * 2),
14
+ import { toArray, interval, map, pipe, take } from '@vielzeug/flux';
15
+
16
+ const values = pipe(
17
+ interval({ every: 100 }),
18
+ map((value) => value * 2),
19
+ take(3),
27
20
  );
28
21
 
29
- // Bridge to ripple signal
30
- const latest = toSignal(even$, { initial: 0 });
22
+ console.log(await toArray(values, { maxItems: 3 })); // [0, 2, 4]
23
+ ```
31
24
 
32
- // Merge ecosystem sources
33
- const messages = toSignal(
34
- merge(fromPulse(pulse, 'chat:message'), fromBus(localBus, 'draft')).pipe(debounce(100)),
35
- { initial: [] },
36
- );
25
+ ## Channels
26
+
27
+ ```ts
28
+ import { createChannel } from '@vielzeug/flux/subjects';
29
+
30
+ const events = createChannel<string>({ replay: 1 });
31
+ events.stream.subscribe(console.log);
32
+ events.send('connected');
33
+ events.dispose();
37
34
  ```
38
35
 
39
36
  ## Adapters
40
37
 
41
38
  ```ts
42
- import { fromSignal, toSignal } from '@vielzeug/flux'; // ripple
43
- import { fromBus, toBus } from '@vielzeug/flux'; // herald
44
- import { fromPulse, fromPresence } from '@vielzeug/flux'; // pulse
45
- import { fromSse, fromQuery } from '@vielzeug/flux'; // courier
39
+ import { fromQuery } from '@vielzeug/flux/courier';
40
+ import { fromBus } from '@vielzeug/flux/herald';
41
+ import { fromPresence } from '@vielzeug/flux/pulse';
42
+ import { fromSignal, toSignal } from '@vielzeug/flux/ripple';
46
43
  ```
47
44
 
48
45
  ## License
package/dist/_dev.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=!globalThis.__FLUX_PROD__;function t(t){e&&console.warn(`[@vielzeug/flux] ${t}`)}function n(t,...n){e&&console.error(`[@vielzeug/flux] ${t}`,...n)}exports.error=n,exports.warn=t;
1
+ function e(e,...t){}exports.error=e;
2
2
  //# sourceMappingURL=_dev.cjs.map
package/dist/_dev.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["/**\n * Set to `true` by the Vite `define` config in production builds so that all\n * dev-only `warn()` / `error()` calls are eliminated by the bundler.\n * When running tests or without a bundler the flag is absent and warnings fire.\n */\nconst isDev = !(globalThis as { __FLUX_PROD__?: boolean }).__FLUX_PROD__;\n\n/** @internal @security Messages may include user data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/flux] ${msg}`);\n}\n\n/** @internal @security Messages and args may include user data. */\nexport function error(msg: string, ...args: unknown[]): void {\n if (isDev) console.error(`[@vielzeug/flux] ${msg}`, ...args);\n}\n"],"mappings":"AAKA,IAAM,EAAQ,CAAE,WAA2C,cAG3D,SAAgB,EAAK,EAAmB,CAClC,GAAO,QAAQ,KAAK,oBAAoB,GAAK,CACnD,CAGA,SAAgB,EAAM,EAAa,GAAG,EAAuB,CACvD,GAAO,QAAQ,MAAM,oBAAoB,IAAO,GAAG,CAAI,CAC7D"}
1
+ {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["/**\n * Set to `true` by the Vite `define` config in production builds so that all\n * dev-only `warn()` / `error()` calls are eliminated by the bundler.\n * When running tests or without a bundler the flag is absent and warnings fire.\n */\nconst isDev = !(globalThis as { __FLUX_PROD__?: boolean }).__FLUX_PROD__;\n\n/** @internal @security Messages may include user data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/flux] ${msg}`);\n}\n\n/** @internal @security Messages and args may include user data. */\nexport function error(msg: string, ...args: unknown[]): void {\n if (isDev) console.error(`[@vielzeug/flux] ${msg}`, ...args);\n}\n"],"mappings":"AAaA,SAAgB,EAAM,EAAa,GAAG,EAAuB,CAE7D"}
package/dist/_dev.js CHANGED
@@ -1,12 +1,6 @@
1
1
  //#region src/_dev.ts
2
- var e = !globalThis.__FLUX_PROD__;
3
- function t(t) {
4
- e && console.warn(`[@vielzeug/flux] ${t}`);
5
- }
6
- function n(t, ...n) {
7
- e && console.error(`[@vielzeug/flux] ${t}`, ...n);
8
- }
2
+ function e(e, ...t) {}
9
3
  //#endregion
10
- export { n as error, t as warn };
4
+ export { e as error };
11
5
 
12
6
  //# sourceMappingURL=_dev.js.map
package/dist/_dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["/**\n * Set to `true` by the Vite `define` config in production builds so that all\n * dev-only `warn()` / `error()` calls are eliminated by the bundler.\n * When running tests or without a bundler the flag is absent and warnings fire.\n */\nconst isDev = !(globalThis as { __FLUX_PROD__?: boolean }).__FLUX_PROD__;\n\n/** @internal @security Messages may include user data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/flux] ${msg}`);\n}\n\n/** @internal @security Messages and args may include user data. */\nexport function error(msg: string, ...args: unknown[]): void {\n if (isDev) console.error(`[@vielzeug/flux] ${msg}`, ...args);\n}\n"],"mappings":";AAKA,IAAM,IAAQ,CAAE,WAA2C;AAG3D,SAAgB,EAAK,GAAmB;CACtC,AAAI,KAAO,QAAQ,KAAK,oBAAoB,GAAK;AACnD;AAGA,SAAgB,EAAM,GAAa,GAAG,GAAuB;CAC3D,AAAI,KAAO,QAAQ,MAAM,oBAAoB,KAAO,GAAG,CAAI;AAC7D"}
1
+ {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["/**\n * Set to `true` by the Vite `define` config in production builds so that all\n * dev-only `warn()` / `error()` calls are eliminated by the bundler.\n * When running tests or without a bundler the flag is absent and warnings fire.\n */\nconst isDev = !(globalThis as { __FLUX_PROD__?: boolean }).__FLUX_PROD__;\n\n/** @internal @security Messages may include user data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/flux] ${msg}`);\n}\n\n/** @internal @security Messages and args may include user data. */\nexport function error(msg: string, ...args: unknown[]): void {\n if (isDev) console.error(`[@vielzeug/flux] ${msg}`, ...args);\n}\n"],"mappings":";AAaA,SAAgB,EAAM,GAAa,GAAG,GAAuB,CAE7D"}
@@ -1,2 +1,2 @@
1
- const e=require("./_dev.cjs");var t=1e4;function n(n){let r=[],i=[],a=!1,o=!1,s={done:!0,value:void 0},c=n({complete(){a=!0,l()},error(e){a=!0,i.length>0?(i.shift().reject(e),l()):r.push({__err:e})},next(n){let a={done:!1,value:n};if(i.length>0){i.shift().resolve(a);return}r.length>=t&&(r.shift(),o||(o=!0,e.warn(`async iterator buffer exceeded ${t} queued values — dropping the oldest. The consumer is falling behind the producer; throttle the source or drain the iterator faster.`))),r.push(a)}});function l(){for(;i.length>0;)i.shift().resolve(s)}let u={next(){if(r.length>0){let e=r.shift();return`__err`in e?Promise.reject(e.__err):Promise.resolve(e)}return a?Promise.resolve(s):new Promise((e,t)=>i.push({reject:t,resolve:e}))},return(){return a||(c(),a=!0,l()),Promise.resolve(s)},[Symbol.asyncIterator](){return u}};return u}exports.makeAsyncIterator=n;
1
+ function e(e){if(!Number.isInteger(e.capacity)||e.capacity<1)throw RangeError(`Async iterable capacity must be a positive integer`)}function t(t,n){e(n);let r=new AbortController,i=[],a={kind:`open`,queue:[]},o=()=>n.signal?.removeEventListener(`abort`,u),s=()=>{for(;i.length>0;)i.shift().resolve({done:!0,value:void 0})},c=()=>{a.kind===`open`&&(a.kind=`complete`,o(),s())},l=e=>{if(a.kind===`open`)for(a={kind:`error`,queue:a.queue,reason:e},r.abort(),o();i.length>0;)i.shift().reject(e)},u=()=>{r.abort(),o(),a={kind:`returned`},s()},d={complete:c,error:l,next(e){if(a.kind!==`open`)return;let t=i.shift();if(t){t.resolve({done:!1,value:e});return}if(a.queue.length<n.capacity){a.queue.push(e);return}n.overflow===`drop-oldest`?(a.queue.shift(),a.queue.push(e)):n.overflow===`error`&&l(RangeError(`Async iterable buffer capacity exceeded`))}};return n.signal?.aborted?u():n.signal?.addEventListener(`abort`,u,{once:!0}),t.subscribe(d,{signal:r.signal}),{next(){return a.kind===`returned`?Promise.resolve({done:!0,value:void 0}):a.queue.length>0?Promise.resolve({done:!1,value:a.queue.shift()}):a.kind===`error`?Promise.reject(a.reason):a.kind===`complete`?Promise.resolve({done:!0,value:void 0}):new Promise((e,t)=>i.push({reject:t,resolve:e}))},return(){return u(),Promise.resolve({done:!0,value:void 0})},[Symbol.asyncIterator](){return this}}}exports.toIterator=t;
2
2
  //# sourceMappingURL=_iterator.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_iterator.cjs","names":[],"sources":["../src/_iterator.ts"],"sourcesContent":["import type { Observer, Unsubscribe } from './types';\n\nimport { warn } from './_dev';\n\ntype QueueItem<T> = IteratorResult<T> | { readonly __err: unknown };\n\n/**\n * Upper bound on the internal buffer before values are dropped (oldest first).\n * Protects against unbounded memory growth when a producer emits faster than the\n * `for await` consumer drains the iterator.\n */\nconst MAX_QUEUE_SIZE = 10_000;\n\n/**\n * Creates an `AsyncIterator<T>` backed by a subscribe function.\n * Buffers incoming values until consumed; cancels the subscription on `return()`.\n * Drops the oldest buffered value (with a one-time dev warning) if the buffer exceeds\n * `MAX_QUEUE_SIZE` see `MAX_QUEUE_SIZE`.\n * @internal\n */\nexport function makeAsyncIterator<T>(subscribe: (observer: Observer<T>) => Unsubscribe): AsyncIterableIterator<T> {\n const queue: QueueItem<T>[] = [];\n const pending: Array<{\n reject: (e: unknown) => void;\n resolve: (r: IteratorResult<T>) => void;\n }> = [];\n let done = false;\n let warnedOverflow = false;\n\n const DONE_RESULT: IteratorResult<T> = { done: true, value: undefined as T };\n\n const unsub = subscribe({\n complete() {\n done = true;\n drainPending();\n },\n error(err) {\n done = true;\n\n if (pending.length > 0) {\n pending.shift()!.reject(err);\n drainPending();\n } else {\n queue.push({ __err: err });\n }\n },\n next(v) {\n const item: IteratorResult<T> = { done: false, value: v };\n\n if (pending.length > 0) {\n pending.shift()!.resolve(item);\n\n return;\n }\n\n if (queue.length >= MAX_QUEUE_SIZE) {\n queue.shift();\n\n if (!warnedOverflow) {\n warnedOverflow = true;\n warn(\n `async iterator buffer exceeded ${MAX_QUEUE_SIZE} queued values — dropping the oldest. ` +\n 'The consumer is falling behind the producer; throttle the source or drain the iterator faster.',\n );\n }\n }\n\n queue.push(item);\n },\n });\n\n function drainPending(): void {\n while (pending.length > 0) {\n pending.shift()!.resolve(DONE_RESULT);\n }\n }\n\n const iterator = {\n next(): Promise<IteratorResult<T>> {\n if (queue.length > 0) {\n const item = queue.shift()!;\n\n if ('__err' in item) return Promise.reject((item as { __err: unknown }).__err);\n\n return Promise.resolve(item as IteratorResult<T>);\n }\n\n if (done) return Promise.resolve(DONE_RESULT);\n\n return new Promise<IteratorResult<T>>((resolve, reject) => pending.push({ reject, resolve }));\n },\n return(): Promise<IteratorResult<T>> {\n if (!done) {\n unsub();\n done = true;\n drainPending();\n }\n\n return Promise.resolve(DONE_RESULT);\n },\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return iterator;\n },\n };\n\n return iterator;\n}\n"],"mappings":"8BAWA,IAAM,EAAiB,IASvB,SAAgB,EAAqB,EAA6E,CAChH,IAAM,EAAwB,CAAC,EACzB,EAGD,CAAC,EACF,EAAO,GACP,EAAiB,GAEf,EAAiC,CAAE,KAAM,GAAM,MAAO,IAAA,EAAe,EAErE,EAAQ,EAAU,CACtB,UAAW,CACT,EAAO,GACP,EAAa,CACf,EACA,MAAM,EAAK,CACT,EAAO,GAEH,EAAQ,OAAS,GACnB,EAAQ,MAAM,CAAC,CAAE,OAAO,CAAG,EAC3B,EAAa,GAEb,EAAM,KAAK,CAAE,MAAO,CAAI,CAAC,CAE7B,EACA,KAAK,EAAG,CACN,IAAM,EAA0B,CAAE,KAAM,GAAO,MAAO,CAAE,EAExD,GAAI,EAAQ,OAAS,EAAG,CACtB,EAAQ,MAAM,CAAC,CAAE,QAAQ,CAAI,EAE7B,MACF,CAEI,EAAM,QAAU,IAClB,EAAM,MAAM,EAEP,IACH,EAAiB,GACjB,EAAA,KACE,kCAAkC,EAAe,qIAEnD,IAIJ,EAAM,KAAK,CAAI,CACjB,CACF,CAAC,EAED,SAAS,GAAqB,CAC5B,KAAO,EAAQ,OAAS,GACtB,EAAQ,MAAM,CAAC,CAAE,QAAQ,CAAW,CAExC,CAEA,IAAM,EAAW,CACf,MAAmC,CACjC,GAAI,EAAM,OAAS,EAAG,CACpB,IAAM,EAAO,EAAM,MAAM,EAIzB,MAFI,UAAW,EAAa,QAAQ,OAAQ,EAA4B,KAAK,EAEtE,QAAQ,QAAQ,CAAyB,CAClD,CAIA,OAFI,EAAa,QAAQ,QAAQ,CAAW,EAErC,IAAI,SAA4B,EAAS,IAAW,EAAQ,KAAK,CAAE,SAAQ,SAAQ,CAAC,CAAC,CAC9F,EACA,QAAqC,CAOnC,OANK,IACH,EAAM,EACN,EAAO,GACP,EAAa,GAGR,QAAQ,QAAQ,CAAW,CACpC,EACA,CAAC,OAAO,gBAA2C,CACjD,OAAO,CACT,CACF,EAEA,OAAO,CACT"}
1
+ {"version":3,"file":"_iterator.cjs","names":[],"sources":["../src/_iterator.ts"],"sourcesContent":["import 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[] } | { kind: 'error'; queue: T[]; reason: unknown } | { kind: 'returned' };\n\nfunction assertOptions(options: AsyncIterableOptions): void {\n if (!Number.isInteger(options.capacity) || options.capacity < 1) {\n throw new RangeError('Async iterable capacity must be a positive integer');\n }\n}\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 assertOptions(options);\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', stop);\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 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 RangeError('Async iterable buffer capacity exceeded'));\n }\n },\n };\n\n if (options.signal?.aborted) stop();\n else options.signal?.addEventListener('abort', stop, { 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":"AAUA,SAAS,EAAc,EAAqC,CAC1D,GAAI,CAAC,OAAO,UAAU,EAAQ,QAAQ,GAAK,EAAQ,SAAW,EAC5D,MAAU,WAAW,oDAAoD,CAE7E,CAGA,SAAgB,EAAc,EAAmB,EAAyD,CACxG,EAAc,CAAO,EAErB,IAAM,EAAa,IAAI,gBACjB,EAAwB,CAAC,EAC3B,EAA0B,CAAE,KAAM,OAAQ,MAAO,CAAC,CAAE,EAElD,MAAqB,EAAQ,QAAQ,oBAAoB,QAAS,CAAI,EAEtE,MAA0B,CAC9B,KAAO,EAAQ,OAAS,GAAG,EAAQ,MAAM,CAAC,CAAE,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,CAAE,OAAO,CAAM,CAC3D,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,EAAS,WAAW,yCAAyC,CAAC,CAElE,CACF,EAOA,OALI,EAAQ,QAAQ,QAAS,EAAK,EAC7B,EAAQ,QAAQ,iBAAiB,QAAS,EAAM,CAAE,KAAM,EAAK,CAAC,EAEnE,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"}
@@ -1,2 +1,4 @@
1
- export {};
1
+ import type { AsyncIterableOptions, Stream } from './types';
2
+ /** Async iteration requires explicit queue policy because streams are push based. */
3
+ export declare function toIterator<T>(source: Stream<T>, options: AsyncIterableOptions): AsyncIterableIterator<T>;
2
4
  //# sourceMappingURL=_iterator.d.ts.map
@@ -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":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAY,MAAM,EAAE,MAAM,SAAS,CAAC;AAgBtE,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,GAAG,qBAAqB,CAAC,CAAC,CAAC,CA6FxG"}
package/dist/_iterator.js CHANGED
@@ -1,53 +1,75 @@
1
- import { warn as e } from "./_dev.js";
2
1
  //#region src/_iterator.ts
3
- var t = 1e4;
4
- function n(n) {
5
- let r = [], i = [], a = !1, o = !1, s = {
6
- done: !0,
7
- value: void 0
8
- }, c = n({
9
- complete() {
10
- a = !0, l();
11
- },
12
- error(e) {
13
- a = !0, i.length > 0 ? (i.shift().reject(e), l()) : r.push({ __err: e });
14
- },
15
- next(n) {
16
- let a = {
17
- done: !1,
18
- value: n
19
- };
20
- if (i.length > 0) {
21
- i.shift().resolve(a);
2
+ function e(e) {
3
+ if (!Number.isInteger(e.capacity) || e.capacity < 1) throw RangeError("Async iterable capacity must be a positive integer");
4
+ }
5
+ function t(t, n) {
6
+ e(n);
7
+ let r = new AbortController(), i = [], a = {
8
+ kind: "open",
9
+ queue: []
10
+ }, o = () => n.signal?.removeEventListener("abort", u), s = () => {
11
+ for (; i.length > 0;) i.shift().resolve({
12
+ done: !0,
13
+ value: void 0
14
+ });
15
+ }, c = () => {
16
+ a.kind === "open" && (a.kind = "complete", o(), s());
17
+ }, l = (e) => {
18
+ if (a.kind === "open") for (a = {
19
+ kind: "error",
20
+ queue: a.queue,
21
+ reason: e
22
+ }, r.abort(), o(); i.length > 0;) i.shift().reject(e);
23
+ }, u = () => {
24
+ r.abort(), o(), a = { kind: "returned" }, s();
25
+ }, d = {
26
+ complete: c,
27
+ error: l,
28
+ next(e) {
29
+ if (a.kind !== "open") return;
30
+ let t = i.shift();
31
+ if (t) {
32
+ t.resolve({
33
+ done: !1,
34
+ value: e
35
+ });
22
36
  return;
23
37
  }
24
- r.length >= t && (r.shift(), o || (o = !0, e(`async iterator buffer exceeded ${t} queued values — dropping the oldest. The consumer is falling behind the producer; throttle the source or drain the iterator faster.`))), r.push(a);
38
+ if (a.queue.length < n.capacity) {
39
+ a.queue.push(e);
40
+ return;
41
+ }
42
+ n.overflow === "drop-oldest" ? (a.queue.shift(), a.queue.push(e)) : n.overflow === "error" && l(/* @__PURE__ */ RangeError("Async iterable buffer capacity exceeded"));
25
43
  }
26
- });
27
- function l() {
28
- for (; i.length > 0;) i.shift().resolve(s);
29
- }
30
- let u = {
44
+ };
45
+ return n.signal?.aborted ? u() : n.signal?.addEventListener("abort", u, { once: !0 }), t.subscribe(d, { signal: r.signal }), {
31
46
  next() {
32
- if (r.length > 0) {
33
- let e = r.shift();
34
- return "__err" in e ? Promise.reject(e.__err) : Promise.resolve(e);
35
- }
36
- return a ? Promise.resolve(s) : new Promise((e, t) => i.push({
47
+ return a.kind === "returned" ? Promise.resolve({
48
+ done: !0,
49
+ value: void 0
50
+ }) : a.queue.length > 0 ? Promise.resolve({
51
+ done: !1,
52
+ value: a.queue.shift()
53
+ }) : a.kind === "error" ? Promise.reject(a.reason) : a.kind === "complete" ? Promise.resolve({
54
+ done: !0,
55
+ value: void 0
56
+ }) : new Promise((e, t) => i.push({
37
57
  reject: t,
38
58
  resolve: e
39
59
  }));
40
60
  },
41
61
  return() {
42
- return a || (c(), a = !0, l()), Promise.resolve(s);
62
+ return u(), Promise.resolve({
63
+ done: !0,
64
+ value: void 0
65
+ });
43
66
  },
44
67
  [Symbol.asyncIterator]() {
45
- return u;
68
+ return this;
46
69
  }
47
70
  };
48
- return u;
49
71
  }
50
72
  //#endregion
51
- export { n as makeAsyncIterator };
73
+ export { t as toIterator };
52
74
 
53
75
  //# sourceMappingURL=_iterator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_iterator.js","names":[],"sources":["../src/_iterator.ts"],"sourcesContent":["import type { Observer, Unsubscribe } from './types';\n\nimport { warn } from './_dev';\n\ntype QueueItem<T> = IteratorResult<T> | { readonly __err: unknown };\n\n/**\n * Upper bound on the internal buffer before values are dropped (oldest first).\n * Protects against unbounded memory growth when a producer emits faster than the\n * `for await` consumer drains the iterator.\n */\nconst MAX_QUEUE_SIZE = 10_000;\n\n/**\n * Creates an `AsyncIterator<T>` backed by a subscribe function.\n * Buffers incoming values until consumed; cancels the subscription on `return()`.\n * Drops the oldest buffered value (with a one-time dev warning) if the buffer exceeds\n * `MAX_QUEUE_SIZE` see `MAX_QUEUE_SIZE`.\n * @internal\n */\nexport function makeAsyncIterator<T>(subscribe: (observer: Observer<T>) => Unsubscribe): AsyncIterableIterator<T> {\n const queue: QueueItem<T>[] = [];\n const pending: Array<{\n reject: (e: unknown) => void;\n resolve: (r: IteratorResult<T>) => void;\n }> = [];\n let done = false;\n let warnedOverflow = false;\n\n const DONE_RESULT: IteratorResult<T> = { done: true, value: undefined as T };\n\n const unsub = subscribe({\n complete() {\n done = true;\n drainPending();\n },\n error(err) {\n done = true;\n\n if (pending.length > 0) {\n pending.shift()!.reject(err);\n drainPending();\n } else {\n queue.push({ __err: err });\n }\n },\n next(v) {\n const item: IteratorResult<T> = { done: false, value: v };\n\n if (pending.length > 0) {\n pending.shift()!.resolve(item);\n\n return;\n }\n\n if (queue.length >= MAX_QUEUE_SIZE) {\n queue.shift();\n\n if (!warnedOverflow) {\n warnedOverflow = true;\n warn(\n `async iterator buffer exceeded ${MAX_QUEUE_SIZE} queued values — dropping the oldest. ` +\n 'The consumer is falling behind the producer; throttle the source or drain the iterator faster.',\n );\n }\n }\n\n queue.push(item);\n },\n });\n\n function drainPending(): void {\n while (pending.length > 0) {\n pending.shift()!.resolve(DONE_RESULT);\n }\n }\n\n const iterator = {\n next(): Promise<IteratorResult<T>> {\n if (queue.length > 0) {\n const item = queue.shift()!;\n\n if ('__err' in item) return Promise.reject((item as { __err: unknown }).__err);\n\n return Promise.resolve(item as IteratorResult<T>);\n }\n\n if (done) return Promise.resolve(DONE_RESULT);\n\n return new Promise<IteratorResult<T>>((resolve, reject) => pending.push({ reject, resolve }));\n },\n return(): Promise<IteratorResult<T>> {\n if (!done) {\n unsub();\n done = true;\n drainPending();\n }\n\n return Promise.resolve(DONE_RESULT);\n },\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return iterator;\n },\n };\n\n return iterator;\n}\n"],"mappings":";;AAWA,IAAM,IAAiB;AASvB,SAAgB,EAAqB,GAA6E;CAChH,IAAM,IAAwB,CAAC,GACzB,IAGD,CAAC,GACF,IAAO,IACP,IAAiB,IAEf,IAAiC;EAAE,MAAM;EAAM,OAAO,KAAA;CAAe,GAErE,IAAQ,EAAU;EACtB,WAAW;GAET,AADA,IAAO,IACP,EAAa;EACf;EACA,MAAM,GAAK;GAGT,AAFA,IAAO,IAEH,EAAQ,SAAS,KACnB,EAAQ,MAAM,CAAC,CAAE,OAAO,CAAG,GAC3B,EAAa,KAEb,EAAM,KAAK,EAAE,OAAO,EAAI,CAAC;EAE7B;EACA,KAAK,GAAG;GACN,IAAM,IAA0B;IAAE,MAAM;IAAO,OAAO;GAAE;GAExD,IAAI,EAAQ,SAAS,GAAG;IACtB,EAAQ,MAAM,CAAC,CAAE,QAAQ,CAAI;IAE7B;GACF;GAcA,AAZI,EAAM,UAAU,MAClB,EAAM,MAAM,GAEP,MACH,IAAiB,IACjB,EACE,kCAAkC,EAAe,qIAEnD,KAIJ,EAAM,KAAK,CAAI;EACjB;CACF,CAAC;CAED,SAAS,IAAqB;EAC5B,OAAO,EAAQ,SAAS,IACtB,EAAQ,MAAM,CAAC,CAAE,QAAQ,CAAW;CAExC;CAEA,IAAM,IAAW;EACf,OAAmC;GACjC,IAAI,EAAM,SAAS,GAAG;IACpB,IAAM,IAAO,EAAM,MAAM;IAIzB,OAFI,WAAW,IAAa,QAAQ,OAAQ,EAA4B,KAAK,IAEtE,QAAQ,QAAQ,CAAyB;GAClD;GAIA,OAFI,IAAa,QAAQ,QAAQ,CAAW,IAErC,IAAI,SAA4B,GAAS,MAAW,EAAQ,KAAK;IAAE;IAAQ;GAAQ,CAAC,CAAC;EAC9F;EACA,SAAqC;GAOnC,OANK,MACH,EAAM,GACN,IAAO,IACP,EAAa,IAGR,QAAQ,QAAQ,CAAW;EACpC;EACA,CAAC,OAAO,iBAA2C;GACjD,OAAO;EACT;CACF;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"_iterator.js","names":[],"sources":["../src/_iterator.ts"],"sourcesContent":["import 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[] } | { kind: 'error'; queue: T[]; reason: unknown } | { kind: 'returned' };\n\nfunction assertOptions(options: AsyncIterableOptions): void {\n if (!Number.isInteger(options.capacity) || options.capacity < 1) {\n throw new RangeError('Async iterable capacity must be a positive integer');\n }\n}\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 assertOptions(options);\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', stop);\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 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 RangeError('Async iterable buffer capacity exceeded'));\n }\n },\n };\n\n if (options.signal?.aborted) stop();\n else options.signal?.addEventListener('abort', stop, { 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":";AAUA,SAAS,EAAc,GAAqC;CAC1D,IAAI,CAAC,OAAO,UAAU,EAAQ,QAAQ,KAAK,EAAQ,WAAW,GAC5D,MAAU,WAAW,oDAAoD;AAE7E;AAGA,SAAgB,EAAc,GAAmB,GAAyD;CACxG,EAAc,CAAO;CAErB,IAAM,IAAa,IAAI,gBAAgB,GACjC,IAAwB,CAAC,GAC3B,IAA0B;EAAE,MAAM;EAAQ,OAAO,CAAC;CAAE,GAElD,UAAqB,EAAQ,QAAQ,oBAAoB,SAAS,CAAI,GAEtE,UAA0B;EAC9B,OAAO,EAAQ,SAAS,IAAG,EAAQ,MAAM,CAAC,CAAE,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,CAAE,OAAO,CAAM;CAC3D,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,gBAAI,WAAW,yCAAyC,CAAC;EAElE;CACF;CAOA,OALI,EAAQ,QAAQ,UAAS,EAAK,IAC7B,EAAQ,QAAQ,iBAAiB,SAAS,GAAM,EAAE,MAAM,GAAK,CAAC,GAEnE,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 ADDED
@@ -0,0 +1,2 @@
1
+ function e(e,t,n){return e.subscribe(t,{signal:n})}exports.link=e;
2
+ //# sourceMappingURL=_link.cjs.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ import type { Observer, Stream, Subscription } from './types';
2
+ /** Every operator forwards its own lifetime to every upstream subscription. */
3
+ export declare function link<T>(source: Stream<T>, observer: Observer<T>, signal: AbortSignal): Subscription;
4
+ //# sourceMappingURL=_link.d.ts.map
@@ -0,0 +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,SAAS,CAAC;AAE9D,+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 ADDED
@@ -0,0 +1,8 @@
1
+ //#region src/_link.ts
2
+ function e(e, t, n) {
3
+ return e.subscribe(t, { signal: n });
4
+ }
5
+ //#endregion
6
+ export { e as link };
7
+
8
+ //# sourceMappingURL=_link.js.map
@@ -0,0 +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"}
package/dist/_numeric.cjs CHANGED
@@ -1,2 +1,2 @@
1
- function e(e){let t=Number.isFinite(e)?Math.max(1,Math.floor(e)):1;return{clamped:t!==e,value:t}}exports.clampPositiveInt=e;
1
+ function e(e,t){if(!Number.isInteger(e)||e<0)throw RangeError(`${t} must be a non-negative integer`)}exports.assertNonNegativeInteger=e;
2
2
  //# sourceMappingURL=_numeric.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_numeric.cjs","names":[],"sources":["../src/_numeric.ts"],"sourcesContent":["/**\n * Coerces `n` to a positive integer >= 1. Non-finite values (`NaN`, `Infinity`,\n * `-Infinity`) are treated as invalid input — same as any other out-of-range\n * number and fall back to `1` rather than silently propagating a value that\n * would defeat every downstream bounds check (`length >= NaN` and `length >= Infinity`\n * are never true, which would otherwise make a \"capped\" buffer grow unbounded).\n * @internal\n */\nexport function clampPositiveInt(n: number): { clamped: boolean; value: number } {\n const value = Number.isFinite(n) ? Math.max(1, Math.floor(n)) : 1;\n\n return { clamped: value !== n, value };\n}\n"],"mappings":"AAQA,SAAgB,EAAiB,EAAgD,CAC/E,IAAM,EAAQ,OAAO,SAAS,CAAC,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,CAAC,CAAC,EAAI,EAEhE,MAAO,CAAE,QAAS,IAAU,EAAG,OAAM,CACvC"}
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"],"mappings":"AAAA,SAAgB,EAAyB,EAAe,EAAoB,CAC1E,GAAI,CAAC,OAAO,UAAU,CAAK,GAAK,EAAQ,EACtC,MAAU,WAAW,GAAG,EAAK,gCAAgC,CAEjE"}
@@ -1,2 +1,3 @@
1
- export {};
1
+ export declare function assertNonNegativeInteger(value: number, name: string): void;
2
+ export declare function assertPositiveInteger(value: number, name: string): void;
2
3
  //# sourceMappingURL=_numeric.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_numeric.d.ts","sourceRoot":"","sources":["../src/_numeric.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"_numeric.d.ts","sourceRoot":"","sources":["../src/_numeric.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI1E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIvE"}
package/dist/_numeric.js CHANGED
@@ -1,12 +1,8 @@
1
1
  //#region src/_numeric.ts
2
- function e(e) {
3
- let t = Number.isFinite(e) ? Math.max(1, Math.floor(e)) : 1;
4
- return {
5
- clamped: t !== e,
6
- value: t
7
- };
2
+ function e(e, t) {
3
+ if (!Number.isInteger(e) || e < 0) throw RangeError(`${t} must be a non-negative integer`);
8
4
  }
9
5
  //#endregion
10
- export { e as clampPositiveInt };
6
+ export { e as assertNonNegativeInteger };
11
7
 
12
8
  //# sourceMappingURL=_numeric.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_numeric.js","names":[],"sources":["../src/_numeric.ts"],"sourcesContent":["/**\n * Coerces `n` to a positive integer >= 1. Non-finite values (`NaN`, `Infinity`,\n * `-Infinity`) are treated as invalid input — same as any other out-of-range\n * number and fall back to `1` rather than silently propagating a value that\n * would defeat every downstream bounds check (`length >= NaN` and `length >= Infinity`\n * are never true, which would otherwise make a \"capped\" buffer grow unbounded).\n * @internal\n */\nexport function clampPositiveInt(n: number): { clamped: boolean; value: number } {\n const value = Number.isFinite(n) ? Math.max(1, Math.floor(n)) : 1;\n\n return { clamped: value !== n, value };\n}\n"],"mappings":";AAQA,SAAgB,EAAiB,GAAgD;CAC/E,IAAM,IAAQ,OAAO,SAAS,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,CAAC,CAAC,IAAI;CAEhE,OAAO;EAAE,SAAS,MAAU;EAAG;CAAM;AACvC"}
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"],"mappings":";AAAA,SAAgB,EAAyB,GAAe,GAAoB;CAC1E,IAAI,CAAC,OAAO,UAAU,CAAK,KAAK,IAAQ,GACtC,MAAU,WAAW,GAAG,EAAK,gCAAgC;AAEjE"}
package/dist/_pipe.cjs CHANGED
@@ -1,2 +1,2 @@
1
- function e(e){return((...t)=>t.reduce((e,t)=>t(e),e()))}exports.makePipe=e;
1
+ function e(e,t){return t.reduce((e,t)=>t(e),e)}exports.applyOperators=e;
2
2
  //# sourceMappingURL=_pipe.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_pipe.cjs","names":[],"sources":["../src/_pipe.ts"],"sourcesContent":["import type { Flux, Operator } from './types';\n\n/**\n * Builds the shared `pipe()` implementation used by `flux()` and every `Subject` variant —\n * previously copy-pasted once per factory. `getInstance` is called lazily so the returned\n * function can be assigned into an object literal that self-references its own binding\n * (`instance`/`subject`) before that binding is initialised.\n * @internal\n */\nexport function makePipe<T>(getInstance: () => Flux<T>): Flux<T>['pipe'] {\n return ((...operators: Operator[]) =>\n operators.reduce((f: Flux<unknown>, op) => op(f), getInstance() as Flux<unknown>)) as Flux<T>['pipe'];\n}\n"],"mappings":"AASA,SAAgB,EAAY,EAA6C,CACvE,QAAS,GAAG,IACV,EAAU,QAAQ,EAAkB,IAAO,EAAG,CAAC,EAAG,EAAY,CAAkB,EACpF"}
1
+ {"version":3,"file":"_pipe.cjs","names":[],"sources":["../src/_pipe.ts"],"sourcesContent":["import type { Operator, Stream } from './types';\n\nexport function applyOperators(source: Stream<unknown>, operators: readonly Operator[]): Stream<unknown> {\n return operators.reduce((current, operator) => operator(current), source);\n}\n"],"mappings":"AAEA,SAAgB,EAAe,EAAyB,EAAiD,CACvG,OAAO,EAAU,QAAQ,EAAS,IAAa,EAAS,CAAO,EAAG,CAAM,CAC1E"}
package/dist/_pipe.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- export {};
1
+ import type { Operator, Stream } from './types';
2
+ export declare function applyOperators(source: Stream<unknown>, operators: readonly Operator[]): Stream<unknown>;
2
3
  //# sourceMappingURL=_pipe.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_pipe.d.ts","sourceRoot":"","sources":["../src/_pipe.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"_pipe.d.ts","sourceRoot":"","sources":["../src/_pipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEhD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAEvG"}
package/dist/_pipe.js CHANGED
@@ -1,8 +1,8 @@
1
1
  //#region src/_pipe.ts
2
- function e(e) {
3
- return ((...t) => t.reduce((e, t) => t(e), e()));
2
+ function e(e, t) {
3
+ return t.reduce((e, t) => t(e), e);
4
4
  }
5
5
  //#endregion
6
- export { e as makePipe };
6
+ export { e as applyOperators };
7
7
 
8
8
  //# sourceMappingURL=_pipe.js.map
package/dist/_pipe.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_pipe.js","names":[],"sources":["../src/_pipe.ts"],"sourcesContent":["import type { Flux, Operator } from './types';\n\n/**\n * Builds the shared `pipe()` implementation used by `flux()` and every `Subject` variant —\n * previously copy-pasted once per factory. `getInstance` is called lazily so the returned\n * function can be assigned into an object literal that self-references its own binding\n * (`instance`/`subject`) before that binding is initialised.\n * @internal\n */\nexport function makePipe<T>(getInstance: () => Flux<T>): Flux<T>['pipe'] {\n return ((...operators: Operator[]) =>\n operators.reduce((f: Flux<unknown>, op) => op(f), getInstance() as Flux<unknown>)) as Flux<T>['pipe'];\n}\n"],"mappings":";AASA,SAAgB,EAAY,GAA6C;CACvE,SAAS,GAAG,MACV,EAAU,QAAQ,GAAkB,MAAO,EAAG,CAAC,GAAG,EAAY,CAAkB;AACpF"}
1
+ {"version":3,"file":"_pipe.js","names":[],"sources":["../src/_pipe.ts"],"sourcesContent":["import type { Operator, Stream } from './types';\n\nexport function applyOperators(source: Stream<unknown>, operators: readonly Operator[]): Stream<unknown> {\n return operators.reduce((current, operator) => operator(current), source);\n}\n"],"mappings":";AAEA,SAAgB,EAAe,GAAyB,GAAiD;CACvG,OAAO,EAAU,QAAQ,GAAS,MAAa,EAAS,CAAO,GAAG,CAAM;AAC1E"}
package/dist/_safe.cjs CHANGED
@@ -1,2 +1,2 @@
1
- function e(e,t){try{e()}catch(e){t?.(e)}}exports.guard=e;
1
+ function e(e,t){try{e()}catch(e){t(e)}}exports.tryCall=e;
2
2
  //# sourceMappingURL=_safe.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_safe.cjs","names":[],"sources":["../src/_safe.ts"],"sourcesContent":["/**\n * Run `fn`; if it throws synchronously, route the error to `onError` instead of letting\n * it escape uncaught. Used by operators to guard user-supplied callbacks (`map`'s `fn`,\n * `filter`'s `predicate`, etc.) so a throw becomes a normal `observer.error()` call\n * instead of an unhandled exception.\n * @internal\n */\nexport function guard(fn: () => void, onError?: (err: unknown) => void): void {\n try {\n fn();\n } catch (err) {\n onError?.(err);\n }\n}\n"],"mappings":"AAOA,SAAgB,EAAM,EAAgB,EAAwC,CAC5E,GAAI,CACF,EAAG,CACL,OAAS,EAAK,CACZ,IAAU,CAAG,CACf,CACF"}
1
+ {"version":3,"file":"_safe.cjs","names":[],"sources":["../src/_safe.ts"],"sourcesContent":["export function tryCall(callback: () => void, onError: (reason: unknown) => void): void {\n try {\n callback();\n } catch (reason) {\n onError(reason);\n }\n}\n"],"mappings":"AAAA,SAAgB,EAAQ,EAAsB,EAA0C,CACtF,GAAI,CACF,EAAS,CACX,OAAS,EAAQ,CACf,EAAQ,CAAM,CAChB,CACF"}
package/dist/_safe.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export {};
1
+ export declare function tryCall(callback: () => void, onError: (reason: unknown) => void): void;
2
2
  //# sourceMappingURL=_safe.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_safe.d.ts","sourceRoot":"","sources":["../src/_safe.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"_safe.d.ts","sourceRoot":"","sources":["../src/_safe.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAMtF"}
package/dist/_safe.js CHANGED
@@ -3,10 +3,10 @@ function e(e, t) {
3
3
  try {
4
4
  e();
5
5
  } catch (e) {
6
- t?.(e);
6
+ t(e);
7
7
  }
8
8
  }
9
9
  //#endregion
10
- export { e as guard };
10
+ export { e as tryCall };
11
11
 
12
12
  //# sourceMappingURL=_safe.js.map
package/dist/_safe.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_safe.js","names":[],"sources":["../src/_safe.ts"],"sourcesContent":["/**\n * Run `fn`; if it throws synchronously, route the error to `onError` instead of letting\n * it escape uncaught. Used by operators to guard user-supplied callbacks (`map`'s `fn`,\n * `filter`'s `predicate`, etc.) so a throw becomes a normal `observer.error()` call\n * instead of an unhandled exception.\n * @internal\n */\nexport function guard(fn: () => void, onError?: (err: unknown) => void): void {\n try {\n fn();\n } catch (err) {\n onError?.(err);\n }\n}\n"],"mappings":";AAOA,SAAgB,EAAM,GAAgB,GAAwC;CAC5E,IAAI;EACF,EAAG;CACL,SAAS,GAAK;EACZ,IAAU,CAAG;CACf;AACF"}
1
+ {"version":3,"file":"_safe.js","names":[],"sources":["../src/_safe.ts"],"sourcesContent":["export function tryCall(callback: () => void, onError: (reason: unknown) => void): void {\n try {\n callback();\n } catch (reason) {\n onError(reason);\n }\n}\n"],"mappings":";AAAA,SAAgB,EAAQ,GAAsB,GAA0C;CACtF,IAAI;EACF,EAAS;CACX,SAAS,GAAQ;EACf,EAAQ,CAAM;CAChB;AACF"}
@@ -1,2 +1,2 @@
1
- var e={delay(e,t){let n=setTimeout(e,t);return()=>clearTimeout(n)},repeat(e,t){let n=setInterval(e,t);return()=>clearInterval(n)}};exports.DEFAULT_SCHEDULER=e;
1
+ var e={delay(e,t){let n=setTimeout(e,t);return()=>clearTimeout(n)},repeat(e,t){let n=setInterval(e,t);return()=>clearInterval(n)}};exports.defaultScheduler=e;
2
2
  //# sourceMappingURL=_scheduler.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_scheduler.cjs","names":[],"sources":["../src/_scheduler.ts"],"sourcesContent":["import type { Scheduler } from './types';\n\nexport const DEFAULT_SCHEDULER: Scheduler = {\n delay(fn, ms) {\n const id = setTimeout(fn, ms);\n\n return () => clearTimeout(id);\n },\n repeat(fn, ms) {\n const id = setInterval(fn, ms);\n\n return () => clearInterval(id);\n },\n};\n"],"mappings":"AAEA,IAAa,EAA+B,CAC1C,MAAM,EAAI,EAAI,CACZ,IAAM,EAAK,WAAW,EAAI,CAAE,EAE5B,UAAa,aAAa,CAAE,CAC9B,EACA,OAAO,EAAI,EAAI,CACb,IAAM,EAAK,YAAY,EAAI,CAAE,EAE7B,UAAa,cAAc,CAAE,CAC/B,CACF"}
1
+ {"version":3,"file":"_scheduler.cjs","names":[],"sources":["../src/_scheduler.ts"],"sourcesContent":["export type Scheduler = {\n delay(callback: () => void, milliseconds: number): () => void;\n repeat(callback: () => void, milliseconds: number): () => void;\n};\n\nexport const defaultScheduler: Scheduler = {\n delay(callback, milliseconds) {\n const id = setTimeout(callback, milliseconds);\n\n return () => clearTimeout(id);\n },\n repeat(callback, milliseconds) {\n const id = setInterval(callback, milliseconds);\n\n return () => clearInterval(id);\n },\n};\n"],"mappings":"AAKA,IAAa,EAA8B,CACzC,MAAM,EAAU,EAAc,CAC5B,IAAM,EAAK,WAAW,EAAU,CAAY,EAE5C,UAAa,aAAa,CAAE,CAC9B,EACA,OAAO,EAAU,EAAc,CAC7B,IAAM,EAAK,YAAY,EAAU,CAAY,EAE7C,UAAa,cAAc,CAAE,CAC/B,CACF"}
@@ -1,3 +1,6 @@
1
- import type { Scheduler } from './types';
2
- export declare const DEFAULT_SCHEDULER: Scheduler;
1
+ export type Scheduler = {
2
+ delay(callback: () => void, milliseconds: number): () => void;
3
+ repeat(callback: () => void, milliseconds: number): () => void;
4
+ };
5
+ export declare const defaultScheduler: Scheduler;
3
6
  //# sourceMappingURL=_scheduler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_scheduler.d.ts","sourceRoot":"","sources":["../src/_scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,eAAO,MAAM,iBAAiB,EAAE,SAW/B,CAAC"}
1
+ {"version":3,"file":"_scheduler.d.ts","sourceRoot":"","sources":["../src/_scheduler.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC9D,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;CAChE,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,SAW9B,CAAC"}
@@ -10,6 +10,6 @@ var e = {
10
10
  }
11
11
  };
12
12
  //#endregion
13
- export { e as DEFAULT_SCHEDULER };
13
+ export { e as defaultScheduler };
14
14
 
15
15
  //# sourceMappingURL=_scheduler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_scheduler.js","names":[],"sources":["../src/_scheduler.ts"],"sourcesContent":["import type { Scheduler } from './types';\n\nexport const DEFAULT_SCHEDULER: Scheduler = {\n delay(fn, ms) {\n const id = setTimeout(fn, ms);\n\n return () => clearTimeout(id);\n },\n repeat(fn, ms) {\n const id = setInterval(fn, ms);\n\n return () => clearInterval(id);\n },\n};\n"],"mappings":";AAEA,IAAa,IAA+B;CAC1C,MAAM,GAAI,GAAI;EACZ,IAAM,IAAK,WAAW,GAAI,CAAE;EAE5B,aAAa,aAAa,CAAE;CAC9B;CACA,OAAO,GAAI,GAAI;EACb,IAAM,IAAK,YAAY,GAAI,CAAE;EAE7B,aAAa,cAAc,CAAE;CAC/B;AACF"}
1
+ {"version":3,"file":"_scheduler.js","names":[],"sources":["../src/_scheduler.ts"],"sourcesContent":["export type Scheduler = {\n delay(callback: () => void, milliseconds: number): () => void;\n repeat(callback: () => void, milliseconds: number): () => void;\n};\n\nexport const defaultScheduler: Scheduler = {\n delay(callback, milliseconds) {\n const id = setTimeout(callback, milliseconds);\n\n return () => clearTimeout(id);\n },\n repeat(callback, milliseconds) {\n const id = setInterval(callback, milliseconds);\n\n return () => clearInterval(id);\n },\n};\n"],"mappings":";AAKA,IAAa,IAA8B;CACzC,MAAM,GAAU,GAAc;EAC5B,IAAM,IAAK,WAAW,GAAU,CAAY;EAE5C,aAAa,aAAa,CAAE;CAC9B;CACA,OAAO,GAAU,GAAc;EAC7B,IAAM,IAAK,YAAY,GAAU,CAAY;EAE7C,aAAa,cAAc,CAAE;CAC/B;AACF"}
@@ -0,0 +1,2 @@
1
+ function e(e){let t=globalThis.reportError;if(t){t(e);return}queueMicrotask(()=>{throw e})}function t(t,n){let r=typeof t==`function`?{next:t}:t,i=new AbortController,a=!1,o,s=()=>{if(!a){a=!0,i.abort(),n?.removeEventListener(`abort`,s);try{o?.()}catch(t){e(t)}}};return n?.aborted?s():n?.addEventListener(`abort`,s,{once:!0}),{add:t=>{if(t){if(a){try{t()}catch(t){e(t)}return}o=t}},signal:i.signal,sink:{complete(){if(!a){try{r.complete?.()}catch(t){e(t)}s()}},error(t){if(!a){if(r.error)try{r.error(t)}catch(t){e(t)}else e(t);s()}},next(t){if(!a)try{r.next(t)}catch(t){s(),e(t)}}},subscription:{get closed(){return a},[Symbol.dispose]:s,unsubscribe:s}}}exports.createSubscription=t;
2
+ //# sourceMappingURL=_subscription.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_subscription.cjs","names":[],"sources":["../src/_subscription.ts"],"sourcesContent":["import type { Observer, Sink, Subscription, Teardown } from './types';\n\nfunction 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 | void): 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 | void): 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":"AAEA,SAAS,EAAqB,EAAuB,CACnD,IAAM,EAAe,WAA0D,YAE/E,GAAI,EAAa,CACf,EAAY,CAAM,EAElB,MACF,CAEA,mBAAqB,CACnB,MAAM,CACR,CAAC,CACH,CAEA,SAAgB,EACd,EACA,EAC0G,CAC1G,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,GAAwC,CAC9C,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"}
@@ -0,0 +1,8 @@
1
+ import type { Observer, Sink, Subscription, Teardown } from './types';
2
+ export declare function createSubscription<T>(observerOrNext: Observer<T> | ((value: T) => void), signal?: AbortSignal): {
3
+ add(teardown: Teardown | void): void;
4
+ signal: AbortSignal;
5
+ sink: Sink<T>;
6
+ subscription: Subscription;
7
+ };
8
+ //# sourceMappingURL=_subscription.d.ts.map
@@ -0,0 +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,SAAS,CAAC;AAgBtE,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,IAAI,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,YAAY,EAAE,YAAY,CAAA;CAAE,CA+F1G"}