mod server;
mod cache;
mod resp;
use std::time::Duration;
use std::sync::Arc;
use tokio::{net::TcpListener, sync::broadcast, signal};
use crate::server::Server;
use crate::cache::Cache;
pub async fn run_server(socket_addr: &str,
sample: usize,
threshold: f64,
frequency: Duration) {
let listener = TcpListener::bind(socket_addr).await.unwrap();
let shutdown = signal::ctrl_c();
let (notify_shutdown, _) = broadcast::channel(1);
let main_cache = Arc::new(Cache::new(
sample,
threshold,
frequency,
));
let clone = main_cache.clone();
let task = tokio::spawn(async move {
clone.monitor_for_expiry().await
});
let server = Server::new(socket_addr,
main_cache,
listener,
notify_shutdown);
log::info!("{:?}", "Server is created");
tokio::select! {
res = server.run() => {
if let Err(err) = res {
log::error!("failed to run the server, error {:?}", err);
}
}
_ = shutdown => {
log::info!("shutting down");
}
}
let Server {
notify_shutdown,
..
} = server;
task.abort();
drop(notify_shutdown);
log::info!("{:?}", "Server is closed");
}