iter-fest 0.2.2-main.fdb3230 → 0.3.1-main.202512220058.031427d

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 (43) hide show
  1. package/README.md +47 -32
  2. package/dist/chunk-6ZEIOTH6.mjs +9 -0
  3. package/dist/chunk-6ZEIOTH6.mjs.map +1 -0
  4. package/dist/{chunk-2DE3J4J7.mjs → chunk-AMBNMMKA.mjs} +2 -1
  5. package/dist/chunk-AMBNMMKA.mjs.map +1 -0
  6. package/dist/{chunk-ANRVAYLW.mjs → chunk-P6MH6RRG.mjs} +2 -1
  7. package/dist/chunk-P6MH6RRG.mjs.map +1 -0
  8. package/dist/chunk-VF6V265K.mjs +190 -0
  9. package/dist/chunk-VF6V265K.mjs.map +1 -0
  10. package/dist/chunk-YGRCFTJT.mjs +13 -0
  11. package/dist/chunk-YGRCFTJT.mjs.map +1 -0
  12. package/dist/iter-fest.asyncGeneratorWithLastValue.js +1 -0
  13. package/dist/iter-fest.asyncGeneratorWithLastValue.js.map +1 -1
  14. package/dist/iter-fest.asyncGeneratorWithLastValue.mjs +1 -1
  15. package/dist/iter-fest.d.mts +1 -0
  16. package/dist/iter-fest.d.ts +1 -0
  17. package/dist/iter-fest.generatorWithLastValue.js +1 -0
  18. package/dist/iter-fest.generatorWithLastValue.js.map +1 -1
  19. package/dist/iter-fest.generatorWithLastValue.mjs +1 -1
  20. package/dist/iter-fest.js +198 -47
  21. package/dist/iter-fest.js.map +1 -1
  22. package/dist/iter-fest.mjs +11 -7
  23. package/dist/iter-fest.observableValues.js +1 -45
  24. package/dist/iter-fest.observableValues.js.map +1 -1
  25. package/dist/iter-fest.observableValues.mjs +1 -2
  26. package/dist/iter-fest.readableStreamValues.d.mts +6 -1
  27. package/dist/iter-fest.readableStreamValues.d.ts +6 -1
  28. package/dist/iter-fest.readableStreamValues.js +2 -19
  29. package/dist/iter-fest.readableStreamValues.js.map +1 -1
  30. package/dist/iter-fest.readableStreamValues.mjs +1 -1
  31. package/dist/iter-fest.readableStreamValuesWithSignal.d.mts +15 -0
  32. package/dist/iter-fest.readableStreamValuesWithSignal.d.ts +15 -0
  33. package/dist/iter-fest.readableStreamValuesWithSignal.js +216 -0
  34. package/dist/iter-fest.readableStreamValuesWithSignal.js.map +1 -0
  35. package/dist/iter-fest.readableStreamValuesWithSignal.mjs +7 -0
  36. package/dist/iter-fest.readableStreamValuesWithSignal.mjs.map +1 -0
  37. package/package.json +26 -14
  38. package/dist/chunk-2DE3J4J7.mjs.map +0 -1
  39. package/dist/chunk-ANRVAYLW.mjs.map +0 -1
  40. package/dist/chunk-RVIERPEV.mjs +0 -26
  41. package/dist/chunk-RVIERPEV.mjs.map +0 -1
  42. package/dist/chunk-WMTE2GGJ.mjs +0 -38
  43. package/dist/chunk-WMTE2GGJ.mjs.map +0 -1
@@ -1,6 +1,12 @@
1
1
  import {
2
2
  readableStreamFrom
3
3
  } from "./chunk-YJSIVBF7.mjs";
4
+ import {
5
+ readableStreamValues
6
+ } from "./chunk-6ZEIOTH6.mjs";
7
+ import {
8
+ readableStreamValuesWithSignal
9
+ } from "./chunk-VF6V265K.mjs";
4
10
  import {
5
11
  iteratorToAsync
6
12
  } from "./chunk-VP5SFGCE.mjs";
@@ -21,10 +27,7 @@ import {
21
27
  } from "./chunk-BZKIZ3TX.mjs";
22
28
  import {
23
29
  observableValues
24
- } from "./chunk-WMTE2GGJ.mjs";
25
- import {
26
- readableStreamValues
27
- } from "./chunk-RVIERPEV.mjs";
30
+ } from "./chunk-YGRCFTJT.mjs";
28
31
  import {
29
32
  observableSubscribeAsReadable
30
33
  } from "./chunk-GOJ2PI5W.mjs";
@@ -127,10 +130,10 @@ import {
127
130
  } from "./chunk-P4OSZLEH.mjs";
128
131
  import {
129
132
  generatorWithLastValue
130
- } from "./chunk-2DE3J4J7.mjs";
133
+ } from "./chunk-AMBNMMKA.mjs";
131
134
  import {
132
135
  asyncGeneratorWithLastValue
133
- } from "./chunk-ANRVAYLW.mjs";
136
+ } from "./chunk-P6MH6RRG.mjs";
134
137
  import {
135
138
  asyncIteratorDrop
136
139
  } from "./chunk-IBEDYMB6.mjs";
@@ -199,6 +202,7 @@ export {
199
202
  observableSubscribeAsReadable,
200
203
  observableValues,
201
204
  readableStreamFrom,
202
- readableStreamValues
205
+ readableStreamValues,
206
+ readableStreamValuesWithSignal
203
207
  };
204
208
  //# sourceMappingURL=iter-fest.mjs.map
@@ -47,53 +47,9 @@ function observableSubscribeAsReadable(observable) {
47
47
  });
48
48
  }
49
49
 
50
- // src/readableStreamValues.ts
51
- function readableStreamValues(readable) {
52
- const reader = readable.getReader();
53
- const iterable = {
54
- [Symbol.asyncIterator]() {
55
- return iterable;
56
- },
57
- async next() {
58
- const result = await Promise.race([reader.read(), reader.closed]);
59
- if (!result || result.done) {
60
- return { done: true, value: void 0 };
61
- }
62
- return { value: result.value };
63
- },
64
- async return() {
65
- reader.releaseLock();
66
- return { done: true, value: void 0 };
67
- }
68
- };
69
- return iterable;
70
- }
71
-
72
50
  // src/observableValues.ts
73
51
  function observableValues(observable) {
74
- const readable = observableSubscribeAsReadable(observable);
75
- const iterable = readableStreamValues(readable);
76
- const cancellableIterable = {
77
- [Symbol.asyncIterator]() {
78
- return cancellableIterable;
79
- },
80
- next() {
81
- return iterable.next();
82
- },
83
- return() {
84
- var _a;
85
- try {
86
- return ((_a = iterable.return) == null ? void 0 : _a.call(iterable)) ?? Promise.resolve({ done: true, value: void 0 });
87
- } finally {
88
- readable.cancel();
89
- }
90
- },
91
- throw(error) {
92
- var _a;
93
- return ((_a = iterable.throw) == null ? void 0 : _a.call(iterable, error)) ?? Promise.resolve({ done: true, value: void 0 });
94
- }
95
- };
96
- return cancellableIterable;
52
+ return observableSubscribeAsReadable(observable).values();
97
53
  }
98
54
  // Annotate the CommonJS export names for ESM import in node:
99
55
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/observableValues.ts","../src/observableSubscribeAsReadable.ts","../src/readableStreamValues.ts"],"sourcesContent":["import { type Observable } from './Observable.ts';\nimport { observableSubscribeAsReadable } from './observableSubscribeAsReadable.ts';\nimport { readableStreamValues } from './readableStreamValues.ts';\n\nexport function observableValues<T>(observable: Observable<T>): AsyncIterableIterator<T> {\n const readable = observableSubscribeAsReadable(observable);\n const iterable = readableStreamValues(readable);\n\n const cancellableIterable: AsyncIterableIterator<T> = {\n [Symbol.asyncIterator]() {\n return cancellableIterable;\n },\n next() {\n return iterable.next();\n },\n return() {\n try {\n return iterable.return?.() ?? Promise.resolve({ done: true, value: undefined });\n } finally {\n readable.cancel();\n }\n },\n throw(error) {\n return iterable.throw?.(error) ?? Promise.resolve({ done: true, value: undefined });\n }\n };\n\n return cancellableIterable;\n}\n","import { type Observable, type Subscription } from './Observable.ts';\n\nexport function observableSubscribeAsReadable<T>(observable: Observable<T>): ReadableStream<T> {\n let subscription: Subscription;\n\n return new ReadableStream<T>({\n cancel() {\n subscription.unsubscribe();\n },\n start(controller) {\n subscription = observable.subscribe({\n complete() {\n controller.close();\n },\n error(err: unknown) {\n controller.error(err);\n },\n next(value) {\n controller.enqueue(value);\n }\n });\n }\n });\n}\n","export function readableStreamValues<T>(readable: ReadableStream<T>): AsyncIterableIterator<T> {\n const reader = readable.getReader();\n\n const iterable: AsyncIterableIterator<T> = {\n [Symbol.asyncIterator]() {\n return iterable;\n },\n async next(): Promise<IteratorResult<T>> {\n const result = await Promise.race([reader.read(), reader.closed]);\n\n if (!result || result.done) {\n return { done: true, value: undefined };\n }\n\n return { value: result.value };\n },\n async return() {\n // Break/throw inside for-loop will trigger return().\n reader.releaseLock();\n\n return { done: true, value: undefined };\n }\n };\n\n return iterable;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,SAAS,8BAAiC,YAA8C;AAC7F,MAAI;AAEJ,SAAO,IAAI,eAAkB;AAAA,IAC3B,SAAS;AACP,mBAAa,YAAY;AAAA,IAC3B;AAAA,IACA,MAAM,YAAY;AAChB,qBAAe,WAAW,UAAU;AAAA,QAClC,WAAW;AACT,qBAAW,MAAM;AAAA,QACnB;AAAA,QACA,MAAM,KAAc;AAClB,qBAAW,MAAM,GAAG;AAAA,QACtB;AAAA,QACA,KAAK,OAAO;AACV,qBAAW,QAAQ,KAAK;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;ACvBO,SAAS,qBAAwB,UAAuD;AAC7F,QAAM,SAAS,SAAS,UAAU;AAElC,QAAM,WAAqC;AAAA,IACzC,CAAC,OAAO,aAAa,IAAI;AACvB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAmC;AACvC,YAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,OAAO,KAAK,GAAG,OAAO,MAAM,CAAC;AAEhE,UAAI,CAAC,UAAU,OAAO,MAAM;AAC1B,eAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,MACxC;AAEA,aAAO,EAAE,OAAO,OAAO,MAAM;AAAA,IAC/B;AAAA,IACA,MAAM,SAAS;AAEb,aAAO,YAAY;AAEnB,aAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;;;AFrBO,SAAS,iBAAoB,YAAqD;AACvF,QAAM,WAAW,8BAA8B,UAAU;AACzD,QAAM,WAAW,qBAAqB,QAAQ;AAE9C,QAAM,sBAAgD;AAAA,IACpD,CAAC,OAAO,aAAa,IAAI;AACvB,aAAO;AAAA,IACT;AAAA,IACA,OAAO;AACL,aAAO,SAAS,KAAK;AAAA,IACvB;AAAA,IACA,SAAS;AAfb;AAgBM,UAAI;AACF,iBAAO,cAAS,WAAT,sCAAuB,QAAQ,QAAQ,EAAE,MAAM,MAAM,OAAO,OAAU,CAAC;AAAA,MAChF,UAAE;AACA,iBAAS,OAAO;AAAA,MAClB;AAAA,IACF;AAAA,IACA,MAAM,OAAO;AAtBjB;AAuBM,eAAO,cAAS,UAAT,kCAAiB,WAAU,QAAQ,QAAQ,EAAE,MAAM,MAAM,OAAO,OAAU,CAAC;AAAA,IACpF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/observableValues.ts","../src/observableSubscribeAsReadable.ts"],"sourcesContent":["import { type Observable } from './Observable.ts';\nimport { observableSubscribeAsReadable } from './observableSubscribeAsReadable.ts';\n\nexport function observableValues<T>(observable: Observable<T>): AsyncIterableIterator<T> {\n return observableSubscribeAsReadable(observable).values();\n}\n","import { type Observable, type Subscription } from './Observable.ts';\n\nexport function observableSubscribeAsReadable<T>(observable: Observable<T>): ReadableStream<T> {\n let subscription: Subscription;\n\n return new ReadableStream<T>({\n cancel() {\n subscription.unsubscribe();\n },\n start(controller) {\n subscription = observable.subscribe({\n complete() {\n controller.close();\n },\n error(err: unknown) {\n controller.error(err);\n },\n next(value) {\n controller.enqueue(value);\n }\n });\n }\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,SAAS,8BAAiC,YAA8C;AAC7F,MAAI;AAEJ,SAAO,IAAI,eAAkB;AAAA,IAC3B,SAAS;AACP,mBAAa,YAAY;AAAA,IAC3B;AAAA,IACA,MAAM,YAAY;AAChB,qBAAe,WAAW,UAAU;AAAA,QAClC,WAAW;AACT,qBAAW,MAAM;AAAA,QACnB;AAAA,QACA,MAAM,KAAc;AAClB,qBAAW,MAAM,GAAG;AAAA,QACtB;AAAA,QACA,KAAK,OAAO;AACV,qBAAW,QAAQ,KAAK;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;ADpBO,SAAS,iBAAoB,YAAqD;AACvF,SAAO,8BAA8B,UAAU,EAAE,OAAO;AAC1D;","names":[]}
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  observableValues
3
- } from "./chunk-WMTE2GGJ.mjs";
4
- import "./chunk-RVIERPEV.mjs";
3
+ } from "./chunk-YGRCFTJT.mjs";
5
4
  import "./chunk-GOJ2PI5W.mjs";
6
5
  export {
7
6
  observableValues
@@ -1,3 +1,8 @@
1
- declare function readableStreamValues<T>(readable: ReadableStream<T>): AsyncIterableIterator<T>;
1
+ /**
2
+ * This is deprecated. You should use `ReadableStream.values` instead.
3
+ *
4
+ * @deprecated
5
+ */
6
+ declare function readableStreamValues<T>(readable: ReadableStream<T>, options?: ReadableStreamIteratorOptions | undefined): AsyncIterableIterator<T>;
2
7
 
3
8
  export { readableStreamValues };
@@ -1,3 +1,8 @@
1
- declare function readableStreamValues<T>(readable: ReadableStream<T>): AsyncIterableIterator<T>;
1
+ /**
2
+ * This is deprecated. You should use `ReadableStream.values` instead.
3
+ *
4
+ * @deprecated
5
+ */
6
+ declare function readableStreamValues<T>(readable: ReadableStream<T>, options?: ReadableStreamIteratorOptions | undefined): AsyncIterableIterator<T>;
2
7
 
3
8
  export { readableStreamValues };
@@ -23,25 +23,8 @@ __export(readableStreamValues_exports, {
23
23
  readableStreamValues: () => readableStreamValues
24
24
  });
25
25
  module.exports = __toCommonJS(readableStreamValues_exports);
26
- function readableStreamValues(readable) {
27
- const reader = readable.getReader();
28
- const iterable = {
29
- [Symbol.asyncIterator]() {
30
- return iterable;
31
- },
32
- async next() {
33
- const result = await Promise.race([reader.read(), reader.closed]);
34
- if (!result || result.done) {
35
- return { done: true, value: void 0 };
36
- }
37
- return { value: result.value };
38
- },
39
- async return() {
40
- reader.releaseLock();
41
- return { done: true, value: void 0 };
42
- }
43
- };
44
- return iterable;
26
+ function readableStreamValues(readable, options) {
27
+ return readable.values(options);
45
28
  }
46
29
  // Annotate the CommonJS export names for ESM import in node:
47
30
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/readableStreamValues.ts"],"sourcesContent":["export function readableStreamValues<T>(readable: ReadableStream<T>): AsyncIterableIterator<T> {\n const reader = readable.getReader();\n\n const iterable: AsyncIterableIterator<T> = {\n [Symbol.asyncIterator]() {\n return iterable;\n },\n async next(): Promise<IteratorResult<T>> {\n const result = await Promise.race([reader.read(), reader.closed]);\n\n if (!result || result.done) {\n return { done: true, value: undefined };\n }\n\n return { value: result.value };\n },\n async return() {\n // Break/throw inside for-loop will trigger return().\n reader.releaseLock();\n\n return { done: true, value: undefined };\n }\n };\n\n return iterable;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,SAAS,qBAAwB,UAAuD;AAC7F,QAAM,SAAS,SAAS,UAAU;AAElC,QAAM,WAAqC;AAAA,IACzC,CAAC,OAAO,aAAa,IAAI;AACvB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAmC;AACvC,YAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,OAAO,KAAK,GAAG,OAAO,MAAM,CAAC;AAEhE,UAAI,CAAC,UAAU,OAAO,MAAM;AAC1B,eAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,MACxC;AAEA,aAAO,EAAE,OAAO,OAAO,MAAM;AAAA,IAC/B;AAAA,IACA,MAAM,SAAS;AAEb,aAAO,YAAY;AAEnB,aAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/readableStreamValues.ts"],"sourcesContent":["/**\n * This is deprecated. You should use `ReadableStream.values` instead.\n *\n * @deprecated\n */\nexport function readableStreamValues<T>(\n readable: ReadableStream<T>,\n options?: ReadableStreamIteratorOptions | undefined\n): AsyncIterableIterator<T> {\n return readable.values(options);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,SAAS,qBACd,UACA,SAC0B;AAC1B,SAAO,SAAS,OAAO,OAAO;AAChC;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  readableStreamValues
3
- } from "./chunk-RVIERPEV.mjs";
3
+ } from "./chunk-6ZEIOTH6.mjs";
4
4
  export {
5
5
  readableStreamValues
6
6
  };
@@ -0,0 +1,15 @@
1
+ type ReadableStreamIteratorWithSignalOptions = ReadableStreamIteratorOptions & {
2
+ signal?: AbortSignal | undefined;
3
+ };
4
+ /**
5
+ * This is based on WHATWG Streams Asynchronous Iteration specification.
6
+ *
7
+ * @see https://streams.spec.whatwg.org/#rs-asynciterator
8
+ *
9
+ * @param stream
10
+ * @param options
11
+ * @returns
12
+ */
13
+ declare function readableStreamValuesWithSignal<T>(stream: ReadableStream<T>, options?: ReadableStreamIteratorWithSignalOptions | undefined): ReadableStreamAsyncIterator<T>;
14
+
15
+ export { type ReadableStreamIteratorWithSignalOptions, readableStreamValuesWithSignal };
@@ -0,0 +1,15 @@
1
+ type ReadableStreamIteratorWithSignalOptions = ReadableStreamIteratorOptions & {
2
+ signal?: AbortSignal | undefined;
3
+ };
4
+ /**
5
+ * This is based on WHATWG Streams Asynchronous Iteration specification.
6
+ *
7
+ * @see https://streams.spec.whatwg.org/#rs-asynciterator
8
+ *
9
+ * @param stream
10
+ * @param options
11
+ * @returns
12
+ */
13
+ declare function readableStreamValuesWithSignal<T>(stream: ReadableStream<T>, options?: ReadableStreamIteratorWithSignalOptions | undefined): ReadableStreamAsyncIterator<T>;
14
+
15
+ export { type ReadableStreamIteratorWithSignalOptions, readableStreamValuesWithSignal };
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/readableStreamValuesWithSignal.ts
21
+ var readableStreamValuesWithSignal_exports = {};
22
+ __export(readableStreamValuesWithSignal_exports, {
23
+ readableStreamValuesWithSignal: () => readableStreamValuesWithSignal
24
+ });
25
+ module.exports = __toCommonJS(readableStreamValuesWithSignal_exports);
26
+
27
+ // src/private/CriticalSection.ts
28
+ var CriticalSection = class {
29
+ #callbacks = [];
30
+ enter(fn) {
31
+ const fnResolver = Promise.withResolvers();
32
+ const callback = async () => {
33
+ try {
34
+ fnResolver.resolve(await fn());
35
+ } catch (error) {
36
+ fnResolver.reject(error);
37
+ }
38
+ if (this.#callbacks.shift() !== callback) {
39
+ throw new Error("ASSERTION: The first resolver must be self.");
40
+ }
41
+ this.#callbacks[0]?.();
42
+ };
43
+ this.#callbacks.push(callback);
44
+ this.#callbacks[0] === callback && callback();
45
+ return fnResolver.promise;
46
+ }
47
+ };
48
+
49
+ // src/private/AsyncIteratorMachinery.ts
50
+ var AsyncIteratorMachinery = class {
51
+ constructor(iterator) {
52
+ this.#criticalSection = new CriticalSection();
53
+ this.#done = false;
54
+ const enter = this.#criticalSection.enter.bind(this.#criticalSection);
55
+ const return_ = iterator.return && iterator.return.bind(iterator);
56
+ const throw_ = iterator.throw && iterator.throw.bind(iterator);
57
+ this.next = (...[value]) => enter(async () => {
58
+ if (this.#done) {
59
+ return Promise.resolve({ done: true, value: void 0 });
60
+ }
61
+ const result = await iterator.next(...value ? [value] : []);
62
+ if (result.done) {
63
+ this.#done = true;
64
+ }
65
+ return result;
66
+ });
67
+ if (return_) {
68
+ this.return = (value) => enter(async () => {
69
+ if (this.#done) {
70
+ return {
71
+ done: true,
72
+ value: typeof value === "undefined" ? value : await value
73
+ };
74
+ }
75
+ this.#done = true;
76
+ return return_(value);
77
+ });
78
+ }
79
+ if (throw_) {
80
+ this.throw = (reason) => enter(() => {
81
+ if (this.#done) {
82
+ return Promise.reject(reason);
83
+ }
84
+ this.#done = true;
85
+ return throw_(reason);
86
+ });
87
+ }
88
+ }
89
+ #criticalSection;
90
+ #done;
91
+ async [Symbol.asyncDispose]() {
92
+ }
93
+ [Symbol.asyncIterator]() {
94
+ return this;
95
+ }
96
+ next;
97
+ return;
98
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
99
+ throw;
100
+ };
101
+
102
+ // src/private/createAbortError.ts
103
+ var ERROR_MESSAGE = "The operation is aborted";
104
+ var ERROR_NAME = "AbortError";
105
+ function createAbortError() {
106
+ if (typeof globalThis.DOMException === "undefined") {
107
+ const error = new Error(ERROR_MESSAGE);
108
+ error.name = ERROR_NAME;
109
+ return error;
110
+ } else {
111
+ return new DOMException(ERROR_MESSAGE, ERROR_NAME);
112
+ }
113
+ }
114
+
115
+ // src/readableStreamValuesWithSignal.ts
116
+ var ReadableStreamIterator = class {
117
+ // The asynchronous iterator initialization steps for a ReadableStream, given stream, iterator, and args, are:
118
+ constructor(stream, args) {
119
+ const reader = stream.getReader();
120
+ this.#reader = reader;
121
+ const preventCancel = !!args[0].preventCancel;
122
+ this.#preventCancel = preventCancel;
123
+ this.#signal = args[0].signal;
124
+ this.#signal?.addEventListener(
125
+ "abort",
126
+ async () => {
127
+ this.#preventCancel || reader.cancel(createAbortError());
128
+ reader.releaseLock();
129
+ },
130
+ { once: true }
131
+ );
132
+ }
133
+ #preventCancel;
134
+ #reader;
135
+ #readRequests = [];
136
+ #signal;
137
+ [Symbol.asyncIterator]() {
138
+ return this;
139
+ }
140
+ async [Symbol.asyncDispose]() {
141
+ }
142
+ // The get the next iteration result steps for a ReadableStream, given stream and iterator, are:
143
+ // next(...[value]: [] | [any]): Promise<IteratorResult<T, any>> {
144
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
145
+ next = () => {
146
+ if (this.#signal?.aborted) {
147
+ return Promise.reject(createAbortError());
148
+ }
149
+ const nextResolvers = Promise.withResolvers();
150
+ const reader = this.#reader;
151
+ const resolvers = Promise.withResolvers();
152
+ const request = {
153
+ // chunk steps, given chunk
154
+ chunk(value) {
155
+ resolvers.resolve({ done: false, value });
156
+ },
157
+ // close steps
158
+ close() {
159
+ reader.releaseLock();
160
+ resolvers.resolve({ done: true, value: void 0 });
161
+ },
162
+ // error steps, given e
163
+ error(reason) {
164
+ reader.releaseLock();
165
+ resolvers.reject(reason);
166
+ }
167
+ };
168
+ this.#readRequests.push(request);
169
+ (async () => {
170
+ try {
171
+ const result = await reader.read();
172
+ if (result.done) {
173
+ if (this.#signal?.aborted) {
174
+ request.error(createAbortError());
175
+ }
176
+ request.close();
177
+ } else {
178
+ request.chunk(result.value);
179
+ }
180
+ } catch (error) {
181
+ if (this.#signal?.aborted) {
182
+ request.error(createAbortError());
183
+ } else {
184
+ request.error(error);
185
+ }
186
+ } finally {
187
+ nextResolvers.resolve();
188
+ }
189
+ })();
190
+ return resolvers.promise;
191
+ };
192
+ // The asynchronous iterator return steps for a ReadableStream, given stream, iterator, and arg, are:
193
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
194
+ async return(value) {
195
+ if (this.#signal?.aborted) {
196
+ return Promise.reject(createAbortError());
197
+ }
198
+ const reader = this.#reader;
199
+ if (!this.#preventCancel) {
200
+ const cancelPromise = reader.cancel(value);
201
+ reader.releaseLock();
202
+ await cancelPromise;
203
+ return { done: true, value };
204
+ }
205
+ reader.releaseLock();
206
+ return { done: true, value };
207
+ }
208
+ };
209
+ function readableStreamValuesWithSignal(stream, options) {
210
+ return new AsyncIteratorMachinery(new ReadableStreamIterator(stream, [options || {}]));
211
+ }
212
+ // Annotate the CommonJS export names for ESM import in node:
213
+ 0 && (module.exports = {
214
+ readableStreamValuesWithSignal
215
+ });
216
+ //# sourceMappingURL=iter-fest.readableStreamValuesWithSignal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/readableStreamValuesWithSignal.ts","../src/private/CriticalSection.ts","../src/private/AsyncIteratorMachinery.ts","../src/private/createAbortError.ts"],"sourcesContent":["import AsyncIteratorMachinery from './private/AsyncIteratorMachinery.ts';\nimport createAbortError from './private/createAbortError.ts';\n\ntype ReadableStreamIteratorWithSignalOptions = ReadableStreamIteratorOptions & {\n signal?: AbortSignal | undefined;\n};\n\ntype ReadableStreamIteratorReadRequest<T> = {\n chunk(value: T): void;\n close(): void;\n error(error: unknown): void;\n};\n\nclass ReadableStreamIterator<T> implements ReadableStreamAsyncIterator<T> {\n // The asynchronous iterator initialization steps for a ReadableStream, given stream, iterator, and args, are:\n constructor(\n stream: ReadableStream<T>,\n args: [{ preventCancel?: boolean | undefined; signal?: AbortSignal | undefined }]\n ) {\n // 1. Let reader be ? AcquireReadableStreamDefaultReader(stream).\n const reader = stream.getReader();\n\n // 2. Set iterator’s reader to reader.\n this.#reader = reader;\n\n // 3. Let preventCancel be args[0][\"preventCancel\"].\n const preventCancel = !!args[0].preventCancel;\n\n // 4. Set iterator’s prevent cancel to preventCancel.\n this.#preventCancel = preventCancel;\n\n this.#signal = args[0].signal;\n\n this.#signal?.addEventListener(\n 'abort',\n async () => {\n // Ignore cancel() rejections.\n this.#preventCancel || reader.cancel(createAbortError());\n\n reader.releaseLock();\n },\n { once: true }\n );\n }\n\n #preventCancel: boolean;\n #reader: ReadableStreamDefaultReader<T>;\n #readRequests: ReadableStreamIteratorReadRequest<T>[] = [];\n #signal: AbortSignal | undefined;\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n async [Symbol.asyncDispose]() {}\n\n // The get the next iteration result steps for a ReadableStream, given stream and iterator, are:\n // next(...[value]: [] | [any]): Promise<IteratorResult<T, any>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n next: () => Promise<IteratorResult<T, any>> = () => {\n if (this.#signal?.aborted) {\n return Promise.reject(createAbortError());\n }\n\n // Iterator machinery: iterator is busy, don't start return().\n const nextResolvers = Promise.withResolvers<void>();\n\n // 1. Let reader be iterator’s reader.\n const reader = this.#reader;\n\n // 2. Assert: reader.[[stream]] is not undefined.\n\n // 3. Let promise be a new promise.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const resolvers = Promise.withResolvers<IteratorResult<T, any>>();\n\n // 4. Let readRequest be a new read request with the following items:\n const request: ReadableStreamIteratorReadRequest<T> = {\n // chunk steps, given chunk\n chunk(value) {\n // Resolve promise with chunk.\n resolvers.resolve({ done: false, value });\n },\n // close steps\n close() {\n // Perform ! ReadableStreamDefaultReaderRelease(reader).\n reader.releaseLock();\n\n // Resolve promise with end of iteration.\n resolvers.resolve({ done: true, value: undefined });\n },\n // error steps, given e\n error(reason) {\n // Perform ! ReadableStreamDefaultReaderRelease(reader).\n reader.releaseLock();\n\n // Reject promise with e.\n resolvers.reject(reason);\n }\n };\n\n this.#readRequests.push(request);\n\n // 5. Perform ! ReadableStreamDefaultReaderRead(this, readRequest).\n (async () => {\n try {\n const result = await reader.read();\n\n if (result.done) {\n if (this.#signal?.aborted) {\n request.error(createAbortError());\n }\n\n request.close();\n } else {\n request.chunk(result.value);\n }\n } catch (error) {\n if (this.#signal?.aborted) {\n request.error(createAbortError());\n } else {\n request.error(error);\n }\n } finally {\n nextResolvers.resolve();\n }\n })();\n\n // 6. Return promise.\n return resolvers.promise;\n };\n\n // The asynchronous iterator return steps for a ReadableStream, given stream, iterator, and arg, are:\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async return(value?: any): Promise<IteratorResult<T, any>> {\n if (this.#signal?.aborted) {\n return Promise.reject(createAbortError());\n }\n\n // 1. Let reader be iterator’s reader.\n const reader = this.#reader;\n // 2. Assert: reader.[[stream]] is not undefined.\n // 3. Assert: reader.[[readRequests]] is empty, as the async iterator machinery guarantees that any previous calls to next() have settled before this is called.\n\n // 4. If iterator’s prevent cancel is false:\n if (!this.#preventCancel) {\n // 1. Let result be ! ReadableStreamReaderGenericCancel(reader, arg).\n const cancelPromise = reader.cancel(value);\n\n // --- Seems WHATWG spec bug: if stream errored, we will fail at cancel() and would never able to call releaseLock(). ---\n // --- Instead, regardless cancel() failed or not, we should release the reader lock. ---\n\n // 2. Perform ! ReadableStreamDefaultReaderRelease(reader).\n reader.releaseLock();\n\n await cancelPromise;\n\n // 3. Return result.\n // --- Seems Node.js 22.14.0 implementation is different from W3C spec, see https://github.com/nodejs/node/issues/57681 ---\n // return { done: true, value: undefined };\n return { done: true, value };\n }\n\n // 5. Perform ! ReadableStreamDefaultReaderRelease(reader).\n reader.releaseLock();\n\n // 6. Return a promise resolved with undefined.\n // --- Seems Node.js 22.14.0 implementation is different from W3C spec, see https://github.com/nodejs/node/issues/57681 ---\n // return { done: true, value: undefined };\n return { done: true, value };\n }\n}\n\n/**\n * This is based on WHATWG Streams Asynchronous Iteration specification.\n *\n * @see https://streams.spec.whatwg.org/#rs-asynciterator\n *\n * @param stream\n * @param options\n * @returns\n */\nexport function readableStreamValuesWithSignal<T>(\n stream: ReadableStream<T>,\n options?: ReadableStreamIteratorWithSignalOptions | undefined\n): ReadableStreamAsyncIterator<T> {\n return new AsyncIteratorMachinery(new ReadableStreamIterator(stream, [options || {}]));\n}\n\nexport { type ReadableStreamIteratorWithSignalOptions };\n","export default class CriticalSection {\n #callbacks: (() => void)[] = [];\n\n enter<T>(fn: () => Promise<T>): Promise<T> {\n const fnResolver = Promise.withResolvers<T>();\n\n // const callback = () =>\n // fn()\n // .then(\n // value => fnResolver.resolve(value),\n // reason => fnResolver.reject(reason)\n // )\n // .then(() => {\n // /* istanbul ignore if */\n // if (this.#callbacks.shift() !== callback) {\n // throw new Error('ASSERTION: The first resolver must be self.');\n // }\n\n // this.#callbacks[0]?.();\n // });\n\n const callback = async () => {\n try {\n fnResolver.resolve(await fn());\n } catch (error) {\n fnResolver.reject(error);\n }\n\n /* istanbul ignore if */\n if (this.#callbacks.shift() !== callback) {\n throw new Error('ASSERTION: The first resolver must be self.');\n }\n\n this.#callbacks[0]?.();\n };\n\n this.#callbacks.push(callback);\n\n this.#callbacks[0] === callback && callback();\n\n return fnResolver.promise;\n }\n}\n","import CriticalSection from './CriticalSection.ts';\n\n/**\n * This machinery protect the logic of iterator/generator. It guarantees:\n *\n * - next(), return(), throw() are in the same critical section\n * - They will be processed sequentially\n * - When the iterator is done\n * - next() will always return { done: true, value: undefined }\n * - return(value) will always return { done: true, value }, without calling underlying return()\n * - throw(reason) will always throw reason, without calling underlying throw()\n */\nexport default class AsyncIteratorMachinery<T, TReturn, TNext> implements AsyncIteratorObject<T, TReturn, TNext> {\n constructor(iterator: AsyncIterator<T, TReturn, TNext>) {\n this.#criticalSection = new CriticalSection();\n this.#done = false;\n\n const enter = this.#criticalSection.enter.bind(this.#criticalSection);\n\n const return_ = iterator.return && iterator.return.bind(iterator);\n const throw_ = iterator.throw && iterator.throw.bind(iterator);\n\n this.next = (...[value]) =>\n enter(async () => {\n if (this.#done) {\n // Seems a bug in TypeScript that it doesn't allow undefined as TReturn for AsyncIterator\n return Promise.resolve({ done: true, value: undefined as TReturn });\n }\n\n const result = await iterator.next(...(value ? [value] : []));\n\n if (result.done) {\n this.#done = true;\n }\n\n return result;\n });\n\n if (return_) {\n this.return = value =>\n enter(async () => {\n if (this.#done) {\n return {\n done: true,\n value: typeof value === 'undefined' ? (value as TReturn) : await value\n };\n }\n\n this.#done = true;\n\n return return_(value);\n });\n }\n\n if (throw_) {\n this.throw = reason =>\n enter(() => {\n if (this.#done) {\n return Promise.reject(reason);\n }\n\n this.#done = true;\n\n return throw_(reason);\n });\n }\n }\n\n #criticalSection: CriticalSection;\n #done: boolean;\n\n async [Symbol.asyncDispose]() {}\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n next: (...[value]: [] | [TNext]) => Promise<IteratorResult<T, TReturn>>;\n return?: (value?: TReturn | PromiseLike<TReturn> | undefined) => Promise<IteratorResult<T, TReturn>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n throw?: (e?: any) => Promise<IteratorResult<T, TReturn>>;\n}\n","const ERROR_MESSAGE = 'The operation is aborted';\nconst ERROR_NAME = 'AbortError';\n\nexport default function createAbortError(): (DOMException & { name: 'AbortError' }) | Error {\n if (typeof globalThis.DOMException === 'undefined') {\n const error = new Error(ERROR_MESSAGE);\n\n error.name = ERROR_NAME;\n\n return error;\n } else {\n return new DOMException(ERROR_MESSAGE, ERROR_NAME);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,7 @@
1
+ import {
2
+ readableStreamValuesWithSignal
3
+ } from "./chunk-VF6V265K.mjs";
4
+ export {
5
+ readableStreamValuesWithSignal
6
+ };
7
+ //# sourceMappingURL=iter-fest.readableStreamValuesWithSignal.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "iter-fest",
3
- "version": "0.2.2-main.fdb3230",
3
+ "version": "0.3.1-main.202512220058.031427d",
4
4
  "description": "A collection of utilities for iterations.",
5
5
  "files": [
6
+ "./*.js",
6
7
  "./dist/"
7
8
  ],
8
9
  "exports": {
@@ -496,6 +497,16 @@
496
497
  "default": "./dist/iter-fest.readableStreamValues.js"
497
498
  }
498
499
  },
500
+ "./readableStreamValuesWithSignal": {
501
+ "import": {
502
+ "types": "./dist/iter-fest.readableStreamValuesWithSignal.d.mts",
503
+ "default": "./dist/iter-fest.readableStreamValuesWithSignal.mjs"
504
+ },
505
+ "require": {
506
+ "types": "./dist/iter-fest.readableStreamValuesWithSignal.d.ts",
507
+ "default": "./dist/iter-fest.readableStreamValuesWithSignal.js"
508
+ }
509
+ },
499
510
  "./symbolObservable": {
500
511
  "import": {
501
512
  "types": "./dist/iter-fest.symbolObservable.d.mts",
@@ -530,12 +541,13 @@
530
541
  "precommit:typescript:production": "tsc --noEmit --project ./src/tsconfig.precommit.production.json",
531
542
  "precommit:typescript:test": "tsc --noEmit --project ./src/tsconfig.precommit.test.json",
532
543
  "prepack": "cp ../../CHANGELOG.md . && cp ../../LICENSE . && cp ../../README.md .",
544
+ "start": "npm run build -- --onSuccess \"touch ../pages/package.json\" --watch",
533
545
  "switch": "cat package.json | jq --arg SWITCH_NAME $SWITCH_NAME -r '(.[\"switch:\" + $SWITCH_NAME] // {}) as $TEMPLATE | .devDependencies += ($TEMPLATE.devDependencies // {}) | .dependencies += ($TEMPLATE.dependencies // {})' | tee ./package.json.tmp && mv ./package.json.tmp ./package.json",
534
546
  "test": "jest"
535
547
  },
536
548
  "repository": {
537
549
  "type": "git",
538
- "url": "git+https://github.com/compulim/iter-fest.git"
550
+ "url": "https://github.com/compulim/iter-fest.git"
539
551
  },
540
552
  "keywords": [
541
553
  "generator",
@@ -552,23 +564,23 @@
552
564
  "core-js-pure": "^3.37.1"
553
565
  },
554
566
  "devDependencies": {
555
- "@babel/preset-env": "^7.24.7",
556
- "@babel/preset-typescript": "^7.24.7",
557
- "@testing-library/react": "^16.0.0",
558
- "@tsconfig/recommended": "^1.0.6",
567
+ "@babel/preset-env": "^7.25.8",
568
+ "@babel/preset-typescript": "^7.25.7",
569
+ "@testing-library/react": "^16.0.1",
570
+ "@tsconfig/recommended": "^1.0.7",
559
571
  "@tsconfig/strictest": "^2.0.5",
560
- "@types/jest": "^29.5.12",
561
- "@types/node": "^20.14.9",
562
- "core-js-pure": "^3.37.1",
563
- "esbuild": "^0.21.5",
572
+ "@types/jest": "^29.5.13",
573
+ "@types/node": "^22.7.5",
574
+ "core-js-pure": "^3.38.1",
575
+ "esbuild": "^0.25.1",
564
576
  "jest": "^29.7.0",
565
577
  "jest-environment-jsdom": "^29.7.0",
566
- "prettier": "^3.3.2",
578
+ "prettier": "^3.3.3",
567
579
  "publint": "^0.2.11",
568
- "tsup": "^8.1.0",
569
- "typescript": "^5.5.2"
580
+ "tsup": "^8.3.5",
581
+ "typescript": "^5.6.3"
570
582
  },
571
583
  "dependencies": {
572
- "iter-fest": "^0.2.2-main.fdb3230"
584
+ "iter-fest": "^0.3.1-main.202512220058.031427d"
573
585
  }
574
586
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/generatorWithLastValue.ts"],"sourcesContent":["const STILL_ITERATING = Symbol();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type GeneratorWithLastValue<T = unknown, TReturn = any, TNext = unknown> = Generator<T, TReturn, TNext> & {\n lastValue(): TReturn;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function generatorWithLastValue<T = unknown, TReturn = any, TNext = unknown>(\n generator: Generator<T, TReturn, TNext>\n): GeneratorWithLastValue<T, TReturn, TNext> {\n let lastValue: typeof STILL_ITERATING | TReturn = STILL_ITERATING;\n\n const generatorWithLastValue = {\n [Symbol.iterator]() {\n return generatorWithLastValue;\n },\n lastValue(): TReturn {\n if (lastValue === STILL_ITERATING) {\n throw new Error('Iteration has not complete yet, cannot get last value.');\n }\n\n return lastValue;\n },\n next(next: TNext) {\n const result = generator.next(next);\n\n if (result.done) {\n lastValue = result.value;\n }\n\n return result;\n },\n return(value: TReturn) {\n return generator.return(value);\n },\n throw(error: unknown) {\n return generator.throw(error);\n }\n };\n\n return generatorWithLastValue;\n}\n"],"mappings":";AAAA,IAAM,kBAAkB,OAAO;AAQxB,SAAS,uBACd,WAC2C;AAC3C,MAAI,YAA8C;AAElD,QAAMA,0BAAyB;AAAA,IAC7B,CAAC,OAAO,QAAQ,IAAI;AAClB,aAAOA;AAAA,IACT;AAAA,IACA,YAAqB;AACnB,UAAI,cAAc,iBAAiB;AACjC,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,MAAa;AAChB,YAAM,SAAS,UAAU,KAAK,IAAI;AAElC,UAAI,OAAO,MAAM;AACf,oBAAY,OAAO;AAAA,MACrB;AAEA,aAAO;AAAA,IACT;AAAA,IACA,OAAO,OAAgB;AACrB,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AAAA,IACA,MAAM,OAAgB;AACpB,aAAO,UAAU,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAOA;AACT;","names":["generatorWithLastValue"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/asyncGeneratorWithLastValue.ts"],"sourcesContent":["const STILL_ITERATING = Symbol();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AsyncGeneratorWithLastValue<T = unknown, TReturn = any, TNext = unknown> = AsyncGenerator<\n T,\n TReturn,\n TNext\n> & {\n lastValue(): TReturn;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function asyncGeneratorWithLastValue<T = unknown, TReturn = any, TNext = unknown>(\n generator: AsyncGenerator<T, TReturn, TNext>\n): AsyncGeneratorWithLastValue<T, TReturn, TNext> {\n let lastValue: typeof STILL_ITERATING | TReturn = STILL_ITERATING;\n\n const asyncGeneratorWithLastValue = {\n [Symbol.asyncIterator]() {\n return asyncGeneratorWithLastValue;\n },\n lastValue(): TReturn {\n if (lastValue === STILL_ITERATING) {\n throw new Error('Iteration has not complete yet, cannot get last value.');\n }\n\n return lastValue;\n },\n async next(next: TNext) {\n const result = await generator.next(next);\n\n if (result.done) {\n lastValue = result.value;\n }\n\n return result;\n },\n return(value: TReturn) {\n return generator.return(value);\n },\n throw(error: unknown) {\n return generator.throw(error);\n }\n };\n\n return asyncGeneratorWithLastValue;\n}\n"],"mappings":";AAAA,IAAM,kBAAkB,OAAO;AAYxB,SAAS,4BACd,WACgD;AAChD,MAAI,YAA8C;AAElD,QAAMA,+BAA8B;AAAA,IAClC,CAAC,OAAO,aAAa,IAAI;AACvB,aAAOA;AAAA,IACT;AAAA,IACA,YAAqB;AACnB,UAAI,cAAc,iBAAiB;AACjC,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AAEA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,MAAa;AACtB,YAAM,SAAS,MAAM,UAAU,KAAK,IAAI;AAExC,UAAI,OAAO,MAAM;AACf,oBAAY,OAAO;AAAA,MACrB;AAEA,aAAO;AAAA,IACT;AAAA,IACA,OAAO,OAAgB;AACrB,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AAAA,IACA,MAAM,OAAgB;AACpB,aAAO,UAAU,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAOA;AACT;","names":["asyncGeneratorWithLastValue"]}
@@ -1,26 +0,0 @@
1
- // src/readableStreamValues.ts
2
- function readableStreamValues(readable) {
3
- const reader = readable.getReader();
4
- const iterable = {
5
- [Symbol.asyncIterator]() {
6
- return iterable;
7
- },
8
- async next() {
9
- const result = await Promise.race([reader.read(), reader.closed]);
10
- if (!result || result.done) {
11
- return { done: true, value: void 0 };
12
- }
13
- return { value: result.value };
14
- },
15
- async return() {
16
- reader.releaseLock();
17
- return { done: true, value: void 0 };
18
- }
19
- };
20
- return iterable;
21
- }
22
-
23
- export {
24
- readableStreamValues
25
- };
26
- //# sourceMappingURL=chunk-RVIERPEV.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/readableStreamValues.ts"],"sourcesContent":["export function readableStreamValues<T>(readable: ReadableStream<T>): AsyncIterableIterator<T> {\n const reader = readable.getReader();\n\n const iterable: AsyncIterableIterator<T> = {\n [Symbol.asyncIterator]() {\n return iterable;\n },\n async next(): Promise<IteratorResult<T>> {\n const result = await Promise.race([reader.read(), reader.closed]);\n\n if (!result || result.done) {\n return { done: true, value: undefined };\n }\n\n return { value: result.value };\n },\n async return() {\n // Break/throw inside for-loop will trigger return().\n reader.releaseLock();\n\n return { done: true, value: undefined };\n }\n };\n\n return iterable;\n}\n"],"mappings":";AAAO,SAAS,qBAAwB,UAAuD;AAC7F,QAAM,SAAS,SAAS,UAAU;AAElC,QAAM,WAAqC;AAAA,IACzC,CAAC,OAAO,aAAa,IAAI;AACvB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAmC;AACvC,YAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,OAAO,KAAK,GAAG,OAAO,MAAM,CAAC;AAEhE,UAAI,CAAC,UAAU,OAAO,MAAM;AAC1B,eAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,MACxC;AAEA,aAAO,EAAE,OAAO,OAAO,MAAM;AAAA,IAC/B;AAAA,IACA,MAAM,SAAS;AAEb,aAAO,YAAY;AAEnB,aAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -1,38 +0,0 @@
1
- import {
2
- readableStreamValues
3
- } from "./chunk-RVIERPEV.mjs";
4
- import {
5
- observableSubscribeAsReadable
6
- } from "./chunk-GOJ2PI5W.mjs";
7
-
8
- // src/observableValues.ts
9
- function observableValues(observable) {
10
- const readable = observableSubscribeAsReadable(observable);
11
- const iterable = readableStreamValues(readable);
12
- const cancellableIterable = {
13
- [Symbol.asyncIterator]() {
14
- return cancellableIterable;
15
- },
16
- next() {
17
- return iterable.next();
18
- },
19
- return() {
20
- var _a;
21
- try {
22
- return ((_a = iterable.return) == null ? void 0 : _a.call(iterable)) ?? Promise.resolve({ done: true, value: void 0 });
23
- } finally {
24
- readable.cancel();
25
- }
26
- },
27
- throw(error) {
28
- var _a;
29
- return ((_a = iterable.throw) == null ? void 0 : _a.call(iterable, error)) ?? Promise.resolve({ done: true, value: void 0 });
30
- }
31
- };
32
- return cancellableIterable;
33
- }
34
-
35
- export {
36
- observableValues
37
- };
38
- //# sourceMappingURL=chunk-WMTE2GGJ.mjs.map