realtime-webrtc/src/lib.rs
90 lines
#[cfg(target_os = "macos")]mod native;use std::fmt;use std::sync::Arc;use std::sync::atomic::AtomicU16;use std::sync::mpsc;#[derive(Debug, thiserror::Error)]pub enum RealtimeWebrtcError { #[error("{0}")] Message(String), #[error("realtime WebRTC is not supported on this platform")] UnsupportedPlatform,}#[derive(Debug, Clone, PartialEq, Eq)]pub enum RealtimeWebrtcEvent { Connected, LocalAudioLevel(u16), Closed, Failed(String),}pub type Result<T> = std::result::Result<T, RealtimeWebrtcError>;pub struct StartedRealtimeWebrtcSession { pub offer_sdp: String, pub handle: RealtimeWebrtcSessionHandle, pub events: mpsc::Receiver<RealtimeWebrtcEvent>,}pub struct RealtimeWebrtcSessionHandle { #[cfg(target_os = "macos")] inner: native::SessionHandle, local_audio_peak: Arc<AtomicU16>,}impl fmt::Debug for RealtimeWebrtcSessionHandle { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RealtimeWebrtcSessionHandle") .finish_non_exhaustive() }}impl RealtimeWebrtcSessionHandle { pub fn apply_answer_sdp(&self, answer_sdp: String) -> Result<()> { #[cfg(target_os = "macos")] { self.inner.apply_answer_sdp(answer_sdp) } #[cfg(not(target_os = "macos"))] { let _ = answer_sdp; Err(RealtimeWebrtcError::UnsupportedPlatform) } } pub fn close(&self) { #[cfg(target_os = "macos")] self.inner.close(); } pub fn local_audio_peak(&self) -> Arc<AtomicU16> { self.local_audio_peak.clone() }}pub struct RealtimeWebrtcSession;impl RealtimeWebrtcSession { pub fn start() -> Result<StartedRealtimeWebrtcSession> { #[cfg(target_os = "macos")] { let started = native::start()?; Ok(StartedRealtimeWebrtcSession { offer_sdp: started.offer_sdp, handle: RealtimeWebrtcSessionHandle { inner: started.handle, local_audio_peak: Arc::new(AtomicU16::new(0)), }, events: started.events, }) } #[cfg(not(target_os = "macos"))] { Err(RealtimeWebrtcError::UnsupportedPlatform) } }}