import "../_dnt.polyfills.js"; import * as dntShim from "../_dnt.shims.js"; import { upgradeWebSocket } from "../deps/shims/upgradeWebSocket.node.js" import { deferred } from "../deps/std/async.js" export async function proxyWebSocket(request: Request, url: string) { const server = new dntShim.WebSocket(url) const upgrade = upgradeWebSocket(request) const client = await upgrade.socket setup(client, server) setup(server, client) return upgrade.response function setup(a: dntShim.WebSocket, b: dntShim.WebSocket) { const ready = deferred() b.addEventListener("open", () => { ready.resolve() }) a.addEventListener("close", async (e) => { try { b.close(e.code, e.reason) } catch {} }) a.addEventListener("message", async (event) => { try { await ready b.send(event.data) } catch { a.close() b.close() } }) } }