UNPKG

@paroicms/server

Version:
64 lines 2.69 kB
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