Files
client-sdk-rust/livekit/src/room/mod.rs
T
Théo MonnomandGitHub cad6d36201 feat: video publishing (#42)
- Prepare webrtc abstraction ( for future wasm support )
- Added track publish support for videos
  - Added LogoTrack example to simple_room demo
- Lot of cleanup
- There are compiler warnings I'll solve on our v1 release
2023-03-18 03:25:16 +01:00

116 lines
2.8 KiB
Rust

use self::track::RemoteTrack;
use crate::participant::ConnectionQuality;
use crate::prelude::*;
use crate::proto;
use crate::rtc_engine::EngineError;
use std::fmt::Debug;
use std::sync::Arc;
use thiserror::Error;
use tokio::sync::mpsc;
pub use crate::rtc_engine::SimulateScenario;
pub mod id;
pub mod options;
pub mod participant;
pub mod publication;
pub mod room_session;
pub mod track;
pub use room_session::*;
pub type RoomResult<T> = Result<T, RoomError>;
#[derive(Error, Debug)]
pub enum RoomError {
#[error("engine : {0}")]
Engine(#[from] EngineError),
#[error("room failure: {0}")]
Internal(String),
#[error("this track or a track of the same source is already published")]
TrackAlreadyPublished,
}
#[derive(Clone, Debug)]
pub enum RoomEvent {
ParticipantConnected(RemoteParticipant),
ParticipantDisconnected(RemoteParticipant),
TrackSubscribed {
track: RemoteTrack,
publication: RemoteTrackPublication,
participant: RemoteParticipant,
},
TrackPublished {
publication: RemoteTrackPublication,
participant: RemoteParticipant,
},
TrackUnpublished {
publication: RemoteTrackPublication,
participant: RemoteParticipant,
},
TrackUnsubscribed {
track: RemoteTrack,
publication: RemoteTrackPublication,
participant: RemoteParticipant,
},
TrackSubscriptionFailed {
error: track::TrackError,
sid: TrackSid,
participant: RemoteParticipant,
},
TrackMuted {
participant: Participant,
publication: TrackPublication,
},
TrackUnmuted {
participant: Participant,
publication: TrackPublication,
},
ActiveSpeakersChanged {
speakers: Vec<Participant>,
},
ConnectionQualityChanged {
quality: ConnectionQuality,
participant: Participant,
},
DataReceived {
payload: Arc<Vec<u8>>,
kind: proto::data_packet::Kind,
participant: RemoteParticipant,
},
ConnectionStateChanged(ConnectionState),
Connected,
Disconnected,
Reconnecting,
Reconnected,
}
#[derive(Debug)]
pub struct Room {
handle: SessionHandle,
}
impl Room {
pub async fn connect(
url: &str,
token: &str,
) -> RoomResult<(Self, mpsc::UnboundedReceiver<RoomEvent>)> {
let handle = SessionHandle::connect(url, token).await?;
let events = handle.subscribe();
Ok((Self { handle }, events))
}
pub async fn close(self) {
self.handle.close().await;
}
/// Allow multiple subscribers/observers to receive events
pub fn subscribe(&self) -> mpsc::UnboundedReceiver<RoomEvent> {
self.handle.subscribe()
}
pub fn session(&self) -> RoomSession {
self.handle.session()
}
}