fix(cloudflare): serve version.json as static asset
Avoid Workers billing for /version.json by removing worker-first routing and generating static _headers rules during manifest build.
This commit is contained in:
@@ -72,4 +72,12 @@ const manifest = {
|
|||||||
fs.mkdirSync(distDir, { recursive: true })
|
fs.mkdirSync(distDir, { recursive: true })
|
||||||
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n", "utf-8")
|
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n", "utf-8")
|
||||||
|
|
||||||
|
const headersPath = path.join(distDir, "_headers")
|
||||||
|
fs.writeFileSync(
|
||||||
|
headersPath,
|
||||||
|
"/version.json\n Cache-Control: no-cache\n Content-Type: application/json; charset=utf-8\n",
|
||||||
|
"utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
console.log(`Wrote ${manifestPath}`)
|
console.log(`Wrote ${manifestPath}`)
|
||||||
|
console.log(`Wrote ${headersPath}`)
|
||||||
|
|||||||
@@ -2,28 +2,8 @@ export interface Env {
|
|||||||
ASSETS: { fetch: (request: Request) => Promise<Response> }
|
ASSETS: { fetch: (request: Request) => Promise<Response> }
|
||||||
}
|
}
|
||||||
|
|
||||||
function withHeader(response: Response, key: string, value: string): Response {
|
|
||||||
const headers = new Headers(response.headers)
|
|
||||||
headers.set(key, value)
|
|
||||||
return new Response(response.body, {
|
|
||||||
status: response.status,
|
|
||||||
statusText: response.statusText,
|
|
||||||
headers,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
async fetch(request: Request, env: Env): Promise<Response> {
|
async fetch(request: Request, env: Env): Promise<Response> {
|
||||||
const url = new URL(request.url)
|
return env.ASSETS.fetch(request)
|
||||||
|
|
||||||
if (url.pathname === "/version.json") {
|
|
||||||
const assetResponse = await env.ASSETS.fetch(request)
|
|
||||||
|
|
||||||
// Ensure this stays fresh; the server uses it on startup.
|
|
||||||
const withCache = withHeader(assetResponse, "Cache-Control", "no-cache")
|
|
||||||
return withHeader(withCache, "Content-Type", "application/json; charset=utf-8")
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Response("Not found", { status: 404 })
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,4 +12,3 @@ custom_domain = true
|
|||||||
directory = "./dist"
|
directory = "./dist"
|
||||||
binding = "ASSETS"
|
binding = "ASSETS"
|
||||||
not_found_handling = "404-page"
|
not_found_handling = "404-page"
|
||||||
run_worker_first = ["/version.json"]
|
|
||||||
|
|||||||
Reference in New Issue
Block a user