LibQuicR
Loading...
Searching...
No Matches
publish_track_handler.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) 2024 Cisco Systems
2// SPDX-License-Identifier: BSD-2-Clause
3
4#pragma once
5
6#include <functional>
7#include <quicr/detail/base_track_handler.h>
8#include <quicr/detail/messages.h>
9#include <quicr/metrics.h>
10#include <quicr/object.h>
11
12namespace quicr {
13
22 class PublishTrackHandler : public BaseTrackHandler
23 {
24 public:
57
79
80 protected:
90 PublishTrackHandler(const FullTrackName& full_track_name,
91 TrackMode track_mode,
92 uint8_t default_priority,
93 uint32_t default_ttl,
94 std::optional<messages::StreamHeaderType> stream_mode = std::nullopt)
95 : BaseTrackHandler(full_track_name)
96 , default_track_mode_(track_mode)
97 , default_priority_(default_priority)
98 , default_ttl_(default_ttl)
99 {
100 switch (track_mode) {
101 case TrackMode::kDatagram:
102 if (stream_mode.has_value()) {
103 throw std::invalid_argument("Datagram track mode should not specify a stream mode");
104 }
105 break;
106 case TrackMode::kStream:
107 // TODO: Is a default acceptable, or enforce?
108 stream_mode_ = stream_mode.has_value()
109 ? stream_mode.value()
110 : messages::StreamHeaderType::kSubgroup0NotEndOfGroupWithExtensions;
111 break;
112 }
113 }
114
115 public:
124 static std::shared_ptr<PublishTrackHandler> Create(const FullTrackName& full_track_name,
125 TrackMode track_mode,
126 uint8_t default_priority,
127 uint32_t default_ttl)
128 {
129 return std::shared_ptr<PublishTrackHandler>(
130 new PublishTrackHandler(full_track_name, track_mode, default_priority, default_ttl));
131 }
132
133 // TODO: Is this all the info needed for an alias calculation?
134
135 // --------------------------------------------------------------------------
136 // Public Virtual API callback event methods
137 // --------------------------------------------------------------------------
141
149 virtual void StatusChanged(Status status);
150
160 virtual void MetricsSampled(const PublishTrackMetrics& metrics);
161
163
164 // --------------------------------------------------------------------------
165 // Various getter/setters
166 // --------------------------------------------------------------------------
170 void SetDefaultPriority(const uint8_t priority) noexcept { default_priority_ = priority; }
171
176 constexpr uint8_t GetDefaultPriority() const noexcept { return default_priority_; }
177
181 void SetDefaultTTL(const uint32_t ttl) noexcept { default_ttl_ = ttl; }
182
186 void SetDefaultTrackMode(const TrackMode track_mode) noexcept { default_track_mode_ = track_mode; }
187
192 constexpr messages::StreamHeaderType GetStreamMode() const noexcept { return stream_mode_; }
193
199 constexpr Status GetStatus() const noexcept { return publish_status_; }
200
205 constexpr bool UsingAnnounce() const noexcept { return use_announce; }
206
211 constexpr void SetUseAnnounce(bool use) noexcept { use_announce = use; }
212
213 // --------------------------------------------------------------------------
214 // Methods that normally do not need to be overridden
215 // --------------------------------------------------------------------------
216
222 constexpr bool CanPublish() const noexcept
223 {
224 switch (publish_status_) {
225 case Status::kOk:
228 return true;
229 default:
230 return false;
231 }
232 }
233
239 void SetTrackAlias(uint64_t track_alias) { track_alias_ = track_alias; }
240
248 std::optional<uint64_t> GetTrackAlias() const noexcept { return track_alias_; }
249
277 virtual PublishObjectStatus PublishObject(const ObjectHeaders& object_headers, BytesSpan data);
278
290 PublishObjectStatus ForwardPublishedData(bool is_new_stream, std::shared_ptr<const std::vector<uint8_t>> data);
291
323
324 // --------------------------------------------------------------------------
325 // Metrics
326 // --------------------------------------------------------------------------
327
335
336 // --------------------------------------------------------------------------
337 // Internals
338 // --------------------------------------------------------------------------
339 protected:
345 void SetDataContextId(uint64_t data_ctx_id) noexcept { publish_data_ctx_id_ = data_ctx_id; };
346
350 constexpr uint64_t GetDataContextId() const noexcept { return publish_data_ctx_id_; };
351
356 void SetStatus(Status status) noexcept
357 {
358 publish_status_ = status;
359 StatusChanged(status);
360 }
361
362 // --------------------------------------------------------------------------
363 // Member variables
364 // --------------------------------------------------------------------------
367 messages::StreamHeaderType stream_mode_;
368 uint8_t default_priority_; // Set by caller and is used when priority is not specified
369 uint32_t default_ttl_; // Set by caller and is used when TTL is not specified
370
371 uint64_t publish_data_ctx_id_; // set byte the transport; publishing data context ID
372
373 uint64_t latest_group_id_{ 0 };
374 uint64_t latest_sub_group_id_{ 0 };
375 uint64_t latest_object_id_{ 0 };
377 std::optional<uint64_t> track_alias_;
378
379 // Used to indicate if the first object has been seen or not (start of publish)
380 bool seen_first_object_{ false };
381
382 Bytes object_msg_buffer_; // TODO(tievens): Review shrink/resize
383
384 bool use_announce{ false }; // Indicates to use announce publish flow if true, otherwise use publish flow
385
386 friend class Transport;
387 friend class Client;
388 friend class Server;
389 };
390
391} // namespace moq
constexpr Status GetStatus() const noexcept
Get the publish status.
Definition publish_track_handler.h:199
void SetDefaultTrackMode(const TrackMode track_mode) noexcept
set/update the default track mode for objects
Definition publish_track_handler.h:186
constexpr uint8_t GetDefaultPriority() const noexcept
Get the default priority for published objects.
Definition publish_track_handler.h:176
virtual PublishObjectStatus PublishObject(const ObjectHeaders &object_headers, BytesSpan data)
Publish [full] object.
constexpr bool CanPublish() const noexcept
Check if the state allows publishing or not.
Definition publish_track_handler.h:222
friend class Transport
Definition publish_track_handler.h:386
PublishTrackHandler(const FullTrackName &full_track_name, TrackMode track_mode, uint8_t default_priority, uint32_t default_ttl, std::optional< messages::StreamHeaderType > stream_mode=std::nullopt)
Publish track handler constructor.
Definition publish_track_handler.h:90
static std::shared_ptr< PublishTrackHandler > Create(const FullTrackName &full_track_name, TrackMode track_mode, uint8_t default_priority, uint32_t default_ttl)
Create a shared Publish track handler.
Definition publish_track_handler.h:124
PublishObjectStatus PublishPartialObject(const ObjectHeaders &object_headers, BytesSpan data)
Publish object to the announced track.
PublishObjectStatus ForwardPublishedData(bool is_new_stream, std::shared_ptr< const std::vector< uint8_t > > data)
Forward received object data to subscriber/relay/remote client.
void SetDefaultPriority(const uint8_t priority) noexcept
set/update the default priority for published objects
Definition publish_track_handler.h:170
Status publish_status_
Definition publish_track_handler.h:365
friend class Client
Definition publish_track_handler.h:387
messages::StreamHeaderType stream_mode_
Definition publish_track_handler.h:367
void SetDefaultTTL(const uint32_t ttl) noexcept
set/update the default TTL expiry for published objects
Definition publish_track_handler.h:181
uint64_t publish_data_ctx_id_
Definition publish_track_handler.h:371
uint64_t latest_group_id_
Definition publish_track_handler.h:373
virtual void StatusChanged(Status status)
Notification of publish track status change.
constexpr messages::StreamHeaderType GetStreamMode() const noexcept
Get the current stream mode.
Definition publish_track_handler.h:192
uint32_t default_ttl_
Definition publish_track_handler.h:369
constexpr void SetUseAnnounce(bool use) noexcept
Set use announce.
Definition publish_track_handler.h:211
uint64_t object_payload_remaining_length_
Definition publish_track_handler.h:376
virtual void MetricsSampled(const PublishTrackMetrics &metrics)
Notification callback to provide sampled metrics.
constexpr bool UsingAnnounce() const noexcept
Get use announce setting.
Definition publish_track_handler.h:205
bool seen_first_object_
Definition publish_track_handler.h:380
void SetStatus(Status status) noexcept
Set the publish status.
Definition publish_track_handler.h:356
void SetTrackAlias(uint64_t track_alias)
Set the track alias.
Definition publish_track_handler.h:239
constexpr uint64_t GetDataContextId() const noexcept
Get the Data context ID.
Definition publish_track_handler.h:350
TrackMode default_track_mode_
Definition publish_track_handler.h:366
friend class Server
Definition publish_track_handler.h:388
Bytes object_msg_buffer_
Definition publish_track_handler.h:382
uint64_t latest_sub_group_id_
Definition publish_track_handler.h:374
std::optional< uint64_t > GetTrackAlias() const noexcept
Get the track alias.
Definition publish_track_handler.h:248
uint8_t default_priority_
Definition publish_track_handler.h:368
uint64_t latest_object_id_
Definition publish_track_handler.h:375
void SetDataContextId(uint64_t data_ctx_id) noexcept
Set the Data context ID.
Definition publish_track_handler.h:345
PublishObjectStatus
Publish status codes.
Definition publish_track_handler.h:29
@ kNoSubscribers
Definition publish_track_handler.h:34
@ kNoPreviousObject
Definition publish_track_handler.h:38
@ kNotAnnounced
Definition publish_track_handler.h:33
@ kObjectContinuationDataNeeded
Definition publish_track_handler.h:40
@ kObjectDataIncomplete
PublishObject() was called when continuation data remains.
Definition publish_track_handler.h:41
@ kPaused
Definition publish_track_handler.h:55
@ kObjectPayloadLengthExceeded
Definition publish_track_handler.h:35
@ kPreviousObjectTruncated
Definition publish_track_handler.h:36
@ kNotAuthorized
Definition publish_track_handler.h:32
@ kObjectDataComplete
Definition publish_track_handler.h:39
@ kPreviousObjectNotCompleteMustStartNewTrack
Definition publish_track_handler.h:53
@ kObjectDataTooLarge
Definition publish_track_handler.h:45
@ kPreviousObjectNotCompleteMustStartNewGroup
Definition publish_track_handler.h:49
@ kOk
Definition publish_track_handler.h:30
@ kInternalError
Definition publish_track_handler.h:31
Status
Status codes for the publish track.
Definition publish_track_handler.h:66
@ kNewGroupRequested
Definition publish_track_handler.h:75
@ kNotAnnounced
Definition publish_track_handler.h:69
@ kPendingPublishOk
Definition publish_track_handler.h:76
@ kNotConnected
Definition publish_track_handler.h:68
@ kSendingUnannounce
In this state, callbacks will not be called.
Definition publish_track_handler.h:73
@ kSubscriptionUpdated
Definition publish_track_handler.h:74
@ kAnnounceNotAuthorized
Definition publish_track_handler.h:71
@ kPendingAnnounceResponse
Definition publish_track_handler.h:70
@ kOk
Definition publish_track_handler.h:67
PublishTrackMetrics publish_track_metrics_
Publish metrics for the track.
Definition publish_track_handler.h:334
bool use_announce
Definition publish_track_handler.h:384
std::optional< uint64_t > track_alias_
Definition publish_track_handler.h:377
Definition transport.h:28
std::vector< Byte > Bytes
Definition common.h:20
std::span< const Byte > BytesSpan
Definition common.h:21
Full track name struct.
Definition track_name.h:260
Object headers struct.
Definition object.h:32
Definition metrics.h:39