tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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