alpine-protocol-sdk 0.2.4

High-level SDK on top of the ALPINE protocol layer.
Documentation
use std::net::{SocketAddr, UdpSocket as StdUdpSocket};

use alpine::stream::FrameTransport;

use crate::transport::TransportError;
use tracing::info;

/// UDP-based transport used by the SDK streaming client.
#[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(())
    }
}