ReadableStreamTee.h (3147B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_dom_ReadableStreamTee_h 8 #define mozilla_dom_ReadableStreamTee_h 9 10 #include "mozilla/dom/ReadRequest.h" 11 #include "mozilla/dom/ReadableStreamControllerBase.h" 12 #include "mozilla/dom/UnderlyingSourceCallbackHelpers.h" 13 #include "nsCycleCollectionParticipant.h" 14 #include "nsISupportsImpl.h" 15 16 namespace mozilla::dom { 17 struct TeeState; 18 enum class TeeBranch : bool; 19 class ReadableStream; 20 21 // Implementation of the Pull algorithm steps for ReadableStreamDefaultTee, 22 // from 23 // https://streams.spec.whatwg.org/#abstract-opdef-readablestreamdefaulttee 24 // Step 12. 25 class ReadableStreamDefaultTeeSourceAlgorithms final 26 : public UnderlyingSourceAlgorithmsBase { 27 public: 28 NS_DECL_ISUPPORTS_INHERITED 29 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED( 30 ReadableStreamDefaultTeeSourceAlgorithms, UnderlyingSourceAlgorithmsBase) 31 32 ReadableStreamDefaultTeeSourceAlgorithms(TeeState* aTeeState, 33 TeeBranch aBranch) 34 : mTeeState(aTeeState), mBranch(aBranch) {} 35 36 MOZ_CAN_RUN_SCRIPT void StartCallback( 37 JSContext* aCx, ReadableStreamControllerBase& aController, 38 JS::MutableHandle<JS::Value> aRetVal, ErrorResult& aRv) override { 39 aRetVal.setUndefined(); 40 } 41 42 MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> PullCallback( 43 JSContext* aCx, ReadableStreamControllerBase& aController, 44 ErrorResult& aRv) override; 45 46 MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> CancelCallback( 47 JSContext* aCx, const Optional<JS::Handle<JS::Value>>& aReason, 48 ErrorResult& aRv) override; 49 50 protected: 51 ~ReadableStreamDefaultTeeSourceAlgorithms() override = default; 52 53 private: 54 // Virtually const, but is cycle collected 55 MOZ_KNOWN_LIVE RefPtr<TeeState> mTeeState; 56 TeeBranch mBranch; 57 }; 58 59 // https://streams.spec.whatwg.org/#abstract-opdef-readablestreamdefaulttee 60 // Step 12.3 61 struct ReadableStreamDefaultTeeReadRequest final : public ReadRequest { 62 NS_DECL_ISUPPORTS_INHERITED 63 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ReadableStreamDefaultTeeReadRequest, 64 ReadRequest) 65 66 RefPtr<TeeState> mTeeState; 67 68 explicit ReadableStreamDefaultTeeReadRequest(TeeState* aTeeState) 69 : mTeeState(aTeeState) {} 70 71 void ChunkSteps(JSContext* aCx, JS::Handle<JS::Value> aChunk, 72 ErrorResult& aRv) override; 73 74 MOZ_CAN_RUN_SCRIPT void CloseSteps(JSContext* aCx, ErrorResult& aRv) override; 75 76 void ErrorSteps(JSContext* aCx, JS::Handle<JS::Value> aError, 77 ErrorResult& aRv) override; 78 79 protected: 80 ~ReadableStreamDefaultTeeReadRequest() override = default; 81 }; 82 83 namespace streams_abstract { 84 MOZ_CAN_RUN_SCRIPT void ReadableByteStreamTee( 85 JSContext* aCx, ReadableStream* aStream, 86 nsTArray<RefPtr<ReadableStream>>& aResult, ErrorResult& aRv); 87 } 88 89 } // namespace mozilla::dom 90 #endif