fix: client bug fixes from review

- FileBrowser: reload hidden files when profile changes
- WebSocket: wrap JSON.parse in try-catch
- WebSocket: exponential backoff on reconnect (2s -> 30s max)
- WebSocket: clean up connection on destroy

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-16 20:09:21 +02:00
parent 39f873bec2
commit 9776b83ac5
3 changed files with 34 additions and 15 deletions
+24 -14
View File
@@ -2,30 +2,40 @@ import { getServer } from "./api";
import { exportStatus, exportCompleted } from "./stores";
let socket: WebSocket | null = null;
let reconnectDelay = 2000;
export function connectExportWs() {
const wsUrl = getServer().replace(/^http/, "ws") + "/ws/export";
socket = new WebSocket(wsUrl);
socket.onopen = () => {
reconnectDelay = 2000; // reset backoff on successful connect
};
socket.onmessage = (event) => {
const msg = JSON.parse(event.data);
switch (msg.type) {
case "clip_done":
exportCompleted.update(n => n + 1);
break;
case "all_done":
exportStatus.set("done");
break;
case "error":
exportStatus.set("error");
console.error("Export error:", msg.msg);
break;
try {
const msg = JSON.parse(event.data);
switch (msg.type) {
case "clip_done":
exportCompleted.update(n => n + 1);
break;
case "all_done":
exportStatus.set("done");
break;
case "error":
exportStatus.set("error");
console.error("Export error:", msg.msg);
break;
}
} catch (e) {
console.error("Failed to parse WebSocket message:", e);
}
};
socket.onclose = () => {
// Reconnect after 2s
setTimeout(connectExportWs, 2000);
// Reconnect with exponential backoff, max 30s
setTimeout(connectExportWs, reconnectDelay);
reconnectDelay = Math.min(reconnectDelay * 2, 30000);
};
}