MCPcopy Index your code
hub / github.com/nukeop/nuclear / useEventSource

Function useEventSource

packages/player/src/remoteControl/useEventSource.ts:10–63  ·  view source on GitHub ↗
(url: string)

Source from the content-addressed store, hash-verified

8const MAX_RETRIES = 3;
9
10export const useEventSource = (url: string) => {
11 const source = useRef<EventSource | null>(null);
12 const [status, setStatus] = useState<ConnectionStatus>('connecting');
13
14 useEffect(() => {
15 if (!url) {
16 setStatus('failed');
17 return;
18 }
19
20 let reconnectTimeout: ReturnType<typeof setTimeout>;
21 let cancelled = false;
22 let retries = 0;
23
24 const connect = () => {
25 const eventSource = new EventSource(url);
26 source.current = eventSource;
27
28 eventSource.addEventListener('open', () => {
29 retries = 0;
30 setStatus('connected');
31 });
32
33 eventSource.addEventListener('error', () => {
34 if (eventSource.readyState === EventSource.CLOSED && !cancelled) {
35 eventSource.close();
36 source.current = null;
37 retries++;
38
39 if (retries > MAX_RETRIES) {
40 setStatus('failed');
41 return;
42 }
43
44 setStatus('reconnecting');
45 reconnectTimeout = setTimeout(connect, RECONNECT_DELAY_MS);
46 } else if (eventSource.readyState === EventSource.CONNECTING) {
47 setStatus('reconnecting');
48 }
49 });
50 };
51
52 connect();
53
54 return () => {
55 cancelled = true;
56 clearTimeout(reconnectTimeout);
57 source.current?.close();
58 source.current = null;
59 };
60 }, [url]);
61
62 return [source.current, status] as const;
63};
64
65export const useEventSourceListener = (
66 source: EventSource | null,

Callers 1

useRemoteStateFunction · 0.90

Calls 2

connectFunction · 0.70
closeMethod · 0.45

Tested by

no test coverage detected