///
import {
getAssetFromKV,
NotFoundError,
MethodNotAllowedError,
serveSinglePageApp,
} from "@cloudflare/kv-asset-handler";
import type { Options } from "@cloudflare/kv-asset-handler";
import { spaMode, cacheControl } from "config:middleware/serve-static-assets";
import type * as kvAssetHandler from "@cloudflare/kv-asset-handler";
import manifest from "__STATIC_CONTENT_MANIFEST";
const ASSET_MANIFEST = JSON.parse(manifest);
import type { Middleware } from "./common";
const staticAssets: Middleware = async (request, env, _ctx, middlewareCtx) => {
let options: Partial = {
ASSET_MANIFEST,
ASSET_NAMESPACE: env.__STATIC_CONTENT,
cacheControl: cacheControl,
mapRequestToAsset: spaMode ? serveSinglePageApp : undefined,
};
try {
const page = await (getAssetFromKV as typeof kvAssetHandler.getAssetFromKV)(
{
request,
waitUntil(promise) {
return _ctx.waitUntil(promise);
},
},
options
);
// allow headers to be altered
const response = new Response(page.body, page);
response.headers.set("X-XSS-Protection", "1; mode=block");
response.headers.set("X-Content-Type-Options", "nosniff");
response.headers.set("X-Frame-Options", "DENY");
response.headers.set("Referrer-Policy", "unsafe-url");
response.headers.set("Feature-Policy", "none");
return response;
} catch (e) {
if (e instanceof NotFoundError || e instanceof MethodNotAllowedError) {
// if a known error is thrown then serve from actual worker
return await middlewareCtx.next(request, env);
}
// otherwise it's a real error, so throw it
throw e;
}
};
export default staticAssets;