/* * 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 RefCounted { 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 : public ReadRequest { 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: JS::VM& m_vm; JS::Realm& m_realm; ReadableStreamDefaultReader& 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); 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 JS::ThrowCompletionOr initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; SinglyLinkedList> m_read_requests; }; }