diff options
Diffstat (limited to 'src/bun.js/builtins/js/ReadableStreamInternals.js')
-rw-r--r-- | src/bun.js/builtins/js/ReadableStreamInternals.js | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/bun.js/builtins/js/ReadableStreamInternals.js b/src/bun.js/builtins/js/ReadableStreamInternals.js index 5321ca922..cbe72c99e 100644 --- a/src/bun.js/builtins/js/ReadableStreamInternals.js +++ b/src/bun.js/builtins/js/ReadableStreamInternals.js @@ -2096,3 +2096,56 @@ async function readableStreamToArrayDirect(stream, underlyingSource) { return capability.@promise; } + + +function readableStreamDefineLazyIterators(prototype) { + "use strict"; + + var asyncIterator = globalThis.Symbol.asyncIterator; + + var ReadableStreamAsyncIterator = async function* ReadableStreamAsyncIterator(stream, preventCancel) { + var reader = stream.getReader(); + var deferredError; + try { + while (true) { + var done, value; + const firstResult = reader.readMany(); + if (@isPromise(firstResult)) { + const result = await firstResult; + done = result.done; + value = result.value; + } else { + done = firstResult.done; + value = firstResult.value; + } + + if (done) { + return; + } + yield* value; + } + } catch(e) { + deferredError = e; + } finally { + reader.releaseLock(); + + if (!preventCancel) { + stream.cancel(deferredError); + } + + if (deferredError) { + throw deferredError; + } + } + }; + + var createAsyncIterator = function asyncIterator() { + return ReadableStreamAsyncIterator(this, false); + }; + var createValues = function values({preventCancel = false} = {preventCancel: false}) { + return ReadableStreamAsyncIterator(this, preventCancel); + }; + @Object.@defineProperty(prototype, asyncIterator, { value: createAsyncIterator }); + @Object.@defineProperty(prototype, "values", { value: createValues }); + return prototype; +}
\ No newline at end of file |