@paroicms/server
Version:
The ParoiCMS server
64 lines • 2.69 kB
JavaScript
import { createTracker } from "@paroicms/internal-server-lib";
import { serveTextFromCacheOr } from "../../common/serve-text-or.js";
import { makeCacheDependencyKey, makeCacheKey } from "../../common/text-cache.js";
import { makeFeedUrl } from "../../helpers/url-helpers.js";
import { createRenderingContext } from "../../liquidjs-tools/liquidjs-rendering/rendering-context.js";
import { generateRssFeed } from "./feed-generator.js";
import { parseFeedUrl } from "./feed-helpers.js";
export async function feedReqHandler(siteContext, httpContext) {
const { req } = httpContext;
const parsed = parseFeedUrl(req.relativeUrl);
if (!parsed)
return false;
const { languageRoutingMode, defaultLanguage, languages } = siteContext.siteSchema;
if (languageRoutingMode === "prefixAll") {
if (!parsed.language || !languages.includes(parsed.language))
return false;
await serveFeed(siteContext, httpContext, {
language: parsed.language,
feedUrl: makeFeedUrl(siteContext, parsed.language),
});
return true;
}
if (languageRoutingMode === "prefixSecondary") {
if (parsed.language) {
if (parsed.language === defaultLanguage || !languages.includes(parsed.language))
return false;
await serveFeed(siteContext, httpContext, {
language: parsed.language,
feedUrl: makeFeedUrl(siteContext, parsed.language),
});
}
else {
await serveFeed(siteContext, httpContext, {
language: defaultLanguage,
feedUrl: makeFeedUrl(siteContext, defaultLanguage),
});
}
return true;
}
throw new Error(`invalid routing mode "${languageRoutingMode}"`);
}
async function serveFeed(siteContext, httpContext, { language, feedUrl }) {
const tracker = createTracker();
const cacheKey = makeCacheKey(siteContext.logger, { kind: "feed", url: feedUrl });
const renderingContext = await createRenderingContext(siteContext, {
cacheKey,
language,
tracker,
dependencyKey: makeCacheDependencyKey({ global: "all" }),
});
const serveOr = serveTextFromCacheOr(siteContext, httpContext, tracker, {
cacheKey,
contentType: "application/rss+xml; charset=utf-8",
});
if (await serveOr.serveFromCache())
return;
const feed = await generateRssFeed(renderingContext, {
language,
feedUrl,
});
await serveOr.putInCacheAndServe(feed, renderingContext.getDependencyKeys());
await renderingContext.close();
}
//# sourceMappingURL=feed.req-handler.js.map