hyperspeed_broadcast/rtc/
workers.rs

1use mediasoup::{worker::Worker, worker::WorkerSettings, worker_manager::WorkerManager};
2use once_cell::sync::OnceCell;
3use log::debug;
4
5static WORKER_POOL: OnceCell<WorkerPool> = OnceCell::new();
6
7// ! Worker pool taken from Vortex source code.
8// ! This is single-threaded, which is enough for now.
9
10#[derive(Debug)]
11pub struct WorkerPool {
12    _manager: WorkerManager,
13    worker: Worker,
14}
15
16impl WorkerPool {
17    pub async fn init() {
18        let worker_pool = WorkerPool::new().await;
19        WORKER_POOL.set(worker_pool).unwrap();
20    }
21
22    pub fn get() -> &'static WorkerPool {
23        WORKER_POOL
24            .get()
25            .expect("Mediasoup worker pool not initialized")
26    }
27
28    pub async fn new() -> Self {
29        let manager = WorkerManager::new();
30        let mut settings = WorkerSettings::default();
31        // ! FIXME: hardcoded value
32        settings.rtc_ports_range = 10100..=10200;
33
34        let worker = manager.create_worker(settings).await.unwrap();
35        debug!("Initialized worker pool");
36        WorkerPool {
37            _manager: manager,
38            worker,
39        }
40    }
41
42    pub fn get_worker(&self) -> &Worker {
43        &self.worker
44    }
45}