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