diff options
author | Nate Sesti <sestinj@gmail.com> | 2023-05-28 19:16:10 -0400 |
---|---|---|
committer | Nate Sesti <sestinj@gmail.com> | 2023-05-28 19:16:10 -0400 |
commit | e02da4c8fada20b7e6bdd80d257a868bbd6b0d0f (patch) | |
tree | d02e8506519346f9b769c182d8a05d965522e06e /extension/src/debugPanel.ts | |
parent | 64643e87e9af8b98945614119179e45fc95281e4 (diff) | |
download | sncontinue-e02da4c8fada20b7e6bdd80d257a868bbd6b0d0f.tar.gz sncontinue-e02da4c8fada20b7e6bdd80d257a868bbd6b0d0f.tar.bz2 sncontinue-e02da4c8fada20b7e6bdd80d257a868bbd6b0d0f.zip |
websockets through vscode messaging for codespaces
Diffstat (limited to 'extension/src/debugPanel.ts')
-rw-r--r-- | extension/src/debugPanel.ts | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/extension/src/debugPanel.ts b/extension/src/debugPanel.ts index 66829836..4192595c 100644 --- a/extension/src/debugPanel.ts +++ b/extension/src/debugPanel.ts @@ -16,6 +16,7 @@ import { import { sendTelemetryEvent, TelemetryEvent } from "./telemetry"; import { RangeInFile, SerializedDebugContext } from "./client"; import { addFileSystemToDebugContext } from "./util/util"; +const WebSocket = require("ws"); class StreamManager { private _fullText: string = ""; @@ -87,6 +88,46 @@ class StreamManager { } } +let websocketConnections: { [url: string]: WebsocketConnection | undefined } = + {}; + +class WebsocketConnection { + private _ws: WebSocket; + private _onMessage: (message: string) => void; + private _onOpen: () => void; + private _onClose: () => void; + + constructor( + url: string, + onMessage: (message: string) => void, + onOpen: () => void, + onClose: () => void + ) { + this._ws = new WebSocket(url); + this._onMessage = onMessage; + this._onOpen = onOpen; + this._onClose = onClose; + + this._ws.onmessage = (event) => { + this._onMessage(event.data); + }; + this._ws.onclose = () => { + this._onClose(); + }; + this._ws.onopen = () => { + this._onOpen(); + }; + } + + public send(message: string) { + this._ws.send(message); + } + + public close() { + this._ws.close(); + } +} + let streamManager = new StreamManager(); export let debugPanelWebview: vscode.Webview | undefined; @@ -147,6 +188,39 @@ export function setupDebugPanel( }); }); + async function connectWebsocket(url: string) { + return new Promise((resolve, reject) => { + const onMessage = (message: any) => { + panel.webview.postMessage({ + type: "websocketForwardingMessage", + url, + data: message, + }); + }; + const onOpen = () => { + panel.webview.postMessage({ + type: "websocketForwardingOpen", + url, + }); + resolve(null); + }; + const onClose = () => { + websocketConnections[url] = undefined; + panel.webview.postMessage({ + type: "websocketForwardingClose", + url, + }); + }; + const connection = new WebsocketConnection( + url, + onMessage, + onOpen, + onClose + ); + websocketConnections[url] = connection; + }); + } + panel.webview.onDidReceiveMessage(async (data) => { switch (data.type) { case "onLoad": { @@ -158,6 +232,27 @@ export function setupDebugPanel( }); break; } + + case "websocketForwardingOpen": { + let url = data.url; + if (typeof websocketConnections[url] === "undefined") { + await connectWebsocket(url); + } + break; + } + case "websocketForwardingMessage": { + let url = data.url; + let connection = websocketConnections[url]; + if (typeof connection === "undefined") { + await connectWebsocket(url); + } + connection = websocketConnections[url]; + if (typeof connection === "undefined") { + throw new Error("Failed to connect websocket in VS Code Extension"); + } + connection.send(data.message); + break; + } case "listTenThings": { sendTelemetryEvent(TelemetryEvent.GenerateIdeas); let resp = await debugApi.listtenDebugListPost({ |