import type { RuntimeMode } from "../shared/api"; import type { StaticAssets } from "./app"; import { createHeaders } from "./helpers"; 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"; } export function hasFileExtension(pathname: string): boolean { return /\/[^/]+\.[^/]+$/.test(pathname); } export function htmlResponse(indexHtml: Blob, mode: RuntimeMode): Response { return new Response(indexHtml, { headers: createHeaders(mode, { "Cache-Control": "no-cache", "Content-Type": "text/html; charset=utf-8", }), }); } 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, { "Cache-Control": "public, max-age=31536000, immutable", "Content-Type": contentTypeFor(pathname), }), }); } if (pathname.startsWith("/assets/") || hasFileExtension(pathname)) { return new Response("Not Found", { headers: createHeaders(mode, { "Content-Type": "text/plain; charset=utf-8" }), status: 404, }); } return htmlResponse(staticAssets.indexHtml, mode); }