|  | // Copyright 2023 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_SESSION_CALLBACKS_H_ | 
|  | #define QUICHE_QUIC_MOQT_MOQT_SESSION_CALLBACKS_H_ | 
|  |  | 
|  | #include <optional> | 
|  |  | 
|  | #include "absl/strings/string_view.h" | 
|  | #include "quiche/quic/core/quic_clock.h" | 
|  | #include "quiche/quic/core/quic_default_clock.h" | 
|  | #include "quiche/quic/moqt/moqt_messages.h" | 
|  | #include "quiche/common/quiche_callbacks.h" | 
|  |  | 
|  | namespace moqt { | 
|  |  | 
|  | // Called when the SETUP message from the peer is received. | 
|  | using MoqtSessionEstablishedCallback = quiche::SingleUseCallback<void()>; | 
|  |  | 
|  | // Called when a GOAWAY message is received from the server. | 
|  | using MoqtSessionGoAwayCallback = | 
|  | quiche::SingleUseCallback<void(absl::string_view new_session_uri)>; | 
|  |  | 
|  | // Called when the session is terminated. | 
|  | using MoqtSessionTerminatedCallback = | 
|  | quiche::SingleUseCallback<void(absl::string_view error_message)>; | 
|  |  | 
|  | // Called from the session destructor. | 
|  | using MoqtSessionDeletedCallback = quiche::SingleUseCallback<void()>; | 
|  |  | 
|  | // Called whenever an ANNOUNCE or UNANNOUNCE message is received from the peer. | 
|  | // ANNOUNCE sets a value for |parameters|, UNANNOUNCE does not. | 
|  | using MoqtIncomingAnnounceCallback = | 
|  | quiche::MultiUseCallback<std::optional<MoqtAnnounceErrorReason>( | 
|  | const FullTrackName& track_namespace, | 
|  | const std::optional<VersionSpecificParameters>& parameters)>; | 
|  |  | 
|  | // Called whenever SUBSCRIBE_ANNOUNCES or UNSUBSCRIBE_ANNOUNCES is received from | 
|  | // the peer.  For SUBSCRIBE_ANNOUNCES, the return value indicates whether to | 
|  | // return an OK or an ERROR; for UNSUBSCRIBE_ANNOUNCES, the return value is | 
|  | // ignored. SUBSCRIBE_ANNOUNCES sets a value for |parameters|, | 
|  | // UNSUBSCRIBE_ANNOUNCES does not. | 
|  | using MoqtIncomingSubscribeAnnouncesCallback = | 
|  | quiche::MultiUseCallback<std::optional<MoqtSubscribeErrorReason>( | 
|  | const FullTrackName& track_namespace, | 
|  | std::optional<VersionSpecificParameters> parameters)>; | 
|  |  | 
|  | inline std::optional<MoqtAnnounceErrorReason> DefaultIncomingAnnounceCallback( | 
|  | const FullTrackName& /*track_namespace*/, | 
|  | std::optional<VersionSpecificParameters> /*parameters*/) { | 
|  | return std::optional(MoqtAnnounceErrorReason{ | 
|  | RequestErrorCode::kNotSupported, | 
|  | "This endpoint does not accept incoming ANNOUNCE messages"}); | 
|  | }; | 
|  |  | 
|  | inline std::optional<MoqtSubscribeErrorReason> | 
|  | DefaultIncomingSubscribeAnnouncesCallback( | 
|  | const FullTrackName& track_namespace, | 
|  | std::optional<VersionSpecificParameters> /*parameters*/) { | 
|  | return MoqtSubscribeErrorReason{ | 
|  | RequestErrorCode::kNotSupported, | 
|  | "This endpoint does not support incoming SUBSCRIBE_ANNOUNCES messages"}; | 
|  | } | 
|  |  | 
|  | // Callbacks for session-level events. | 
|  | struct MoqtSessionCallbacks { | 
|  | MoqtSessionEstablishedCallback session_established_callback = +[] {}; | 
|  | MoqtSessionGoAwayCallback goaway_received_callback = | 
|  | +[](absl::string_view) {}; | 
|  | MoqtSessionTerminatedCallback session_terminated_callback = | 
|  | +[](absl::string_view) {}; | 
|  | MoqtSessionDeletedCallback session_deleted_callback = +[] {}; | 
|  |  | 
|  | MoqtIncomingAnnounceCallback incoming_announce_callback = | 
|  | DefaultIncomingAnnounceCallback; | 
|  | MoqtIncomingSubscribeAnnouncesCallback incoming_subscribe_announces_callback = | 
|  | DefaultIncomingSubscribeAnnouncesCallback; | 
|  | const quic::QuicClock* clock = quic::QuicDefaultClock::Get(); | 
|  | }; | 
|  |  | 
|  | }  // namespace moqt | 
|  |  | 
|  | #endif  // QUICHE_QUIC_MOQT_MOQT_SESSION_CALLBACKS_H_ |