blob: 16f9886dadc4ea63bd5d058162611bc772ad96d1 [file] [edit]
// Copyright 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_TRACK_STATUS_STREAM_H_
#define QUICHE_QUIC_MOQT_MOQT_TRACK_STATUS_STREAM_H_
#include <cstdint>
#include <memory>
#include <optional>
#include "absl/base/nullability.h"
#include "absl/status/status.h"
#include "quiche/quic/moqt/moqt_bidi_stream.h"
#include "quiche/quic/moqt/moqt_error.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_live_publisher.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_priority.h"
#include "quiche/quic/moqt/moqt_publisher.h"
#include "quiche/quic/moqt/moqt_types.h"
#include "quiche/common/quiche_weak_ptr.h"
#include "quiche/web_transport/web_transport.h"
namespace moqt {
// MoqtTrackStatusRequestStream represents an outgoing TRACK_STATUS request.
class MoqtTrackStatusRequestStream : public MoqtBidiStreamBase {
public:
MoqtTrackStatusRequestStream(MoqtFramer* absl_nonnull framer,
const MoqtControlMessageParser& message_parser,
uint64_t request_id,
const FullTrackName& full_track_name,
const MessageParameters& parameters,
SessionErrorCallback session_error_callback,
MoqtResponseCallback response_callback);
~MoqtTrackStatusRequestStream() { 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_;
const FullTrackName full_track_name_;
const MessageParameters parameters_;
MoqtResponseCallback response_callback_;
};
// MoqtTrackStatusResponseStream represents an incoming TRACK_STATUS request.
class MoqtTrackStatusResponseStream : public MoqtBidiStreamBase,
public MoqtObjectListener {
public:
MoqtTrackStatusResponseStream(
MoqtFramer* absl_nonnull framer,
const MoqtControlMessageParser& message_parser,
SessionErrorCallback session_error_callback,
quiche::QuicheWeakPtr<SessionToPublisherInterface> session);
~MoqtTrackStatusResponseStream() { Detach(); }
// MoqtBidiStreamBase overrides.
void OnStreamBound() override { stream_parser()->set_allow_fin(true); }
absl::Status OnRawControlMessage(
const MoqtRawControlMessage& message) override;
absl::Status OnControlMessage(const MoqtTrackStatus& message);
// MoqtObjectListener overrides.
void OnSubscribeAccepted() override;
void OnSubscribeRejected(MoqtRequestErrorInfo info) override;
void OnNewObjectAvailable(Location, std::optional<uint64_t>,
MoqtPriority) override {}
void OnNewFinAvailable(Location, uint64_t) override {}
void OnSubgroupAbandoned(uint64_t, uint64_t,
webtransport::StreamErrorCode) override {}
void OnGroupAbandoned(uint64_t) override {}
void OnTrackPublisherGone() override;
void Detach() override;
private:
SessionToPublisherInterface* absl_nullable session() const {
return session_.GetIfAvailable();
}
std::optional<uint64_t> request_id_;
const quiche::QuicheWeakPtr<SessionToPublisherInterface> session_;
std::shared_ptr<MoqtTrackPublisher> publisher_ = nullptr;
};
} // namespace moqt
#endif // QUICHE_QUIC_MOQT_MOQT_TRACK_STATUS_STREAM_H_