| | |
| | |
| |
|
| | 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'; |
| |
|