| // 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_SUBSCRIBE_STREAM_H_ |
| #define QUICHE_QUIC_MOQT_MOQT_SUBSCRIBE_STREAM_H_ |
| |
| #include <cstdint> |
| #include <memory> |
| |
| #include "absl/base/nullability.h" |
| #include "absl/status/status.h" |
| #include "quiche/quic/core/quic_alarm_factory.h" |
| #include "quiche/quic/core/quic_clock.h" |
| #include "quiche/quic/moqt/moqt_bidi_stream.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_object_subscriber.h" |
| #include "quiche/quic/moqt/moqt_parser.h" |
| #include "quiche/quic/moqt/moqt_session_callbacks.h" |
| #include "quiche/common/quiche_weak_ptr.h" |
| |
| namespace moqt { |
| |
| class MoqtSubscribeRequestStream : public MoqtBidiStreamBase { |
| public: |
| MoqtSubscribeRequestStream( |
| MoqtFramer* absl_nonnull framer, |
| const MoqtControlMessageParser& message_parser, uint64_t request_id, |
| SessionErrorCallback session_error_callback, const FullTrackName& name, |
| SubscribeVisitor* absl_nonnull visitor, |
| const MessageParameters& parameters, |
| LiveSubscriber::AddCallback add_callback, |
| LiveSubscriber::RemoveCallback remove_callback, |
| const quic::QuicClock* absl_nonnull clock, |
| quic::QuicAlarmFactory* absl_nonnull alarm_factory); |
| ~MoqtSubscribeRequestStream() { Detach(); } |
| |
| // StreamBase overrides. |
| void OnStreamBound() override; |
| absl::Status OnRawControlMessage( |
| const MoqtRawControlMessage& message) override; |
| absl::Status OnControlMessage(const MoqtRequestOk& message) override; |
| absl::Status OnControlMessage(const MoqtRequestError& message) override; |
| absl::Status OnControlMessage(const MoqtSubscribeOk& message); |
| absl::Status OnControlMessage(const MoqtPublishDone& message); |
| |
| LiveSubscriber* track() const { return track_.get(); } |
| void Detach() override; |
| |
| private: |
| std::unique_ptr<LiveSubscriber> track_; |
| LiveSubscriber::AddCallback add_callback_; |
| LiveSubscriber::RemoveCallback remove_callback_; |
| const quic::QuicClock* clock_; |
| quic::QuicAlarmFactory* alarm_factory_; |
| }; |
| |
| class MoqtSubscribeResponseStream : public MoqtBidiStreamBase { |
| public: |
| MoqtSubscribeResponseStream( |
| MoqtFramer* absl_nonnull framer, |
| const MoqtControlMessageParser& message_parser, uint64_t track_alias, |
| LivePublisher::AddCallback add_callback, |
| LivePublisher::RemoveCallback remove_callback, |
| SessionErrorCallback session_error_callback, |
| quiche::QuicheWeakPtr<SessionToPublisherInterface> session); |
| ~MoqtSubscribeResponseStream() { |
| if (subscription_ != nullptr) { |
| subscription_->IgnoreResetAllStreams(); |
| } |
| Detach(); |
| } |
| |
| // MoqtBidiStreamBase overrides. |
| void OnStreamBound() override { stream_parser()->set_allow_fin(true); } |
| absl::Status OnRawControlMessage( |
| const MoqtRawControlMessage& message) override; |
| absl::Status OnControlMessage(const MoqtRequestOk& message) override { |
| return absl::InvalidArgumentError( |
| "REQUEST_OK not allowed from Subscriber on SUBSCRIBE stream"); |
| } |
| absl::Status OnControlMessage(const MoqtRequestError& message) override { |
| return absl::InvalidArgumentError( |
| "REQUEST_ERROR not allowed from Subscriber on SUBSCRIBE stream"); |
| } |
| |
| absl::Status OnControlMessage(const MoqtSubscribe& message); |
| absl::Status OnControlMessage(const MoqtRequestUpdate& message); |
| absl::Status OnControlMessage(const MoqtObjectAck& message) { |
| subscription_->ProcessObjectAck(message); |
| return absl::OkStatus(); |
| } |
| void Detach() override; |
| |
| private: |
| // Returns nullptr if MoqtSession is gone. |
| SessionToPublisherInterface* absl_nullable session() const { |
| return session_.GetIfAvailable(); |
| } |
| |
| uint64_t track_alias_; |
| std::unique_ptr<LivePublisher> subscription_; |
| LivePublisher::AddCallback add_callback_; |
| LivePublisher::RemoveCallback remove_callback_; |
| quiche::QuicheWeakPtr<SessionToPublisherInterface> session_; |
| }; |
| |
| } // namespace moqt |
| |
| #endif // QUICHE_QUIC_MOQT_MOQT_SUBSCRIBE_STREAM_H_ |