72 lines
2.0 KiB
TypeScript
72 lines
2.0 KiB
TypeScript
import { getPublicNextURL } from "@/server/utils"
|
|
|
|
import { resolve as resolveEntry } from "@/utils/entry"
|
|
import { findLang } from "@/utils/languages"
|
|
import { removeTrailingSlash } from "@/utils/url"
|
|
|
|
import type { NextRequest } from "next/server"
|
|
|
|
import type { Lang } from "@/constants/languages"
|
|
|
|
export function getDefaultRequestHeaders(request: NextRequest) {
|
|
const lang = findLang(request.nextUrl.pathname)!
|
|
const nextUrlPublic = getPublicNextURL(request)
|
|
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(nextUrlPublic.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,
|
|
}
|
|
}
|