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;
|