File size: 2,766 Bytes
ef1ad9e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import { v4 as uuidv4 } from "uuid";
export const createWebSocket = (apiUrl) => {
  let socket;
  let messageStream = "";
  let isStreaming = false;
  let onMessageCallback = () => {};
  let currentUuid = uuidv4();
  let formattedMessage = new Set();

  const connect = () => {
    socket = new WebSocket(apiUrl);

    socket.onopen = () => {
      console.log("WebSocket connection opened.");
      isStreaming = true;
    };

    socket.onmessage = (event) => {
      const message = event.data;
      messageStream += message;
      if (messageStream.includes("%S%")) {
        messageStream = "";
        isStreaming = true;
      }
      if (messageStream.includes("%E%")) {
        if (!isStreaming) {
          currentUuid = uuidv4();
        }
      }

      if (messageStream.includes("%E%")) {
        isStreaming = false;
      }

      onMessageCallback(JSON.stringify("%S%" + messageStream));
    };

    socket.onclose = (event) => {
      if (event.wasClean) {
        console.log("WebSocket connection closed cleanly.");
      } else {
        console.log("WebSocket connection closed unexpectedly.");
      }
      isStreaming = false;
    };

    socket.onerror = (error) => {
      console.error("WebSocket error:", error);
      isStreaming = false;
    };
  };

  const sendMessage = (message) => {
    if (socket && socket.readyState === WebSocket.OPEN) {
      socket.send(message);
    } else {
      console.error("WebSocket is not open.");
    }
  };

  const onMessage = (callback) => {
    onMessageCallback = callback;
  };

  const formatStream = (rawMessage) => {
    let parsedData = JSON?.parse(rawMessage);
    if (
      parsedData.includes("%S%") &&
      !parsedData.endsWith("%S") &&
      !parsedData.endsWith("%E") &&
      !parsedData.endsWith("%") &&
      !parsedData.includes("%J%")
    ) {
      // Check if an object with the current UUID already exists in the set
      let existingObj = Array.from(formattedMessage).find(
        (obj) => obj.id === currentUuid
      );
      if (existingObj) {
        // Update the content of the existing object
        existingObj.content = parsedData.replace(/%S%|%J%\s*\{\s*\}|%E%/g, "");
      } else {
        // Add a new object to the set
        formattedMessage.add({
          id: currentUuid,
          content: parsedData.replace(/%S%|%J%\s*\{\s*\}|%E%/g, ""),
        });
      }
    }

    return Array.from(formattedMessage);
  };

  const refresh = () => {
    if (socket) {
      socket.close();
    }
    connect();
  };

  connect();

  return {
    sendMessage,
    onMessage,
    formatStream,
    isStreaming: () => isStreaming,
    refresh,
  };
};