/* * Copyright (c) 2023, Matthew Olsson * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Web::Streams { struct ReadableStreamReadResult { JS::Value value; bool done; }; class ReadRequest : public JS::Cell { JS_CELL(ReadRequest, JS::Cell); public: virtual ~ReadRequest() = default; virtual void on_chunk(JS::Value chunk) = 0; virtual void on_close() = 0; virtual void on_error(JS::Value error) = 0; }; class ReadLoopReadRequest final : public ReadRequest { JS_CELL(ReadLoopReadRequest, JS::Cell); public: // successSteps, which is an algorithm accepting a byte sequence using SuccessSteps = JS::SafeFunction; // failureSteps, which is an algorithm accepting a JavaScript value using FailureSteps = JS::SafeFunction; ReadLoopReadRequest(JS::VM& vm, JS::Realm& realm, ReadableStreamDefaultReader& reader, SuccessSteps success_steps, FailureSteps failure_steps); virtual void on_chunk(JS::Value chunk) override; virtual void on_close() override; virtual void on_error(JS::Value error) override; private: virtual void visit_edges(Visitor&) override; JS::VM& m_vm; JS::NonnullGCPtr m_realm; JS::NonnullGCPtr m_reader; ByteBuffer m_bytes; SuccessSteps m_success_steps; FailureSteps m_failure_steps; }; // https://streams.spec.whatwg.org/#readablestreamdefaultreader class ReadableStreamDefaultReader final : public Bindings::PlatformObject , public ReadableStreamGenericReaderMixin { WEB_PLATFORM_OBJECT(ReadableStreamDefaultReader, Bindings::PlatformObject); JS_DECLARE_ALLOCATOR(ReadableStreamDefaultReader); public: static WebIDL::ExceptionOr> construct_impl(JS::Realm&, JS::NonnullGCPtr); virtual ~ReadableStreamDefaultReader() override = default; WebIDL::ExceptionOr> read(); WebIDL::ExceptionOr read_all_bytes(ReadLoopReadRequest::SuccessSteps, ReadLoopReadRequest::FailureSteps); WebIDL::ExceptionOr> read_all_bytes_deprecated(); WebIDL::ExceptionOr release_lock(); SinglyLinkedList>& read_requests() { return m_read_requests; } private: explicit ReadableStreamDefaultReader(JS::Realm&); virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; SinglyLinkedList> m_read_requests; }; }