packetz 2.0.0

Create async packet-based servers with ease, Built with gamedev in mind. Stay tuned for UDP support, and more!
Documentation
use std::io;
use tokio::{net, io::split};
use std::net::SocketAddr;
use crate::packet::*;

pub type TcpPacketStream = PacketStream<net::TcpStream, net::TcpStream>;

pub struct Server<Url: net::ToSocketAddrs> {
    bind: Url
}

impl<Url: net::ToSocketAddrs> Server<Url> {
    pub const fn bind(bind: Url) -> Self {
        return Self {
            bind
        }
    }
    pub async fn listen(&self) -> Result<ServerListener, io::Error> {
        Ok(ServerListener {
            listener: net::TcpListener::bind(&self.bind).await?
        })
    }
}

pub struct ServerListener {
    listener: net::TcpListener
}

impl ServerListener {
    pub async fn accept(&self) -> Result<(TcpPacketStream, SocketAddr), io::Error> {
        let (stream, addr) = self.listener.accept().await?;
        let (read, write) = split(stream);
        Ok((
            PacketStream {
                read: PacketRead { stream: read },
                write: PacketWrite { stream: write }
            },
            addr
        ))
    }
}

#[cfg(feature = "tls")]
pub mod tls {
    use std::io;
    use std::sync::Arc;
    use tokio::io::split;
    use tokio::net;
    use std::net::SocketAddr;
    use tokio_rustls::TlsAcceptor;
    use crate::packet::*;
    use tokio_rustls::rustls::ServerConfig;

    pub type TlsServerTcpPacketStream = PacketStream<tokio_rustls::server::TlsStream<tokio::net::TcpStream>, tokio_rustls::server::TlsStream<tokio::net::TcpStream>>;

    pub struct Server<Url: net::ToSocketAddrs> {
        bind: Url
    }

    impl<Url: net::ToSocketAddrs> Server<Url> {
        pub const fn bind(bind: Url) -> Self {
            return Self {
                bind
            }
        }
        pub async fn listen(&self, config: Arc<ServerConfig>) -> Result<ServerListener, io::Error> {
            Ok(ServerListener {
                listener: net::TcpListener::bind(&self.bind).await?,
                acceptor: TlsAcceptor::from(config)
            })
        }
    }

    pub struct ServerListener {
        listener: net::TcpListener,
        acceptor: TlsAcceptor
    }

    impl ServerListener {
        pub async fn accept(&self) -> Result<(TlsServerTcpPacketStream, SocketAddr), io::Error> {
            let (stream, addr) = self.listener.accept().await?;
            let stream = self.acceptor.accept(stream).await?;
            let (read, write) = split(stream);
            Ok((
                PacketStream {
                    read: PacketRead { stream: read },
                    write: PacketWrite { stream: write }
                },
                addr
            ))
        }
    }
}