5 use connect::{tcp::TcpListener, StreamExt};
7 use remote_client::{Client, ClientId};
12 use tokio::{sync::Mutex as AsyncMutex, task};
14 pub struct ServerData {
15 clients_by_id: RwLock<HashMap<ClientId, Arc<Client>>>,
16 clients_by_name: RwLock<HashMap<String, Arc<Client>>>,
20 listener: TcpListener,
21 data: Arc<ServerData>,
26 pub async fn new(addr: &str, quit: Quit) -> Self {
29 listener: TcpListener::bind(addr).await.unwrap(),
30 data: Arc::new(ServerData {
31 clients_by_id: RwLock::new(HashMap::new()),
32 clients_by_name: RwLock::new(HashMap::new()),
37 pub async fn run(mut self) {
38 let mut next_id: ClientId = 0;
39 let mut quit = self.quit.subscribe();
43 conn = self.listener.next() => {
44 let conn = conn.expect("Listener interrupted");
46 info!("Client from {} assigned id {next_id}", conn.peer_addr());
48 let (reader, writer) = conn.split();
49 let client = Arc::new(Client {
51 conn: AsyncMutex::new(writer),
52 server: Arc::downgrade(&self.data),
53 quit: self.quit.clone(),
60 .insert(next_id, Arc::clone(&client));
64 task::spawn(async move { (*client).run(reader).await });
67 trace!("Quit signal received");
70 else => unreachable!("Quit channel broke"),
74 info!("Stopped server");