51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
import type { APIEvent } from "@solidjs/start/server"
|
|
import { Resource } from "@opencode-ai/console-resource"
|
|
|
|
const dataPath = "/data"
|
|
|
|
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(`${dataPath}/_build/`) || targetUrl.pathname === `${dataPath}/banner.jpg`) {
|
|
targetUrl.pathname = targetUrl.pathname.slice(dataPath.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,
|
|
})
|
|
}
|
|
|
|
export function statsRedirect(evt: APIEvent) {
|
|
const url = new URL(evt.request.url)
|
|
url.pathname = `${dataPath}${url.pathname.slice("/stats".length)}`
|
|
return new Response(null, {
|
|
status: 308,
|
|
headers: {
|
|
Location: url.toString(),
|
|
},
|
|
})
|
|
}
|
|
|
|
function rewriteStatsHtml(html: string) {
|
|
return html.replaceAll('"/_build/', `"${dataPath}/_build/`).replaceAll("'/_build/", `'${dataPath}/_build/`)
|
|
}
|