index.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _renderResult = _interopRequireDefault(require("../render-result"));
  7. var _types = _interopRequireWildcard(require("./types"));
  8. Object.keys(_types).forEach(function(key) {
  9. if (key === "default" || key === "__esModule") return;
  10. if (key in exports && exports[key] === _types[key]) return;
  11. Object.defineProperty(exports, key, {
  12. enumerable: true,
  13. get: function() {
  14. return _types[key];
  15. }
  16. });
  17. });
  18. class ResponseCache {
  19. constructor(incrementalCache, minimalMode){
  20. this.incrementalCache = incrementalCache;
  21. this.pendingResponses = new Map();
  22. this.minimalMode = minimalMode;
  23. }
  24. get(key, responseGenerator, context) {
  25. var ref2;
  26. // ensure manual revalidate doesn't block normal requests
  27. const pendingResponseKey = key ? `${key}-${context.isManualRevalidate ? "1" : "0"}` : null;
  28. const pendingResponse = pendingResponseKey ? this.pendingResponses.get(pendingResponseKey) : null;
  29. if (pendingResponse) {
  30. return pendingResponse;
  31. }
  32. let resolver = ()=>{};
  33. let rejecter = ()=>{};
  34. const promise = new Promise((resolve, reject)=>{
  35. resolver = resolve;
  36. rejecter = reject;
  37. });
  38. if (pendingResponseKey) {
  39. this.pendingResponses.set(pendingResponseKey, promise);
  40. }
  41. let resolved = false;
  42. const resolve1 = (cacheEntry)=>{
  43. if (pendingResponseKey) {
  44. // Ensure all reads from the cache get the latest value.
  45. this.pendingResponses.set(pendingResponseKey, Promise.resolve(cacheEntry));
  46. }
  47. if (!resolved) {
  48. resolved = true;
  49. resolver(cacheEntry);
  50. }
  51. };
  52. // we keep the previous cache entry around to leverage
  53. // when the incremental cache is disabled in minimal mode
  54. if (pendingResponseKey && this.minimalMode && ((ref2 = this.previousCacheItem) == null ? void 0 : ref2.key) === pendingResponseKey && this.previousCacheItem.expiresAt > Date.now()) {
  55. resolve1(this.previousCacheItem.entry);
  56. this.pendingResponses.delete(pendingResponseKey);
  57. return promise;
  58. }
  59. (async ()=>{
  60. let cachedResponse = null;
  61. try {
  62. cachedResponse = key && !this.minimalMode ? await this.incrementalCache.get(key) : null;
  63. if (cachedResponse && !context.isManualRevalidate) {
  64. var ref;
  65. resolve1({
  66. isStale: cachedResponse.isStale,
  67. revalidate: cachedResponse.curRevalidate,
  68. value: ((ref = cachedResponse.value) == null ? void 0 : ref.kind) === "PAGE" ? {
  69. kind: "PAGE",
  70. html: _renderResult.default.fromStatic(cachedResponse.value.html),
  71. pageData: cachedResponse.value.pageData
  72. } : cachedResponse.value
  73. });
  74. if (!cachedResponse.isStale || context.isPrefetch) {
  75. // The cached value is still valid, so we don't need
  76. // to update it yet.
  77. return;
  78. }
  79. }
  80. const cacheEntry = await responseGenerator(resolved, !!cachedResponse);
  81. const resolveValue = cacheEntry === null ? null : {
  82. ...cacheEntry,
  83. isMiss: !cachedResponse
  84. };
  85. // for manual revalidate wait to resolve until cache is set
  86. if (!context.isManualRevalidate) {
  87. resolve1(resolveValue);
  88. }
  89. if (key && cacheEntry && typeof cacheEntry.revalidate !== "undefined") {
  90. if (this.minimalMode) {
  91. this.previousCacheItem = {
  92. key: pendingResponseKey || key,
  93. entry: cacheEntry,
  94. expiresAt: Date.now() + 1000
  95. };
  96. } else {
  97. var ref1;
  98. await this.incrementalCache.set(key, ((ref1 = cacheEntry.value) == null ? void 0 : ref1.kind) === "PAGE" ? {
  99. kind: "PAGE",
  100. html: cacheEntry.value.html.toUnchunkedString(),
  101. pageData: cacheEntry.value.pageData
  102. } : cacheEntry.value, cacheEntry.revalidate);
  103. }
  104. } else {
  105. this.previousCacheItem = undefined;
  106. }
  107. if (context.isManualRevalidate) {
  108. resolve1(resolveValue);
  109. }
  110. } catch (err) {
  111. // when a getStaticProps path is erroring we automatically re-set the
  112. // existing cache under a new expiration to prevent non-stop retrying
  113. if (cachedResponse && key) {
  114. await this.incrementalCache.set(key, cachedResponse.value, Math.min(Math.max(cachedResponse.revalidate || 3, 3), 30));
  115. }
  116. // while revalidating in the background we can't reject as
  117. // we already resolved the cache entry so log the error here
  118. if (resolved) {
  119. console.error(err);
  120. } else {
  121. rejecter(err);
  122. }
  123. } finally{
  124. if (pendingResponseKey) {
  125. this.pendingResponses.delete(pendingResponseKey);
  126. }
  127. }
  128. })();
  129. return promise;
  130. }
  131. }
  132. exports.default = ResponseCache;
  133. function _interopRequireDefault(obj) {
  134. return obj && obj.__esModule ? obj : {
  135. default: obj
  136. };
  137. }
  138. function _getRequireWildcardCache() {
  139. if (typeof WeakMap !== "function") return null;
  140. var cache = new WeakMap();
  141. _getRequireWildcardCache = function() {
  142. return cache;
  143. };
  144. return cache;
  145. }
  146. function _interopRequireWildcard(obj) {
  147. if (obj && obj.__esModule) {
  148. return obj;
  149. }
  150. if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
  151. return {
  152. default: obj
  153. };
  154. }
  155. var cache = _getRequireWildcardCache();
  156. if (cache && cache.has(obj)) {
  157. return cache.get(obj);
  158. }
  159. var newObj = {};
  160. var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
  161. for(var key in obj){
  162. if (Object.prototype.hasOwnProperty.call(obj, key)) {
  163. var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
  164. if (desc && (desc.get || desc.set)) {
  165. Object.defineProperty(newObj, key, desc);
  166. } else {
  167. newObj[key] = obj[key];
  168. }
  169. }
  170. }
  171. newObj.default = obj;
  172. if (cache) {
  173. cache.set(obj, newObj);
  174. }
  175. return newObj;
  176. }
  177. //# sourceMappingURL=index.js.map