Implemented a real-time console log streaming via WebSocket for debugging purposes. Users can enable console output in settings to view application logs directly in the web interface.

This commit is contained in:
2026-01-14 21:47:17 +01:00
parent e997059e2a
commit 44da16977c
16 changed files with 501 additions and 15 deletions

View File

@@ -15,6 +15,7 @@ class WebSocketManager {
this.lastBanEventId = null;
this.statusCallbacks = [];
this.banEventCallbacks = [];
this.consoleLogCallbacks = [];
// Connection metrics for tooltip
this.connectedAt = null;
@@ -58,11 +59,20 @@ class WebSocketManager {
this.ws.onmessage = (event) => {
try {
const message = JSON.parse(event.data);
this.messageCount++;
this.handleMessage(message);
// WebSocket may send multiple JSON messages separated by newlines
// Split by newlines and parse each message separately
const messages = event.data.split('\n').filter(line => line.trim().length > 0);
for (const messageText of messages) {
try {
const message = JSON.parse(messageText);
this.messageCount++;
this.handleMessage(message);
} catch (parseErr) {
console.error('Error parsing individual WebSocket message:', parseErr, 'Raw:', messageText);
}
}
} catch (err) {
console.error('Error parsing WebSocket message:', err);
console.error('Error processing WebSocket message:', err);
}
};
@@ -112,11 +122,27 @@ class WebSocketManager {
case 'heartbeat':
this.handleHeartbeat(message);
break;
case 'console_log':
this.handleConsoleLog(message);
break;
default:
console.log('Unknown message type:', message.type);
}
}
handleConsoleLog(message) {
// Notify all registered console log callbacks
if (this.consoleLogCallbacks) {
this.consoleLogCallbacks.forEach(callback => {
try {
callback(message.message, message.time);
} catch (err) {
console.error('Error in console log callback:', err);
}
});
}
}
handleBanEvent(eventData) {
// Check if we've already processed this event (prevent duplicates)
// Only check if event has an ID and we have a lastBanEventId
@@ -170,6 +196,13 @@ class WebSocketManager {
this.banEventCallbacks.push(callback);
}
onConsoleLog(callback) {
if (!this.consoleLogCallbacks) {
this.consoleLogCallbacks = [];
}
this.consoleLogCallbacks.push(callback);
}
disconnect() {
if (this.ws) {
this.ws.close();