Refactor: Entfernen des Daemon WebSocket und Umstellung auf Socket.io für Event-Verarbeitung
Änderungen: - Der Daemon WebSocket wurde aus der Anwendung entfernt, um die Komplexität zu reduzieren und die Stabilität zu erhöhen. - Die Event-Verarbeitung in StatusBar.vue und BranchView.vue wurde aktualisiert, um Socket.io für die Registrierung und Verarbeitung von Live-Events zu verwenden. - Protokollausgaben wurden hinzugefügt, um den Empfang und die Verarbeitung von Events zu dokumentieren. Diese Anpassungen verbessern die Nachvollziehbarkeit der Event-Verarbeitung und vereinfachen die Codebasis.
This commit is contained in:
@@ -56,14 +56,25 @@ export default {
|
||||
},
|
||||
async mounted() {
|
||||
await this.fetchStatus();
|
||||
this.setupSocketEvents();
|
||||
|
||||
// Live-Socket-Events
|
||||
["falukantUpdateStatus", "stock_change", "familychanged"].forEach(eventName => {
|
||||
if (this.daemonSocket) {
|
||||
this.daemonSocket.addEventListener('message', (event) => {
|
||||
try {
|
||||
const data = JSON.parse(event.data);
|
||||
if (data.event === eventName) {
|
||||
this.handleEvent(data);
|
||||
}
|
||||
} catch (error) {
|
||||
// Ignore non-JSON messages like ping/pong
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
beforeUnmount() {
|
||||
if (this.socket) {
|
||||
this.socket.off("falukantUpdateStatus");
|
||||
this.socket.off("stock_change");
|
||||
this.socket.off("familychanged");
|
||||
}
|
||||
// Daemon WebSocket wird automatisch beim Logout geschlossen
|
||||
},
|
||||
methods: {
|
||||
async fetchStatus() {
|
||||
@@ -106,27 +117,6 @@ export default {
|
||||
console.error("Error fetching status:", error);
|
||||
}
|
||||
},
|
||||
// Daemon WebSocket deaktiviert - verwende Socket.io Events
|
||||
setupSocketEvents() {
|
||||
if (this.socket) {
|
||||
this.socket.on('falukantUpdateStatus', (data) => {
|
||||
console.log('📨 StatusBar: falukantUpdateStatus empfangen:', data);
|
||||
this.handleEvent({ event: 'falukantUpdateStatus', ...data });
|
||||
});
|
||||
this.socket.on('stock_change', (data) => {
|
||||
console.log('📨 StatusBar: stock_change empfangen:', data);
|
||||
this.handleEvent({ event: 'stock_change', ...data });
|
||||
});
|
||||
this.socket.on('familychanged', (data) => {
|
||||
console.log('📨 StatusBar: familychanged empfangen:', data);
|
||||
this.handleEvent({ event: 'familychanged', ...data });
|
||||
});
|
||||
console.log('✅ StatusBar: Socket.io Events registriert');
|
||||
} else {
|
||||
console.log('⚠️ StatusBar: Socket.io noch nicht verfügbar');
|
||||
setTimeout(() => this.setupSocketEvents(), 1000);
|
||||
}
|
||||
},
|
||||
handleEvent(eventData) {
|
||||
console.log('🔄 StatusBar: handleEvent aufgerufen mit:', eventData);
|
||||
console.log('🔄 StatusBar: Event-Typ:', eventData.event);
|
||||
|
||||
@@ -122,102 +122,91 @@ const store = createStore({
|
||||
}
|
||||
},
|
||||
initializeDaemonSocket({ commit, state }) {
|
||||
// Daemon WebSocket temporär deaktiviert aufgrund von CORS/Protokoll-Problemen
|
||||
// Socket.io wird für alle Events verwendet
|
||||
console.log('🔌 Daemon WebSocket deaktiviert - verwende Socket.io für alle Events');
|
||||
return;
|
||||
|
||||
if (state.isLoggedIn && state.user) {
|
||||
let currentDaemonSocket = state.daemonSocket;
|
||||
const connectDaemonSocket = () => {
|
||||
if (currentDaemonSocket) {
|
||||
currentDaemonSocket.disconnect();
|
||||
}
|
||||
const daemonUrl = import.meta.env.VITE_DAEMON_SOCKET || 'wss://www.your-part.de:4551';
|
||||
console.log('🔌 Initializing Daemon WebSocket connection to:', daemonUrl);
|
||||
console.log('🔌 Protocol:', 'yourpart-protocol');
|
||||
try {
|
||||
// Versuche zuerst ohne Protokoll, da der Server es möglicherweise nicht unterstützt
|
||||
let daemonSocket;
|
||||
try {
|
||||
console.log('🔌 Trying WebSocket connection without protocol...');
|
||||
daemonSocket = new WebSocket(daemonUrl);
|
||||
} catch (error) {
|
||||
console.error('❌ Failed to create WebSocket:', error);
|
||||
throw error;
|
||||
}
|
||||
|
||||
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) => {
|
||||
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) => {
|
||||
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
|
||||
});
|
||||
retryConnection(connectDaemonSocket);
|
||||
};
|
||||
|
||||
daemonSocket.addEventListener('message', (event) => {
|
||||
const message = event.data;
|
||||
if (message === "ping") {
|
||||
daemonSocket.send("pong");
|
||||
} else {
|
||||
try {
|
||||
const data = JSON.parse(message);
|
||||
} catch (error) {
|
||||
console.error("Error parsing 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);
|
||||
retryConnection(connectDaemonSocket);
|
||||
}
|
||||
};
|
||||
|
||||
let retryCount = 0;
|
||||
const maxRetries = 5;
|
||||
const retryConnection = (reconnectFn) => {
|
||||
if (retryCount >= maxRetries) {
|
||||
console.error('❌ Max retry attempts reached for Daemon WebSocket');
|
||||
return;
|
||||
}
|
||||
retryCount++;
|
||||
const delay = Math.min(1000 * Math.pow(2, retryCount - 1), 10000); // Exponential backoff, max 10s
|
||||
console.log(`🔄 Retrying Daemon WebSocket connection in ${delay}ms (attempt ${retryCount}/${maxRetries})`);
|
||||
setTimeout(() => {
|
||||
reconnectFn();
|
||||
}, delay);
|
||||
};
|
||||
connectDaemonSocket();
|
||||
if (!state.isLoggedIn || !state.user) {
|
||||
console.log("User is not logged in or user data is not available for Daemon WebSocket.");
|
||||
return;
|
||||
}
|
||||
|
||||
const daemonUrl = import.meta.env.VITE_DAEMON_SOCKET || 'wss://www.your-part.de:4551';
|
||||
console.log('🔌 Initializing Daemon WebSocket connection to:', daemonUrl);
|
||||
|
||||
const connectDaemonSocket = () => {
|
||||
try {
|
||||
const daemonSocket = new WebSocket(daemonUrl, 'yourpart-protocol');
|
||||
console.log('🔌 Protocol: yourpart-protocol');
|
||||
|
||||
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) => {
|
||||
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) => {
|
||||
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
|
||||
});
|
||||
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);
|
||||
retryConnection(connectDaemonSocket);
|
||||
}
|
||||
};
|
||||
|
||||
let retryCount = 0;
|
||||
const maxRetries = 5;
|
||||
const retryConnection = (reconnectFn) => {
|
||||
if (retryCount >= maxRetries) {
|
||||
console.error('❌ Max retry attempts reached for Daemon WebSocket');
|
||||
return;
|
||||
}
|
||||
retryCount++;
|
||||
const delay = Math.min(1000 * Math.pow(2, retryCount - 1), 10000); // Exponential backoff, max 10s
|
||||
console.log(`🔄 Retrying Daemon WebSocket connection in ${delay}ms (attempt ${retryCount}/${maxRetries})`);
|
||||
setTimeout(() => {
|
||||
reconnectFn();
|
||||
}, delay);
|
||||
};
|
||||
connectDaemonSocket();
|
||||
},
|
||||
setLanguage({ commit }, language) {
|
||||
commit('setLanguage', language);
|
||||
|
||||
@@ -55,7 +55,7 @@ export default {
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapState(['socket', 'daemonSocket']),
|
||||
...mapState(['daemonSocket']),
|
||||
},
|
||||
|
||||
async mounted() {
|
||||
@@ -72,58 +72,32 @@ export default {
|
||||
this.selectMainBranch();
|
||||
}
|
||||
|
||||
// Daemon WebSocket deaktiviert - verwende Socket.io
|
||||
this.setupSocketEvents();
|
||||
|
||||
// Live-Socket-Events - nur für Events ohne spezielle Behandlung
|
||||
// Live-Socket-Events
|
||||
[
|
||||
"production_ready",
|
||||
"stock_change",
|
||||
"price_update",
|
||||
"director_death",
|
||||
"production_started",
|
||||
"selled_items",
|
||||
"knowledge_update"
|
||||
"production_ready", "stock_change", "price_update",
|
||||
"director_death", "production_started", "selled_items",
|
||||
"knowledge_update", "falukantUpdateStatus", "falukantBranchUpdate"
|
||||
].forEach(eventName => {
|
||||
if (this.socket) {
|
||||
this.socket.on(eventName, data => this.handleEvent({ event: eventName, ...data }));
|
||||
if (this.daemonSocket) {
|
||||
this.daemonSocket.addEventListener('message', (event) => {
|
||||
try {
|
||||
const data = JSON.parse(event.data);
|
||||
if (data.event === eventName) {
|
||||
this.handleEvent(data);
|
||||
}
|
||||
} catch (error) {
|
||||
// Ignore non-JSON messages like ping/pong
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
beforeUnmount() {
|
||||
if (this.socket) {
|
||||
// Entferne spezielle Event-Listener
|
||||
this.socket.off("falukantBranchUpdate");
|
||||
this.socket.off("falukantUpdateStatus");
|
||||
// Entferne allgemeine Event-Listener
|
||||
this.socket.off("production_ready");
|
||||
this.socket.off("stock_change");
|
||||
this.socket.off("price_update");
|
||||
this.socket.off("director_death");
|
||||
this.socket.off("production_started");
|
||||
this.socket.off("selled_items");
|
||||
this.socket.off("knowledge_update");
|
||||
}
|
||||
// Daemon WebSocket wird automatisch beim Logout geschlossen
|
||||
},
|
||||
|
||||
methods: {
|
||||
setupSocketEvents() {
|
||||
if (this.socket) {
|
||||
this.socket.on('falukantBranchUpdate', (data) => {
|
||||
console.log('📨 BranchView: falukantBranchUpdate empfangen:', data);
|
||||
this.handleEvent({ event: 'falukantBranchUpdate', ...data });
|
||||
});
|
||||
this.socket.on('falukantUpdateStatus', (data) => {
|
||||
console.log('📨 BranchView: falukantUpdateStatus empfangen:', data);
|
||||
this.handleEvent({ event: 'falukantUpdateStatus', ...data });
|
||||
});
|
||||
console.log('✅ BranchView: Socket.io Events registriert');
|
||||
} else {
|
||||
console.log('⚠️ BranchView: Socket.io noch nicht verfügbar');
|
||||
setTimeout(() => this.setupSocketEvents(), 1000);
|
||||
}
|
||||
},
|
||||
async loadBranches() {
|
||||
try {
|
||||
const result = await apiClient.get('/api/falukant/branches');
|
||||
|
||||
Reference in New Issue
Block a user