diff --git a/apps/scandic-web/server/tokenManager.ts b/apps/scandic-web/server/tokenManager.ts index 515b490f0..5552c8d3f 100644 --- a/apps/scandic-web/server/tokenManager.ts +++ b/apps/scandic-web/server/tokenManager.ts @@ -1,4 +1,4 @@ -import { metrics, trace } from "@opentelemetry/api" +import { metrics, trace, type Tracer } from "@opentelemetry/api" import { env } from "@/env/server" @@ -20,32 +20,47 @@ export async function getServiceToken() { const tracer = trace.getTracer("getServiceToken") return await tracer.startActiveSpan("getServiceToken", async () => { - let scopes: string[] = [] - if (env.ENABLE_BOOKING_FLOW) { - scopes = ["profile", "hotel", "booking", "package", "availability"] - } else { - scopes = ["profile"] - } + const scopes = env.ENABLE_BOOKING_FLOW + ? ["profile", "hotel", "booking", "package", "availability"] + : ["profile"] const cacheKey = getServiceTokenCacheKey(scopes) - const cacheClient = await getCacheClient() - const token = - await cacheClient.get>>(cacheKey) - console.log("[DEBUG] getServiceToken", typeof token, token) - if (!token || token.expiresAt < Date.now()) { - return await tracer.startActiveSpan("fetch new token", async () => { - const newToken = await getJwt(scopes) - const relativeTime = (newToken.expiresAt - Date.now()) / 1000 - await cacheClient.set(cacheKey, newToken, relativeTime) + const token = await getOrSetServiceTokenFromCache(cacheKey, scopes, tracer) - return newToken.jwt - }) + if (token.expiresAt < Date.now()) { + await cacheClient.deleteKey(cacheKey) + + const newToken = await getOrSetServiceTokenFromCache( + cacheKey, + scopes, + tracer + ) + return newToken.jwt } return token.jwt }) } +async function getOrSetServiceTokenFromCache( + cacheKey: string, + scopes: string[], + tracer: Tracer +) { + const cacheClient = await getCacheClient() + const token = await cacheClient.cacheOrGet( + cacheKey, + async () => { + return await tracer.startActiveSpan("fetch new token", async () => { + const newToken = await getJwt(scopes) + return newToken + }) + }, + "1h" + ) + return token +} + async function getJwt(scopes: string[]) { fetchServiceTokenCounter.add(1) const jwt = await fetchServiceToken(scopes) diff --git a/apps/scandic-web/server/trpc.ts b/apps/scandic-web/server/trpc.ts index 64f3d1f24..5ca672b25 100644 --- a/apps/scandic-web/server/trpc.ts +++ b/apps/scandic-web/server/trpc.ts @@ -139,7 +139,6 @@ export const safeProtectedProcedure = baseProcedure.use(async function (opts) { export const serviceProcedure = baseProcedure.use(async (opts) => { const token = await getServiceToken() - console.log("[DEBUG] token", typeof token, token) const { access_token } = token if (!access_token) { throw internalServerError(`[serviceProcedure] No service token`) diff --git a/apps/scandic-web/services/dataCache/MemoryCache/UnstableCache/cacheOrGet.ts b/apps/scandic-web/services/dataCache/MemoryCache/UnstableCache/cacheOrGet.ts index e0d970c24..04943fe45 100644 --- a/apps/scandic-web/services/dataCache/MemoryCache/UnstableCache/cacheOrGet.ts +++ b/apps/scandic-web/services/dataCache/MemoryCache/UnstableCache/cacheOrGet.ts @@ -10,7 +10,7 @@ import { cacheLogger } from "../../logger" export const cacheOrGet: DataCache["cacheOrGet"] = async ( key: string | string[], - callback: (overrideTTL?: (cacheTime: CacheTime) => void) => Promise, + callback: () => Promise, ttl: CacheTime ): Promise => { if (!Array.isArray(key)) {