@prsna_ai/mcp-server
Version:
Model Context Protocol server for PRSNA personality profiles and communication insights
123 lines • 3.32 kB
JavaScript
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