diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp index d01c663975..f9f8ac426c 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp @@ -811,6 +811,28 @@ void readable_byte_stream_controller_pull_into(ReadableByteStreamController& con MUST(readable_byte_stream_controller_call_pull_if_needed(controller)); } +// https://streams.spec.whatwg.org/#readable-stream-byob-reader-read +void readable_stream_byob_reader_read(ReadableStreamBYOBReader& reader, JS::Value view, ReadIntoRequest& read_into_request) +{ + // 1. Let stream be reader.[[stream]]. + auto stream = reader.stream(); + + // 2. Assert: stream is not undefined. + VERIFY(stream); + + // 3. Set stream.[[disturbed]] to true. + stream->set_disturbed(true); + + // 4. If stream.[[state]] is "errored", perform readIntoRequest’s error steps given stream.[[storedError]]. + if (stream->is_errored()) { + read_into_request.on_error(stream->stored_error()); + } + // 5. Otherwise, perform ! ReadableByteStreamControllerPullInto(stream.[[controller]], view, readIntoRequest). + else { + readable_byte_stream_controller_pull_into(*stream->controller()->get>(), view, read_into_request); + } +} + // https://streams.spec.whatwg.org/#abstract-opdef-readablestreamdefaultreaderrelease WebIDL::ExceptionOr readable_stream_default_reader_release(ReadableStreamDefaultReader& reader) { diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.h b/Userland/Libraries/LibWeb/Streams/AbstractOperations.h index 942376af1d..bee6689110 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.h +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.h @@ -55,6 +55,7 @@ void readable_stream_default_reader_error_read_requests(ReadableStreamDefaultRea void readable_stream_byob_reader_error_read_into_requests(ReadableStreamBYOBReader&, JS::Value error); JS::Value readable_byte_stream_controller_convert_pull_into_descriptor(JS::Realm&, PullIntoDescriptor const&); void readable_byte_stream_controller_pull_into(ReadableByteStreamController&, JS::Value view_value, ReadIntoRequest&); +void readable_stream_byob_reader_read(ReadableStreamBYOBReader&, JS::Value view, ReadIntoRequest&); void readable_byte_stream_controller_fill_head_pull_into_descriptor(ReadableByteStreamController const&, u64 size, PullIntoDescriptor&); WebIDL::ExceptionOr readable_stream_default_reader_read(ReadableStreamDefaultReader&, ReadRequest&);