/* * Copyright (c) 2024-2026, Tim Flynn * Copyright (c) 2025, Aliaksandr Kalenik * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace Web::Fetch::Fetching { class FetchedDataReceiver final : public JS::Cell { GC_CELL(FetchedDataReceiver, JS::Cell); GC_DECLARE_ALLOCATOR(FetchedDataReceiver); public: virtual ~FetchedDataReceiver() override; void set_pending_promise(GC::Ref); void set_response(GC::Ref response) { m_response = response; } void set_body(GC::Ref body); enum class NetworkState { Ongoing, Complete, Error, }; void handle_network_bytes(ReadonlyBytes, NetworkState); private: FetchedDataReceiver(GC::Ref, GC::Ref, RefPtr); virtual void visit_edges(Visitor& visitor) override; void pull_bytes_into_stream(); void close_stream(); bool buffer_is_eof() const { return m_pulled_bytes == m_buffer.size(); } ByteBuffer copy_unpulled_bytes(); GC::Ref m_fetch_params; GC::Ptr m_response; GC::Ptr m_body; GC::Ref m_stream; GC::Ptr m_pending_promise; RefPtr m_http_cache; ByteBuffer m_buffer; size_t m_pulled_bytes { 0 }; enum class LifecycleState { Receiving, CompletePending, ReadyToClose, Closed, }; LifecycleState m_lifecycle_state { LifecycleState::Receiving }; bool m_has_unfulfilled_promise { false }; }; }