Verbesserung: Implementierung eines Protokoll-Fallbacks für die Daemon WebSocket-Verbindung

Änderungen:
- Der Verbindungsaufbau des Daemon WebSockets wurde angepasst, um zuerst mit einem spezifischen Subprotokoll zu versuchen und bei Misserfolg auf eine Verbindung ohne Subprotokoll zurückzugreifen.
- Zusätzliche Protokollausgaben wurden hinzugefügt, um den Verbindungsstatus und Fehlerdetails besser nachzuvollziehen.

Diese Anpassungen erhöhen die Robustheit der WebSocket-Verbindung und verbessern die Fehlerdiagnose.
This commit is contained in:
Torsten Schulz (local)
2025-09-08 22:15:45 +02:00
parent bb185f0111
commit 79b2f9d37d

View File

@@ -131,70 +131,105 @@ const store = createStore({
console.log('🔌 Initializing Daemon WebSocket connection to:', daemonUrl); console.log('🔌 Initializing Daemon WebSocket connection to:', daemonUrl);
const connectDaemonSocket = () => { const connectDaemonSocket = () => {
try { // Protokoll-Fallback: zuerst mit Subprotokoll, dann ohne
const daemonSocket = new WebSocket(daemonUrl, 'yourpart-protocol'); const protocols = ['yourpart-protocol', undefined];
console.log('🔌 Protocol: yourpart-protocol'); let attemptIndex = 0;
daemonSocket.onopen = () => {
console.log('✅ Daemon WebSocket connected successfully');
retryCount = 0; // Reset retry counter on successful connection
const payload = JSON.stringify({
user_id: state.user.id,
event: 'setUserId',
data: { userId: state.user.id }
});
daemonSocket.send(payload);
};
daemonSocket.onclose = (event) => { const tryConnectWithProtocol = () => {
console.warn('❌ Daemon WebSocket disconnected:', event.reason); const currentProtocol = protocols[attemptIndex];
console.warn('❌ Close details:', { try {
code: event.code, const daemonSocket = currentProtocol
reason: event.reason, ? new WebSocket(daemonUrl, currentProtocol)
wasClean: event.wasClean, : new WebSocket(daemonUrl);
readyState: daemonSocket.readyState console.log('🔌 Protocol:', currentProtocol ?? 'none (fallback)');
});
retryConnection(connectDaemonSocket);
};
daemonSocket.onerror = (error) => { let opened = false;
console.error('❌ Daemon WebSocket error:', error);
console.error('❌ Error details:', {
type: error.type,
target: error.target,
readyState: daemonSocket.readyState,
url: daemonSocket.url,
protocol: daemonSocket.protocol
});
console.error('❌ Browser info:', {
userAgent: navigator.userAgent,
location: window.location.href,
isSecure: window.location.protocol === 'https:'
});
retryConnection(connectDaemonSocket);
};
daemonSocket.addEventListener('message', (event) => { daemonSocket.onopen = () => {
const message = event.data; opened = true;
if (message === "ping") { console.log('✅ Daemon WebSocket connected successfully');
daemonSocket.send("pong"); retryCount = 0; // Reset retry counter on successful connection
} else { const payload = JSON.stringify({
try { user_id: state.user.id,
const data = JSON.parse(message); event: 'setUserId',
// Handle daemon messages here data: { userId: state.user.id }
console.log('📨 Daemon message received:', data); });
} catch (error) { daemonSocket.send(payload);
console.error("Error parsing daemon message:", error); };
daemonSocket.onclose = (event) => {
console.warn('❌ Daemon WebSocket disconnected:', event.reason);
console.warn('❌ Close details:', {
code: event.code,
reason: event.reason,
wasClean: event.wasClean,
readyState: daemonSocket.readyState
});
// Falls Verbindungsaufbau nicht offen war und es noch einen Fallback gibt → nächsten Versuch ohne Subprotokoll
if (!opened && attemptIndex < protocols.length - 1) {
attemptIndex += 1;
console.warn('🔄 Fallback: versuche erneut ohne Subprotokoll...');
tryConnectWithProtocol();
return;
} }
} retryConnection(connectDaemonSocket);
}); };
commit('setDaemonSocket', daemonSocket); daemonSocket.onerror = (error) => {
} catch (error) { console.error('❌ Daemon WebSocket error:', error);
console.error('❌ Failed to create Daemon WebSocket:', error); console.error('❌ Error details:', {
console.error('❌ URL attempted:', import.meta.env.VITE_DAEMON_SOCKET); type: error.type,
retryConnection(connectDaemonSocket); target: error.target,
} readyState: daemonSocket.readyState,
url: daemonSocket.url,
protocol: daemonSocket.protocol
});
console.error('❌ Browser info:', {
userAgent: navigator.userAgent,
location: window.location.href,
isSecure: window.location.protocol === 'https:'
});
// Bei Fehler vor Open: Fallback versuchen
if (!opened && attemptIndex < protocols.length - 1) {
attemptIndex += 1;
console.warn('🔄 Fallback: versuche erneut ohne Subprotokoll (onerror)...');
tryConnectWithProtocol();
return;
}
retryConnection(connectDaemonSocket);
};
daemonSocket.addEventListener('message', (event) => {
const message = event.data;
if (message === "ping") {
daemonSocket.send("pong");
} else {
try {
const data = JSON.parse(message);
// Handle daemon messages here
console.log('📨 Daemon message received:', data);
} catch (error) {
console.error("Error parsing daemon message:", error);
}
}
});
commit('setDaemonSocket', daemonSocket);
} catch (error) {
console.error('❌ Failed to create Daemon WebSocket:', error);
console.error('❌ URL attempted:', import.meta.env.VITE_DAEMON_SOCKET);
// Beim Konstruktionsfehler ebenfalls Fallback versuchen
if (attemptIndex < protocols.length - 1) {
attemptIndex += 1;
console.warn('🔄 Fallback: Konstruktion ohne Subprotokoll...');
tryConnectWithProtocol();
return;
}
retryConnection(connectDaemonSocket);
}
};
tryConnectWithProtocol();
}; };
let retryCount = 0; let retryCount = 0;