/* * Copyright (c) 2025, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include namespace Web::Streams::Detail { struct ReadableStreamTeeParams final : public JS::Cell { GC_CELL(ReadableStreamTeeParams, JS::Cell); GC_DECLARE_ALLOCATOR(ReadableStreamTeeParams); virtual void visit_edges(Visitor& visitor) override; bool reading { false }; bool read_again { false }; bool canceled1 { false }; bool canceled2 { false }; JS::Value reason1 { JS::js_undefined() }; JS::Value reason2 { JS::js_undefined() }; GC::Ptr branch1; GC::Ptr branch2; GC::Ptr pull_algorithm; }; // https://streams.spec.whatwg.org/#ref-for-read-requestâ‘¢ class ReadableStreamTeeReadRequest final : public ReadRequest { GC_CELL(ReadableStreamTeeReadRequest, ReadRequest); GC_DECLARE_ALLOCATOR(ReadableStreamTeeReadRequest); private: ReadableStreamTeeReadRequest( JS::Realm& realm, GC::Ref stream, GC::Ref params, GC::Ref cancel_promise, bool clone_for_branch2); virtual void visit_edges(Visitor& visitor) override; virtual void on_chunk(JS::Value chunk) override; virtual void on_close() override; virtual void on_error(JS::Value) override; GC::Ref m_realm; GC::Ref m_stream; GC::Ref m_params; GC::Ref m_cancel_promise; bool m_clone_for_branch2 { false }; }; struct ReadableByteStreamTeeParams final : public JS::Cell { GC_CELL(ReadableByteStreamTeeParams, JS::Cell); GC_DECLARE_ALLOCATOR(ReadableByteStreamTeeParams); explicit ReadableByteStreamTeeParams(ReadableStreamReader reader); virtual void visit_edges(Visitor& visitor) override; bool reading { false }; bool read_again_for_branch1 { false }; bool read_again_for_branch2 { false }; bool canceled1 { false }; bool canceled2 { false }; JS::Value reason1 { JS::js_undefined() }; JS::Value reason2 { JS::js_undefined() }; GC::Ptr branch1; GC::Ptr branch2; GC::Ptr pull1_algorithm; GC::Ptr pull2_algorithm; ReadableStreamReader reader; }; // https://streams.spec.whatwg.org/#ref-for-read-requestâ‘£ class ReadableByteStreamTeeDefaultReadRequest final : public ReadRequest { GC_CELL(ReadableByteStreamTeeDefaultReadRequest, ReadRequest); GC_DECLARE_ALLOCATOR(ReadableByteStreamTeeDefaultReadRequest); private: ReadableByteStreamTeeDefaultReadRequest( JS::Realm& realm, GC::Ref stream, GC::Ref params, GC::Ref cancel_promise); virtual void visit_edges(Visitor& visitor) override; virtual void on_chunk(JS::Value chunk) override; virtual void on_close() override; virtual void on_error(JS::Value) override; GC::Ref m_realm; GC::Ref m_stream; GC::Ref m_params; GC::Ref m_cancel_promise; }; // https://streams.spec.whatwg.org/#ref-for-read-into-requestâ‘¡ class ReadableByteStreamTeeBYOBReadRequest final : public ReadIntoRequest { GC_CELL(ReadableByteStreamTeeBYOBReadRequest, ReadIntoRequest); GC_DECLARE_ALLOCATOR(ReadableByteStreamTeeBYOBReadRequest); private: ReadableByteStreamTeeBYOBReadRequest( JS::Realm& realm, GC::Ref stream, GC::Ref params, GC::Ref cancel_promise, GC::Ref byob_branch, GC::Ref other_branch, bool for_branch2); virtual void visit_edges(Visitor& visitor) override; virtual void on_chunk(JS::Value chunk) override; virtual void on_close(JS::Value chunk) override; virtual void on_error(JS::Value) override; GC::Ref m_realm; GC::Ref m_stream; GC::Ref m_params; GC::Ref m_cancel_promise; GC::Ref m_byob_branch; GC::Ref m_other_branch; bool m_for_branch2 { false }; }; }