use std::net::{SocketAddr, UdpSocket as StdUdpSocket};
use alpine::stream::FrameTransport;
use crate::transport::TransportError;
use tracing::info;
#[derive(Debug)]
pub struct UdpFrameTransport {
socket: StdUdpSocket,
_peer: SocketAddr,
}
impl UdpFrameTransport {
pub fn new(local: SocketAddr, peer: SocketAddr) -> Result<Self, TransportError> {
let socket =
StdUdpSocket::bind(local).map_err(|err| TransportError::Bind(err.to_string()))?;
socket
.connect(peer)
.map_err(|err| TransportError::Send(err.to_string()))?;
let bound = socket
.local_addr()
.map_err(|err| TransportError::Bind(err.to_string()))?;
info!(
"[ALPINE][STREAM][SOCKET] UDP stream socket bound local_addr={} peer={}",
bound, peer
);
Ok(Self {
socket,
_peer: peer,
})
}
}
impl FrameTransport for UdpFrameTransport {
fn send_frame(&self, bytes: &[u8]) -> Result<(), String> {
self.socket
.send(bytes)
.map_err(|e| format!("udp stream send: {}", e))?;
Ok(())
}
}