UNPKG

@push.rocks/webrequest

Version:

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

126 lines 7.3 kB
/** * Cache storage layer using IndexedDB via @push.rocks/webstore */ import * as plugins from '../webrequest.plugins.js'; export class CacheStore { constructor(dbName = 'webrequest-v4', storeName = 'cache') { this.webstore = new plugins.webstore.WebStore({ dbName, storeName, }); // Initialize the store this.initPromise = this.init(); } /** * Initialize the store */ async init() { // WebStore handles initialization internally // This method exists for future extension if needed } /** * Generate a cache key from a request */ generateCacheKey(request) { // Use URL + method as the base key const url = request.url; const method = request.method; // For GET requests, just use the URL if (method === 'GET') { return url; } // For other methods, include the method return `${method}:${url}`; } /** * Store a response in the cache */ async set(cacheKey, entry) { await this.initPromise; await this.webstore.set(cacheKey, entry); } /** * Retrieve a cached response */ async get(cacheKey) { await this.initPromise; try { const entry = (await this.webstore.get(cacheKey)); return entry || null; } catch (error) { // If entry doesn't exist or is corrupted, return null return null; } } /** * Check if a cache entry exists */ async has(cacheKey) { await this.initPromise; return await this.webstore.check(cacheKey); } /** * Delete a cache entry */ async delete(cacheKey) { await this.initPromise; await this.webstore.delete(cacheKey); } /** * Clear all cache entries */ async clear() { await this.initPromise; await this.webstore.clear(); } /** * Create a Response object from a cache entry */ responseFromCacheEntry(entry) { const headers = new Headers(entry.headers); return new Response(entry.response, { status: entry.status, statusText: entry.statusText, headers, }); } /** * Create a cache entry from a Response object */ async cacheEntryFromResponse(url, response, metadata) { // Clone the response so we can read it multiple times const clonedResponse = response.clone(); const buffer = await clonedResponse.arrayBuffer(); // Extract headers const headers = {}; clonedResponse.headers.forEach((value, key) => { headers[key] = value; }); return { response: buffer, headers, timestamp: Date.now(), etag: metadata?.etag || clonedResponse.headers.get('etag') || undefined, lastModified: metadata?.lastModified || clonedResponse.headers.get('last-modified') || undefined, maxAge: metadata?.maxAge, url, status: clonedResponse.status, statusText: clonedResponse.statusText, }; } /** * Prune expired entries (garbage collection) * Returns the number of entries deleted */ async pruneExpired() { await this.initPromise; // Note: WebStore doesn't provide a way to list all keys // This would need to be implemented if we want automatic cleanup // For now, we rely on individual entry checks return 0; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jYWNoZS9jYWNoZS5zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sS0FBSyxPQUFPLE1BQU0sMEJBQTBCLENBQUM7QUFHcEQsTUFBTSxPQUFPLFVBQVU7SUFJckIsWUFBWSxTQUFpQixlQUFlLEVBQUUsWUFBb0IsT0FBTztRQUN2RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDNUMsTUFBTTtZQUNOLFNBQVM7U0FDVixDQUFDLENBQUM7UUFFSCx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLElBQUk7UUFDaEIsNkNBQTZDO1FBQzdDLG9EQUFvRDtJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0IsQ0FBQyxPQUFnQjtRQUN0QyxtQ0FBbUM7UUFDbkMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRTlCLHFDQUFxQztRQUNyQyxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNyQixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFFRCx3Q0FBd0M7UUFDeEMsT0FBTyxHQUFHLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQWdCLEVBQUUsS0FBa0I7UUFDbkQsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7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