diff --git a/packages/console/app/src/lib/stats-proxy.ts b/packages/console/app/src/lib/stats-proxy.ts new file mode 100644 index 0000000000..9c85a5093b --- /dev/null +++ b/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/") +} diff --git a/packages/console/app/src/routes/stats/[...path].ts b/packages/console/app/src/routes/stats/[...path].ts index 326ff2c117..d1899215df 100644 --- a/packages/console/app/src/routes/stats/[...path].ts +++ b/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 diff --git a/packages/console/app/src/routes/stats/index.ts b/packages/console/app/src/routes/stats/index.ts index 326ff2c117..d1899215df 100644 --- a/packages/console/app/src/routes/stats/index.ts +++ b/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