Verbesserung: Erweiterung der Protokollausgaben in daemonWebSocketBridge.js zur Fehlerdiagnose und Eventverarbeitung

Ä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.
This commit is contained in:
Torsten Schulz (local)
2025-09-08 16:55:47 +02:00
parent 827b8c3a44
commit 0c9f4bb952

View File

@@ -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() {