UNPKG

astro

Version:

Astro is a modern site builder with web best practices, performance, and DX front-of-mind.

52 lines (51 loc) • 2.06 kB
import { createOriginCheckMiddleware } from "../app/origin-check.js"; import { createAsyncManifestMemo } from "../manifest/memo.js"; import { NOOP_MIDDLEWARE_FN } from "./noop-middleware.js"; import { sequence } from "./sequence.js"; // Snapshot of the already-resolved middleware, for the sync `peekMiddleware` // accessor (reproduces `ContainerPipeline.insertRoute`'s synchronous // `this.resolvedMiddleware` read). const resolvedMiddleware = new WeakMap(); const middlewareMemo = createAsyncManifestMemo(async (manifest) => { let handler; // The middleware can be undefined when using edge middleware. // This is set to undefined by the plugin-ssr.ts if (manifest.middleware) { const middlewareInstance = await manifest.middleware(); const onRequest = middlewareInstance.onRequest ?? NOOP_MIDDLEWARE_FN; const internalMiddlewares = [onRequest]; if (manifest.checkOrigin) { // this middleware must be placed at the beginning because it needs to block incoming requests internalMiddlewares.unshift(createOriginCheckMiddleware()); } handler = sequence(...internalMiddlewares); } else { handler = NOOP_MIDDLEWARE_FN; } resolvedMiddleware.set(manifest, handler); return handler; }); /** * Resolves the middleware from the manifest and returns the `onRequest` * function (prefixed with the origin-check middleware when configured). If * `onRequest` isn't there, it returns a no-op function. */ export function getMiddleware(manifest) { return middlewareMemo.get(manifest); } /** * The already-resolved middleware for a manifest, or `undefined` when * `getMiddleware` has not settled yet. Sync — used where a synchronous * snapshot is required (the container's `insertRoute`). */ export function peekMiddleware(manifest) { return resolvedMiddleware.get(manifest); } /** * Clears the cached middleware so it is re-resolved on the next request. * Called via HMR when middleware files change during development. */ export function clearMiddleware(manifest) { middlewareMemo.invalidate(manifest); resolvedMiddleware.delete(manifest); }