livekit_datatrack/
track.rs1use crate::packet::Handle;
16use from_variants::FromVariants;
17use std::{
18 fmt::Display,
19 marker::PhantomData,
20 sync::{Arc, RwLock},
21};
22use thiserror::Error;
23
24#[derive(Debug, Clone)]
26pub struct DataTrack<L> {
27 pub(crate) info: Arc<DataTrackInfo>,
28 pub(crate) inner: Arc<DataTrackInner>,
29 pub(crate) _location: PhantomData<L>,
31}
32
33#[derive(Debug, Clone, FromVariants)]
34pub(crate) enum DataTrackInner {
35 Local(crate::local::LocalTrackInner),
36 Remote(crate::remote::RemoteTrackInner),
37}
38
39impl<L> DataTrack<L> {
40 pub fn info(&self) -> &DataTrackInfo {
42 &self.info
43 }
44
45 pub fn is_published(&self) -> bool {
47 match self.inner.as_ref() {
48 DataTrackInner::Local(inner) => inner.is_published(),
49 DataTrackInner::Remote(inner) => inner.is_published(),
50 }
51 }
52
53 pub async fn wait_for_unpublish(&self) {
59 match self.inner.as_ref() {
60 DataTrackInner::Local(inner) => inner.wait_for_unpublish().await,
61 DataTrackInner::Remote(inner) => inner.wait_for_unpublish().await,
62 }
63 }
64}
65
66#[derive(Debug, Clone)]
68#[cfg_attr(test, derive(fake::Dummy))]
69pub struct DataTrackInfo {
70 pub(crate) sid: Arc<RwLock<DataTrackSid>>,
71 pub(crate) pub_handle: Handle,
72 pub(crate) name: String,
73 pub(crate) uses_e2ee: bool,
74}
75
76impl DataTrackInfo {
77 pub fn sid(&self) -> DataTrackSid {
83 self.sid.read().unwrap().clone()
84 }
85
86 pub fn name(&self) -> &str {
88 &self.name
89 }
90
91 pub fn uses_e2ee(&self) -> bool {
93 self.uses_e2ee
94 }
95}
96
97#[derive(Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
99pub struct DataTrackSid(String);
100
101#[derive(Debug, Error)]
102#[error("Invalid data track SID")]
103pub struct DataTrackSidError;
104
105impl DataTrackSid {
106 const PREFIX: &str = "DTR_";
107}
108
109impl TryFrom<String> for DataTrackSid {
110 type Error = DataTrackSidError;
111
112 fn try_from(raw_id: String) -> Result<Self, Self::Error> {
113 if raw_id.starts_with(Self::PREFIX) {
114 Ok(Self(raw_id))
115 } else {
116 Err(DataTrackSidError)
117 }
118 }
119}
120
121impl From<DataTrackSid> for String {
122 fn from(id: DataTrackSid) -> Self {
123 id.0
124 }
125}
126
127impl Display for DataTrackSid {
128 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
129 write!(f, "{}", self.0)
130 }
131}
132
133#[cfg(test)]
134impl fake::Dummy<fake::Faker> for DataTrackSid {
135 fn dummy_with_rng<R: rand::Rng + ?Sized>(_: &fake::Faker, rng: &mut R) -> Self {
136 const BASE_57_ALPHABET: &[u8; 57] =
137 b"23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
138 let random_id: String = (0..12)
139 .map(|_| {
140 let idx = rng.random_range(0..BASE_57_ALPHABET.len());
141 BASE_57_ALPHABET[idx] as char
142 })
143 .collect();
144 Self::try_from(format!("{}{}", Self::PREFIX, random_id)).unwrap()
145 }
146}