1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-09 09:34:57 +09:00

LibWeb: Implement an AO to close writable streams with error propagation

This commit is contained in:
Timothy Flynn 2025-04-09 11:56:29 -04:00 committed by Tim Flynn
parent f7c095a318
commit 1d6e1637cc
Notes: github-actions[bot] 2025-04-11 16:12:34 +00:00
2 changed files with 30 additions and 0 deletions

View file

@ -4092,6 +4092,35 @@ GC::Ref<WebIDL::Promise> writable_stream_default_writer_close(WritableStreamDefa
return writable_stream_close(*stream);
}
// https://streams.spec.whatwg.org/#writable-stream-default-writer-close-with-error-propagation
GC::Ref<WebIDL::Promise> writable_stream_default_writer_close_with_error_propagation(WritableStreamDefaultWriter& writer)
{
auto& realm = writer.realm();
// 1. Let stream be writer.[[stream]].
auto stream = writer.stream();
// 2. Assert: stream is not undefined.
VERIFY(stream);
// 3. Let state be stream.[[state]].
auto state = stream->state();
// 4. If ! WritableStreamCloseQueuedOrInFlight(stream) is true or state is "closed", return a promise resolved with undefined.
if (writable_stream_close_queued_or_in_flight(*stream) || state == WritableStream::State::Closed)
return WebIDL::create_resolved_promise(realm, JS::js_undefined());
// 5. If state is "errored", return a promise rejected with stream.[[storedError]].
if (state == WritableStream::State::Errored)
return WebIDL::create_rejected_promise(realm, stream->stored_error());
// 6. Assert: state is "writable" or "erroring".
VERIFY(state == WritableStream::State::Writable || state == WritableStream::State::Erroring);
// 7. Return ! WritableStreamDefaultWriterClose(writer).
return writable_stream_default_writer_close(writer);
}
// https://streams.spec.whatwg.org/#writable-stream-default-writer-ensure-closed-promise-rejected
void writable_stream_default_writer_ensure_closed_promise_rejected(WritableStreamDefaultWriter& writer, JS::Value error)
{

View file

@ -135,6 +135,7 @@ void writable_stream_update_backpressure(WritableStream&, bool backpressure);
GC::Ref<WebIDL::Promise> writable_stream_default_writer_abort(WritableStreamDefaultWriter&, JS::Value reason);
GC::Ref<WebIDL::Promise> writable_stream_default_writer_close(WritableStreamDefaultWriter&);
GC::Ref<WebIDL::Promise> writable_stream_default_writer_close_with_error_propagation(WritableStreamDefaultWriter&);
void writable_stream_default_writer_ensure_closed_promise_rejected(WritableStreamDefaultWriter&, JS::Value error);
void writable_stream_default_writer_ensure_ready_promise_rejected(WritableStreamDefaultWriter&, JS::Value error);
Optional<double> writable_stream_default_writer_get_desired_size(WritableStreamDefaultWriter const&);