// deno-lint-ignore-file ban-types import { LRUCache } from 'lru-cache'; import { type Gauge } from 'prom-client'; type FetchFn = (key: K, opts: O) => Promise; interface FetchFnOpts { signal?: AbortSignal | null; } type SimpleLRUOpts = LRUCache.Options & { gauge?: Gauge; }; export class SimpleLRU< K extends {}, V extends {}, O extends {} = FetchFnOpts, > { protected cache: LRUCache; constructor(fetchFn: FetchFn, private opts: SimpleLRUOpts) { this.cache = new LRUCache({ async fetchMethod(key, _staleValue, { signal }) { try { return await fetchFn(key, { signal: signal as unknown as AbortSignal }); } catch { return null as unknown as V; } }, ...opts, }); } async fetch(key: K, opts?: O): Promise { const result = await this.cache.fetch(key, opts); this.opts.gauge?.set(this.cache.size); if (result === undefined || result === null) { throw new Error('SimpleLRU: fetch failed'); } return result; } put(key: K, value: V): Promise { this.cache.set(key, value); return Promise.resolve(); } }