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/metrics.h>
9#include <quicr/object.h>
10
11namespace quicr {
12
21 class PublishTrackHandler : public BaseTrackHandler
22 {
23 public:
54
70
71 protected:
80 PublishTrackHandler(const FullTrackName& full_track_name,
81 TrackMode track_mode,
82 uint8_t default_priority,
83 uint32_t default_ttl)
84 : BaseTrackHandler(full_track_name)
85 , default_track_mode_(track_mode)
86 , default_priority_(default_priority)
87 , default_ttl_(default_ttl)
88 {
89 }
90
91 public:
100 static std::shared_ptr<PublishTrackHandler> Create(const FullTrackName& full_track_name,
101 TrackMode track_mode,
102 uint8_t default_priority,
103 uint32_t default_ttl)
104 {
105 return std::shared_ptr<PublishTrackHandler>(
106 new PublishTrackHandler(full_track_name, track_mode, default_priority, default_ttl));
107 }
108
109 // --------------------------------------------------------------------------
110 // Public Virtual API callback event methods
111 // --------------------------------------------------------------------------
114
115
123 virtual void StatusChanged(Status status);
124
134 virtual void MetricsSampled(const PublishTrackMetrics& metrics);
135
137
138 // --------------------------------------------------------------------------
139 // Various getter/setters
140 // --------------------------------------------------------------------------
144 void SetDefaultPriority(const uint8_t priority) noexcept { default_priority_ = priority; }
145
149 void SetDefaultTTL(const uint32_t ttl) noexcept { default_ttl_ = ttl; }
150
154 void SetDefaultTrackMode(const TrackMode track_mode) noexcept { default_track_mode_ = track_mode; }
155
161 constexpr Status GetStatus() const noexcept { return publish_status_; }
162
163 // --------------------------------------------------------------------------
164 // Methods that normally do not need to be overridden
165 // --------------------------------------------------------------------------
166
195
207 PublishObjectStatus ForwardPublishedData(bool is_new_stream, std::shared_ptr<const std::vector<uint8_t>> data);
208
240
241 // --------------------------------------------------------------------------
242 // Metrics
243 // --------------------------------------------------------------------------
244
252
253 // --------------------------------------------------------------------------
254 // Internals
255 // --------------------------------------------------------------------------
256 private:
272 using PublishObjFunction = std::function<PublishObjectStatus(uint8_t priority,
273 uint32_t ttl,
274 bool stream_header_needed,
275 uint64_t group_id,
276 uint64_t subgroup_id,
277 uint64_t object_id,
278 std::optional<Extensions> extensions,
279 BytesSpan data)>;
280
293 using ForwardDataFunction =
294 std::function<PublishObjectStatus(uint8_t priority,
295 uint32_t ttl,
296 bool stream_header_needed,
297 std::shared_ptr<const std::vector<uint8_t>> data)>;
298
304 void SetDataContextId(uint64_t data_ctx_id) noexcept { publish_data_ctx_id_ = data_ctx_id; };
305
309 constexpr uint64_t GetDataContextId() const noexcept { return publish_data_ctx_id_; };
310
315 void SetStatus(Status status) noexcept
316 {
317 publish_status_ = status;
318 StatusChanged(status);
319 }
320
321 // --------------------------------------------------------------------------
322 // Member variables
323 // --------------------------------------------------------------------------
324 Status publish_status_{ Status::kNotAnnounced };
325 TrackMode default_track_mode_;
326 uint8_t default_priority_; // Set by caller and is used when priority is not specified
327 uint32_t default_ttl_; // Set by caller and is used when TTL is not specified
328
329 uint64_t publish_data_ctx_id_; // set byte the transport; publishing data context ID
330 PublishObjFunction publish_object_func_; // set by the transport
331 ForwardDataFunction forward_publish_data_func_; // set by the transport
332
333 uint64_t prev_object_group_id_{ 0 };
334 uint64_t prev_sub_group_id_{ 0 };
335 uint64_t prev_object_id_{ 0 };
336 uint64_t object_payload_remaining_length_{ 0 };
337 bool sent_first_header_{ false }; // Used to indicate if the first stream has sent the header or not
338
339 Bytes object_msg_buffer_; // TODO(tievens): Review shrink/resize
340
341 friend class Transport;
342 friend class Client;
343 friend class Server;
344 };
345
346} // namespace moq
MoQ Client.
Definition client.h:21
MOQ track handler for published track.
Definition publish_track_handler.h:22
constexpr Status GetStatus() const noexcept
Get the publish status.
Definition publish_track_handler.h:161
PublishTrackHandler(const FullTrackName &full_track_name, TrackMode track_mode, uint8_t default_priority, uint32_t default_ttl)
Publish track handler constructor.
Definition publish_track_handler.h:80
void SetDefaultTrackMode(const TrackMode track_mode) noexcept
set/update the default track mode for objects
Definition publish_track_handler.h:154
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:100
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:144
void SetDefaultTTL(const uint32_t ttl) noexcept
set/update the default TTL expiry for published objects
Definition publish_track_handler.h:149
PublishObjectStatus PublishObject(const ObjectHeaders &object_headers, BytesSpan data)
Publish [full] object.
virtual void StatusChanged(Status status)
Notification of publish track status change.
virtual void MetricsSampled(const PublishTrackMetrics &metrics)
Notification callback to provide sampled metrics.
PublishObjectStatus
Publish status codes.
Definition publish_track_handler.h:28
@ kObjectDataIncomplete
PublishObject() was called when continuation data remains.
Status
Status codes for the publish track.
Definition publish_track_handler.h:59
@ kSendingUnannounce
In this state, callbacks will not be called.
PublishTrackMetrics publish_track_metrics_
Publish metrics for the track.
Definition publish_track_handler.h:251
MoQ Server.
Definition server.h:21
MOQ Implementation supporting both client and server modes.
Definition transport.h:34
Definition transport.h:26
std::vector< Byte > Bytes
Definition common.h:22
Span< const Byte > BytesSpan
Definition common.h:23
Full track name struct.
Definition track_name.h:267
Object headers struct.
Definition object.h:32
Definition metrics.h:39