servo_media_streams/
registry.rs

1use super::MediaStream;
2use std::collections::HashMap;
3use std::sync::{Arc, LazyLock, Mutex};
4use uuid::Uuid;
5
6type RegisteredMediaStream = Arc<Mutex<dyn MediaStream>>;
7
8static MEDIA_STREAMS_REGISTRY: LazyLock<Mutex<HashMap<MediaStreamId, RegisteredMediaStream>>> =
9    LazyLock::new(|| Mutex::new(HashMap::new()));
10
11#[derive(Clone, Copy, Hash, Eq, PartialEq)]
12pub struct MediaStreamId(Uuid);
13impl MediaStreamId {
14    pub fn new() -> MediaStreamId {
15        Self { 0: Uuid::new_v4() }
16    }
17
18    pub fn id(self) -> Uuid {
19        self.0
20    }
21}
22
23pub fn register_stream(stream: Arc<Mutex<dyn MediaStream>>) -> MediaStreamId {
24    let id = MediaStreamId::new();
25    stream.lock().unwrap().set_id(id.clone());
26    MEDIA_STREAMS_REGISTRY
27        .lock()
28        .unwrap()
29        .insert(id.clone(), stream);
30    id
31}
32
33pub fn unregister_stream(stream: &MediaStreamId) {
34    MEDIA_STREAMS_REGISTRY.lock().unwrap().remove(stream);
35}
36
37pub fn get_stream(stream: &MediaStreamId) -> Option<Arc<Mutex<dyn MediaStream>>> {
38    MEDIA_STREAMS_REGISTRY.lock().unwrap().get(stream).cloned()
39}