From 0c9f4bb952853547494a2fed0b845cd15b8ea135 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 8 Sep 2025 16:55:47 +0200 Subject: [PATCH] Verbesserung: Erweiterung der Protokollausgaben in daemonWebSocketBridge.js zur Fehlerdiagnose und Eventverarbeitung MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Änderungen: - Hinzufügen von detaillierten Protokollausgaben beim Verbindungsaufbau und beim Empfang von Nachrichten, um den Status und die empfangenen Daten besser nachzuvollziehen. - Implementierung von Protokollausgaben zur Unterscheidung zwischen verschiedenen Nachrichtenformaten und zur Dokumentation der Weiterleitung von Events an Socket.io. - Verbesserung der Fehlerbehandlung beim Parsen von JSON-Nachrichten mit zusätzlichen Protokollausgaben zur Diagnose. Diese Anpassungen erhöhen die Nachvollziehbarkeit der WebSocket-Interaktionen und erleichtern die Fehlersuche im Backend. --- backend/services/daemonWebSocketBridge.js | 112 +++++++++++++++++++--- 1 file changed, 101 insertions(+), 11 deletions(-) diff --git a/backend/services/daemonWebSocketBridge.js b/backend/services/daemonWebSocketBridge.js index 75738d7..d87f674 100644 --- a/backend/services/daemonWebSocketBridge.js +++ b/backend/services/daemonWebSocketBridge.js @@ -25,10 +25,15 @@ class DaemonWebSocketBridge { this.daemonSocket.on('open', () => { console.log('✅ Daemon WebSocket verbunden'); + console.log('🔍 Daemon URL:', daemonUrl); + console.log('🔍 ReadyState:', this.daemonSocket.readyState); + console.log('🔍 Protocol:', this.daemonSocket.protocol); + console.log('🔍 Extensions:', this.daemonSocket.extensions); this.isConnected = true; this.reconnectAttempts = 0; // Registriere uns beim Daemon + console.log('📤 Registriere Backend beim Daemon...'); this.send({ event: 'register_backend', data: { type: 'backend_bridge' } @@ -36,11 +41,31 @@ class DaemonWebSocketBridge { }); this.daemonSocket.on('message', (data) => { + const rawMessage = data.toString(); + console.log('='.repeat(80)); + console.log('📨 DAEMON → BACKEND'); + console.log('📨 Raw Message:', rawMessage); + console.log('📨 Länge:', rawMessage.length); + console.log('📨 Zeitstempel:', new Date().toISOString()); + + // Ignoriere ping/pong-Nachrichten + if (rawMessage === 'ping' || rawMessage === 'pong') { + console.log('🏓 Ping/Pong-Nachricht ignoriert'); + console.log('='.repeat(80)); + return; + } + try { - const message = JSON.parse(data.toString()); + const message = JSON.parse(rawMessage); + console.log('✅ JSON erfolgreich geparst'); + console.log('📨 Parsed Message:', JSON.stringify(message, null, 2)); this.handleDaemonMessage(message); } catch (error) { - console.error('❌ Fehler beim Parsen der Daemon-Nachricht:', error); + console.error('❌ JSON Parse Fehler:'); + console.error('❌ Error:', error.message); + console.error('❌ Raw data:', rawMessage); + console.error('❌ Hex:', Buffer.from(rawMessage, 'utf8').toString('hex')); + console.log('='.repeat(80)); } }); @@ -62,13 +87,52 @@ class DaemonWebSocketBridge { } handleDaemonMessage(message) { - console.log('📨 Daemon-Nachricht empfangen:', message); + console.log('🔍 BACKEND VERARBEITUNG'); + console.log('🔍 Message Type:', typeof message); + console.log('🔍 Message Keys:', Object.keys(message || {})); + + // Prüfe verschiedene Nachrichtenformate + let eventName = null; + let eventData = {}; + + if (message.event) { + // Standard-Format: { event: 'eventName', data: {...} } + console.log('🔍 Format: Standard (event)'); + eventName = message.event; + eventData = message.data || {}; + } else if (message.type) { + // Alternative Format: { type: 'eventName', ... } + console.log('🔍 Format: Alternative (type)'); + eventName = message.type; + eventData = { ...message }; + delete eventData.type; + } else if (typeof message === 'string') { + // String-Format: 'eventName' + console.log('🔍 Format: String'); + eventName = message; + } else if (Array.isArray(message)) { + // Array-Format: ['eventName', {...}] + console.log('🔍 Format: Array'); + eventName = message[0]; + eventData = message[1] || {}; + } else { + console.log('⚠️ Format: Unbekannt'); + eventName = 'unknown_event'; + eventData = message; + } + + console.log('🔍 Extracted Event:', eventName); + console.log('🔍 Extracted Data:', eventData); // Leite spezifische Events an Socket.io weiter - if (message.event) { + if (eventName) { const io = getIo(); + console.log('📤 BACKEND → FRONTEND'); + console.log('📤 Socket.io verfügbar:', !!io); + console.log('📤 Event Name:', eventName); + console.log('📤 Event Data:', eventData); - switch (message.event) { + switch (eventName) { case 'production_ready': case 'stock_change': case 'price_update': @@ -80,28 +144,54 @@ class DaemonWebSocketBridge { case 'knowledge_update': case 'familychanged': // Broadcast an alle verbundenen Clients - io.emit(message.event, message.data || {}); - console.log(`📤 Event ${message.event} an alle Clients weitergeleitet:`, message.data || {}); + console.log(`📤 Sende Event "${eventName}" an alle Socket.io Clients...`); + if (io) { + io.emit(eventName, eventData); + console.log(`✅ Event "${eventName}" erfolgreich an Socket.io gesendet`); + console.log(`✅ Data:`, JSON.stringify(eventData, null, 2)); + } else { + console.error('❌ Socket.io nicht verfügbar!'); + } break; case 'workerStatus': // Spezielle Behandlung für Worker-Status - io.emit('daemon_worker_status', message.data || {}); - console.log('📤 Worker-Status an alle Clients weitergeleitet'); + console.log(`📤 Sende Worker-Status Event an alle Socket.io Clients...`); + if (io) { + io.emit('daemon_worker_status', eventData); + console.log(`✅ Worker-Status erfolgreich an Socket.io gesendet`); + console.log(`✅ Data:`, JSON.stringify(eventData, null, 2)); + } else { + console.error('❌ Socket.io nicht verfügbar!'); + } break; default: - console.log('⚠️ Unbekanntes Daemon-Event:', message.event); + console.log('⚠️ Unbekanntes Daemon-Event:', eventName); + console.log('⚠️ Event wird nicht weitergeleitet'); } + } else { + console.log('⚠️ Kein Event-Name extrahiert - keine Weiterleitung'); } + + console.log('='.repeat(80)); } send(data) { + console.log('📤 BACKEND → DAEMON'); + console.log('📤 Data:', JSON.stringify(data, null, 2)); + console.log('📤 WebSocket Status:', this.daemonSocket ? this.daemonSocket.readyState : 'CLOSED'); + if (this.daemonSocket && this.daemonSocket.readyState === WebSocket.OPEN) { - this.daemonSocket.send(JSON.stringify(data)); + const message = JSON.stringify(data); + console.log('📤 Sende an Daemon:', message); + this.daemonSocket.send(message); + console.log('✅ Nachricht erfolgreich an Daemon gesendet'); } else { console.warn('⚠️ Daemon WebSocket nicht verbunden - kann Nachricht nicht senden'); + console.warn('⚠️ ReadyState:', this.daemonSocket ? this.daemonSocket.readyState : 'CLOSED'); } + console.log('='.repeat(80)); } scheduleReconnect() {