From 5797ff9ebce139abe9b21e59434200fbe7ef7023 Mon Sep 17 00:00:00 2001 From: Chris Wanstrath <2+defunkt@users.noreply.github.com> Date: Tue, 23 Sep 2025 17:55:31 -0700 Subject: [PATCH] sneaker wip --- app/src/server.tsx | 1 + app/src/sneaker.ts | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 app/src/sneaker.ts diff --git a/app/src/server.tsx b/app/src/server.tsx index 2127da8..23c2db8 100644 --- a/app/src/server.tsx +++ b/app/src/server.tsx @@ -13,6 +13,7 @@ import { send, addWebsocket, removeWebsocket, closeWebsockets } from "./websocke import { Layout } from "./components/layout" import { Terminal } from "./components/terminal" import { dispatchMessage } from "./dispatch" +import "./sneaker" // // Hono setup diff --git a/app/src/sneaker.ts b/app/src/sneaker.ts new file mode 100644 index 0000000..9f6b1be --- /dev/null +++ b/app/src/sneaker.ts @@ -0,0 +1,38 @@ +import app from "./server" + +const SNEAKER_URL = "localhost:3100" + +const ws = new WebSocket(`ws://${SNEAKER_URL}/tunnel`) + +ws.onerror = e => console.log("sneaker error", e) + +ws.onmessage = async event => { + const msg = JSON.parse(event.data.toString()) + try { + const req = new Request("http://localhost" + msg.path, { + method: msg.method, + headers: msg.headers, + body: msg.body || undefined, + }) + + const res = await app.fetch(req) + + const body = await res.text() + const headers: Record = {} + res.headers.forEach((v, k) => (headers[k] = v)) + + ws.send(JSON.stringify({ + id: msg.id, + status: res.status, + headers, + body, + })) + } catch (err: any) { + ws.send(JSON.stringify({ + id: msg.id, + status: 500, + headers: { "content-type": "text/plain" }, + body: "error: " + err.message, + })) + } +}