| |
| |
|
|
| import { config } from '@/config'; |
|
|
| import type CacheModule from './base'; |
| import kv, { getKVNamespace } from './kv'; |
|
|
| |
|
|
| const globalCache: { |
| get: (key: string) => Promise<string | null | undefined> | string | null | undefined; |
| set: (key: string, value?: string | Record<string, any>, maxAge?: number) => any; |
| } = { |
| get: async (key) => { |
| if (key && kv.status.available && getKVNamespace()) { |
| const value = await getKVNamespace()!.get(key); |
| return value; |
| } |
| return null; |
| }, |
| set: async (key, value, maxAge = config.cache.routeExpire) => { |
| if (!kv.status.available || !getKVNamespace()) { |
| return; |
| } |
| if (!value || value === 'undefined') { |
| value = ''; |
| } |
| if (typeof value === 'object') { |
| value = JSON.stringify(value); |
| } |
| if (key) { |
| await getKVNamespace()!.put(key, value, { expirationTtl: maxAge }); |
| } |
| }, |
| }; |
|
|
| |
| const cacheModule: CacheModule = kv; |
|
|
| export default { |
| ...cacheModule, |
| get status() { |
| return kv.status; |
| }, |
| |
| |
| |
| |
| |
| |
| |
| |
| tryGet: async <T extends string | Record<string, any>>(key: string, getValueFunc: () => Promise<T>, maxAge = config.cache.contentExpire, refresh = true) => { |
| if (typeof key !== 'string') { |
| throw new TypeError('Cache key must be a string'); |
| } |
| |
| if (kv.status.available) { |
| let v = await kv.get(key, refresh); |
| if (v) { |
| let parsed; |
| try { |
| parsed = JSON.parse(v); |
| } catch { |
| parsed = null; |
| } |
| if (parsed) { |
| v = parsed; |
| } |
| return v as T; |
| } else { |
| const value = await getValueFunc(); |
| kv.set(key, value, maxAge); |
| return value; |
| } |
| } |
| |
| const value = await getValueFunc(); |
| return value; |
| }, |
| globalCache, |
| }; |
|
|
| export { setKVNamespace } from './kv'; |
|
|