p2p2 0.0.1

NAT Traversal for P2P communication
Documentation
use crate::async_socket::{BindError, ConnectError, UdpSocket};
use crate::secure_stream::stream::{RecvBytes, SendBytes};
use crate::udp::UDP_MAX_SIZE;
use std::error::Error;
use std::net::SocketAddr;

pub struct Tokio {
    sock: tokio::net::UdpSocket,
}

#[async_trait::async_trait]
impl SendBytes for Tokio {
    async fn send(&mut self, message: &[u8]) -> Result<usize, Box<dyn Error + Send + Sync>> {
        self.sock.send(message).await.map_err(Into::into)
    }

    type SendExtra = SocketAddr;

    async fn send_extra(
        &mut self,
        message: &[u8],
        extra: Self::SendExtra,
    ) -> Result<usize, Box<dyn Error + Send + Sync>> {
        self.sock.send_to(message, extra).await.map_err(Into::into)
    }

    fn max_size() -> Option<usize>
    where
        Self: Sized,
    {
        Some(UDP_MAX_SIZE)
    }
}

#[async_trait::async_trait]
impl RecvBytes for Tokio {
    async fn recv(&mut self) -> Result<Vec<u8>, Box<dyn Error + Send + Sync>> {
        let mut b = vec![0; UDP_MAX_SIZE];
        let len = self.sock.recv(&mut b).await?;

        b.resize(len, 0);
        Ok(b)
    }

    type RecvExtra = SocketAddr;

    async fn recv_extra(
        &mut self,
    ) -> Result<(Vec<u8>, Self::RecvExtra), Box<dyn Error + Send + Sync>> {
        let mut b = vec![0; UDP_MAX_SIZE];
        let (len, addr) = self.sock.recv_from(&mut b).await?;

        b.resize(len, 0);
        Ok((b, addr))
    }

    fn max_size() -> Option<usize>
    where
        Self: Sized,
    {
        Some(UDP_MAX_SIZE)
    }
}

#[async_trait::async_trait]
impl UdpSocket for Tokio {
    async fn bind(address: SocketAddr) -> Result<Self, BindError> {
        let sock = tokio::net::UdpSocket::bind(address).await?;

        Ok(Tokio { sock })
    }

    async fn connect(&self, address: SocketAddr) -> Result<(), ConnectError> {
        self.sock.connect(address).await?;
        Ok(())
    }

    fn address(&self) -> SocketAddr {
        self.sock
            .local_addr()
            .expect("somehow couldn't get local address")
    }
}