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:
+24
-14
@@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user