htmgo/framework/assets/js/util/ws.ts

52 lines
1.5 KiB
TypeScript
Raw Normal View History

2024-09-17 17:13:22 +00:00
type WsOpts = {
url: string;
reconnectInterval?: number;
onOpen?: () => void;
onMessage: (message: string) => void;
onError?: (error: Event) => void;
onClose?: () => void;
}
export function createWebSocketClient(opts: WsOpts) {
let socket: WebSocket | null = null;
const connect = (tries: number) => {
if(tries > 50) {
console.error('failed to connect to websocket after 50 tries, please reload the page');
return;
}
2024-09-17 17:13:22 +00:00
socket = new WebSocket(opts.url);
// Handle connection open
socket.onopen = () => {
};
// Handle incoming messages
socket.onmessage = (event) => {
opts.onMessage(event.data)
};
// Handle connection errors
socket.onerror = (error) => {
2024-09-17 18:35:44 +00:00
try {
socket?.close()
} catch(ex) {
// noop
}
let interval = tries * (opts.reconnectInterval || 100);
setTimeout(() => connect(tries + 1), interval);
2024-09-17 17:13:22 +00:00
};
// Handle connection close and attempt reconnection
socket.onclose = () => {
2024-09-17 18:35:44 +00:00
let interval = tries * (opts.reconnectInterval || 100);
2024-09-17 17:13:22 +00:00
setTimeout(() => connect(tries + 1), interval);
};
};
connect(1);
const sendMessage = (message: string) => {
if (socket && socket.readyState === WebSocket.OPEN) {
socket.send(message);
} else {
setTimeout(() => sendMessage(message), 100);
}
};
return { sendMessage };
}