| 
						
						
							
								
							
						
						
					 | 
					@ -293,6 +293,7 @@ pub fn start_notification_server() -> WebSocketUsers { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        let users2 = users.clone(); | 
					 | 
					 | 
					        let users2 = users.clone(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        tokio::spawn(async move { | 
					 | 
					 | 
					        tokio::spawn(async move { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            let addr = (CONFIG.websocket_address(), CONFIG.websocket_port()); | 
					 | 
					 | 
					            let addr = (CONFIG.websocket_address(), CONFIG.websocket_port()); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					            info!("Starting WebSockets server on {}:{}", addr.0, addr.1); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            let listener = TcpListener::bind(addr).await.expect("Can't listen on websocket port"); | 
					 | 
					 | 
					            let listener = TcpListener::bind(addr).await.expect("Can't listen on websocket port"); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            let (shutdown_tx, mut shutdown_rx) = tokio::sync::oneshot::channel::<()>(); | 
					 | 
					 | 
					            let (shutdown_tx, mut shutdown_rx) = tokio::sync::oneshot::channel::<()>(); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -317,9 +318,11 @@ pub fn start_notification_server() -> WebSocketUsers { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    users | 
					 | 
					 | 
					    users | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					async fn handle_connection(stream: TcpStream, users: WebSocketUsers, _addr: SocketAddr) -> Result<(), Error> { | 
					 | 
					 | 
					async fn handle_connection(stream: TcpStream, users: WebSocketUsers, addr: SocketAddr) -> Result<(), Error> { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					    let mut user_uuid: Option<String> = None; | 
					 | 
					 | 
					    let mut user_uuid: Option<String> = None; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    info!("Accepting WS connection from {addr}"); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    // Accept connection, do initial handshake, validate auth token and get the user ID
 | 
					 | 
					 | 
					    // Accept connection, do initial handshake, validate auth token and get the user ID
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    use handshake::server::{Request, Response}; | 
					 | 
					 | 
					    use handshake::server::{Request, Response}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    let mut stream = accept_hdr_async(stream, |req: &Request, res: Response| { | 
					 | 
					 | 
					    let mut stream = accept_hdr_async(stream, |req: &Request, res: Response| { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -346,9 +349,22 @@ async fn handle_connection(stream: TcpStream, users: WebSocketUsers, _addr: Sock | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            res = stream.next() =>  { | 
					 | 
					 | 
					            res = stream.next() =>  { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                match res { | 
					 | 
					 | 
					                match res { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                    Some(Ok(message)) => { | 
					 | 
					 | 
					                    Some(Ok(message)) => { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                        //info!("RECEIVED {message:?}");
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                        // Respond to any pings
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                        if let Message::Ping(ping) = message { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                            if stream.send(Message::Pong(ping)).await.is_err() { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                                break; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                            } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                            continue; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                        } else if let Message::Pong(_) = message { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                            /* Ignored */ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                            continue; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					                        } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                        // We should receive an initial message with the protocol and version, and we will reply to it
 | 
					 | 
					 | 
					                        // We should receive an initial message with the protocol and version, and we will reply to it
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                        if let Message::Text(ref message) = message { | 
					 | 
					 | 
					                        if let Message::Text(ref message) = message { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					                            let msg = message.strip_suffix('\u{1e}').unwrap_or(message); | 
					 | 
					 | 
					                            let msg = message.strip_suffix(RECORD_SEPARATOR as char).unwrap_or(message); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                            if serde_json::from_str(msg).ok() == Some(INITIAL_MESSAGE) { | 
					 | 
					 | 
					                            if serde_json::from_str(msg).ok() == Some(INITIAL_MESSAGE) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                                stream.send(Message::binary(INITIAL_RESPONSE)).await?; | 
					 | 
					 | 
					                                stream.send(Message::binary(INITIAL_RESPONSE)).await?; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -377,13 +393,15 @@ async fn handle_connection(stream: TcpStream, users: WebSocketUsers, _addr: Sock | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            } | 
					 | 
					 | 
					            } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            _= interval.tick() => { | 
					 | 
					 | 
					            _= interval.tick() => { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					                if stream.send(Message::Binary(create_ping())).await.is_err() { | 
					 | 
					 | 
					                if stream.send(Message::Ping(create_ping())).await.is_err() { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					                    break; | 
					 | 
					 | 
					                    break; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					                } | 
					 | 
					 | 
					                } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            } | 
					 | 
					 | 
					            } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        } | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    info!("Closing WS connection from {addr}"); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    //  Delete from map
 | 
					 | 
					 | 
					    //  Delete from map
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    users.map.entry(user_uuid).or_default().retain(|(uuid, _)| uuid != &entry_uuid); | 
					 | 
					 | 
					    users.map.entry(user_uuid).or_default().retain(|(uuid, _)| uuid != &entry_uuid); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    Ok(()) | 
					 | 
					 | 
					    Ok(()) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					
  |