diff --git a/Cargo.lock b/Cargo.lock index 16ef566..333a1c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -249,7 +249,6 @@ name = "connserver" version = "0.1.0" dependencies = [ "anyhow", - "async-trait", "dotenvy", "enc", "env_logger", @@ -919,6 +918,17 @@ dependencies = [ "serde", ] +[[package]] +name = "servercom" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "net", + "thiserror", + "tokio", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1001,6 +1011,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tokio" version = "1.44.2" diff --git a/Cargo.toml b/Cargo.toml index 21815d8..31c069b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["connserver", "enc", "net", "clientcom", "clientcom-c"] +members = ["connserver", "enc", "net", "clientcom", "clientcom-c", "servercom"] resolver = "2" [profile.release-with-debug] diff --git a/connserver/Cargo.toml b/connserver/Cargo.toml index 620a025..61d4733 100644 --- a/connserver/Cargo.toml +++ b/connserver/Cargo.toml @@ -14,7 +14,6 @@ enc = { path = "../enc" } anyhow = "1.0.98" serde = { version = "1.0.219", features = ["derive"] } toml = "0.8.20" -async-trait = "0.1.88" dotenvy = "0.15.7" [profile.release-with-debug] diff --git a/connserver/src/master.rs b/connserver/src/master.rs index cb3e3fa..58baa34 100644 --- a/connserver/src/master.rs +++ b/connserver/src/master.rs @@ -1,15 +1,16 @@ +use std::future::Future; + use net::TaggedPacket; use tokio::net::{ tcp::{OwnedReadHalf, OwnedWriteHalf}, TcpStream, }; -#[async_trait::async_trait] pub trait MasterDuplex: Send + Sync { /// Send a tagged packet to the master. - async fn send_packet(&mut self, packet: TaggedPacket) -> anyhow::Result<()>; + fn send_packet(&mut self, packet: TaggedPacket) -> impl Future> + Send; /// Receive a tagged packet from the master. - async fn recv_packet(&mut self) -> anyhow::Result; + fn recv_packet(&mut self) -> impl Future> + Send; } pub struct TcpMasterDuplex { @@ -29,7 +30,6 @@ impl TcpMasterDuplex { } } -#[async_trait::async_trait] impl MasterDuplex for TcpMasterDuplex { async fn send_packet(&mut self, packet: TaggedPacket) -> anyhow::Result<()> { net::send_tagged_packet(&mut self.write, packet).await diff --git a/servercom/Cargo.toml b/servercom/Cargo.toml new file mode 100644 index 0000000..df91647 --- /dev/null +++ b/servercom/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "servercom" +version = "0.1.0" +edition = "2024" + +[dependencies] +anyhow = "1.0.98" +async-trait = "0.1.88" +net = { path = "../net" } +thiserror = "2.0.12" +tokio = "1.44.2" diff --git a/servercom/src/lib.rs b/servercom/src/lib.rs new file mode 100644 index 0000000..9715dc4 --- /dev/null +++ b/servercom/src/lib.rs @@ -0,0 +1,50 @@ +use tokio::net::TcpStream; +use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf}; +use std::future::Future; +use net; + +pub trait MasterServer { + fn handle_packet( + &mut self, + packet: net::TaggedPacket, + send_packet: impl AsyncFnMut(net::TaggedPacket) -> anyhow::Result<()>, + ) -> impl Future>; +} + +pub struct ServerCore +where + Master: MasterServer, +{ + pub clients: Vec, + pub read: net::FramedReader, + pub write: OwnedWriteHalf, + pub master: Master, +} + +impl ServerCore +where + Master: MasterServer, +{ + pub fn new(mut stream: TcpStream, master: Master) -> anyhow::Result { + 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?; + } + } +}