blob: 1ad38d657af60476d75fc3f10334b4636ef0ba18 [file]
// Copyright (c) 2026 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef QUICHE_QUIC_MOQT_MOQT_PUBLISH_NAMESPACE_STREAM_H_
#define QUICHE_QUIC_MOQT_MOQT_PUBLISH_NAMESPACE_STREAM_H_
#include <cstdint>
#include <optional>
#include <utility>
#include "absl/status/status.h"
#include "quiche/quic/moqt/moqt_bidi_stream.h"
#include "quiche/quic/moqt/moqt_fetch_task.h"
#include "quiche/quic/moqt/moqt_framer.h"
#include "quiche/quic/moqt/moqt_key_value_pair.h"
#include "quiche/quic/moqt/moqt_messages.h"
#include "quiche/quic/moqt/moqt_names.h"
#include "quiche/quic/moqt/moqt_parser.h"
#include "quiche/quic/moqt/moqt_session_callbacks.h"
#include "quiche/common/quiche_callbacks.h"
#include "quiche/common/quiche_weak_ptr.h"
namespace moqt {
using AddPublishNamespaceCallback =
quiche::SingleUseCallback<bool(const TrackNamespace&, MoqtBidiStreamBase*)>;
using RemovePublishNamespaceCallback =
quiche::SingleUseCallback<void(const TrackNamespace&)>;
// This class will be owned by the webtransport stream.
class MoqtPublishNamespaceRequestStream : public MoqtBidiStreamBase {
public:
// Assumes the caller will send or queue the PUBLISH_NAMESPACE.
MoqtPublishNamespaceRequestStream(
const TrackNamespace& prefix, const MessageParameters& parameters,
MoqtFramer* framer, const MoqtControlMessageParser& message_parser,
uint64_t request_id, RemovePublishNamespaceCallback remove_callback,
SessionErrorCallback session_error_callback,
MoqtResponseCallback response_callback)
: MoqtBidiStreamBase(framer, message_parser,
std::move(session_error_callback)),
request_id_(request_id),
remove_callback_(std::move(remove_callback)),
response_callback_(std::move(response_callback)),
prefix_(prefix),
parameters_(parameters) {}
~MoqtPublishNamespaceRequestStream() { Detach(); }
// MoqtBidiStreamBase overrides.
void OnStreamBound() override;
absl::Status OnRawControlMessage(
const MoqtRawControlMessage& message) override;
absl::Status OnControlMessage(const MoqtRequestOk& message);
absl::Status OnControlMessage(const MoqtRequestError& message);
void Detach() override;
private:
const uint64_t request_id_;
RemovePublishNamespaceCallback remove_callback_;
MoqtResponseCallback response_callback_;
const TrackNamespace prefix_;
MessageParameters parameters_;
};
class MoqtPublishNamespaceResponseStream : public MoqtBidiStreamBase {
public:
// Constructor for the publisher side.
MoqtPublishNamespaceResponseStream(
MoqtFramer* framer, const MoqtControlMessageParser& message_parser,
AddPublishNamespaceCallback add_callback,
RemovePublishNamespaceCallback remove_callback,
SessionErrorCallback session_error_callback,
MoqtIncomingPublishNamespaceCallback application)
: MoqtBidiStreamBase(framer, message_parser,
std::move(session_error_callback)),
add_callback_(std::move(add_callback)),
remove_callback_(std::move(remove_callback)),
application_(std::move(application)),
weak_ptr_factory_(this) {}
~MoqtPublishNamespaceResponseStream() { Detach(); }
void OnStreamBound() override {
// TODO(martinduke): Set the priority for this stream.
}
absl::Status OnRawControlMessage(
const MoqtRawControlMessage& message) override;
absl::Status OnControlMessage(const MoqtPublishNamespace& message);
absl::Status OnControlMessage(const MoqtRequestUpdate& message);
void Detach() override;
private:
uint64_t request_id_;
std::optional<TrackNamespace> prefix_;
AddPublishNamespaceCallback add_callback_;
RemovePublishNamespaceCallback remove_callback_;
MoqtIncomingPublishNamespaceCallback application_;
quiche::QuicheWeakPtrFactory<MoqtPublishNamespaceResponseStream>
weak_ptr_factory_;
};
} // namespace moqt
#endif // QUICHE_QUIC_MOQT_MOQT_PUBLISH_NAMESPACE_STREAM_H_