|
1 | 1 | #!/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
|
2 | 2 |
|
| 3 | +import { Deferred, deferred } from "https://deno.land/std@0.136.0/async/mod.ts"; |
3 | 4 | import { Status, serve } from "https://deno.land/std@0.136.0/http/mod.ts";
|
4 | 5 | import { BufReader } from "https://deno.land/std@0.136.0/io/mod.ts";
|
5 | 6 | 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> {
|
91 | 92 | const url = new URL(request.url);
|
92 | 93 | url.hostname = "localhost";
|
93 | 94 | 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); |
95 | 129 | }
|
96 | 130 |
|
97 | 131 | async function parsePortAndToken(stdout: Deno.Reader): Promise<{port: number, token: string}> {
|
|
0 commit comments