/** * Collection Index Manager with Background Refresh and Robust Caching * * This manager implements: * - 1-hour TTL with local file caching * - Background refresh without blocking operations * - Exponential backoff retry logic * - Configurable timeouts via environment variables * - Return stale cache while refreshing in background * - Comprehensive error handling for production use */ import { CollectionIndex } from '../types/collection'; import { IFileOperationsService } from '../services/FileOperationsService.js'; export interface CollectionIndexCacheEntry { data: CollectionIndex; timestamp: number; etag?: string; lastModified?: string; version: string; checksum: string; } export interface CollectionIndexManagerConfig { ttlMs?: number; fetchTimeoutMs?: number; maxRetries?: number; baseRetryDelayMs?: number; maxRetryDelayMs?: number; cacheDir?: string; fileOperations: IFileOperationsService; } export declare class CollectionIndexManager { private readonly INDEX_URL; private readonly TTL_MS; private readonly FETCH_TIMEOUT_MS; private readonly MAX_RETRIES; private readonly BASE_RETRY_DELAY_MS; private readonly MAX_RETRY_DELAY_MS; private readonly CACHE_FILE; private cachedIndex; private backgroundRefreshPromise; private isRefreshing; private circuitBreakerFailures; private circuitBreakerLastFailure; private readonly CIRCUIT_BREAKER_THRESHOLD; private readonly CIRCUIT_BREAKER_TIMEOUT_MS; private readonly REFRESH_THRESHOLD; private readonly JITTER_FACTOR; private readonly fileOperations; private readonly DEFAULT_TTL_MS; private readonly DEFAULT_MAX_RETRIES; private readonly DEFAULT_BASE_RETRY_DELAY_MS; private readonly DEFAULT_MAX_RETRY_DELAY_MS; private readonly DEFAULT_FETCH_TIMEOUT_MS; private readonly CHECKSUM_LENGTH; private readonly JSON_INDENT; constructor(config: CollectionIndexManagerConfig); /** * Parse fetch timeout from config or environment variable */ private parseFetchTimeout; /** * Get collection index with stale-while-revalidate pattern * Returns cached data immediately if available, refreshes in background */ getIndex(): Promise; /** * Force refresh the collection index */ forceRefresh(): Promise; /** * Check if cache should be refreshed (within TTL but getting close to expiry) */ private shouldRefreshCache; /** * Check if cache is expired */ private isCacheExpired; /** * Start background refresh without blocking */ private startBackgroundRefresh; /** * Perform background refresh */ private performBackgroundRefresh; /** * Fetch collection index with retry logic and exponential backoff */ private fetchWithRetry; /** * Calculate retry delay with exponential backoff and jitter */ private calculateRetryDelay; /** * Add jitter (±25% randomness) to a delay to prevent thundering herd problems */ private addJitter; /** * Fetch collection index from GitHub */ private fetchCollectionIndex; /** * Validate collection index structure */ private validateIndexStructure; /** * Update cache with new data */ private updateCache; /** * Calculate checksum for data integrity verification */ private calculateChecksum; /** * Load cache from disk */ private loadFromDisk; /** * Save cache to disk */ private saveToDisk; /** * Circuit breaker logic */ private isCircuitBreakerOpen; private recordCircuitBreakerFailure; /** * Utility methods */ private sleep; private getErrorMessage; /** * Get cache statistics for monitoring */ getCacheStats(): { isValid: boolean; age: number; hasCache: boolean; version?: string; totalElements?: number; isRefreshing: boolean; circuitBreakerFailures: number; circuitBreakerOpen: boolean; }; /** * Clear all cache data */ clearCache(): Promise; /** * Wait for any ongoing background refresh to complete */ waitForBackgroundRefresh(): Promise; } //# sourceMappingURL=CollectionIndexManager.d.ts.map