UNPKG

@push.rocks/webrequest

Version:

Modern, fetch-compatible web request library with intelligent HTTP caching, retry strategies, and fault tolerance.

118 lines 6.87 kB
/** * Cache manager - orchestrates caching logic */ import { CacheStore } from './cache.store.js'; import { getStrategyHandler, } from './cache.strategies.js'; import { extractCacheMetadata } from './cache.headers.js'; export class CacheManager { constructor(dbName, storeName) { this.cacheStore = new CacheStore(dbName, storeName); } /** * Execute a request with caching */ async execute(request, options, fetchFn) { // Determine the cache strategy const strategy = this.determineStrategy(request, options); // If no caching (no-store or network-only), bypass cache if (strategy === 'network-only') { const response = await fetchFn(request); return { response, fromCache: false, revalidated: false, }; } // Generate cache key const cacheKey = this.generateCacheKey(request, options); // Get strategy handler const handler = getStrategyHandler(strategy); // Execute strategy const context = { request, cacheKey, cacheStore: this.cacheStore, fetchFn, logging: options.logging, }; return await handler.execute(context); } /** * Determine the caching strategy based on options and request */ determineStrategy(request, options) { // If explicit strategy provided, use it if (options.cacheStrategy) { return options.cacheStrategy; } // Map standard cache modes to strategies if (options.cache) { return this.mapCacheModeToStrategy(options.cache); } // Check request cache mode if (request.cache) { return this.mapCacheModeToStrategy(request.cache); } // Default strategy return 'network-first'; } /** * Map standard fetch cache modes to our strategies */ mapCacheModeToStrategy(cacheMode) { switch (cacheMode) { case 'default': return 'network-first'; case 'no-store': case 'reload': return 'network-only'; case 'no-cache': return 'network-first'; // Will use revalidation case 'force-cache': return 'cache-first'; case 'only-if-cached': return 'cache-only'; default: return 'network-first'; } } /** * Generate cache key */ generateCacheKey(request, options) { // If custom cache key provided if (options.cacheKey) { if (typeof options.cacheKey === 'function') { return options.cacheKey(request); } return options.cacheKey; } // Default cache key generation return this.cacheStore.generateCacheKey(request); } /** * Clear the cache */ async clear() { await this.cacheStore.clear(); } /** * Delete a specific cache entry */ async delete(cacheKey) { await this.cacheStore.delete(cacheKey); } /** * Check if a cache entry exists */ async has(cacheKey) { return await this.cacheStore.has(cacheKey); } /** * Get the underlying cache store */ getStore() { return this.cacheStore; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUubWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NhY2hlL2NhY2hlLm1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFPSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUNMLGtCQUFrQixHQUduQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTFELE1BQU0sT0FBTyxZQUFZO0lBR3ZCLFlBQVksTUFBZSxFQUFFLFNBQWtCO1FBQzdDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxPQUFPLENBQ2xCLE9BQWdCLEVBQ2hCLE9BQThDLEVBQzlDLE9BQWdEO1FBRWhELCtCQUErQjtRQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTFELHlEQUF5RDtRQUN6RCxJQUFJLFFBQVEsS0FBSyxjQUFjLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxPQUFPO2dCQUNMLFFBQVE7Z0JBQ1IsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLFdBQVcsRUFBRSxLQUFLO2FBQ25CLENBQUM7UUFDSixDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFekQsdUJBQXVCO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDLG1CQUFtQjtRQUNuQixNQUFNLE9BQU8sR0FB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