feat(chat-server): implement 60s inactivity heartbeat timeout
This commit is contained in:
parent
385b1b0427
commit
bee87f051c
1 changed files with 50 additions and 35 deletions
|
|
@ -109,51 +109,66 @@ async fn handle_socket(socket: WebSocket, state: WebSocketState, claims: AccessT
|
|||
return;
|
||||
}
|
||||
|
||||
// Boucle principale de gestion des messages
|
||||
while let Some(msg) = receiver.next().await {
|
||||
match msg {
|
||||
Ok(Message::Text(text)) => {
|
||||
debug!("📨 Message WebSocket reçu: {}", text);
|
||||
// Timeout d'inactivité (Heartbeat)
|
||||
let keepalive_timeout = std::time::Duration::from_secs(60);
|
||||
|
||||
match handle_incoming_message(&text, &state, client.clone(), &claims).await {
|
||||
Ok(should_continue) => {
|
||||
if !should_continue {
|
||||
// Boucle principale de gestion des messages avec timeout
|
||||
loop {
|
||||
match tokio::time::timeout(keepalive_timeout, receiver.next()).await {
|
||||
Ok(Some(msg)) => {
|
||||
match msg {
|
||||
Ok(Message::Text(text)) => {
|
||||
debug!("📨 Message WebSocket reçu: {}", text);
|
||||
|
||||
match handle_incoming_message(&text, &state, client.clone(), &claims).await {
|
||||
Ok(should_continue) => {
|
||||
if !should_continue {
|
||||
break;
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
error!("❌ Erreur lors du traitement du message: {}", e);
|
||||
|
||||
// Envoyer un message d'erreur au client
|
||||
let error_msg = OutgoingMessage::Error {
|
||||
message: format!("Erreur: {}", e),
|
||||
};
|
||||
if client.send_message(error_msg).await.is_err() {
|
||||
error!("❌ Impossible d'envoyer le message d'erreur au client");
|
||||
break; // Fermer la connexion si on ne peut même pas envoyer d'erreur
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(Message::Close(_)) => {
|
||||
info!("👋 Connexion WebSocket fermée par le client");
|
||||
break;
|
||||
}
|
||||
Ok(Message::Ping(_)) => {
|
||||
debug!("🏓 Ping WebSocket reçu");
|
||||
if client.send_message(OutgoingMessage::Pong).await.is_err() {
|
||||
error!("❌ Erreur lors de l'envoi du Pong");
|
||||
break;
|
||||
}
|
||||
}
|
||||
Ok(Message::Pong(_)) => {
|
||||
debug!("🏓 Pong WebSocket reçu");
|
||||
}
|
||||
Ok(_) => {
|
||||
debug!("⚠️ Type de message WebSocket non géré");
|
||||
}
|
||||
Err(e) => {
|
||||
error!("❌ Erreur lors du traitement du message: {}", e);
|
||||
|
||||
// Envoyer un message d'erreur au client
|
||||
let error_msg = OutgoingMessage::Error {
|
||||
message: format!("Erreur: {}", e),
|
||||
};
|
||||
if client.send_message(error_msg).await.is_err() {
|
||||
error!("❌ Impossible d'envoyer le message d'erreur au client");
|
||||
break; // Fermer la connexion si on ne peut même pas envoyer d'erreur
|
||||
}
|
||||
error!("❌ Erreur WebSocket: {}", e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(Message::Close(_)) => {
|
||||
info!("👋 Connexion WebSocket fermée par le client");
|
||||
Ok(None) => {
|
||||
// Fin du stream
|
||||
break;
|
||||
}
|
||||
Ok(Message::Ping(_)) => {
|
||||
debug!("🏓 Ping WebSocket reçu");
|
||||
if client.send_message(OutgoingMessage::Pong).await.is_err() {
|
||||
error!("❌ Erreur lors de l'envoi du Pong");
|
||||
break;
|
||||
}
|
||||
}
|
||||
Ok(Message::Pong(_)) => {
|
||||
debug!("🏓 Pong WebSocket reçu");
|
||||
}
|
||||
Ok(_) => {
|
||||
debug!("⚠️ Type de message WebSocket non géré");
|
||||
}
|
||||
Err(e) => {
|
||||
error!("❌ Erreur WebSocket: {}", e);
|
||||
Err(_) => {
|
||||
info!("💤 Timeout inactivité ({}s) pour client {}, fermeture", keepalive_timeout.as_secs(), client_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue