Files
yourpart3/backend/services/daemonWebSocketBridge.js
Torsten Schulz (local) 917b04fb5e Fix: Umstellung auf Socket.io für alle Views und Verbesserung der Event-Registrierung
Änderung:
- Alle Views wurden aktualisiert, um den Daemon WebSocket zu deaktivieren und stattdessen Socket.io für die Event-Registrierung zu verwenden.
- Eine neue Methode `setupSocketEvents` wurde hinzugefügt, um die Socket.io-Events zu registrieren und Protokollausgaben für den Status der Registrierung bereitzustellen.
- Die Logik zur Handhabung von WebSocket-Events wurde vereinfacht und verbessert, um die Stabilität und Nachvollziehbarkeit zu erhöhen.

Diese Anpassung sorgt für eine konsistentere Handhabung von WebSocket-Events und verbessert die Benutzererfahrung durch zuverlässigere Datenaktualisierungen.
2025-09-08 12:06:56 +02:00

144 lines
4.8 KiB
JavaScript

// services/daemonWebSocketBridge.js
import WebSocket from 'ws';
import { getIo } from '../utils/socket.js';
class DaemonWebSocketBridge {
constructor() {
this.daemonSocket = null;
this.reconnectInterval = 5000;
this.maxReconnectAttempts = 10;
this.reconnectAttempts = 0;
this.isConnected = false;
}
connect() {
if (this.daemonSocket && this.daemonSocket.readyState === WebSocket.OPEN) {
console.log('🔌 Daemon WebSocket bereits verbunden');
return;
}
const daemonUrl = process.env.DAEMON_WS_URL || 'wss://www.your-part.de:4551';
console.log('🔌 Verbinde mit Daemon WebSocket:', daemonUrl);
try {
this.daemonSocket = new WebSocket(daemonUrl);
this.daemonSocket.on('open', () => {
console.log('✅ Daemon WebSocket verbunden');
this.isConnected = true;
this.reconnectAttempts = 0;
// Registriere uns beim Daemon
this.send({
event: 'register_backend',
data: { type: 'backend_bridge' }
});
});
this.daemonSocket.on('message', (data) => {
try {
const message = JSON.parse(data.toString());
this.handleDaemonMessage(message);
} catch (error) {
console.error('❌ Fehler beim Parsen der Daemon-Nachricht:', error);
}
});
this.daemonSocket.on('close', (code, reason) => {
console.log('❌ Daemon WebSocket getrennt:', code, reason.toString());
this.isConnected = false;
this.scheduleReconnect();
});
this.daemonSocket.on('error', (error) => {
console.error('❌ Daemon WebSocket Fehler:', error.message);
this.isConnected = false;
});
} catch (error) {
console.error('❌ Fehler beim Erstellen der Daemon WebSocket-Verbindung:', error);
this.scheduleReconnect();
}
}
handleDaemonMessage(message) {
console.log('📨 Daemon-Nachricht empfangen:', message);
// Leite spezifische Events an Socket.io weiter
if (message.event) {
const io = getIo();
switch (message.event) {
case 'production_ready':
case 'stock_change':
case 'price_update':
case 'director_death':
case 'production_started':
case 'selled_items':
case 'falukantUpdateStatus':
case 'falukantBranchUpdate':
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 || {});
break;
case 'workerStatus':
// Spezielle Behandlung für Worker-Status
io.emit('daemon_worker_status', message.data || {});
console.log('📤 Worker-Status an alle Clients weitergeleitet');
break;
default:
console.log('⚠️ Unbekanntes Daemon-Event:', message.event);
}
}
}
send(data) {
if (this.daemonSocket && this.daemonSocket.readyState === WebSocket.OPEN) {
this.daemonSocket.send(JSON.stringify(data));
} else {
console.warn('⚠️ Daemon WebSocket nicht verbunden - kann Nachricht nicht senden');
}
}
scheduleReconnect() {
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
console.error('❌ Maximale Wiederverbindungsversuche erreicht');
return;
}
this.reconnectAttempts++;
const delay = Math.min(this.reconnectInterval * this.reconnectAttempts, 30000);
console.log(`🔄 Wiederverbindung in ${delay}ms (Versuch ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);
setTimeout(() => {
this.connect();
}, delay);
}
disconnect() {
if (this.daemonSocket) {
this.daemonSocket.close();
this.daemonSocket = null;
this.isConnected = false;
}
}
getStatus() {
return {
connected: this.isConnected,
reconnectAttempts: this.reconnectAttempts,
readyState: this.daemonSocket ? this.daemonSocket.readyState : 'CLOSED'
};
}
}
// Singleton-Instanz
const daemonBridge = new DaemonWebSocketBridge();
export default daemonBridge;