import { stringify } from "querystring" import { Lang } from "@/constants/languages" import { env } from "@/env/server" import { resolve as resolveEntry } from "@/utils/entry" import { findLang } from "@/utils/languages" import { removeTrailingSlash } from "@/utils/url" import type { NextRequest } from "next/server" export function getDefaultRequestHeaders(request: NextRequest) { const lang = findLang(request.nextUrl.pathname)! let nextUrl if (env.PUBLIC_URL) { const publicUrl = new URL(env.PUBLIC_URL) const nextUrlPublic = request.nextUrl.clone() nextUrlPublic.host = publicUrl.host nextUrlPublic.hostname = publicUrl.hostname nextUrl = nextUrlPublic } else { nextUrl = request.nextUrl } const headers = new Headers(request.headers) headers.set("x-lang", lang) headers.set( "x-pathname", removeTrailingSlash( request.nextUrl.pathname.replace(`/${lang}`, "").replace(`/webview`, "") ) ) headers.set("x-url", removeTrailingSlash(nextUrl.href)) return headers } const entryResponseCache: Map< string, { contentType: string | null uid: string | null expiresAt: number } > = new Map() let size: number = 0 export const fetchAndCacheEntry = async (path: string, lang: Lang) => { const cacheKey = `${path + lang}` const cachedResponse = entryResponseCache.get(cacheKey) if (cachedResponse && cachedResponse.expiresAt > Date.now() / 1000) { console.log("[CMS MIDDLEWARE]: CACHE HIT") return cachedResponse } if (cachedResponse && cachedResponse.expiresAt < Date.now() / 1000) { console.log("[CMS MIDDLEWARE]: CACHE STALE") size -= JSON.stringify(cachedResponse).length entryResponseCache.delete(cacheKey) } else { console.log("[CMS MIDDLEWARE]: CACHE MISS") } const { contentType, uid } = await resolveEntry(path, lang) let expiresAt = Date.now() / 1000 if (!contentType || !uid) { expiresAt += 600 } else { expiresAt += 3600 * 12 } const entryCache = { contentType, uid, expiresAt } size += JSON.stringify(entryCache).length console.log("[CMS MIDDLEWARE] Adding to cache", entryCache) console.log("[CMS MIDDLEWARE] Cache size (total)", size) entryResponseCache.set(cacheKey, entryCache) return { contentType, uid, } }