feat(chat-server): implement 60s inactivity heartbeat timeout

This commit is contained in:
okinrev 2025-12-06 12:00:20 +01:00
parent e169a982d3
commit 109ca3cb82

View file

@ -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;
}
}