use crate::packet::VoipPacket;
use super::Result;
use super::UdpError;
use tokio::net::{ToSocketAddrs, UdpSocket};
use uuid::Uuid;
#[derive(Debug)]
pub struct Client {
uuid: Uuid,
udp_socket: UdpSocket,
}
impl Client {
pub async fn new<T: ToSocketAddrs>(uuid: Uuid, remote_addr: T) -> Result<Self> {
Ok(Self {
uuid,
udp_socket: establish_connection(remote_addr).await?,
})
}
pub fn uuid(&self) -> Uuid {
self.uuid
}
pub fn udp_socket(&self) -> &UdpSocket {
&self.udp_socket
}
pub async fn send_message(&self, msg_buf: &VoipPacket) -> Result<usize> {
self.udp_socket
.send(&msg_buf.0)
.await
.map_err(UdpError::SendError)
}
}
pub async fn establish_connection<T: ToSocketAddrs>(remote_addr: T) -> Result<UdpSocket> {
let udp_socket = UdpSocket::bind("[::]:0")
.await
.map_err(UdpError::BindError)?;
udp_socket
.connect(remote_addr)
.await
.map_err(UdpError::ConnectionError)?;
Ok(udp_socket)
}