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 = () => { const tryConnectWithProtocol = () => {
console.log('✅ Daemon WebSocket connected successfully'); const currentProtocol = protocols[attemptIndex];
retryCount = 0; // Reset retry counter on successful connection try {
const payload = JSON.stringify({ const daemonSocket = currentProtocol
user_id: state.user.id, ? new WebSocket(daemonUrl, currentProtocol)
event: 'setUserId', : new WebSocket(daemonUrl);
data: { userId: state.user.id } console.log('🔌 Protocol:', currentProtocol ?? 'none (fallback)');
});
daemonSocket.send(payload);
};
daemonSocket.onclose = (event) => { let opened = false;
console.warn('❌ Daemon WebSocket disconnected:', event.reason);
console.warn('❌ Close details:', {
code: event.code,
reason: event.reason,
wasClean: event.wasClean,
readyState: daemonSocket.readyState
});
retryConnection(connectDaemonSocket);
};
daemonSocket.onerror = (error) => { daemonSocket.onopen = () => {
console.error('❌ Daemon WebSocket error:', error); opened = true;
console.error('❌ Error details:', { console.log('✅ Daemon WebSocket connected successfully');
type: error.type, retryCount = 0; // Reset retry counter on successful connection
target: error.target, const payload = JSON.stringify({
readyState: daemonSocket.readyState, user_id: state.user.id,
url: daemonSocket.url, event: 'setUserId',
protocol: daemonSocket.protocol data: { userId: state.user.id }
}); });
console.error('❌ Browser info:', { daemonSocket.send(payload);
userAgent: navigator.userAgent, };
location: window.location.href,
isSecure: window.location.protocol === 'https:'
});
retryConnection(connectDaemonSocket);
};
daemonSocket.addEventListener('message', (event) => { daemonSocket.onclose = (event) => {
const message = event.data; console.warn('❌ Daemon WebSocket disconnected:', event.reason);
if (message === "ping") { console.warn('❌ Close details:', {
daemonSocket.send("pong"); code: event.code,
} else { reason: event.reason,
try { wasClean: event.wasClean,
const data = JSON.parse(message); readyState: daemonSocket.readyState
// Handle daemon messages here });
console.log('📨 Daemon message received:', data); // Falls Verbindungsaufbau nicht offen war und es noch einen Fallback gibt → nächsten Versuch ohne Subprotokoll
} catch (error) { if (!opened && attemptIndex < protocols.length - 1) {
console.error("Error parsing daemon message:", error); 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;