diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp index 9b745ad842..e9bd5bca9a 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp @@ -738,6 +738,21 @@ WebIDL::ExceptionOr set_up_readable_stream_default_controller_from_underly return set_up_readable_stream_default_controller(stream, controller, move(start_algorithm), move(pull_algorithm), move(cancel_algorithm), high_water_mark, move(size_algorithm)); } +// https://streams.spec.whatwg.org/#acquire-writable-stream-default-writer +WebIDL::ExceptionOr> acquire_writable_stream_default_writer(WritableStream& stream) +{ + auto& realm = stream.realm(); + + // 1. Let writer be a new WritableStreamDefaultWriter. + auto writer = MUST_OR_THROW_OOM(stream.heap().allocate(realm, realm)); + + // 2. Perform ? SetUpWritableStreamDefaultWriter(writer, stream). + TRY(set_up_writable_stream_default_writer(*writer, stream)); + + // 3. Return writer. + return writer; +} + // https://streams.spec.whatwg.org/#is-writable-stream-locked bool is_writable_stream_locked(WritableStream const& stream) { diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.h b/Userland/Libraries/LibWeb/Streams/AbstractOperations.h index c081f910dd..a1153d28c8 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.h +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.h @@ -53,6 +53,7 @@ bool readable_stream_default_controller_can_close_or_enqueue(ReadableStreamDefau WebIDL::ExceptionOr set_up_readable_stream_default_controller(ReadableStream&, ReadableStreamDefaultController&, StartAlgorithm&&, PullAlgorithm&&, CancelAlgorithm&&, double high_water_mark, SizeAlgorithm&&); WebIDL::ExceptionOr set_up_readable_stream_default_controller_from_underlying_source(ReadableStream&, JS::Value underlying_source_value, UnderlyingSource, double high_water_mark, SizeAlgorithm&&); +WebIDL::ExceptionOr> acquire_writable_stream_default_writer(WritableStream&); bool is_writable_stream_locked(WritableStream const&); WebIDL::ExceptionOr set_up_writable_stream_default_writer(WritableStreamDefaultWriter&, WritableStream&); WebIDL::ExceptionOr> writable_stream_close(WritableStream&); diff --git a/Userland/Libraries/LibWeb/Streams/WritableStream.cpp b/Userland/Libraries/LibWeb/Streams/WritableStream.cpp index 2266cb5854..342f5d6abf 100644 --- a/Userland/Libraries/LibWeb/Streams/WritableStream.cpp +++ b/Userland/Libraries/LibWeb/Streams/WritableStream.cpp @@ -76,6 +76,13 @@ WebIDL::ExceptionOr> WritableStream::close() return TRY(writable_stream_close(*this))->promise(); } +// https://streams.spec.whatwg.org/#ws-get-writer +WebIDL::ExceptionOr> WritableStream::get_writer() +{ + // 1. Return ? AcquireWritableStreamDefaultWriter(this). + return acquire_writable_stream_default_writer(*this); +} + WritableStream::WritableStream(JS::Realm& realm) : Bindings::PlatformObject(realm) { diff --git a/Userland/Libraries/LibWeb/Streams/WritableStream.h b/Userland/Libraries/LibWeb/Streams/WritableStream.h index f3480ed878..4f25672ffa 100644 --- a/Userland/Libraries/LibWeb/Streams/WritableStream.h +++ b/Userland/Libraries/LibWeb/Streams/WritableStream.h @@ -48,6 +48,7 @@ public: bool locked() const; WebIDL::ExceptionOr> close(); + WebIDL::ExceptionOr> get_writer(); bool backpressure() const { return m_backpressure; } void set_backpressure(bool value) { m_backpressure = value; } diff --git a/Userland/Libraries/LibWeb/Streams/WritableStream.idl b/Userland/Libraries/LibWeb/Streams/WritableStream.idl index d366eef1bd..35bb0913a0 100644 --- a/Userland/Libraries/LibWeb/Streams/WritableStream.idl +++ b/Userland/Libraries/LibWeb/Streams/WritableStream.idl @@ -1,3 +1,5 @@ +#import + [Exposed=*, Transferable] interface WritableStream { // FIXME: optional QueuingStrategy strategy = {} @@ -7,7 +9,7 @@ interface WritableStream { // FIXME: // Promise abort(optional any reason); - // WritableStreamDefaultWriter getWriter(); Promise close(); + WritableStreamDefaultWriter getWriter(); };