59 lines
2.2 KiB
JavaScript
59 lines
2.2 KiB
JavaScript
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);
|
|
}
|
|
}
|