@paroicms/server
Version:
The ParoiCMS server
60 lines • 2.98 kB
JavaScript
import { createTracker } from "@paroicms/internal-server-lib";
import { render404Html, serveTextFromCacheOr } from "../common/serve-text-or.js";
import { makeCacheKey } from "../common/text-cache.js";
import { trackerReportToMessage } from "../common/tracker-report.js";
import { serve301Redirect } from "../express/http-helpers.js";
import { parsePageRoute } from "./page-route/page-route-parser.js";
import { generateDocumentHtml } from "./serve-document/serve-document.js";
import { serveMultilingualIndexPage } from "./serve-index-page.js";
export async function siteRouterReqHandler(siteContext, httpContext) {
const { req } = httpContext;
if (req.path === "/" && siteContext.siteSchema.languageRoutingMode === "prefixAll") {
const tracker = createTracker();
await serveMultilingualIndexPage(siteContext, httpContext, tracker);
siteContext.logger.stats(trackerReportToMessage(tracker.toReport(), `serve ${req.relativeUrl}`));
return true;
}
const parsedRoute = parsePageRoute(siteContext, req.path);
if (!parsedRoute)
return false;
const tracker = createTracker();
await serveDocument(siteContext, httpContext, parsedRoute, tracker);
siteContext.logger.stats(trackerReportToMessage(tracker.toReport(), `serve ${req.relativeUrl}`));
return true;
}
async function serveDocument(siteContext, httpContext, parsedRoute, tracker) {
const { req } = httpContext;
const cacheKeyWithQuery = makeCacheKey(siteContext.logger, {
kind: "html",
url: req.relativeUrl,
});
const cacheKeyWithPath = makeCacheKey(siteContext.logger, { kind: "html", url: req.path });
const serveOr = serveTextFromCacheOr(siteContext, httpContext, tracker, {
cacheKey: [cacheKeyWithQuery, cacheKeyWithPath],
});
if (await serveOr.serveFromCache())
return;
const redirectCacheKey = makeCacheKey(siteContext.logger, {
kind: "redirect",
urlKey: parsedRoute.urlCacheKey,
});
const cacheRedirect = await siteContext.textCache.getCacheValue(redirectCacheKey, tracker);
if (cacheRedirect && cacheRedirect.value !== req.relativeUrl) {
return serve301Redirect(httpContext, cacheRedirect.value);
}
const generated = await generateDocumentHtml(siteContext, httpContext, { parsedRoute, cacheKeyWithQuery, cacheKeyWithPath }, tracker);
if (generated.status === 301) {
await siteContext.textCache.setCacheValue({
cacheKey: redirectCacheKey,
dependencyKeys: generated.dependencyKeys,
value: generated.url,
}, tracker);
return serve301Redirect(httpContext, generated.url);
}
if (generated.status === 404) {
await render404Html(siteContext, httpContext, { language: parsedRoute.language });
return;
}
await serveOr.putInCacheAndServe(generated.html, generated.dependencyKeys, generated.cacheKey);
}
//# sourceMappingURL=site-router.req-handler.js.map