WebTransportReceiveStream.cpp (2785B)
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 #include "mozilla/dom/WebTransportReceiveStream.h" 8 9 #include "mozilla/dom/ReadableByteStreamController.h" 10 #include "mozilla/dom/ReadableStream.h" 11 #include "mozilla/dom/UnderlyingSourceCallbackHelpers.h" 12 #include "mozilla/dom/WebTransport.h" 13 #include "mozilla/dom/WebTransportSendReceiveStreamBinding.h" 14 #include "mozilla/ipc/DataPipe.h" 15 16 using namespace mozilla::ipc; 17 18 namespace mozilla::dom { 19 20 NS_IMPL_CYCLE_COLLECTION_INHERITED(WebTransportReceiveStream, ReadableStream, 21 mTransport) 22 NS_IMPL_ADDREF_INHERITED(WebTransportReceiveStream, ReadableStream) 23 NS_IMPL_RELEASE_INHERITED(WebTransportReceiveStream, ReadableStream) 24 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WebTransportReceiveStream) 25 NS_INTERFACE_MAP_END_INHERITING(ReadableStream) 26 27 WebTransportReceiveStream::WebTransportReceiveStream(nsIGlobalObject* aGlobal, 28 WebTransport* aTransport) 29 : ReadableStream(aGlobal, 30 ReadableStream::HoldDropJSObjectsCaller::Explicit), 31 mTransport(aTransport) { 32 mozilla::HoldJSObjects(this); 33 } 34 35 // WebIDL Boilerplate 36 37 JSObject* WebTransportReceiveStream::WrapObject( 38 JSContext* aCx, JS::Handle<JSObject*> aGivenProto) { 39 return WebTransportReceiveStream_Binding::Wrap(aCx, this, aGivenProto); 40 } 41 42 already_AddRefed<WebTransportReceiveStream> WebTransportReceiveStream::Create( 43 WebTransport* aWebTransport, nsIGlobalObject* aGlobal, uint64_t aStreamId, 44 DataPipeReceiver* receiver, ErrorResult& aRv) { 45 // https://w3c.github.io/webtransport/#webtransportreceivestream-create 46 AutoJSAPI jsapi; 47 if (!jsapi.Init(aGlobal)) { 48 return nullptr; 49 } 50 JSContext* cx = jsapi.cx(); 51 52 auto stream = MakeRefPtr<WebTransportReceiveStream>(aGlobal, aWebTransport); 53 54 nsCOMPtr<nsIAsyncInputStream> inputStream = receiver; 55 auto algorithms = MakeRefPtr<InputToReadableStreamAlgorithms>( 56 cx, inputStream, (ReadableStream*)stream); 57 58 stream->SetUpByteNative(cx, *algorithms, Some(0.0), aRv); 59 if (aRv.Failed()) { 60 return nullptr; 61 } 62 // Add to ReceiveStreams 63 aWebTransport->mReceiveStreams.InsertOrUpdate(aStreamId, stream); 64 return stream.forget(); 65 } 66 67 already_AddRefed<Promise> WebTransportReceiveStream::GetStats() { 68 RefPtr<Promise> promise = Promise::CreateInfallible(ReadableStream::mGlobal); 69 promise->MaybeRejectWithNotSupportedError("GetStats isn't supported yet"); 70 return promise.forget(); 71 } 72 73 } // namespace mozilla::dom