iter-fest 0.2.2-main.5f5a121 → 0.2.2-main.f145669

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/iter-fest.js CHANGED
@@ -79,7 +79,8 @@ __export(src_exports, {
79
79
  observableSubscribeAsReadable: () => observableSubscribeAsReadable,
80
80
  observableValues: () => observableValues,
81
81
  readableStreamFrom: () => readableStreamFrom,
82
- readableStreamValues: () => readableStreamValues
82
+ readableStreamValues: () => readableStreamValues,
83
+ readableStreamValuesWithSignal: () => readableStreamValuesWithSignal
83
84
  });
84
85
  module.exports = __toCommonJS(src_exports);
85
86
 
@@ -650,70 +651,9 @@ function observableSubscribeAsReadable(observable) {
650
651
  });
651
652
  }
652
653
 
653
- // src/private/abortSignalAsRejectedPromise.ts
654
- function abortSignalAsRejectedPromise(abortSignal) {
655
- return new Promise((_, reject) => {
656
- if (abortSignal.aborted) {
657
- return reject(new Error("Aborted"));
658
- }
659
- abortSignal.addEventListener("abort", () => reject(new Error("Aborted")), { once: true });
660
- });
661
- }
662
-
663
- // src/readableStreamValues.ts
664
- function readableStreamValues(readable, init) {
665
- const reader = readable.getReader();
666
- const iterable = {
667
- [Symbol.asyncIterator]() {
668
- return iterable;
669
- },
670
- async next() {
671
- const abortPromise = (init == null ? void 0 : init.signal) && abortSignalAsRejectedPromise(init.signal);
672
- let result;
673
- try {
674
- result = await Promise.race([reader.read(), reader.closed, ...abortPromise ? [abortPromise] : []]);
675
- } catch (error) {
676
- reader.releaseLock();
677
- throw error;
678
- }
679
- if (!result || result.done) {
680
- return { done: true, value: void 0 };
681
- }
682
- return { value: result.value };
683
- },
684
- async return() {
685
- reader.releaseLock();
686
- return { done: true, value: void 0 };
687
- }
688
- };
689
- return iterable;
690
- }
691
-
692
654
  // src/observableValues.ts
693
655
  function observableValues(observable) {
694
- const readable = observableSubscribeAsReadable(observable);
695
- const iterable = readableStreamValues(readable);
696
- const cancellableIterable = {
697
- [Symbol.asyncIterator]() {
698
- return cancellableIterable;
699
- },
700
- next() {
701
- return iterable.next();
702
- },
703
- return() {
704
- var _a;
705
- try {
706
- return ((_a = iterable.return) == null ? void 0 : _a.call(iterable)) ?? Promise.resolve({ done: true, value: void 0 });
707
- } finally {
708
- readable.cancel();
709
- }
710
- },
711
- throw(error) {
712
- var _a;
713
- return ((_a = iterable.throw) == null ? void 0 : _a.call(iterable, error)) ?? Promise.resolve({ done: true, value: void 0 });
714
- }
715
- };
716
- return cancellableIterable;
656
+ return observableSubscribeAsReadable(observable).values();
717
657
  }
718
658
 
719
659
  // src/readableStreamFrom.ts
@@ -733,6 +673,202 @@ function readableStreamFrom(anyIterable) {
733
673
  }
734
674
  });
735
675
  }
676
+
677
+ // src/readableStreamValues.ts
678
+ function readableStreamValues(readable, options) {
679
+ return readable.values(options);
680
+ }
681
+
682
+ // src/private/CriticalSection.ts
683
+ var CriticalSection = class {
684
+ #callbacks = [];
685
+ enter(fn) {
686
+ const fnResolver = Promise.withResolvers();
687
+ const callback = async () => {
688
+ var _a, _b;
689
+ try {
690
+ fnResolver.resolve(await fn());
691
+ } catch (error) {
692
+ fnResolver.reject(error);
693
+ }
694
+ if (this.#callbacks.shift() !== callback) {
695
+ throw new Error("ASSERTION: The first resolver must be self.");
696
+ }
697
+ (_b = (_a = this.#callbacks)[0]) == null ? void 0 : _b.call(_a);
698
+ };
699
+ this.#callbacks.push(callback);
700
+ this.#callbacks[0] === callback && callback();
701
+ return fnResolver.promise;
702
+ }
703
+ };
704
+
705
+ // src/private/AsyncIteratorMachinery.ts
706
+ var AsyncIteratorMachinery = class {
707
+ constructor(iterator) {
708
+ this.#criticalSection = new CriticalSection();
709
+ this.#done = false;
710
+ const enter = this.#criticalSection.enter.bind(this.#criticalSection);
711
+ const return_ = iterator.return && iterator.return.bind(iterator);
712
+ const throw_ = iterator.throw && iterator.throw.bind(iterator);
713
+ this.next = (...[value]) => enter(async () => {
714
+ if (this.#done) {
715
+ return Promise.resolve({ done: true, value: void 0 });
716
+ }
717
+ const result = await iterator.next(...value ? [value] : []);
718
+ if (result.done) {
719
+ this.#done = true;
720
+ }
721
+ return result;
722
+ });
723
+ if (return_) {
724
+ this.return = (value) => enter(async () => {
725
+ if (this.#done) {
726
+ return {
727
+ done: true,
728
+ value: typeof value === "undefined" ? value : await value
729
+ };
730
+ }
731
+ this.#done = true;
732
+ return return_(value);
733
+ });
734
+ }
735
+ if (throw_) {
736
+ this.throw = (reason) => enter(() => {
737
+ if (this.#done) {
738
+ return Promise.reject(reason);
739
+ }
740
+ this.#done = true;
741
+ return throw_(reason);
742
+ });
743
+ }
744
+ }
745
+ #criticalSection;
746
+ #done;
747
+ async [Symbol.asyncDispose]() {
748
+ }
749
+ [Symbol.asyncIterator]() {
750
+ return this;
751
+ }
752
+ next;
753
+ return;
754
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
755
+ throw;
756
+ };
757
+
758
+ // src/private/createAbortError.ts
759
+ var ERROR_MESSAGE = "The operation is aborted";
760
+ var ERROR_NAME = "AbortError";
761
+ function createAbortError() {
762
+ if (typeof globalThis.DOMException === "undefined") {
763
+ const error = new Error(ERROR_MESSAGE);
764
+ error.name = ERROR_NAME;
765
+ return error;
766
+ } else {
767
+ return new DOMException(ERROR_MESSAGE, ERROR_NAME);
768
+ }
769
+ }
770
+
771
+ // src/readableStreamValuesWithSignal.ts
772
+ var ReadableStreamIterator = class {
773
+ // The asynchronous iterator initialization steps for a ReadableStream, given stream, iterator, and args, are:
774
+ constructor(stream, args) {
775
+ var _a;
776
+ const reader = stream.getReader();
777
+ this.#reader = reader;
778
+ const preventCancel = !!args[0].preventCancel;
779
+ this.#preventCancel = preventCancel;
780
+ this.#signal = args[0].signal;
781
+ (_a = this.#signal) == null ? void 0 : _a.addEventListener(
782
+ "abort",
783
+ async () => {
784
+ this.#preventCancel || reader.cancel(createAbortError());
785
+ reader.releaseLock();
786
+ },
787
+ { once: true }
788
+ );
789
+ }
790
+ #preventCancel;
791
+ #reader;
792
+ #readRequests = [];
793
+ #signal;
794
+ [Symbol.asyncIterator]() {
795
+ return this;
796
+ }
797
+ async [Symbol.asyncDispose]() {
798
+ }
799
+ // The get the next iteration result steps for a ReadableStream, given stream and iterator, are:
800
+ // next(...[value]: [] | [any]): Promise<IteratorResult<T, any>> {
801
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
802
+ next = () => {
803
+ var _a;
804
+ if ((_a = this.#signal) == null ? void 0 : _a.aborted) {
805
+ return Promise.reject(createAbortError());
806
+ }
807
+ const nextResolvers = Promise.withResolvers();
808
+ const reader = this.#reader;
809
+ const resolvers = Promise.withResolvers();
810
+ const request = {
811
+ // chunk steps, given chunk
812
+ chunk(value) {
813
+ resolvers.resolve({ done: false, value });
814
+ },
815
+ // close steps
816
+ close() {
817
+ reader.releaseLock();
818
+ resolvers.resolve({ done: true, value: void 0 });
819
+ },
820
+ // error steps, given e
821
+ error(reason) {
822
+ reader.releaseLock();
823
+ resolvers.reject(reason);
824
+ }
825
+ };
826
+ this.#readRequests.push(request);
827
+ (async () => {
828
+ var _a2, _b;
829
+ try {
830
+ const result = await reader.read();
831
+ if (result.done) {
832
+ if ((_a2 = this.#signal) == null ? void 0 : _a2.aborted) {
833
+ request.error(createAbortError());
834
+ }
835
+ request.close();
836
+ } else {
837
+ request.chunk(result.value);
838
+ }
839
+ } catch (error) {
840
+ if ((_b = this.#signal) == null ? void 0 : _b.aborted) {
841
+ request.error(createAbortError());
842
+ } else {
843
+ request.error(error);
844
+ }
845
+ } finally {
846
+ nextResolvers.resolve();
847
+ }
848
+ })();
849
+ return resolvers.promise;
850
+ };
851
+ // The asynchronous iterator return steps for a ReadableStream, given stream, iterator, and arg, are:
852
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
853
+ async return(value) {
854
+ var _a;
855
+ if ((_a = this.#signal) == null ? void 0 : _a.aborted) {
856
+ return Promise.reject(createAbortError());
857
+ }
858
+ const reader = this.#reader;
859
+ if (!this.#preventCancel) {
860
+ const cancelPromise = reader.cancel(value);
861
+ reader.releaseLock();
862
+ await cancelPromise;
863
+ return { done: true, value };
864
+ }
865
+ reader.releaseLock();
866
+ return { done: true, value };
867
+ }
868
+ };
869
+ function readableStreamValuesWithSignal(stream, options) {
870
+ return new AsyncIteratorMachinery(new ReadableStreamIterator(stream, [options || {}]));
871
+ }
736
872
  // Annotate the CommonJS export names for ESM import in node:
737
873
  0 && (module.exports = {
738
874
  IterableWritableStream,
@@ -784,6 +920,7 @@ function readableStreamFrom(anyIterable) {
784
920
  observableSubscribeAsReadable,
785
921
  observableValues,
786
922
  readableStreamFrom,
787
- readableStreamValues
923
+ readableStreamValues,
924
+ readableStreamValuesWithSignal
788
925
  });
789
926
  //# sourceMappingURL=iter-fest.js.map