///
///
import type { OutgoingHttpHeaders } from 'http';
import type RenderResult from '../render-result';
import type { Revalidate } from '../lib/revalidate';
import type { RouteKind } from '../../server/future/route-kind';
export interface ResponseCacheBase {
get(key: string | null, responseGenerator: ResponseGenerator, context: {
isOnDemandRevalidate?: boolean;
isPrefetch?: boolean;
incrementalCache: IncrementalCache;
/**
* This is a hint to the cache to help it determine what kind of route
* this is so it knows where to look up the cache entry from. If not
* provided it will test the filesystem to check.
*/
routeKind?: RouteKind;
}): Promise;
}
export interface CachedFetchValue {
kind: 'FETCH';
data: {
headers: {
[k: string]: string;
};
body: string;
url: string;
status?: number;
};
tags?: string[];
revalidate: number;
}
export interface CachedRedirectValue {
kind: 'REDIRECT';
props: Object;
}
interface CachedPageValue {
kind: 'PAGE';
html: RenderResult;
postponed: string | undefined;
pageData: Object;
status: number | undefined;
headers: OutgoingHttpHeaders | undefined;
}
export interface CachedRouteValue {
kind: 'ROUTE';
body: Buffer;
status: number;
headers: OutgoingHttpHeaders;
}
export interface CachedImageValue {
kind: 'IMAGE';
etag: string;
buffer: Buffer;
extension: string;
isMiss?: boolean;
isStale?: boolean;
}
interface IncrementalCachedPageValue {
kind: 'PAGE';
html: string;
pageData: Object;
postponed: string | undefined;
headers: OutgoingHttpHeaders | undefined;
status: number | undefined;
}
export type IncrementalCacheEntry = {
curRevalidate?: number | false;
revalidateAfter: number | false;
isStale?: boolean | -1;
value: IncrementalCacheValue | null;
};
export type IncrementalCacheValue = CachedRedirectValue | IncrementalCachedPageValue | CachedImageValue | CachedFetchValue | CachedRouteValue;
export type ResponseCacheValue = CachedRedirectValue | CachedPageValue | CachedImageValue | CachedRouteValue;
export type ResponseCacheEntry = {
revalidate?: Revalidate;
value: ResponseCacheValue | null;
isStale?: boolean | -1;
isMiss?: boolean;
};
/**
* @param hasResolved whether the responseGenerator has resolved it's promise
* @param previousCacheEntry the previous cache entry if it exists or the current
*/
export type ResponseGenerator = (hasResolved: boolean, previousCacheEntry?: IncrementalCacheItem, isRevalidating?: boolean) => Promise;
export type IncrementalCacheItem = {
revalidateAfter?: number | false;
curRevalidate?: number | false;
revalidate?: number | false;
value: IncrementalCacheValue | null;
isStale?: boolean | -1;
isMiss?: boolean;
} | null;
export type IncrementalCacheKindHint = 'app' | 'pages' | 'fetch';
export interface IncrementalCache {
get: (key: string, ctx?: {
/**
* The kind of cache entry to get. If not provided it will try to
* determine the kind from the filesystem.
*/
kindHint?: IncrementalCacheKindHint;
}) => Promise;
set: (key: string, data: IncrementalCacheValue | null, ctx: {
revalidate: Revalidate;
}) => Promise;
}
export {};