(request)
| 304 | } |
| 305 | |
| 306 | async function handleLivePreview(runId, request, suffix) { |
| 307 | const target = livePreviewTarget(runId, request, suffix, "http"); |
| 308 | const headers = new Headers(request.headers); |
| 309 | headers.set("host", target.host); |
| 310 | return fetch(target, new Request(target, { |
| 311 | method: request.method, |
| 312 | headers, |
| 313 | body: request.body, |
| 314 | redirect: "manual", |
| 315 | duplex: request.body ? "half" : undefined, |
| 316 | })); |
| 317 | } |
| 318 | |
| 319 | function upgradeLivePreview(server, request, runId, suffix) { |
| 320 | const target = livePreviewTarget(runId, request, suffix, "ws"); |
| 321 | return server.upgrade(request, { data: { target: target.toString(), upstream: null } }); |
| 322 | } |
| 323 | |
| 324 | let bunServer = null; |
| 325 | |
| 326 | if (typeof Bun !== "undefined") { |
| 327 | bunServer = Bun.serve({ |
| 328 | port: PORT, |
| 329 | async fetch(request) { |
| 330 | const url = new URL(request.url); |
| 331 | if (url.pathname === "/health") return json({ ok: true }); |
| 332 | if (url.pathname === "/run" && request.method === "POST") { |
| 333 | try { return json(await handleRun(await request.json())); } |
| 334 | catch (error) { return json({ ok: false, error: String(error?.message || error) }, 400); } |
| 335 | } |
| 336 | const previewMatch = url.pathname.match(/^\/live\/(run_[A-Za-z0-9-]+)\/preview\/?(.*)$/); |
| 337 | if (previewMatch) { |
| 338 | const [, runId, suffix] = previewMatch; |
| 339 | try { |
| 340 | if (request.headers.get("upgrade")?.toLowerCase() === "websocket") { |
| 341 | if (upgradeLivePreview(bunServer, request, runId, suffix)) return; |
| 342 | return json({ ok: false, error: "preview_websocket_upgrade_failed" }, 502); |
| 343 | } |
| 344 | return await handleLivePreview(runId, request, suffix); |
| 345 | } |
no test coverage detected