use std::sync::{Arc, LazyLock, Mutex, MutexGuard};
use crate::{Client, Consume, Origin, Publish, Session, audio::Audio, video::Video};
pub struct State {
pub session: Session,
pub client: Client,
pub origin: Origin,
pub publish: Publish,
pub consume: Consume,
pub audio: Audio,
pub video: Video,
}
impl State {
pub fn new() -> Self {
Self {
session: Session::default(),
client: Client::default(),
origin: Origin::default(),
publish: Publish::default(),
consume: Consume::default(),
audio: Audio::default(),
video: Video::default(),
}
}
pub fn lock<'a>() -> MutexGuard<'a, Self> {
STATE.lock().unwrap()
}
}
static STATE: LazyLock<Mutex<State>> = LazyLock::new(|| Mutex::new(State::new()));
pub struct Shared<T>(Arc<Mutex<Option<T>>>);
impl<T> Shared<T> {
pub fn new(value: T) -> Self {
Self(Arc::new(Mutex::new(Some(value))))
}
pub fn lock(&self) -> MutexGuard<'_, Option<T>> {
self.0.lock().unwrap()
}
pub fn take(&self) -> Option<T> {
self.lock().take()
}
#[cfg(test)]
pub fn holders(&self) -> usize {
Arc::strong_count(&self.0)
}
}
impl<T> Clone for Shared<T> {
fn clone(&self) -> Self {
Self(self.0.clone())
}
}