import isDevelopment from "../../../utils/is-development"; import { log } from "../../../utils/log"; import { logBuildErrorsOnce } from "../../../utils/build-error-log"; import getCache from "../../cache/get-cache"; import generateWebPageResponseFromComponentReturn from "./generate-web-page-response-from-component-return"; import grabPageComponent from "./grab-page-component"; import grabPageErrorComponent from "./grab-page-error-component"; export default async function handleWebPages({ req, }) { try { const is_dev = isDevelopment(); if (!is_dev) { const url = new URL(req.url); const key = url.pathname + (url.search || ""); const existing_cache = getCache({ key, paradigm: "html" }); if (existing_cache) { const res_opts = { headers: { "Content-Type": "text/html", "X-Bunext-Cache": "HIT", }, }; return new Response(existing_cache, res_opts); } } // The dev server port opens before the one-time startup build // finishes. First page render waits for it so we never serve HTML // against half-built hydration/SSR modules. if (is_dev && global.BUNEXT_INITIAL_BUILD_PROMISE) { try { await global.BUNEXT_INITIAL_BUILD_PROMISE; } catch (error) { } } const componentRes = await grabPageComponent({ req, }); if (componentRes instanceof Response) { return componentRes; } return await generateWebPageResponseFromComponentReturn({ ...componentRes, }); } catch (error) { logBuildErrorsOnce([ { text: `Error Handling Web Page: ${error?.message || String(error)}`, }, ], (line) => log.error(line)); const componentRes = await grabPageErrorComponent({ error, }); if (componentRes instanceof Response) { return componentRes; } return await generateWebPageResponseFromComponentReturn(componentRes); } }