48 lines
1.1 KiB
TypeScript
48 lines
1.1 KiB
TypeScript
import ReconnectingWebSocket from "reconnecting-websocket";
|
|
import { StreamUpdate } from "./types";
|
|
|
|
const WS_BASE_URL = process.env.NEXT_PUBLIC_WS_URL || "ws://localhost:8000";
|
|
|
|
export function createWebSocket(
|
|
analysisId: string,
|
|
onMessage: (update: StreamUpdate) => void,
|
|
onError?: (error: Event) => void,
|
|
onOpen?: () => void,
|
|
onClose?: () => void
|
|
): ReconnectingWebSocket {
|
|
const ws = new ReconnectingWebSocket(
|
|
`${WS_BASE_URL}/api/analysis/${analysisId}/stream`,
|
|
[],
|
|
{
|
|
connectionTimeout: 4000,
|
|
maxRetries: 10,
|
|
maxReconnectionDelay: 10000,
|
|
minReconnectionDelay: 1000,
|
|
}
|
|
);
|
|
|
|
ws.addEventListener("message", (event) => {
|
|
try {
|
|
const update: StreamUpdate = JSON.parse(event.data);
|
|
onMessage(update);
|
|
} catch (error) {
|
|
console.error("Failed to parse WebSocket message:", error);
|
|
}
|
|
});
|
|
|
|
if (onError) {
|
|
ws.addEventListener("error", onError);
|
|
}
|
|
|
|
if (onOpen) {
|
|
ws.addEventListener("open", onOpen);
|
|
}
|
|
|
|
if (onClose) {
|
|
ws.addEventListener("close", onClose);
|
|
}
|
|
|
|
return ws;
|
|
}
|
|
|