Просмотр исходного кода

fix(stats): proxy build assets under stats path

Adam 3 месяцев назад
Родитель
Сommit
7480b97630

+ 39 - 0
packages/console/app/src/lib/stats-proxy.ts

@@ -0,0 +1,39 @@
+import type { APIEvent } from "@solidjs/start/server"
+import { Resource } from "@opencode-ai/console-resource"
+
+export async function statsProxy(evt: APIEvent) {
+  const req = evt.request.clone()
+  const targetUrl = new URL(req.url)
+  targetUrl.protocol = "https:"
+  targetUrl.hostname = Resource.App.stage === "production" ? "stats.opencode.ai" : "stats.dev.opencode.ai"
+  targetUrl.port = ""
+
+  if (targetUrl.pathname.startsWith("/stats/_build/")) {
+    targetUrl.pathname = targetUrl.pathname.slice("/stats".length)
+  }
+
+  const response = await fetch(targetUrl, {
+    method: req.method,
+    headers: req.headers,
+    body: req.body,
+  })
+
+  if (!response.headers.get("content-type")?.includes("text/html")) return response
+
+  const headers = new Headers(response.headers)
+  headers.delete("content-encoding")
+  headers.delete("content-length")
+  headers.delete("etag")
+
+  return new Response(rewriteStatsHtml(await response.text()), {
+    status: response.status,
+    statusText: response.statusText,
+    headers,
+  })
+}
+
+function rewriteStatsHtml(html: string) {
+  return html
+    .replaceAll("\"/_build/", "\"/stats/_build/")
+    .replaceAll("'/_build/", "'/stats/_build/")
+}

+ 7 - 21
packages/console/app/src/routes/stats/[...path].ts

@@ -1,22 +1,8 @@
-import type { APIEvent } from "@solidjs/start/server"
-import { Resource } from "@opencode-ai/console-resource"
+import { statsProxy } from "~/lib/stats-proxy"
 
-async function handler(evt: APIEvent) {
-  const req = evt.request.clone()
-  const url = new URL(req.url)
-  const host = Resource.App.stage === "production" ? "stats.opencode.ai" : "stats.dev.opencode.ai"
-  const targetUrl = `https://${host}${url.pathname}${url.search}`
-
-  return fetch(targetUrl, {
-    method: req.method,
-    headers: req.headers,
-    body: req.body,
-  })
-}
-
-export const GET = handler
-export const POST = handler
-export const PUT = handler
-export const DELETE = handler
-export const OPTIONS = handler
-export const PATCH = handler
+export const GET = statsProxy
+export const POST = statsProxy
+export const PUT = statsProxy
+export const DELETE = statsProxy
+export const OPTIONS = statsProxy
+export const PATCH = statsProxy

+ 7 - 21
packages/console/app/src/routes/stats/index.ts

@@ -1,22 +1,8 @@
-import type { APIEvent } from "@solidjs/start/server"
-import { Resource } from "@opencode-ai/console-resource"
+import { statsProxy } from "~/lib/stats-proxy"
 
-async function handler(evt: APIEvent) {
-  const req = evt.request.clone()
-  const url = new URL(req.url)
-  const host = Resource.App.stage === "production" ? "stats.opencode.ai" : "stats.dev.opencode.ai"
-  const targetUrl = `https://${host}${url.pathname}${url.search}`
-
-  return fetch(targetUrl, {
-    method: req.method,
-    headers: req.headers,
-    body: req.body,
-  })
-}
-
-export const GET = handler
-export const POST = handler
-export const PUT = handler
-export const DELETE = handler
-export const OPTIONS = handler
-export const PATCH = handler
+export const GET = statsProxy
+export const POST = statsProxy
+export const PUT = statsProxy
+export const DELETE = statsProxy
+export const OPTIONS = statsProxy
+export const PATCH = statsProxy