diff --git a/Cargo.lock b/Cargo.lock index 0e7a19a..21b59b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -774,6 +774,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "solstice-server" +version = "0.1.0" +dependencies = [ + "anyhow", + "env_logger 0.8.4", + "log", + "parking_lot", + "solstice-proto", + "tokio", +] + [[package]] name = "strsim" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index 9e53580..90ad5ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,4 +3,5 @@ members = [ "client", "proto", + "server", ] diff --git a/proto/src/server/mod.rs b/proto/src/server/mod.rs index 2cf145e..9a93c5e 100644 --- a/proto/src/server/mod.rs +++ b/proto/src/server/mod.rs @@ -3,8 +3,6 @@ mod constants; mod credentials; mod request; mod response; -#[cfg(test)] -mod testing; mod version; pub use self::client::{Client, ClientLoginError, ClientWorker}; diff --git a/server/Cargo.toml b/server/Cargo.toml new file mode 100644 index 0000000..1a65dbc --- /dev/null +++ b/server/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "solstice-server" +version = "0.1.0" +authors = ["letitz"] +edition = "2021" + +[dependencies] +anyhow = "^1.0" +env_logger = "^0.8" +log = "^0.4" +parking_lot = "^0.11" +solstice-proto = { path = "../proto" } +tokio = { version = "^1.0", features = ["full"] } diff --git a/proto/src/server/testing/mod.rs b/server/src/lib.rs similarity index 85% rename from proto/src/server/testing/mod.rs rename to server/src/lib.rs index 341eb0f..6d6b62b 100644 --- a/proto/src/server/testing/mod.rs +++ b/server/src/lib.rs @@ -1,4 +1,4 @@ -//! Testing utilities for server protocol code. +//! A server library, mostly for testing. mod server; mod user_status; diff --git a/proto/src/server/testing/server.rs b/server/src/server.rs similarity index 97% rename from proto/src/server/testing/server.rs rename to server/src/server.rs index c18495c..1bc24b1 100644 --- a/proto/src/server/testing/server.rs +++ b/server/src/server.rs @@ -1,22 +1,18 @@ //! Provides utilities for testing protocol code. -// TODO: Move this to a separate crate, so that it can be depended upon as a -// dev dependency in tests and run standalone as examples. Layering should be: -// solstice-client -(dev)-> solstice-server -> solstice-proto use std::io; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use anyhow::{bail, Context}; use log::{info, warn}; +use solstice_proto::core::{FrameReader, FrameWriter, Worker}; +use solstice_proto::server::{LoginResponse, ServerRequest, ServerResponse}; use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf}; use tokio::net::{TcpListener, TcpStream}; use tokio::sync::mpsc; use tokio::sync::oneshot; use tokio::sync::watch; -use crate::core::{FrameReader, FrameWriter, Worker}; -use crate::server::{LoginResponse, ServerRequest, ServerResponse}; - /// A handler for a single client connected to the server. pub trait ClientHandler { /// Runs this handler against the given incoming stream of requests. @@ -300,6 +296,7 @@ where /// /// Useful for tests who need to guarantee a handler is spawned before the /// server shuts down. + #[cfg(test)] async fn accept(&mut self) -> io::Result<()> { let (stream, peer_address) = self.listener.accept().await?; self.spawn_handler(stream, peer_address); diff --git a/proto/src/server/testing/user_status.rs b/server/src/user_status.rs similarity index 96% rename from proto/src/server/testing/user_status.rs rename to server/src/user_status.rs index 426738b..f2aa8f6 100644 --- a/proto/src/server/testing/user_status.rs +++ b/server/src/user_status.rs @@ -3,12 +3,12 @@ use std::sync::Arc; use log::warn; use parking_lot::Mutex; - -use crate::server::testing::{ClientHandlerFactory, RequestHandler}; -use crate::server::{ +use solstice_proto::server::{ ServerRequest, ServerResponse, UserStatusRequest, UserStatusResponse, }; +use crate::{ClientHandlerFactory, RequestHandler}; + /// A map of user names to user status responses to serve. #[derive(Debug, Default)] pub struct UserStatusMap {