pub mod binary;
pub mod handler;
use std::sync::Arc;
use tokio::net::TcpListener;
use tracing::{error, info};
use crate::config::AuthConfig;
use crate::engine::queue::QueueManager;
#[cfg(feature = "tls")]
pub async fn start_tls_tcp_server(
listener: TcpListener,
manager: Arc<QueueManager>,
auth_config: AuthConfig,
mut shutdown_rx: tokio::sync::watch::Receiver<bool>,
acceptor: tokio_rustls::TlsAcceptor,
) {
let auth = Arc::new(auth_config);
let addr = listener
.local_addr()
.map(|a| a.to_string())
.unwrap_or_else(|_| "unknown".to_string());
info!(addr = %addr, "TLS TCP server listening");
loop {
tokio::select! {
result = listener.accept() => {
match result {
Ok((stream, _)) => {
stream.set_nodelay(true).ok();
let mgr = Arc::clone(&manager);
let auth = Arc::clone(&auth);
let acceptor = acceptor.clone();
tokio::spawn(async move {
match acceptor.accept(stream).await {
Ok(tls_stream) => {
handler::handle_connection(tls_stream, mgr, &auth).await;
}
Err(e) => {
tracing::warn!(error = %e, "TLS handshake failed");
}
}
});
}
Err(e) => {
error!(error = %e, "Failed to accept TCP connection");
}
}
}
_ = shutdown_rx.changed() => {
info!("TLS TCP server shutting down");
break;
}
}
}
}
pub async fn start_tcp_server(
listener: TcpListener,
manager: Arc<QueueManager>,
auth_config: AuthConfig,
mut shutdown_rx: tokio::sync::watch::Receiver<bool>,
) {
let addr = listener
.local_addr()
.map(|a| a.to_string())
.unwrap_or_else(|_| "unknown".to_string());
info!(addr = %addr, "TCP server listening");
let auth_config = Arc::new(auth_config);
loop {
tokio::select! {
result = listener.accept() => {
match result {
Ok((stream, _addr)) => {
stream.set_nodelay(true).ok();
let mgr = Arc::clone(&manager);
let auth = Arc::clone(&auth_config);
tokio::spawn(async move {
handler::handle_connection(stream, mgr, &auth).await;
});
}
Err(e) => {
error!(error = %e, "Failed to accept TCP connection");
}
}
}
_ = shutdown_rx.changed() => {
info!("TCP server shutting down, no longer accepting connections");
break;
}
}
}
}