1mod server;
2mod cache;
3mod resp;
4
5use std::time::Duration;
6use std::sync::Arc;
7use tokio::{net::TcpListener, sync::broadcast, signal};
8
9use crate::server::Server;
10use crate::cache::Cache;
11
12pub async fn run_server(socket_addr: &str,
13 sample: usize,
14 threshold: f64,
15 frequency: Duration) {
16
17 let listener = TcpListener::bind(socket_addr).await.unwrap();
19
20 let shutdown = signal::ctrl_c();
22
23 let (notify_shutdown, _) = broadcast::channel(1);
25
26 let main_cache = Arc::new(Cache::new(
29 sample,
30 threshold,
31 frequency,
32 ));
33
34 let clone = main_cache.clone();
36
37 let task = tokio::spawn(async move {
38 clone.monitor_for_expiry().await
39 });
40
41 let server = Server::new(socket_addr,
43 main_cache,
44 listener,
45 notify_shutdown);
46
47 log::info!("{:?}", "Server is created");
48
49 tokio::select! {
50 res = server.run() => {
51 if let Err(err) = res {
52 log::error!("failed to run the server, error {:?}", err);
53 }
54 }
55 _ = shutdown => {
56 log::info!("shutting down");
57 }
58 }
59
60 let Server {
61 notify_shutdown,
62 ..
63 } = server;
64
65 task.abort();
67
68 drop(notify_shutdown);
70
71 log::info!("{:?}", "Server is closed");
72}