voltlane-server 0.1.1

Voltlane server-side library to communicate with the standard Voltlane TCP reverse proxy.
Documentation
use tokio::net::TcpStream;
use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
use std::future::Future;
pub use voltlane_net as net;

pub trait MasterServer {
    fn handle_packet(
        &mut self,
        packet: net::TaggedPacket,
        send_packet: impl AsyncFnMut(net::TaggedPacket) -> anyhow::Result<()>,
    ) -> impl Future<Output = anyhow::Result<()>>;
}

pub struct ServerCore<Client, Master>
where
    Master: MasterServer,
{
    pub clients: Vec<Client>,
    pub read: net::FramedReader<OwnedReadHalf>,
    pub write: OwnedWriteHalf,
    pub master: Master,
}

impl<ClientT, Master> ServerCore<ClientT, Master>
where
    Master: MasterServer,
{
    pub fn new(mut stream: TcpStream, master: Master) -> anyhow::Result<Self> {
        net::configure_performance_tcp_socket(&mut stream)?;
        let (read, write) = stream.into_split();
        let read = net::new_framed_reader(read);
        Ok(Self {
            read,
            write,
            clients: Vec::new(),
            master,
        })
    }

    pub async fn run(&mut self) -> anyhow::Result<()> {
        loop {
            let packet = net::recv_tagged_packet(&mut self.read).await?;
            self.master
                .handle_packet(packet, async |packet| -> anyhow::Result<()> {
                    net::send_tagged_packet(&mut self.write, packet).await
                })
                .await?;
        }
    }
}