From dd3fed9423ce977e39b6c91fa89bb4cbbed8638e Mon Sep 17 00:00:00 2001 From: Linus Flood Date: Wed, 19 Mar 2025 09:16:11 +0000 Subject: [PATCH] Merged in fix/cache-service-token (pull request #1571) fix(servicetoken): cache it when using unstable_cache * fix(servicetoken): cache it when using unstable_cache * Refactor and using cacheOrGet as get/set * Refactor * Use expiresAt from cached token Approved-by: Anton Gunnarsson --- apps/scandic-web/server/tokenManager.ts | 51 ++++++++++++------- apps/scandic-web/server/trpc.ts | 1 - .../MemoryCache/UnstableCache/cacheOrGet.ts | 2 +- 3 files changed, 34 insertions(+), 20 deletions(-) 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)) {