1
0
Fork 0
firefox/dom/webtransport/api/WebTransportSendStream.cpp
Daniel Baumann 5e9a113729
Adding upstream version 140.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-25 09:37:52 +02:00

95 lines
3.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/WebTransportSendStream.h"
#include "mozilla/dom/UnderlyingSinkCallbackHelpers.h"
#include "mozilla/dom/WritableStream.h"
#include "mozilla/dom/WebTransport.h"
#include "mozilla/dom/WebTransportSendReceiveStreamBinding.h"
#include "mozilla/ipc/DataPipe.h"
using namespace mozilla::ipc;
namespace mozilla::dom {
NS_IMPL_CYCLE_COLLECTION_INHERITED(WebTransportSendStream, WritableStream,
mTransport)
NS_IMPL_ADDREF_INHERITED(WebTransportSendStream, WritableStream)
NS_IMPL_RELEASE_INHERITED(WebTransportSendStream, WritableStream)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WebTransportSendStream)
NS_INTERFACE_MAP_END_INHERITING(WritableStream)
WebTransportSendStream::WebTransportSendStream(nsIGlobalObject* aGlobal,
WebTransport* aTransport)
: WritableStream(aGlobal,
WritableStream::HoldDropJSObjectsCaller::Explicit),
mTransport(aTransport) {
mozilla::HoldJSObjects(this);
}
JSObject* WebTransportSendStream::WrapObject(
JSContext* aCx, JS::Handle<JSObject*> aGivenProto) {
return WebTransportSendStream_Binding::Wrap(aCx, this, aGivenProto);
}
// NOTE: this does not yet implement SendOrder; see bug 1816925
/* static */
already_AddRefed<WebTransportSendStream> WebTransportSendStream::Create(
WebTransport* aWebTransport, nsIGlobalObject* aGlobal, uint64_t aStreamId,
DataPipeSender* aSender, Maybe<int64_t> aSendOrder, ErrorResult& aRv) {
// https://w3c.github.io/webtransport/#webtransportsendstream-create
AutoJSAPI jsapi;
if (!jsapi.Init(aGlobal)) {
return nullptr;
}
JSContext* cx = jsapi.cx();
auto stream = MakeRefPtr<WebTransportSendStream>(aGlobal, aWebTransport);
nsCOMPtr<nsIAsyncOutputStream> outputStream = aSender;
auto algorithms = MakeRefPtr<WritableStreamToOutput>(
stream->GetParentObject(), outputStream);
stream->mStreamId = aStreamId;
if (aSendOrder.isSome()) {
stream->mSendOrder.SetValue(aSendOrder.value());
}
// Steps 2-5
RefPtr<QueuingStrategySize> writableSizeAlgorithm;
stream->SetUpNative(cx, *algorithms, Nothing(), writableSizeAlgorithm, aRv);
// Step 6: Add the following steps to streams [[controller]]'s [[signal]].
// Step 6.1: If stream.[[PendingOperation]] is null, then abort these steps.
// Step 6.2: Let reason be streams [[controller]]'s [[signal]]'s abort
// reason. Step 6.3: Let abortPromise be the result of aborting stream with
// reason. Step 6.4: Upon fulfillment of abortPromise, reject promise with
// reason. Step 6.5: Let pendingOperation be stream.[[PendingOperation]].
// Step 6.6: Set stream.[[PendingOperation]] to null.
// Step 6.7: Resolve pendingOperation with promise.
// XXX TODO
// Step 7: Append stream to SendStreams
aWebTransport->mSendStreams.InsertOrUpdate(aStreamId, stream);
// Step 8: return stream
return stream.forget();
}
void WebTransportSendStream::SetSendOrder(Nullable<int64_t> aSendOrder) {
mSendOrder = aSendOrder;
mTransport->SendSetSendOrder(
mStreamId, aSendOrder.IsNull() ? Nothing() : Some(aSendOrder.Value()));
}
already_AddRefed<Promise> WebTransportSendStream::GetStats() {
RefPtr<Promise> promise = Promise::CreateInfallible(WritableStream::mGlobal);
promise->MaybeRejectWithNotSupportedError("GetStats isn't supported yet");
return promise.forget();
}
} // namespace mozilla::dom