From e8ad57108264b2bcc3a0ffeaf255d04866dd42e4 Mon Sep 17 00:00:00 2001 From: Matthew Olsson Date: Sat, 8 Apr 2023 12:01:49 -0700 Subject: [PATCH] LibWeb: Add ReadableStreamBYOBReader interface --- Userland/Libraries/LibWeb/CMakeLists.txt | 1 + Userland/Libraries/LibWeb/Forward.h | 1 + .../Streams/ReadableStreamBYOBReader.cpp | 25 +++++++++ .../LibWeb/Streams/ReadableStreamBYOBReader.h | 54 +++++++++++++++++++ .../Streams/ReadableStreamBYOBReader.idl | 11 ++++ Userland/Libraries/LibWeb/idl_files.cmake | 1 + 6 files changed, 93 insertions(+) create mode 100644 Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBReader.cpp create mode 100644 Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBReader.h create mode 100644 Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBReader.idl diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 6beb7ffb5b..71742b11ce 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -475,6 +475,7 @@ set(SOURCES Streams/AbstractOperations.cpp Streams/ReadableByteStreamController.cpp Streams/ReadableStream.cpp + Streams/ReadableStreamBYOBReader.cpp Streams/ReadableStreamBYOBRequest.cpp Streams/ReadableStreamDefaultController.cpp Streams/ReadableStreamDefaultReader.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 92ad3082ca..04214b5bf4 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -509,6 +509,7 @@ class Selection; namespace Web::Streams { class ReadableByteStreamController; class ReadableStream; +class ReadableStreamBYOBReader; class ReadableStreamBYOBRequest; class ReadableStreamDefaultController; class ReadableStreamDefaultReader; diff --git a/Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBReader.cpp b/Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBReader.cpp new file mode 100644 index 0000000000..f3466d1706 --- /dev/null +++ b/Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBReader.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023, Matthew Olsson + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::Streams { + +ReadableStreamBYOBReader::ReadableStreamBYOBReader(JS::Realm& realm) + : Bindings::PlatformObject(realm) + , ReadableStreamGenericReaderMixin(realm) +{ +} + +void ReadableStreamBYOBReader::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + ReadableStreamGenericReaderMixin::visit_edges(visitor); +} + +} diff --git a/Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBReader.h b/Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBReader.h new file mode 100644 index 0000000000..0af65b212d --- /dev/null +++ b/Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBReader.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2023, Matthew Olsson + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace Web::Streams { + +// https://streams.spec.whatwg.org/#read-into-request +class ReadIntoRequest : public RefCounted { +public: + virtual ~ReadIntoRequest() = default; + + // An algorithm taking a chunk, called when a chunk is available for reading + virtual void on_chunk(JS::Value chunk) = 0; + + // An algorithm taking a chunk or undefined, called when no chunks are available because the stream is closed + virtual void on_close(JS::Value chunk_or_undefined) = 0; + + // An algorithm taking a JavaScript value, called when no chunks are available because the stream is errored + virtual void on_error(JS::Value error) = 0; +}; + +// https://streams.spec.whatwg.org/#readablestreambyobreader +class ReadableStreamBYOBReader final + : public Bindings::PlatformObject + , public ReadableStreamGenericReaderMixin { + WEB_PLATFORM_OBJECT(ReadableStreamBYOBReader, Bindings::PlatformObject); + +public: + virtual ~ReadableStreamBYOBReader() override = default; + + Vector>& read_into_requests() { return m_read_into_requests; } + +private: + explicit ReadableStreamBYOBReader(JS::Realm&); + + virtual void visit_edges(Cell::Visitor&) override; + + // https://streams.spec.whatwg.org/#readablestreambyobreader-readintorequests + // A list of read-into requests, used when a consumer requests chunks sooner than they are available + Vector> m_read_into_requests; +}; + +} diff --git a/Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBReader.idl b/Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBReader.idl new file mode 100644 index 0000000000..27a704c219 --- /dev/null +++ b/Userland/Libraries/LibWeb/Streams/ReadableStreamBYOBReader.idl @@ -0,0 +1,11 @@ +#import + +[Exposed=*] +interface ReadableStreamBYOBReader { + // FIXME: Implement + // constructor(ReadableStream stream); + + // Promise read(ArrayBufferView view); + // undefined releaseLock(); +}; +ReadableStreamBYOBReader includes ReadableStreamGenericReader; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 83c0eddbeb..a18f942088 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -184,6 +184,7 @@ libweb_js_bindings(RequestIdleCallback/IdleDeadline) libweb_js_bindings(ResizeObserver/ResizeObserver) libweb_js_bindings(Streams/ReadableByteStreamController) libweb_js_bindings(Streams/ReadableStream) +libweb_js_bindings(Streams/ReadableStreamBYOBReader) libweb_js_bindings(Streams/ReadableStreamBYOBRequest) libweb_js_bindings(Streams/ReadableStreamDefaultController) libweb_js_bindings(Streams/ReadableStreamDefaultReader)