Spaces:
Runtime error
Runtime error
File size: 1,655 Bytes
cd8bd0a | 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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | interface MemoryCache {
key: string;
value: unknown;
expiresAt: number;
}
class MemoryCachingLayer {
private cache: Map<string, MemoryCache> = new Map();
private maxSize: number = 1000;
private defaultTtl: number = 300000;
private hits: number = 0;
private misses: number = 0;
async get(key: string): Promise<unknown | null> {
const entry = this.cache.get(key);
if (!entry) {
this.misses += 1;
return null;
}
if (Date.now() > entry.expiresAt) {
this.cache.delete(key);
this.misses += 1;
return null;
}
this.hits += 1;
this.cache.delete(key);
this.cache.set(key, entry);
return entry.value;
}
async set(key: string, value: unknown, ttl?: number): Promise<void> {
if (this.cache.has(key)) {
this.cache.delete(key);
} else if (this.cache.size >= this.maxSize) {
const oldestKey = this.cache.keys().next().value;
if (oldestKey) {
this.cache.delete(oldestKey);
}
}
const now = Date.now();
this.cache.set(key, {
key,
value,
expiresAt: now + (ttl ?? this.defaultTtl),
});
}
async invalidate(pattern: string): Promise<void> {
const regex = new RegExp(pattern);
for (const key of this.cache.keys()) {
if (regex.test(key)) {
this.cache.delete(key);
}
}
}
async clear(): Promise<void> {
this.cache.clear();
this.hits = 0;
this.misses = 0;
}
stats() {
return {
size: this.cache.size,
maxSize: this.maxSize,
hits: this.hits,
misses: this.misses,
};
}
}
export const memoryCache = new MemoryCachingLayer();
|