UNPKG

@prsna_ai/mcp-server

Version:

Model Context Protocol server for PRSNA personality profiles and communication insights

123 lines 3.32 kB
import { logger } from '../utils/logger.js'; import { CONFIG } from '../utils/constants.js'; export class CacheManager { cache = new Map(); cleanupInterval; constructor() { // Cleanup expired entries every 5 minutes this.cleanupInterval = setInterval(() => { this.cleanup(); }, 5 * 60 * 1000); logger.debug('Cache manager initialized', { maxSize: CONFIG.CACHE.MAX_SIZE, cleanupInterval: '5 minutes' }); } /** * Store a value in cache with TTL */ set(key, value, ttlSeconds) { // Enforce max cache size if (this.cache.size >= CONFIG.CACHE.MAX_SIZE) { this.evictOldest(); } const expires = Date.now() + (ttlSeconds * 1000); this.cache.set(key, { value, expires }); logger.debug('Cache set', { key, ttlSeconds, cacheSize: this.cache.size }); } /** * Get a value from cache if not expired */ get(key) { const entry = this.cache.get(key); if (!entry) { logger.debug('Cache miss', { key }); return undefined; } if (Date.now() > entry.expires) { this.cache.delete(key); logger.debug('Cache expired', { key }); return undefined; } logger.debug('Cache hit', { key }); return entry.value; } /** * Check if a key exists and is not expired */ has(key) { const entry = this.cache.get(key); if (!entry) { return false; } if (Date.now() > entry.expires) { this.cache.delete(key); return false; } return true; } /** * Delete a specific key */ delete(key) { const deleted = this.cache.delete(key); if (deleted) { logger.debug('Cache delete', { key }); } return deleted; } /** * Clear all cache entries */ clear() { this.cache.clear(); logger.info('Cache cleared'); } /** * Get cache statistics */ getStats() { return { size: this.cache.size, maxSize: CONFIG.CACHE.MAX_SIZE }; } /** * Clean up expired entries */ cleanup() { const before = this.cache.size; const now = Date.now(); for (const [key, entry] of this.cache.entries()) { if (now > entry.expires) { this.cache.delete(key); } } const after = this.cache.size; if (before !== after) { logger.debug('Cache cleanup completed', { removedEntries: before - after, remainingEntries: after }); } } /** * Evict the oldest entry to make room */ evictOldest() { const firstKey = this.cache.keys().next().value; if (firstKey) { this.cache.delete(firstKey); logger.debug('Cache evicted oldest entry', { key: firstKey }); } } /** * Destroy the cache manager and cleanup intervals */ destroy() { clearInterval(this.cleanupInterval); this.clear(); logger.info('Cache manager destroyed'); } } //# sourceMappingURL=cache.js.map