/* * Copyright (c) 2025, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Web::Streams::Detail { // https://streams.spec.whatwg.org/#ref-for-in-parallel class ReadableStreamPipeTo final : public JS::Cell { GC_CELL(ReadableStreamPipeTo, JS::Cell); GC_DECLARE_ALLOCATOR(ReadableStreamPipeTo); public: void process(); void set_abort_signal(GC::Ref, DOM::AbortSignal::AbortSignal::AbortAlgorithmID); void shutdown_with_action(GC::Ref()>> action, Optional original_error = {}); void shutdown(Optional error = {}); private: ReadableStreamPipeTo( GC::Ref, GC::Ref, GC::Ref source, GC::Ref destination, GC::Ref reader, GC::Ref writer, bool prevent_close, bool prevent_abort, bool prevent_cancel); virtual void visit_edges(Cell::Visitor& visitor) override; void read_chunk(); void write_chunk(); void write_unwritten_chunks(); void wait_for_pending_writes_to_complete(Function on_complete); void finish(Optional error = {}); bool check_for_error_and_close_states(); bool check_for_forward_errors(); bool check_for_backward_errors(); bool check_for_forward_close(); bool check_for_backward_close(); GC::Ref m_realm; GC::Ref m_promise; GC::Ref m_source; GC::Ref m_destination; GC::Ref m_reader; GC::Ref m_writer; GC::Ptr m_signal; DOM::AbortSignal::AbortAlgorithmID m_signal_id { 0 }; Vector> m_pending_writes; Vector m_unwritten_chunks; bool m_prevent_close { false }; bool m_prevent_abort { false }; bool m_prevent_cancel { false }; bool m_shutting_down { false }; }; }