LibWeb: Implement static method ReadableStream.from(asyncIterable)

(cherry picked from commit 0ec0e92b100faf92256e704b9e94e9c90a04b642)
This commit is contained in:
Kenneth Myhra 2024-06-08 10:44:35 +02:00 committed by Tim Ledbetter
parent 2e45967127
commit 7cbe5c9d4a
5 changed files with 45 additions and 1 deletions

View file

@ -0,0 +1,5 @@
Well
Hello
Friends
!
🦬

View file

@ -0,0 +1,30 @@
<script src="../include.js"></script>
<script>
async function* asyncGenerator() {
yield "Well";
yield "Hello";
yield "Friends";
yield "!";
yield "🦬";
}
async function readStream(stream) {
const reader = stream.getReader();
while (true) {
const { done, value } = await reader.read();
if (done)
break;
println(value);
}
}
test(async () => {
const asyncIterable = {
[Symbol.asyncIterator]: asyncGenerator,
};
const readableStream = ReadableStream.from(asyncIterable);
await readStream(readableStream);
});
</script>

View file

@ -68,6 +68,13 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<ReadableStream>> ReadableStream::construct_
return readable_stream;
}
// https://streams.spec.whatwg.org/#rs-from
WebIDL::ExceptionOr<JS::NonnullGCPtr<ReadableStream>> ReadableStream::from(JS::VM& vm, JS::Value async_iterable)
{
// 1. Return ? ReadableStreamFromIterable(asyncIterable).
return TRY(readable_stream_from_iterable(vm, async_iterable));
}
ReadableStream::ReadableStream(JS::Realm& realm)
: PlatformObject(realm)
{

View file

@ -70,6 +70,8 @@ public:
static WebIDL::ExceptionOr<JS::NonnullGCPtr<ReadableStream>> construct_impl(JS::Realm&, Optional<JS::Handle<JS::Object>> const& underlying_source, QueuingStrategy const& = {});
static WebIDL::ExceptionOr<JS::NonnullGCPtr<ReadableStream>> from(JS::VM& vm, JS::Value async_iterable);
virtual ~ReadableStream() override;
bool locked() const;

View file

@ -29,7 +29,7 @@ dictionary ReadableStreamGetReaderOptions {
interface ReadableStream {
constructor(optional object underlyingSource, optional QueuingStrategy strategy = {});
[FIXME] static ReadableStream from(any asyncIterable);
static ReadableStream from(any asyncIterable);
readonly attribute boolean locked;