use livekit_common::{ClientCapability, ParticipantIdentity, RemoteParticipantRegistry};
use livekit_data_stream::api::{StreamResult, StreamTextOptions, TextStreamInfo};
use livekit_rpc::backend::{RpcTransport, RpcTransportError};
use std::sync::Arc;
pub(crate) struct SessionTransport(pub(crate) Arc<super::RoomSession>);
impl RemoteParticipantRegistry for SessionTransport {
fn remote_client_protocol(&self, identity: &ParticipantIdentity) -> i32 {
self.0.remote_client_protocol(identity)
}
fn remote_capabilities(&self, identity: &ParticipantIdentity) -> Vec<ClientCapability> {
self.0.remote_capabilities(identity)
}
fn remote_identities(&self) -> Vec<ParticipantIdentity> {
self.0.remote_identities()
}
}
impl RpcTransport for SessionTransport {
async fn publish_data(
&self,
data: livekit_protocol::DataPacket,
) -> Result<(), RpcTransportError> {
self.0
.rtc_engine
.publish_data(data, crate::DataPacketKind::Reliable, false)
.await
.map_err(RpcTransportError::new)
}
async fn send_text(
&self,
text: &str,
options: StreamTextOptions,
) -> StreamResult<TextStreamInfo> {
self.0.outgoing_stream_manager.send_text(text, options, self.0.as_ref()).await
}
fn server_version(&self) -> Option<String> {
self.0
.rtc_engine
.session()
.signal_client()
.join_response()
.server_info
.and_then(|info| (!info.version.is_empty()).then(|| info.version))
}
}