web.js 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. class WebResponseCache {
  7. constructor(minimalMode){
  8. this.pendingResponses = new Map();
  9. this.minimalMode = minimalMode;
  10. }
  11. get(key, responseGenerator, context) {
  12. var ref;
  13. // ensure manual revalidate doesn't block normal requests
  14. const pendingResponseKey = key ? `${key}-${context.isManualRevalidate ? "1" : "0"}` : null;
  15. const pendingResponse = pendingResponseKey ? this.pendingResponses.get(pendingResponseKey) : null;
  16. if (pendingResponse) {
  17. return pendingResponse;
  18. }
  19. let resolver = ()=>{};
  20. let rejecter = ()=>{};
  21. const promise = new Promise((resolve, reject)=>{
  22. resolver = resolve;
  23. rejecter = reject;
  24. });
  25. if (pendingResponseKey) {
  26. this.pendingResponses.set(pendingResponseKey, promise);
  27. }
  28. let resolved = false;
  29. const resolve1 = (cacheEntry)=>{
  30. if (pendingResponseKey) {
  31. // Ensure all reads from the cache get the latest value.
  32. this.pendingResponses.set(pendingResponseKey, Promise.resolve(cacheEntry));
  33. }
  34. if (!resolved) {
  35. resolved = true;
  36. resolver(cacheEntry);
  37. }
  38. };
  39. // we keep the previous cache entry around to leverage
  40. // when the incremental cache is disabled in minimal mode
  41. if (pendingResponseKey && this.minimalMode && ((ref = this.previousCacheItem) == null ? void 0 : ref.key) === pendingResponseKey && this.previousCacheItem.expiresAt > Date.now()) {
  42. resolve1(this.previousCacheItem.entry);
  43. this.pendingResponses.delete(pendingResponseKey);
  44. return promise;
  45. }
  46. (async ()=>{
  47. try {
  48. const cacheEntry = await responseGenerator(resolved, false);
  49. const resolveValue = cacheEntry === null ? null : {
  50. ...cacheEntry,
  51. isMiss: true
  52. };
  53. // for manual revalidate wait to resolve until cache is set
  54. if (!context.isManualRevalidate) {
  55. resolve1(resolveValue);
  56. }
  57. if (key && cacheEntry && typeof cacheEntry.revalidate !== "undefined") {
  58. this.previousCacheItem = {
  59. key: pendingResponseKey || key,
  60. entry: cacheEntry,
  61. expiresAt: Date.now() + 1000
  62. };
  63. } else {
  64. this.previousCacheItem = undefined;
  65. }
  66. if (context.isManualRevalidate) {
  67. resolve1(resolveValue);
  68. }
  69. } catch (err) {
  70. // while revalidating in the background we can't reject as
  71. // we already resolved the cache entry so log the error here
  72. if (resolved) {
  73. console.error(err);
  74. } else {
  75. rejecter(err);
  76. }
  77. } finally{
  78. if (pendingResponseKey) {
  79. this.pendingResponses.delete(pendingResponseKey);
  80. }
  81. }
  82. })();
  83. return promise;
  84. }
  85. }
  86. exports.default = WebResponseCache;
  87. //# sourceMappingURL=web.js.map