import type { RuntimeMode } from "../shared/api"; import { createHeaders } from "./helpers"; import type { StaticAssets } from "./app"; export function serveStaticAsset(pathname: string, staticAssets: StaticAssets, mode: RuntimeMode): Response { if (pathname === "/") { return htmlResponse(staticAssets.indexHtml, mode); } const asset = staticAssets.files[pathname]; if (asset) { return new Response(asset, { headers: createHeaders(mode, { "Content-Type": contentTypeFor(pathname), "Cache-Control": "public, max-age=31536000, immutable", }), }); } if (pathname.startsWith("/assets/") || hasFileExtension(pathname)) { return new Response("Not Found", { status: 404, headers: createHeaders(mode, { "Content-Type": "text/plain; charset=utf-8" }), }); } return htmlResponse(staticAssets.indexHtml, mode); } export function htmlResponse(indexHtml: Blob, mode: RuntimeMode): Response { return new Response(indexHtml, { headers: createHeaders(mode, { "Content-Type": "text/html; charset=utf-8", "Cache-Control": "no-cache", }), }); } export function hasFileExtension(pathname: string): boolean { return /\/[^/]+\.[^/]+$/.test(pathname); } export function contentTypeFor(pathname: string): string { if (pathname.endsWith(".js") || pathname.endsWith(".mjs")) return "text/javascript; charset=utf-8"; if (pathname.endsWith(".css")) return "text/css; charset=utf-8"; if (pathname.endsWith(".svg")) return "image/svg+xml"; if (pathname.endsWith(".json")) return "application/json; charset=utf-8"; if (pathname.endsWith(".png")) return "image/png"; if (pathname.endsWith(".jpg") || pathname.endsWith(".jpeg")) return "image/jpeg"; if (pathname.endsWith(".ico")) return "image/x-icon"; return "application/octet-stream"; }