use-websocket.ts 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { useRef } from "react";
  2. export type WsMsgFn = (event: MessageEvent<any>) => void;
  3. export interface WsOptions {
  4. errorCount?: number; // default is 5
  5. retryInterval?: number; // default is 2500
  6. }
  7. export const useWebsocket = (onMessage: WsMsgFn, options?: WsOptions) => {
  8. const wsRef = useRef<WebSocket | null>(null);
  9. const timerRef = useRef<any>(null);
  10. const disconnect = () => {
  11. if (wsRef.current) {
  12. wsRef.current.close();
  13. wsRef.current = null;
  14. }
  15. if (timerRef.current) {
  16. clearTimeout(timerRef.current);
  17. }
  18. };
  19. const connect = (url: string) => {
  20. let errorCount = options?.errorCount ?? 5;
  21. if (!url) return;
  22. const connectHelper = () => {
  23. disconnect();
  24. const ws = new WebSocket(url);
  25. wsRef.current = ws;
  26. ws.addEventListener("message", onMessage);
  27. ws.addEventListener("error", () => {
  28. errorCount -= 1;
  29. if (errorCount >= 0) {
  30. timerRef.current = setTimeout(connectHelper, 2500);
  31. }
  32. });
  33. };
  34. connectHelper();
  35. };
  36. return { connect, disconnect };
  37. };