- Renamed project from PSA-Utils to Pulse - Moved all app files from autotask-app/ to root - Updated package.json name to 'pulse' - Updated Docker container names to pulse-app and pulse-redis - Updated Docker network name to pulse-network
62 lines
1.2 KiB
TypeScript
62 lines
1.2 KiB
TypeScript
// Simple in-memory cache with TTL
|
|
interface CacheEntry<T> {
|
|
data: T;
|
|
timestamp: number;
|
|
ttl: number;
|
|
}
|
|
|
|
class SimpleCache {
|
|
private cache: Map<string, CacheEntry<any>> = new Map();
|
|
|
|
set<T>(key: string, data: T, ttlMinutes: number = 5): void {
|
|
this.cache.set(key, {
|
|
data,
|
|
timestamp: Date.now(),
|
|
ttl: ttlMinutes * 60 * 1000, // Convert to milliseconds
|
|
});
|
|
}
|
|
|
|
get<T>(key: string): T | null {
|
|
const entry = this.cache.get(key);
|
|
|
|
if (!entry) {
|
|
return null;
|
|
}
|
|
|
|
// Check if expired
|
|
if (Date.now() - entry.timestamp > entry.ttl) {
|
|
this.cache.delete(key);
|
|
return null;
|
|
}
|
|
|
|
return entry.data as T;
|
|
}
|
|
|
|
delete(key: string): void {
|
|
this.cache.delete(key);
|
|
}
|
|
|
|
clear(): void {
|
|
this.cache.clear();
|
|
}
|
|
|
|
// Clean up expired entries
|
|
cleanup(): void {
|
|
const now = Date.now();
|
|
for (const [key, entry] of this.cache.entries()) {
|
|
if (now - entry.timestamp > entry.ttl) {
|
|
this.cache.delete(key);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Global cache instance
|
|
export const apiCache = new SimpleCache();
|
|
|
|
// Run cleanup every 5 minutes (server-side only)
|
|
if (typeof window === 'undefined') {
|
|
setInterval(() => {
|
|
apiCache.cleanup();
|
|
}, 5 * 60 * 1000);
|
|
}
|