Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 45x 45x 31x 31x 15x 4x 4x 11x 27x 1x 3x 2x 1x 8x | interface CacheEntry<T> {
value: T;
expiresAt: number;
}
export class TtlCache {
private readonly store = new Map<string, CacheEntry<unknown>>();
private readonly defaultTtlMs: number;
constructor(defaultTtlMs = 120_000) {
this.defaultTtlMs = defaultTtlMs;
}
get<T>(key: string): T | undefined {
const entry = this.store.get(key);
if (!entry) return undefined;
if (Date.now() > entry.expiresAt) {
this.store.delete(key);
return undefined;
}
return entry.value as T;
}
set<T>(key: string, value: T, ttlMs?: number): void {
this.store.set(key, {
value,
expiresAt: Date.now() + (ttlMs ?? this.defaultTtlMs),
});
}
invalidate(pattern: string): void {
for (const key of this.store.keys()) {
if (key.includes(pattern)) {
this.store.delete(key);
}
}
}
clear(): void {
this.store.clear();
}
get size(): number {
return this.store.size;
}
}
|