create project

This commit is contained in:
ismailsosic
2022-12-27 12:05:56 +01:00
parent 2a33a2d3de
commit cd2143287c
16035 changed files with 2489703 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
import type { IncrementalCache, ResponseCacheEntry, ResponseGenerator } from './types';
export * from './types';
export default class ResponseCache {
pendingResponses: Map<string, Promise<ResponseCacheEntry | null>>;
previousCacheItem?: {
key: string;
entry: ResponseCacheEntry | null;
expiresAt: number;
};
minimalMode?: boolean;
constructor(minimalMode: boolean);
get(key: string | null, responseGenerator: ResponseGenerator, context: {
isManualRevalidate?: boolean;
isPrefetch?: boolean;
incrementalCache: IncrementalCache;
}): Promise<ResponseCacheEntry | null>;
}

View File

@@ -0,0 +1,181 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _renderResult = _interopRequireDefault(require("../render-result"));
var _types = _interopRequireWildcard(require("./types"));
Object.keys(_types).forEach(function(key) {
if (key === "default" || key === "__esModule") return;
if (key in exports && exports[key] === _types[key]) return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function() {
return _types[key];
}
});
});
class ResponseCache {
constructor(minimalMode){
this.pendingResponses = new Map();
this.minimalMode = minimalMode;
}
get(key, responseGenerator, context) {
var ref3;
const { incrementalCache } = context;
// ensure manual revalidate doesn't block normal requests
const pendingResponseKey = key ? `${key}-${context.isManualRevalidate ? "1" : "0"}` : null;
const pendingResponse = pendingResponseKey ? this.pendingResponses.get(pendingResponseKey) : null;
if (pendingResponse) {
return pendingResponse;
}
let resolver = ()=>{};
let rejecter = ()=>{};
const promise = new Promise((resolve, reject)=>{
resolver = resolve;
rejecter = reject;
});
if (pendingResponseKey) {
this.pendingResponses.set(pendingResponseKey, promise);
}
let resolved = false;
const resolve1 = (cacheEntry)=>{
if (pendingResponseKey) {
// Ensure all reads from the cache get the latest value.
this.pendingResponses.set(pendingResponseKey, Promise.resolve(cacheEntry));
}
if (!resolved) {
resolved = true;
resolver(cacheEntry);
}
};
// we keep the previous cache entry around to leverage
// when the incremental cache is disabled in minimal mode
if (pendingResponseKey && this.minimalMode && ((ref3 = this.previousCacheItem) == null ? void 0 : ref3.key) === pendingResponseKey && this.previousCacheItem.expiresAt > Date.now()) {
resolve1(this.previousCacheItem.entry);
this.pendingResponses.delete(pendingResponseKey);
return promise;
}
(async ()=>{
let cachedResponse = null;
try {
cachedResponse = key && !this.minimalMode ? await incrementalCache.get(key) : null;
if (cachedResponse && !context.isManualRevalidate) {
var ref, ref1;
if (((ref = cachedResponse.value) == null ? void 0 : ref.kind) === "FETCH") {
throw new Error(`invariant: unexpected cachedResponse of kind fetch in response cache`);
}
resolve1({
isStale: cachedResponse.isStale,
revalidate: cachedResponse.curRevalidate,
value: ((ref1 = cachedResponse.value) == null ? void 0 : ref1.kind) === "PAGE" ? {
kind: "PAGE",
html: _renderResult.default.fromStatic(cachedResponse.value.html),
pageData: cachedResponse.value.pageData
} : cachedResponse.value
});
if (!cachedResponse.isStale || context.isPrefetch) {
// The cached value is still valid, so we don't need
// to update it yet.
return;
}
}
const cacheEntry = await responseGenerator(resolved, !!cachedResponse);
const resolveValue = cacheEntry === null ? null : {
...cacheEntry,
isMiss: !cachedResponse
};
// for manual revalidate wait to resolve until cache is set
if (!context.isManualRevalidate) {
resolve1(resolveValue);
}
if (key && cacheEntry && typeof cacheEntry.revalidate !== "undefined") {
if (this.minimalMode) {
this.previousCacheItem = {
key: pendingResponseKey || key,
entry: cacheEntry,
expiresAt: Date.now() + 1000
};
} else {
var ref2;
await incrementalCache.set(key, ((ref2 = cacheEntry.value) == null ? void 0 : ref2.kind) === "PAGE" ? {
kind: "PAGE",
html: cacheEntry.value.html.toUnchunkedString(),
pageData: cacheEntry.value.pageData
} : cacheEntry.value, cacheEntry.revalidate);
}
} else {
this.previousCacheItem = undefined;
}
if (context.isManualRevalidate) {
resolve1(resolveValue);
}
} catch (err) {
// when a getStaticProps path is erroring we automatically re-set the
// existing cache under a new expiration to prevent non-stop retrying
if (cachedResponse && key) {
await incrementalCache.set(key, cachedResponse.value, Math.min(Math.max(cachedResponse.revalidate || 3, 3), 30));
}
// while revalidating in the background we can't reject as
// we already resolved the cache entry so log the error here
if (resolved) {
console.error(err);
} else {
rejecter(err);
}
} finally{
if (pendingResponseKey) {
this.pendingResponses.delete(pendingResponseKey);
}
}
})();
return promise;
}
}
exports.default = ResponseCache;
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache() {
if (typeof WeakMap !== "function") return null;
var cache = new WeakMap();
_getRequireWildcardCache = function() {
return cache;
};
return cache;
}
function _interopRequireWildcard(obj) {
if (obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache();
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../server/response-cache/index.ts"],"names":["ResponseCache","constructor","minimalMode","pendingResponses","Map","get","key","responseGenerator","context","incrementalCache","pendingResponseKey","isManualRevalidate","pendingResponse","resolver","rejecter","promise","Promise","resolve","reject","set","resolved","cacheEntry","previousCacheItem","expiresAt","Date","now","entry","delete","cachedResponse","value","kind","Error","isStale","revalidate","curRevalidate","html","RenderResult","fromStatic","pageData","isPrefetch","resolveValue","isMiss","toUnchunkedString","undefined","err","Math","min","max","console","error"],"mappings":"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"}

View File

@@ -0,0 +1,66 @@
/// <reference types="node" />
import type RenderResult from '../render-result';
export interface ResponseCacheBase {
get(key: string | null, responseGenerator: ResponseGenerator, context: {
isManualRevalidate?: boolean;
isPrefetch?: boolean;
incrementalCache: IncrementalCache;
}): Promise<ResponseCacheEntry | null>;
}
export interface CachedFetchValue {
kind: 'FETCH';
data: any;
isStale: boolean;
age: number;
revalidate: number;
}
export interface CachedRedirectValue {
kind: 'REDIRECT';
props: Object;
}
interface CachedPageValue {
kind: 'PAGE';
html: RenderResult;
pageData: Object;
}
export interface CachedImageValue {
kind: 'IMAGE';
etag: string;
buffer: Buffer;
extension: string;
isMiss?: boolean;
isStale?: boolean;
}
interface IncrementalCachedPageValue {
kind: 'PAGE';
html: string;
pageData: Object;
}
export declare type IncrementalCacheEntry = {
curRevalidate?: number | false;
revalidateAfter: number | false;
isStale?: boolean;
value: IncrementalCacheValue | null;
};
export declare type IncrementalCacheValue = CachedRedirectValue | IncrementalCachedPageValue | CachedImageValue | CachedFetchValue;
export declare type ResponseCacheValue = CachedRedirectValue | CachedPageValue | CachedImageValue;
export declare type ResponseCacheEntry = {
revalidate?: number | false;
value: ResponseCacheValue | null;
isStale?: boolean;
isMiss?: boolean;
};
export declare type ResponseGenerator = (hasResolved: boolean, hadCache: boolean) => Promise<ResponseCacheEntry | null>;
export declare type IncrementalCacheItem = {
revalidateAfter?: number | false;
curRevalidate?: number | false;
revalidate?: number | false;
value: IncrementalCacheValue | null;
isStale?: boolean;
isMiss?: boolean;
} | null;
export interface IncrementalCache {
get: (key: string) => Promise<IncrementalCacheItem>;
set: (key: string, data: IncrementalCacheValue | null, revalidate?: number | false) => Promise<void>;
}
export {};

View File

@@ -0,0 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
//# sourceMappingURL=types.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../server/response-cache/types.ts"],"names":[],"mappings":"AAAA"}

View File

@@ -0,0 +1,20 @@
import type { ResponseCacheEntry, ResponseGenerator } from './types';
/**
* In the web server, there is currently no incremental cache provided and we
* always SSR the page.
*/
export default class WebResponseCache {
pendingResponses: Map<string, Promise<ResponseCacheEntry | null>>;
previousCacheItem?: {
key: string;
entry: ResponseCacheEntry | null;
expiresAt: number;
};
minimalMode?: boolean;
constructor(minimalMode: boolean);
get(key: string | null, responseGenerator: ResponseGenerator, context: {
isManualRevalidate?: boolean;
isPrefetch?: boolean;
incrementalCache: any;
}): Promise<ResponseCacheEntry | null>;
}

View File

@@ -0,0 +1,88 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
class WebResponseCache {
constructor(minimalMode){
this.pendingResponses = new Map();
this.minimalMode = minimalMode;
}
get(key, responseGenerator, context) {
var ref;
// ensure manual revalidate doesn't block normal requests
const pendingResponseKey = key ? `${key}-${context.isManualRevalidate ? "1" : "0"}` : null;
const pendingResponse = pendingResponseKey ? this.pendingResponses.get(pendingResponseKey) : null;
if (pendingResponse) {
return pendingResponse;
}
let resolver = ()=>{};
let rejecter = ()=>{};
const promise = new Promise((resolve, reject)=>{
resolver = resolve;
rejecter = reject;
});
if (pendingResponseKey) {
this.pendingResponses.set(pendingResponseKey, promise);
}
let resolved = false;
const resolve1 = (cacheEntry)=>{
if (pendingResponseKey) {
// Ensure all reads from the cache get the latest value.
this.pendingResponses.set(pendingResponseKey, Promise.resolve(cacheEntry));
}
if (!resolved) {
resolved = true;
resolver(cacheEntry);
}
};
// we keep the previous cache entry around to leverage
// when the incremental cache is disabled in minimal mode
if (pendingResponseKey && this.minimalMode && ((ref = this.previousCacheItem) == null ? void 0 : ref.key) === pendingResponseKey && this.previousCacheItem.expiresAt > Date.now()) {
resolve1(this.previousCacheItem.entry);
this.pendingResponses.delete(pendingResponseKey);
return promise;
}
(async ()=>{
try {
const cacheEntry = await responseGenerator(resolved, false);
const resolveValue = cacheEntry === null ? null : {
...cacheEntry,
isMiss: true
};
// for manual revalidate wait to resolve until cache is set
if (!context.isManualRevalidate) {
resolve1(resolveValue);
}
if (key && cacheEntry && typeof cacheEntry.revalidate !== "undefined") {
this.previousCacheItem = {
key: pendingResponseKey || key,
entry: cacheEntry,
expiresAt: Date.now() + 1000
};
} else {
this.previousCacheItem = undefined;
}
if (context.isManualRevalidate) {
resolve1(resolveValue);
}
} catch (err) {
// while revalidating in the background we can't reject as
// we already resolved the cache entry so log the error here
if (resolved) {
console.error(err);
} else {
rejecter(err);
}
} finally{
if (pendingResponseKey) {
this.pendingResponses.delete(pendingResponseKey);
}
}
})();
return promise;
}
}
exports.default = WebResponseCache;
//# sourceMappingURL=web.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../server/response-cache/web.ts"],"names":["WebResponseCache","constructor","minimalMode","pendingResponses","Map","get","key","responseGenerator","context","pendingResponseKey","isManualRevalidate","pendingResponse","resolver","rejecter","promise","Promise","resolve","reject","set","resolved","cacheEntry","previousCacheItem","expiresAt","Date","now","entry","delete","resolveValue","isMiss","revalidate","undefined","err","console","error"],"mappings":"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"}