Spaces:
Running
Running
File size: 1,583 Bytes
5dfbe50 |
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 |
import { config } from '../config';
interface CacheEntry<T> {
data: T;
expiry: number;
}
class InMemoryCache {
private cache: Map<string, CacheEntry<any>> = new Map();
private cleanupInterval: NodeJS.Timeout;
constructor() {
// Cleanup expired entries every minute
this.cleanupInterval = setInterval(() => this.cleanup(), 60000);
}
set<T>(key: string, value: T, ttl: number = config.cacheTTL): void {
if (!config.enableCache) return;
const expiry = Date.now() + (ttl * 1000);
this.cache.set(key, { data: value, expiry });
}
get<T>(key: string): T | null {
if (!config.enableCache) return null;
const entry = this.cache.get(key);
if (!entry) return null;
if (Date.now() > entry.expiry) {
this.cache.delete(key);
return null;
}
return entry.data as T;
}
delete(key: string): void {
this.cache.delete(key);
}
clear(): void {
this.cache.clear();
}
private cleanup(): void {
const now = Date.now();
for (const [key, entry] of this.cache.entries()) {
if (now > entry.expiry) {
this.cache.delete(key);
}
}
}
destroy(): void {
clearInterval(this.cleanupInterval);
this.cache.clear();
}
}
export const cache = new InMemoryCache();
// Cache key generators
export const cacheKeys = {
search: (query: string, limit: number) => `search:${query}:${limit}`,
image: (docId: string, type: 'thumbnail' | 'full') => `image:${docId}:${type}`,
similarityMap: (docId: string, query: string) => `similarity:${docId}:${query}`,
}; |