import { type CacheTime, type DataCache } from "@/services/dataCache/Cache" import { cacheLogger } from "../logger" import { generateCacheKey } from "./generateCacheKey" import { get } from "./get" import { set } from "./set" export const cacheOrGet: DataCache["cacheOrGet"] = async ( key: string | string[], callback: (overrideTTL: (cacheTime: CacheTime) => void) => Promise, ttl: CacheTime ) => { const cacheKey = generateCacheKey(key) const cachedValue = await get(cacheKey) let realTTL = ttl const overrideTTL = function (cacheTime: CacheTime) { realTTL = cacheTime } if (!cachedValue) { const perf = performance.now() const data = await callback(overrideTTL) cacheLogger.debug( `Getting data '${cacheKey}' took ${(performance.now() - perf).toFixed(2)}ms` ) await set(cacheKey, data, realTTL) return data } return cachedValue }