LibQuicR
Loading...
Searching...
No Matches
client.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 <optional>
7#include <quicr/common.h>
8#include <quicr/config.h>
9#include <quicr/detail/attributes.h>
12#include <quicr/track_name.h>
13
14namespace quicr {
15 using namespace quicr;
16
22 class Client : public Transport
23 {
24 protected:
30 Client(const ClientConfig& cfg)
31 : Transport(cfg, std::make_shared<ThreadedTickService>(cfg.tick_service_sleep_delay_us))
32 {
33 }
34
35 public:
36 ~Client() = default;
37
38 static std::shared_ptr<Client> Create(const ClientConfig& cfg)
39 {
40 return std::shared_ptr<Client>(new Client(cfg));
41 }
42
53
64
65 // --BEGIN CALLBACKS ----------------------------------------------------------------------------------
70
79 virtual void ServerSetupReceived(const ServerSetupAttributes& server_setup_attributes);
80
89 virtual void AnnounceStatusChanged(const TrackNamespace& track_namespace, const PublishAnnounceStatus status);
90
97 virtual void AnnounceReceived(const TrackNamespace& track_namespace,
98 const PublishAnnounceAttributes& announce_attributes);
99
105 virtual void UnannounceReceived(const TrackNamespace& track_namespace);
106
117 virtual void SubscribeAnnouncesStatusChanged(const TrackNamespace& track_namespace,
118 std::optional<messages::SubscribeNamespaceErrorCode> error_code,
119 std::optional<messages::ReasonPhrase> reason);
120
138 virtual void UnpublishedSubscribeReceived(const FullTrackName& track_full_name,
139 const messages::SubscribeAttributes& subscribe_attributes);
140
152 virtual void ResolveSubscribe(ConnectionHandle connection_handle,
153 uint64_t request_id,
154 uint64_t track_alias,
155 const SubscribeResponse& subscribe_response);
156
169 uint64_t request_id,
170 const quicr::FullTrackName& track_full_name,
171 const quicr::messages::FetchAttributes& attributes) override;
172
178 void BindFetchTrack(TransportConnId conn_id, std::shared_ptr<PublishFetchHandler> track_handler);
179
185 void UnbindFetchTrack(ConnectionHandle conn_id, const std::shared_ptr<PublishFetchHandler>& track_handler);
186
196 void MetricsSampled(const ConnectionMetrics& metrics) override;
197
199 // --END OF CALLBACKS ----------------------------------------------------------------------------------
200
208
214 void SubscribeTrack(std::shared_ptr<SubscribeTrackHandler> track_handler)
215 {
216 if (connection_handle_) {
217 Transport::SubscribeTrack(*connection_handle_, std::move(track_handler));
218 }
219 }
220
229 virtual uint64_t RequestTrackStatus(const FullTrackName& track_full_name,
230 const messages::SubscribeAttributes& subscribe_attributes = {})
231 {
232 if (connection_handle_) {
233 return Transport::RequestTrackStatus(*connection_handle_, track_full_name, subscribe_attributes);
234 }
235 return 0;
236 }
237
243 void UnsubscribeTrack(std::shared_ptr<SubscribeTrackHandler> track_handler)
244 {
245 if (connection_handle_) {
246 Transport::UnsubscribeTrack(*connection_handle_, std::move(track_handler));
247 }
248 }
249
271 void PublishAnnounce(const TrackNamespace& track_namespace);
272
281 void PublishUnannounce(const TrackNamespace& track_namespace);
282
290 void SubscribeAnnounces(const TrackNamespace& prefix_namespace)
291 {
292 if (!connection_handle_) {
293 return;
294 }
295
296 SendSubscribeAnnounces(*connection_handle_, prefix_namespace);
297 }
298
304 void UnsubscribeAnnounces(const TrackNamespace& prefix_namespace)
305 {
306 if (!connection_handle_) {
307 return;
308 }
309
310 SendUnsubscribeAnnounces(*connection_handle_, prefix_namespace);
311 }
312
319 void PublishTrack(std::shared_ptr<PublishTrackHandler> track_handler)
320 {
321 if (connection_handle_) {
322 Transport::PublishTrack(*connection_handle_, std::move(track_handler));
323 }
324 }
325
333 void UnpublishTrack(std::shared_ptr<PublishTrackHandler> track_handler)
334 {
335 if (connection_handle_) {
336 Transport::UnpublishTrack(*connection_handle_, std::move(track_handler));
337 }
338 }
339
345 void FetchTrack(std::shared_ptr<FetchTrackHandler> track_handler)
346 {
347 if (connection_handle_.has_value()) {
348 Transport::FetchTrack(connection_handle_.value(), std::move(track_handler));
349 }
350 }
351
357 void CancelFetchTrack(std::shared_ptr<FetchTrackHandler> track_handler)
358 {
359 if (connection_handle_.has_value()) {
360 Transport::CancelFetchTrack(connection_handle_.value(), std::move(track_handler));
361 }
362 }
363
369 std::optional<ConnectionHandle> GetConnectionHandle() const { return connection_handle_; }
370
371 private:
372 bool ProcessCtrlMessage(ConnectionContext& conn_ctx, BytesSpan stream_buffer) override;
374 uint8_t priority,
375 uint32_t ttl,
376 bool stream_header_needed,
377 uint64_t group_id,
378 uint64_t subgroup_id,
379 uint64_t object_id,
380 std::optional<Extensions> extensions,
381 BytesSpan data) const;
382
383 void SetConnectionHandle(ConnectionHandle connection_handle) override
384 {
385 connection_handle_ = connection_handle;
386 }
387
388 void SetStatus(Status status)
389 {
390 status_ = status;
391 StatusChanged(status);
392 }
393
394 std::optional<ConnectionHandle> connection_handle_;
395 };
396
397} // namespace quicr
void SubscribeTrack(std::shared_ptr< SubscribeTrackHandler > track_handler)
Subscribe to a track.
Definition client.h:214
PublishAnnounceStatus GetAnnounceStatus(const TrackNamespace &track_namespace)
Get announce status for namespace.
virtual void UnpublishedSubscribeReceived(const FullTrackName &track_full_name, const messages::SubscribeAttributes &subscribe_attributes)
Callback notification for new subscribe received that doesn't match an existing publish track.
void BindFetchTrack(TransportConnId conn_id, std::shared_ptr< PublishFetchHandler > track_handler)
Bind a server fetch publisher track handler.
void CancelFetchTrack(std::shared_ptr< FetchTrackHandler > track_handler)
Cancel a given Fetch track handler.
Definition client.h:357
std::optional< ConnectionHandle > GetConnectionHandle() const
Get the connection handle.
Definition client.h:369
void UnsubscribeAnnounces(const TrackNamespace &prefix_namespace)
Unsubscribe announces to prefix namespace.
Definition client.h:304
virtual void AnnounceStatusChanged(const TrackNamespace &track_namespace, const PublishAnnounceStatus status)
Notification on publish announcement status change.
void UnbindFetchTrack(ConnectionHandle conn_id, const std::shared_ptr< PublishFetchHandler > &track_handler)
Unbind a server fetch publisher track handler.
virtual void ResolveSubscribe(ConnectionHandle connection_handle, uint64_t request_id, uint64_t track_alias, const SubscribeResponse &subscribe_response)
Accept or reject an subscribe that was received.
bool FetchReceived(quicr::ConnectionHandle connection_handle, uint64_t request_id, const quicr::FullTrackName &track_full_name, const quicr::messages::FetchAttributes &attributes) override
Callback on fetch message.
void UnpublishTrack(std::shared_ptr< PublishTrackHandler > track_handler)
Unpublish track.
Definition client.h:333
void FetchTrack(std::shared_ptr< FetchTrackHandler > track_handler)
Fetch track.
Definition client.h:345
virtual void ServerSetupReceived(const ServerSetupAttributes &server_setup_attributes)
Callback on server setup message.
void PublishAnnounce(const TrackNamespace &track_namespace)
Publish a track namespace.
void SubscribeAnnounces(const TrackNamespace &prefix_namespace)
Subscribe Announces to prefix namespace.
Definition client.h:290
void PublishUnannounce(const TrackNamespace &track_namespace)
Unannounce a publish namespace.
virtual void UnannounceReceived(const TrackNamespace &track_namespace)
Callback notification for unannounce received by subscribe announces.
Client(const ClientConfig &cfg)
MoQ Client Constructor to create the client mode instance.
Definition client.h:30
virtual uint64_t RequestTrackStatus(const FullTrackName &track_full_name, const messages::SubscribeAttributes &subscribe_attributes={})
Request track status.
Definition client.h:229
static std::shared_ptr< Client > Create(const ClientConfig &cfg)
Definition client.h:38
virtual void AnnounceReceived(const TrackNamespace &track_namespace, const PublishAnnounceAttributes &announce_attributes)
Callback notification for announce received by subscribe announces.
void MetricsSampled(const ConnectionMetrics &metrics) override
Notification callback to provide sampled metrics.
virtual void SubscribeAnnouncesStatusChanged(const TrackNamespace &track_namespace, std::optional< messages::SubscribeNamespaceErrorCode > error_code, std::optional< messages::ReasonPhrase > reason)
Callback notification for subscribe announces OK or Error.
void UnsubscribeTrack(std::shared_ptr< SubscribeTrackHandler > track_handler)
Unsubscribe track.
Definition client.h:243
~Client()=default
Status Disconnect()
Disconnect the client connection gracefully.
void PublishTrack(std::shared_ptr< PublishTrackHandler > track_handler)
Publish to a track.
Definition client.h:319
Status Connect()
Starts a client connection via a transport thread.
Definition publish_fetch_handler.h:11
PublishObjectStatus
Publish status codes.
Definition publish_track_handler.h:29
An N-tuple representation of a MOQ namespace.
Definition track_name.h:20
void UnpublishTrack(ConnectionHandle connection_handle, const std::shared_ptr< PublishTrackHandler > &track_handler)
Unpublish track.
Status
Status of the transport.
Definition transport.h:46
void CancelFetchTrack(ConnectionHandle connection_handle, std::shared_ptr< FetchTrackHandler > track_handler)
Cancel Fetch track.
void SubscribeTrack(ConnectionHandle connection_handle, std::shared_ptr< SubscribeTrackHandler > track_handler)
Subscribe to a track.
uint64_t RequestTrackStatus(ConnectionHandle connection_handle, const FullTrackName &track_full_name, const messages::SubscribeAttributes &subscribe_attributes)
Request track status.
friend class Client
Definition transport.h:610
void FetchTrack(ConnectionHandle connection_handle, std::shared_ptr< FetchTrackHandler > track_handler)
Fetch track.
void PublishTrack(ConnectionHandle connection_handle, std::shared_ptr< PublishTrackHandler > track_handler)
Publish to a track.
Transport()=delete
void UnsubscribeTrack(ConnectionHandle connection_handle, const std::shared_ptr< SubscribeTrackHandler > &track_handler)
Unsubscribe track.
virtual void StatusChanged(Status status)
Callback notification for status/state change.
Definition transport.h:257
Definition transport.h:28
uint64_t ConnectionHandle
Definition common.h:22
std::span< const Byte > BytesSpan
Definition common.h:21
PublishAnnounceStatus
Publish Announce Status.
Definition common.h:54
Definition config.h:22
Definition metrics.h:14
Full track name struct.
Definition track_name.h:260
Publish announce attributes.
Definition common.h:29
Server Setup Attributes.
Definition common.h:45