WebTransportSendStream.cpp (3758B)
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/WebTransportSendStream.h" 8 9 #include "mozilla/dom/UnderlyingSinkCallbackHelpers.h" 10 #include "mozilla/dom/WebTransport.h" 11 #include "mozilla/dom/WebTransportSendReceiveStreamBinding.h" 12 #include "mozilla/dom/WritableStream.h" 13 #include "mozilla/ipc/DataPipe.h" 14 15 using namespace mozilla::ipc; 16 17 namespace mozilla::dom { 18 19 NS_IMPL_CYCLE_COLLECTION_INHERITED(WebTransportSendStream, WritableStream, 20 mTransport) 21 NS_IMPL_ADDREF_INHERITED(WebTransportSendStream, WritableStream) 22 NS_IMPL_RELEASE_INHERITED(WebTransportSendStream, WritableStream) 23 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WebTransportSendStream) 24 NS_INTERFACE_MAP_END_INHERITING(WritableStream) 25 26 WebTransportSendStream::WebTransportSendStream(nsIGlobalObject* aGlobal, 27 WebTransport* aTransport) 28 : WritableStream(aGlobal, 29 WritableStream::HoldDropJSObjectsCaller::Explicit), 30 mTransport(aTransport) { 31 mozilla::HoldJSObjects(this); 32 } 33 34 JSObject* WebTransportSendStream::WrapObject( 35 JSContext* aCx, JS::Handle<JSObject*> aGivenProto) { 36 return WebTransportSendStream_Binding::Wrap(aCx, this, aGivenProto); 37 } 38 39 // NOTE: this does not yet implement SendOrder; see bug 1816925 40 /* static */ 41 already_AddRefed<WebTransportSendStream> WebTransportSendStream::Create( 42 WebTransport* aWebTransport, nsIGlobalObject* aGlobal, uint64_t aStreamId, 43 DataPipeSender* aSender, Maybe<int64_t> aSendOrder, ErrorResult& aRv) { 44 // https://w3c.github.io/webtransport/#webtransportsendstream-create 45 AutoJSAPI jsapi; 46 if (!jsapi.Init(aGlobal)) { 47 return nullptr; 48 } 49 JSContext* cx = jsapi.cx(); 50 51 auto stream = MakeRefPtr<WebTransportSendStream>(aGlobal, aWebTransport); 52 53 nsCOMPtr<nsIAsyncOutputStream> outputStream = aSender; 54 auto algorithms = MakeRefPtr<WritableStreamToOutput>( 55 stream->GetParentObject(), outputStream); 56 57 stream->mStreamId = aStreamId; 58 59 if (aSendOrder.isSome()) { 60 stream->mSendOrder.SetValue(aSendOrder.value()); 61 } 62 63 // Steps 2-5 64 RefPtr<QueuingStrategySize> writableSizeAlgorithm; 65 stream->SetUpNative(cx, *algorithms, Nothing(), writableSizeAlgorithm, aRv); 66 67 // Step 6: Add the following steps to stream’s [[controller]]'s [[signal]]. 68 // Step 6.1: If stream.[[PendingOperation]] is null, then abort these steps. 69 // Step 6.2: Let reason be stream’s [[controller]]'s [[signal]]'s abort 70 // reason. Step 6.3: Let abortPromise be the result of aborting stream with 71 // reason. Step 6.4: Upon fulfillment of abortPromise, reject promise with 72 // reason. Step 6.5: Let pendingOperation be stream.[[PendingOperation]]. 73 // Step 6.6: Set stream.[[PendingOperation]] to null. 74 // Step 6.7: Resolve pendingOperation with promise. 75 // XXX TODO 76 77 // Step 7: Append stream to SendStreams 78 aWebTransport->mSendStreams.InsertOrUpdate(aStreamId, stream); 79 // Step 8: return stream 80 return stream.forget(); 81 } 82 83 void WebTransportSendStream::SetSendOrder(Nullable<int64_t> aSendOrder) { 84 mSendOrder = aSendOrder; 85 mTransport->SendSetSendOrder( 86 mStreamId, aSendOrder.IsNull() ? Nothing() : Some(aSendOrder.Value())); 87 } 88 89 already_AddRefed<Promise> WebTransportSendStream::GetStats() { 90 RefPtr<Promise> promise = Promise::CreateInfallible(WritableStream::mGlobal); 91 promise->MaybeRejectWithNotSupportedError("GetStats isn't supported yet"); 92 return promise.forget(); 93 } 94 95 } // namespace mozilla::dom