This commit is contained in:
Louis Mazin 2026-02-03 16:28:01 +01:00
parent 4bdfc1b3f9
commit e198f1e3ee

View File

@ -306,11 +306,7 @@ const connectWebSocket = async (pterodactylToken, serverId) => {
})); }));
}); });
// Handler pour le pong WebSocket natif // Pas besoin de handler 'pong' - on vérifie l'accès aux logs directement
ws.on('pong', () => {
lastHeartbeatResponse = Date.now();
console.log('🏓 [WEBSOCKET] Pong reçu - connexion OK');
});
ws.on('message', async (data) => { ws.on('message', async (data) => {
@ -331,65 +327,43 @@ const connectWebSocket = async (pterodactylToken, serverId) => {
if (heartbeatTimeout) clearTimeout(heartbeatTimeout); if (heartbeatTimeout) clearTimeout(heartbeatTimeout);
lastHeartbeatResponse = Date.now(); lastHeartbeatResponse = Date.now();
let missedHeartbeats = 0;
const MAX_MISSED_HEARTBEATS = 2; // 2 heartbeats manqués = reconnexion
heartbeatInterval = setInterval(() => { heartbeatInterval = setInterval(() => {
if (ws && ws.readyState === WebSocket.OPEN) { if (ws && ws.readyState === WebSocket.OPEN) {
try { try {
const timeSinceLastResponse = Date.now() - lastHeartbeatResponse; const timeSinceLastLog = Date.now() - lastHeartbeatResponse;
// Si on a pas eu de réponse depuis plus de 30s, incrémenter le compteur // Si on n'a pas reçu de log depuis plus de 40s, c'est que l'accès aux logs est perdu
if (timeSinceLastResponse > 30000) { if (timeSinceLastLog > 40000) {
missedHeartbeats++; console.error(`💔 [WEBSOCKET] Aucun log reçu depuis ${Math.round(timeSinceLastLog/1000)}s - accès aux logs perdu! Reconnexion forcée...`);
console.warn(`⚠️ [WEBSOCKET] Heartbeat manqué (${missedHeartbeats}/${MAX_MISSED_HEARTBEATS}). Dernière réponse: ${Math.round(timeSinceLastResponse/1000)}s`); if (ws) {
ws.terminate(); // Fermeture immédiate sans attendre
if (missedHeartbeats >= MAX_MISSED_HEARTBEATS) {
console.error('💔 [WEBSOCKET] Trop de heartbeats manqués! Reconnexion forcée...');
if (ws) {
ws.terminate(); // Fermeture immédiate sans attendre
}
return;
}
} else {
// Reset le compteur si on a reçu une réponse récemment
if (missedHeartbeats > 0) {
console.log('✅ [WEBSOCKET] Heartbeat de retour à la normale');
missedHeartbeats = 0;
} }
return;
} }
// Envoyer le heartbeat // Redemander l'accès aux logs pour s'assurer qu'on les reçoit toujours
ws.send(JSON.stringify({ event: 'send heartbeat', args: [] })); ws.send(JSON.stringify({
console.log('💓 [WEBSOCKET] Heartbeat envoyé'); event: 'send logs',
args: [null]
// Aussi envoyer un ping WebSocket natif pour vérifier la connexion TCP }));
if (ws.ping) { console.log(`📡 [WEBSOCKET] Vérification accès aux logs (dernier reçu: ${Math.round(timeSinceLastLog/1000)}s)`);
ws.ping();
console.log('🏓 [WEBSOCKET] Ping natif envoyé');
}
} catch (error) { } catch (error) {
console.error('❌ [WEBSOCKET] Erreur lors de l\'envoi du heartbeat:', error.message); console.error('❌ [WEBSOCKET] Erreur lors de la vérification des logs:', error.message);
missedHeartbeats++; if (ws) {
if (missedHeartbeats >= MAX_MISSED_HEARTBEATS && ws) {
console.error('💔 [WEBSOCKET] Erreurs répétées, reconnexion forcée...');
ws.terminate(); ws.terminate();
} }
} }
} else { } else {
console.warn('⚠️ [WEBSOCKET] Heartbeat impossible: WebSocket non ouvert (état:', ws ? ws.readyState : 'null', ')'); console.warn('⚠️ [WEBSOCKET] Vérification impossible: WebSocket non ouvert (état:', ws ? ws.readyState : 'null', ')');
missedHeartbeats++; if (heartbeatInterval) {
if (missedHeartbeats >= MAX_MISSED_HEARTBEATS) { clearInterval(heartbeatInterval);
console.error('💔 [WEBSOCKET] WebSocket fermé, nettoyage...'); heartbeatInterval = null;
if (heartbeatInterval) {
clearInterval(heartbeatInterval);
heartbeatInterval = null;
}
} }
} }
}, 20000); // Vérifier toutes les 20s au lieu de 30s }, 20000); // Vérifier toutes les 20s
console.log('💓 [WEBSOCKET] Heartbeat configuré (20s, max 2 manqués)'); console.log('📡 [WEBSOCKET] Vérification d\'accès aux logs configurée (20s, timeout 40s)');
} }
// Détecter les réponses du serveur (console output, status, etc) pour mettre à jour le lastHeartbeatResponse // Détecter les réponses du serveur (console output, status, etc) pour mettre à jour le lastHeartbeatResponse