From 18aa5889680007b446b598ff2c84de2dd7044995 Mon Sep 17 00:00:00 2001 From: Kenneth Myhra Date: Fri, 7 Jul 2023 21:55:09 +0200 Subject: [PATCH] LibWeb: Add AO transform_stream_default_sink_write_algorithm() --- .../LibWeb/Streams/AbstractOperations.cpp | 47 +++++++++++++++++++ .../LibWeb/Streams/AbstractOperations.h | 1 + 2 files changed, 48 insertions(+) diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp index a28b83af22..815d85507d 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp @@ -2845,6 +2845,53 @@ WebIDL::ExceptionOr> transform_stream_default_ return WebIDL::create_resolved_promise(realm, react_result); } +// https://streams.spec.whatwg.org/#transform-stream-default-sink-write-algorithm +WebIDL::ExceptionOr> transform_stream_default_sink_write_algorithm(TransformStream& stream, JS::Value chunk) +{ + auto& realm = stream.realm(); + + // 1. Assert: stream.[[writable]].[[state]] is "writable". + VERIFY(stream.writable()->state() == WritableStream::State::Writable); + + // 2. Let controller be stream.[[controller]]. + auto controller = stream.controller(); + + // 3. If stream.[[backpressure]] is true, + if (stream.backpressure().has_value() && *stream.backpressure()) { + // 1. Let backpressureChangePromise be stream.[[backpressureChangePromise]]. + auto backpressure_change_promise = stream.backpressure_change_promise(); + + // 2. Assert: backpressureChangePromise is not undefined. + VERIFY(backpressure_change_promise); + + // 3. Return the result of reacting to backpressureChangePromise with the following fulfillment steps: + auto react_result = WebIDL::react_to_promise(*backpressure_change_promise, + [&stream, controller, chunk](auto const&) -> WebIDL::ExceptionOr { + // 1. Let writable be stream.[[writable]]. + auto writable = stream.writable(); + + // 2. Let state be writable.[[state]]. + auto state = writable->state(); + + // 3. If state is "erroring", throw writable.[[storedError]]. + if (state == WritableStream::State::Erroring) + return JS::throw_completion(writable->stored_error()); + + // 4. Assert: state is "writable". + VERIFY(state == WritableStream::State::Writable); + + // 5. Return ! TransformStreamDefaultControllerPerformTransform(controller, chunk). + return TRY(transform_stream_default_controller_perform_transform(*controller, chunk))->promise(); + }, + {}); + + return WebIDL::create_resolved_promise(realm, react_result); + } + + // 4. Return ! TransformStreamDefaultControllerPerformTransform(controller, chunk). + return transform_stream_default_controller_perform_transform(*controller, chunk); +} + // https://streams.spec.whatwg.org/#transform-stream-error WebIDL::ExceptionOr transform_stream_error(TransformStream& stream, JS::Value error) { diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.h b/Userland/Libraries/LibWeb/Streams/AbstractOperations.h index 58128191a2..5ba7af528c 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.h +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.h @@ -138,6 +138,7 @@ WebIDL::ExceptionOr transform_stream_default_controller_enqueue(TransformS WebIDL::ExceptionOr transform_stream_default_controller_error(TransformStreamDefaultController&, JS::Value error); WebIDL::ExceptionOr transform_stream_default_controller_terminate(TransformStreamDefaultController&); WebIDL::ExceptionOr> transform_stream_default_controller_perform_transform(TransformStreamDefaultController&, JS::Value chunk); +WebIDL::ExceptionOr> transform_stream_default_sink_write_algorithm(TransformStream&, JS::Value chunk); WebIDL::ExceptionOr transform_stream_error(TransformStream&, JS::Value error); WebIDL::ExceptionOr transform_stream_error_writable_and_unblock_write(TransformStream&, JS::Value error); WebIDL::ExceptionOr transform_stream_set_backpressure(TransformStream&, bool backpressure);