Skip to main content

voltlane_server/
lib.rs

1use tokio::net::TcpStream;
2use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
3use std::future::Future;
4pub use voltlane_net as net;
5
6pub trait MasterServer {
7    fn handle_packet(
8        &mut self,
9        packet: net::TaggedPacket,
10        send_packet: impl AsyncFnMut(net::TaggedPacket) -> anyhow::Result<()>,
11    ) -> impl Future<Output = anyhow::Result<()>>;
12}
13
14pub struct ServerCore<Client, Master>
15where
16    Master: MasterServer,
17{
18    pub clients: Vec<Client>,
19    pub read: net::FramedReader<OwnedReadHalf>,
20    pub write: OwnedWriteHalf,
21    pub master: Master,
22}
23
24impl<ClientT, Master> ServerCore<ClientT, Master>
25where
26    Master: MasterServer,
27{
28    pub fn new(mut stream: TcpStream, master: Master) -> anyhow::Result<Self> {
29        net::configure_performance_tcp_socket(&mut stream)?;
30        let (read, write) = stream.into_split();
31        let read = net::new_framed_reader(read);
32        Ok(Self {
33            read,
34            write,
35            clients: Vec::new(),
36            master,
37        })
38    }
39
40    pub async fn run(&mut self) -> anyhow::Result<()> {
41        loop {
42            let packet = net::recv_tagged_packet(&mut self.read).await?;
43            self.master
44                .handle_packet(packet, async |packet| -> anyhow::Result<()> {
45                    net::send_tagged_packet(&mut self.write, packet).await
46                })
47                .await?;
48        }
49    }
50}