UNPKG

officernd-mcp-server

Version:

MCP server for OfficeRnD workspace management - create, search, update and cancel bookings

118 lines 3.39 kB
export class ResourceRateCache { cache = new Map(); resourceRatesCache = new Map(); cacheLifetime; // in milliseconds constructor(cacheLifetimeMinutes = 60) { this.cacheLifetime = cacheLifetimeMinutes * 60 * 1000; } /** * Get a resource rate from cache if it exists and is not expired */ getRate(rateId) { const cached = this.cache.get(rateId); if (!cached) { return null; } const now = new Date(); const age = now.getTime() - cached.fetchedAt.getTime(); if (age > this.cacheLifetime) { // Cache expired this.cache.delete(rateId); return null; } return cached.rate; } /** * Get rates for a specific resource from cache */ getRatesForResource(resourceId) { const cached = this.resourceRatesCache.get(resourceId); if (!cached) { return null; } const now = new Date(); const age = now.getTime() - cached.fetchedAt.getTime(); if (age > this.cacheLifetime) { // Cache expired this.resourceRatesCache.delete(resourceId); return null; } return cached.rates; } /** * Store a resource rate in cache */ setRate(rate) { this.cache.set(rate._id, { rate, fetchedAt: new Date(), }); } /** * Store multiple resource rates in cache */ setRates(rates) { const now = new Date(); rates.forEach(rate => { this.cache.set(rate._id, { rate, fetchedAt: now, }); }); // Also cache by resource ID const ratesByResource = new Map(); rates.forEach(rate => { if (!ratesByResource.has(rate.resource)) { ratesByResource.set(rate.resource, []); } ratesByResource.get(rate.resource).push(rate); }); ratesByResource.forEach((resourceRates, resourceId) => { this.resourceRatesCache.set(resourceId, { rates: resourceRates, fetchedAt: now, }); }); } /** * Clear all cached rates */ clear() { this.cache.clear(); this.resourceRatesCache.clear(); } /** * Get cache statistics */ getStats() { const rates = Array.from(this.cache.keys()); const resources = Array.from(this.resourceRatesCache.keys()); return { size: this.cache.size, rates, resources, }; } /** * Remove expired entries from cache */ cleanExpired() { const now = new Date(); let removed = 0; for (const [key, value] of this.cache.entries()) { const age = now.getTime() - value.fetchedAt.getTime(); if (age > this.cacheLifetime) { this.cache.delete(key); removed++; } } for (const [key, value] of this.resourceRatesCache.entries()) { const age = now.getTime() - value.fetchedAt.getTime(); if (age > this.cacheLifetime) { this.resourceRatesCache.delete(key); } } return removed; } } //# sourceMappingURL=resource-rate-cache.js.map