|
|
@@ -0,0 +1,44 @@
|
|
|
+// @ts-nocheck
|
|
|
+/**
|
|
|
+ * A polyfill for `ReadableStream.protototype[Symbol.asyncIterator]`,
|
|
|
+ * aligning as closely as possible to the specification.
|
|
|
+ *
|
|
|
+ * from https://gist.github.com/MattiasBuelens/496fc1d37adb50a733edd43853f2f60e
|
|
|
+ *
|
|
|
+ * @see https://streams.spec.whatwg.org/#rs-asynciterator
|
|
|
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream#async_iteration
|
|
|
+ */
|
|
|
+
|
|
|
+ReadableStream.prototype.values ??= function ({ preventCancel = false } = {}) {
|
|
|
+ const reader = this.getReader()
|
|
|
+ return {
|
|
|
+ async next() {
|
|
|
+ try {
|
|
|
+ const result = await reader.read()
|
|
|
+ if (result.done) {
|
|
|
+ reader.releaseLock()
|
|
|
+ }
|
|
|
+ return result
|
|
|
+ } catch (e) {
|
|
|
+ reader.releaseLock()
|
|
|
+ throw e
|
|
|
+ }
|
|
|
+ },
|
|
|
+ async return(value) {
|
|
|
+ if (!preventCancel) {
|
|
|
+ const cancelPromise = reader.cancel(value)
|
|
|
+ reader.releaseLock()
|
|
|
+ await cancelPromise
|
|
|
+ } else {
|
|
|
+ reader.releaseLock()
|
|
|
+ }
|
|
|
+ return { done: true, value }
|
|
|
+ },
|
|
|
+ [Symbol.asyncIterator]() {
|
|
|
+ return this
|
|
|
+ },
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+ReadableStream.prototype[Symbol.asyncIterator] ??=
|
|
|
+ ReadableStream.prototype.values
|