Files
clash-proxy/src/hooks/use-websocket.ts

59 lines
1.4 KiB
TypeScript
Raw Normal View History

import { useRef } from "react";
2024-01-14 17:30:18 +08:00
import WebSocket from "tauri-plugin-websocket-api";
export type WsMsgFn = (event: string) => void;
export interface WsOptions {
errorCount?: number; // default is 5
2024-01-14 17:30:18 +08:00
onError?: (e: any) => void;
}
export const useWebsocket = (onMessage: WsMsgFn, options?: WsOptions) => {
const wsRef = useRef<WebSocket | null>(null);
const timerRef = useRef<any>(null);
2024-01-14 17:30:18 +08:00
const disconnect = async () => {
if (wsRef.current) {
2024-01-14 17:30:18 +08:00
await wsRef.current.disconnect();
wsRef.current = null;
}
if (timerRef.current) {
clearTimeout(timerRef.current);
}
};
2024-01-14 17:30:18 +08:00
const connect = async (url: string) => {
let errorCount = options?.errorCount ?? 5;
if (!url) return;
2024-01-14 17:30:18 +08:00
const connectHelper = async () => {
await disconnect();
const ws = await WebSocket.connect(url);
ws.addListener((event) => {
switch (event.type) {
case "Text": {
onMessage(event.data);
break;
}
default: {
break;
}
}
});
2024-01-14 17:30:18 +08:00
wsRef.current = ws;
};
2024-01-14 17:30:18 +08:00
try {
await connectHelper();
} catch (e) {
errorCount -= 1;
if (errorCount >= 0) {
timerRef.current = setTimeout(connectHelper, 2500);
} else {
await disconnect();
options?.onError?.(e);
}
}
};
return { connect, disconnect };
};