summaryrefslogtreecommitdiff
path: root/extension/react-app/src/hooks/vscodeMessenger.ts
blob: e330db57630da7794acdb3377913c62128714233 (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
68
69
70
71
72
import { postVscMessage } from "../vscode";
// import { Messenger } from "../../../src/util/messenger";
import { Messenger } from "./messenger";

export class VscodeMessenger extends Messenger {
  serverUrl: string;

  constructor(serverUrl: string) {
    super();
    this.serverUrl = serverUrl;
    postVscMessage("websocketForwardingOpen", { url: this.serverUrl });
  }

  send(messageType: string, data: object) {
    postVscMessage("websocketForwardingMessage", {
      message: { messageType, data },
      url: this.serverUrl,
    });
  }

  onMessageType(messageType: string, callback: (data: object) => void): void {
    window.addEventListener("message", (event: any) => {
      if (event.data.type === "websocketForwardingMessage") {
        console.log("VS CODE SENT DATA: ", event.data);
        const data = JSON.parse(event.data.data);
        if (data.messageType === messageType) {
          callback(data.data);
        }
      }
    });
  }

  onMessage(callback: (messageType: string, data: any) => void): void {
    window.addEventListener("message", (event: any) => {
      if (event.data.type === "websocketForwardingMessage") {
        const data = JSON.parse(event.data.data);
        callback(data.messageType, data.data);
      }
    });
  }

  sendAndReceive(messageType: string, data: any): Promise<any> {
    return new Promise((resolve) => {
      const handler = (event: any) => {
        if (event.data.type === "websocketForwardingMessage") {
          const data = JSON.parse(event.data.data);
          if (data.messageType === messageType) {
            window.removeEventListener("message", handler);
            resolve(data.data);
          }
        }
      };
      window.addEventListener("message", handler);
      this.send(messageType, data);
    });
  }

  onOpen(callback: () => void): void {
    window.addEventListener("message", (event: any) => {
      if (event.data.type === "websocketForwardingOpen") {
        callback();
      }
    });
  }
  onClose(callback: () => void): void {
    window.addEventListener("message", (event: any) => {
      if (event.data.type === "websocketForwardingClose") {
        callback();
      }
    });
  }
}