| import { DetachedPromise } from '../../lib/detached-promise'; |
| |
| |
| |
| export default class WebResponseCache { |
| constructor(minimalMode){ |
| this.pendingResponses = new Map(); |
| |
| |
| Object.assign(this, { |
| minimalMode |
| }); |
| } |
| get(key, responseGenerator, context) { |
| var _this_previousCacheItem; |
| |
| const pendingResponseKey = key ? `${key}-${context.isOnDemandRevalidate ? '1' : '0'}` : null; |
| const pendingResponse = pendingResponseKey ? this.pendingResponses.get(pendingResponseKey) : null; |
| if (pendingResponse) { |
| return pendingResponse; |
| } |
| const { promise, resolve: resolver, reject: rejecter } = new DetachedPromise(); |
| if (pendingResponseKey) { |
| this.pendingResponses.set(pendingResponseKey, promise); |
| } |
| let hasResolved = false; |
| const resolve = (cacheEntry)=>{ |
| if (pendingResponseKey) { |
| |
| this.pendingResponses.set(pendingResponseKey, Promise.resolve(cacheEntry)); |
| } |
| if (!hasResolved) { |
| hasResolved = true; |
| resolver(cacheEntry); |
| } |
| }; |
| |
| |
| if (pendingResponseKey && this.minimalMode && ((_this_previousCacheItem = this.previousCacheItem) == null ? void 0 : _this_previousCacheItem.key) === pendingResponseKey && this.previousCacheItem.expiresAt > Date.now()) { |
| resolve(this.previousCacheItem.entry); |
| this.pendingResponses.delete(pendingResponseKey); |
| return promise; |
| } |
| |
| |
| |
| ; |
| (async ()=>{ |
| try { |
| const cacheEntry = await responseGenerator({ |
| hasResolved |
| }); |
| const resolveValue = cacheEntry === null ? null : { |
| ...cacheEntry, |
| isMiss: true |
| }; |
| |
| if (!context.isOnDemandRevalidate) { |
| resolve(resolveValue); |
| } |
| if (key && cacheEntry && cacheEntry.cacheControl) { |
| this.previousCacheItem = { |
| key: pendingResponseKey || key, |
| entry: cacheEntry, |
| expiresAt: Date.now() + 1000 |
| }; |
| } else { |
| this.previousCacheItem = undefined; |
| } |
| if (context.isOnDemandRevalidate) { |
| resolve(resolveValue); |
| } |
| } catch (err) { |
| |
| |
| if (hasResolved) { |
| console.error(err); |
| } else { |
| rejecter(err); |
| } |
| } finally{ |
| if (pendingResponseKey) { |
| this.pendingResponses.delete(pendingResponseKey); |
| } |
| } |
| })(); |
| return promise; |
| } |
| } |
|
|
| |