summaryrefslogtreecommitdiff
path: root/extension/react-app/src/hooks/useWebsocket.ts
blob: 147172bdd7f271a11c880d58a53a77f62f1db9b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import React, { useEffect, useState } from "react";
import { RootStore } from "../redux/store";
import { useSelector } from "react-redux";

function useContinueWebsocket(
  serverUrl: string,
  onMessage: (message: { data: any }) => void
) {
  const sessionId = useSelector((state: RootStore) => state.config.sessionId);
  const [websocket, setWebsocket] = useState<WebSocket | undefined>(undefined);

  async function connect() {
    while (!sessionId) {
      await new Promise((resolve) => setTimeout(resolve, 300));
    }

    console.log("Creating websocket", sessionId);

    const wsUrl =
      serverUrl.replace("http", "ws") +
      "/notebook/ws?session_id=" +
      encodeURIComponent(sessionId);

    const ws = new WebSocket(wsUrl);
    setWebsocket(ws);

    // Set up callbacks
    ws.onopen = () => {
      console.log("Websocket opened");
      ws.send(JSON.stringify({ sessionId }));
    };

    ws.onmessage = (msg) => {
      onMessage(msg);
      console.log("Got message", msg);
    };

    ws.onclose = (msg) => {
      console.log("Websocket closed");
      setWebsocket(undefined);
    };

    return ws;
  }

  async function getConnection() {
    if (!websocket) {
      return await connect();
    }
    return websocket;
  }

  async function send(message: object) {
    let ws = await getConnection();
    ws.send(JSON.stringify(message));
  }

  useEffect(() => {
    if (!sessionId) {
      return;
    }
    connect();
  }, [sessionId]);

  return { send };
}
export default useContinueWebsocket;