Skip to content

Commit 1531b3e

Browse files
committed
main.ts: Support proxying WebSocket connections
This fixes VSCode's unexpected failed to connect error.
1 parent 71d47ed commit 1531b3e

File tree

1 file changed

+35
-1
lines changed

1 file changed

+35
-1
lines changed

main.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!/usr/bin/env -S deno run --import-map vendor/import_map.json --allow-net --allow-read=. --allow-write=refresh_tokens.json --allow-run=chroot/jail --check
22

3+
import { Deferred, deferred } from "https://deno.land/std@0.136.0/async/mod.ts";
34
import { Status, serve } from "https://deno.land/std@0.136.0/http/mod.ts";
45
import { BufReader } from "https://deno.land/std@0.136.0/io/mod.ts";
56
import { basename } from "https://deno.land/std@0.136.0/path/mod.ts";
@@ -91,7 +92,40 @@ function proxy(request: Request, port: number): Promise<Response> {
9192
const url = new URL(request.url);
9293
url.hostname = "localhost";
9394
url.port = String(port);
94-
return fetch(new Request(String(url), request), {redirect: "manual"});
95+
96+
if(request.headers.get("upgrade") != "websocket")
97+
return fetch(new Request(String(url), request), {redirect: "manual"});
98+
else
99+
url.protocol = "ws";
100+
101+
const serverSocket = new WebSocket(String(url));
102+
const {response, socket} = Deno.upgradeWebSocket(request);
103+
104+
const serverBootstrap = deferred();
105+
serverSocket.onopen = serverBootstrap.resolve;
106+
107+
const bootstrap = deferred();
108+
socket.onopen = bootstrap.resolve;
109+
110+
serverSocket.onmessage = async function(message) {
111+
await bootstrap;
112+
socket.send(message.data);
113+
};
114+
socket.onmessage = async function(message) {
115+
await serverBootstrap;
116+
serverSocket.send(message.data);
117+
};
118+
119+
serverSocket.onclose = function() {
120+
socket.onmessage = null;
121+
socket.close();
122+
};
123+
socket.onclose = function() {
124+
serverSocket.onmessage = null;
125+
serverSocket.close();
126+
};
127+
128+
return Promise.resolve(response);
95129
}
96130

97131
async function parsePortAndToken(stdout: Deno.Reader): Promise<{port: number, token: string}> {

0 commit comments

Comments
 (0)