Skip to content

Commit

Permalink
feat: ReadableStream.from (#19446)
Browse files Browse the repository at this point in the history
Closes #19417
  • Loading branch information
crowlKats authored Jul 2, 2023
1 parent 17ddf2f commit 805497a
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 2 deletions.
62 changes: 62 additions & 0 deletions ext/web/06_streams.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ const {
// SharedArrayBufferPrototype,
Symbol,
SymbolAsyncIterator,
SymbolIterator,
SymbolFor,
TypeError,
TypedArrayPrototypeGetBuffer,
Expand Down Expand Up @@ -4780,6 +4781,30 @@ function initializeCountSizeFunction(globalObject) {
WeakMapPrototypeSet(countSizeFunctionWeakMap, globalObject, size);
}

async function* createAsyncFromSyncIterator(syncIterator) {
// deno-lint-ignore prefer-primordials
yield* syncIterator;
}

// Ref: https://tc39.es/ecma262/#sec-getiterator
function getIterator(obj, async = false) {
if (async) {
if (obj[SymbolAsyncIterator] === undefined) {
if (obj[SymbolIterator] === undefined) {
throw new TypeError("No iterator found");
}
return createAsyncFromSyncIterator(obj[SymbolIterator]());
} else {
return obj[SymbolAsyncIterator]();
}
} else {
if (obj[SymbolIterator] === undefined) {
throw new TypeError("No iterator found");
}
return obj[SymbolIterator]();
}
}

const _resourceBacking = Symbol("[[resourceBacking]]");
// This distinction exists to prevent unrefable streams being used in
// regular fast streams that are unaware of refability
Expand Down Expand Up @@ -4863,6 +4888,43 @@ class ReadableStream {
}
}

static from(asyncIterable) {
webidl.requiredArguments(
arguments.length,
1,
"Failed to call 'ReadableStream.from'",
);
asyncIterable = webidl.converters.any(asyncIterable);

const iterator = getIterator(asyncIterable, true);

const stream = createReadableStream(() => undefined, async () => {
// deno-lint-ignore prefer-primordials
const res = await iterator.next();
if (typeof res !== "object") {
throw new TypeError("iterator.next value is not an object");
}
if (res.done) {
readableStreamDefaultControllerClose(stream[_controller]);
} else {
readableStreamDefaultControllerEnqueue(stream[_controller], res.value);
}
}, async (reason) => {
if (typeof iterator.return === "undefined") {
return undefined;
} else {
// deno-lint-ignore prefer-primordials
const res = await iterator.return(reason);
if (typeof res !== "object") {
throw new TypeError("iterator.return value is not an object");
} else {
return undefined;
}
}
}, 0);
return stream;
}

/** @returns {boolean} */
get locked() {
webidl.assertBranded(this, ReadableStreamPrototype);
Expand Down
6 changes: 4 additions & 2 deletions tools/wpt/expectation.json
Original file line number Diff line number Diff line change
Expand Up @@ -2496,7 +2496,9 @@
"owning-type-message-port.any.html": false,
"owning-type-message-port.any.worker.html": false,
"owning-type.any.html": false,
"owning-type.any.worker.html": false
"owning-type.any.worker.html": false,
"from.any.html": true,
"from.any.worker.html": true
},
"transform-streams": {
"backpressure.any.html": true,
Expand Down Expand Up @@ -9693,4 +9695,4 @@
"media-sniff.window.html": false
}
}
}
}

0 comments on commit 805497a

Please sign in to comment.