Files
web/middlewares/utils.ts
Michael Zetterberg 4a846540c3 feat: improve handling of deployment env vars
These are now defined in Netlify UI for dedicated environments (test, stage, production):

AUTH_URL
NEXTAUTH_URL
PUBLIC_URL

Code now falls back to incoming request host. Mainly used for
deployment previews which do not have Akamai in front, meaning
we do not need the above workaround as incoming request host
matches the actual public facing host. When Akamai is in front,
we lose the public facing host in Netlify's routing layer as they
internally use `x-forwarded-for` and we can't claim it for our usage.
2024-10-15 17:03:36 +02:00

71 lines
2.0 KiB
TypeScript

import { Lang } from "@/constants/languages"
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"
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,
}
}