UNPKG

serwist

Version:

A Swiss Army knife for service workers.

352 lines 12.2 kB
import type { HTTPMethod } from "./constants.js"; import type { PrecacheStrategyOptions } from "./lib/strategies/PrecacheStrategy.js"; export type PromiseOrNot<T> = T | Promise<T>; export interface MapLikeObject { [key: string]: any; } /** * Using a plain {@linkcode MapLikeObject} for now, but could extend/restrict this * in the future. */ export type PluginState = MapLikeObject; /** * Options passed to a {@linkcode RouteMatchCallback} function. */ export interface RouteMatchCallbackOptions { event: ExtendableEvent; request: Request; sameOrigin: boolean; url: URL; } /** * The match callback is used to determine if a route should apply for a * particular URL and request. * * When matching occurs in response to a `fetch` event from the client, the `event` * object is also supplied. However, since the match callback can be invoked outside * of a `fetch` event, matching logic should not assume the `event` object will always * be available. * * If the match callback returns a truthy value, the matching route's * handler will be invoked immediately. If the value returned is a non-empty array * or object, that value will be the handler's `options.params` argument. */ export type RouteMatchCallback = (options: RouteMatchCallbackOptions) => any; /** * Options passed to a {@linkcode RouteHandlerCallback} function. */ export interface RouteHandlerCallbackOptions { /** * The event associated with the request. */ event: ExtendableEvent; /** * A request to run this strategy for. */ request: Request; url: URL; params?: string[] | MapLikeObject; } /** * Options passed to a {@linkcode ManualHandlerCallback} function. */ export interface ManualHandlerCallbackOptions { /** * The event associated with the request. */ event: ExtendableEvent; /** * A request to run this strategy for. */ request: Request | string; url?: never; /** * The return value from {@linkcode RouteMatchCallback} (if applicable). */ params?: never; } export type HandlerCallbackOptions = RouteHandlerCallbackOptions | ManualHandlerCallbackOptions; /** * The "handler" callback is invoked whenever a request is matched to a * {@linkcode Route} via its {@linkcode RouteMatchCallback} This handler * callback should return a promise that resolves to a response. * * If a non-empty array or object is returned by the matcher, it * will be passed in as this handler's `options.params` argument. */ export type RouteHandlerCallback = (options: RouteHandlerCallbackOptions) => Promise<Response>; /** * The "handler" callback is invoked whenever a request is matched to a * {@linkcode Route} via its {@linkcode RouteMatchCallback} This handler * callback should return a promise that resolves to a response. * * If a non-empty array or object is returned by the matcher, it * will be passed in as this handler's `options.params` argument. */ export type ManualHandlerCallback = (options: ManualHandlerCallbackOptions) => Promise<Response>; /** * An object with a `handle` method of type {@linkcode RouteHandlerCallback}. * * A {@linkcode Route} object can be created with either an `RouteHandlerCallback` * function or this {@linkcode RouteHandler} object. */ export interface RouteHandlerObject { handle: RouteHandlerCallback; } /** * Either a {@linkcode RouteHandlerCallback} or a {@linkcode RouteHandlerObject}. * Most APIs that accept route handlers take either. */ export type RouteHandler = RouteHandlerCallback | RouteHandlerObject; export interface HandlerWillStartCallbackParam { request: Request; event: ExtendableEvent; state?: PluginState; } export type HandlerWillStartCallback = (param: HandlerWillStartCallbackParam) => Promise<any>; export interface CacheDidUpdateCallbackParam { /** * Name of the cache the responses belong to. This is included in the * broadcast message. */ cacheName: string; /** * The possibly updated response. */ newResponse: Response; /** * The request for the cached entry. */ request: Request; /** * The event that triggered this possible cache update. */ event: ExtendableEvent; /** * The previous cached response. */ oldResponse?: Response | null; state?: PluginState; } export type CacheDidUpdateCallback = (param: CacheDidUpdateCallbackParam) => PromiseOrNot<any>; export interface CacheKeyWillBeUsedCallbackParam { mode: string; request: Request; event: ExtendableEvent; params?: any; state?: PluginState; } export type CacheKeyWillBeUsedCallback = (param: CacheKeyWillBeUsedCallbackParam) => PromiseOrNot<Request | string>; export interface CacheWillUpdateCallbackParam { request: Request; response: Response; event: ExtendableEvent; state?: PluginState; } export type CacheWillUpdateCallback = (param: CacheWillUpdateCallbackParam) => PromiseOrNot<any>; export interface CachedResponseWillBeUsedCallbackParam { /** * Name of the cache the response is in. */ cacheName: string; /** * The original request, which may or may not * contain a Range: header. */ request: Request; /** * The complete cached `Response` object that's been read * from a cache and whose freshness should be checked. */ cachedResponse?: Response; event: ExtendableEvent; matchOptions?: CacheQueryOptions; state?: PluginState; } export type CachedResponseWillBeUsedCallback = (param: CachedResponseWillBeUsedCallbackParam) => PromiseOrNot<any>; export interface FetchDidFailCallbackParam { error: Error; originalRequest: Request; request: Request; event: ExtendableEvent; state?: PluginState; } export type FetchDidFailCallback = (param: FetchDidFailCallbackParam) => PromiseOrNot<any>; export interface FetchDidSucceedCallbackParam { request: Request; response: Response; event: ExtendableEvent; state?: PluginState; } export type FetchDidSucceedCallback = (param: FetchDidSucceedCallbackParam) => PromiseOrNot<Response>; export interface RequestWillFetchCallbackParam { request: Request; event: ExtendableEvent; state?: PluginState; } export type RequestWillFetchCallback = (param: RequestWillFetchCallbackParam) => PromiseOrNot<Request>; export interface HandlerWillRespondCallbackParam { request: Request; response: Response; event: ExtendableEvent; state?: PluginState; } export type HandlerWillRespondCallback = (param: HandlerWillRespondCallbackParam) => PromiseOrNot<Response>; export interface HandlerDidErrorCallbackParam { request: Request; event: ExtendableEvent; error: Error; state?: PluginState; } export type HandlerDidErrorCallback = (param: HandlerDidErrorCallbackParam) => PromiseOrNot<Response | undefined>; export interface HandlerDidRespondCallbackParam { request: Request; event: ExtendableEvent; response?: Response; state?: PluginState; } export type HandlerDidRespondCallback = (param: HandlerDidRespondCallbackParam) => PromiseOrNot<any>; export interface HandlerDidCompleteCallbackParam { request: Request; error?: Error; event: ExtendableEvent; response?: Response; state?: PluginState; } export type HandlerDidCompleteCallback = (param: HandlerDidCompleteCallbackParam) => PromiseOrNot<any>; /** * An object with optional lifecycle callback properties for the fetch and * cache operations. */ export declare interface SerwistPlugin { cacheDidUpdate?: CacheDidUpdateCallback; cachedResponseWillBeUsed?: CachedResponseWillBeUsedCallback; cacheKeyWillBeUsed?: CacheKeyWillBeUsedCallback; cacheWillUpdate?: CacheWillUpdateCallback; fetchDidFail?: FetchDidFailCallback; fetchDidSucceed?: FetchDidSucceedCallback; handlerDidComplete?: HandlerDidCompleteCallback; handlerDidError?: HandlerDidErrorCallback; handlerDidRespond?: HandlerDidRespondCallback; handlerWillRespond?: HandlerWillRespondCallback; handlerWillStart?: HandlerWillStartCallback; requestWillFetch?: RequestWillFetchCallback; } export interface SerwistPluginCallbackParam { cacheDidUpdate: CacheDidUpdateCallbackParam; cachedResponseWillBeUsed: CachedResponseWillBeUsedCallbackParam; cacheKeyWillBeUsed: CacheKeyWillBeUsedCallbackParam; cacheWillUpdate: CacheWillUpdateCallbackParam; fetchDidFail: FetchDidFailCallbackParam; fetchDidSucceed: FetchDidSucceedCallbackParam; handlerDidComplete: HandlerDidCompleteCallbackParam; handlerDidError: HandlerDidErrorCallbackParam; handlerDidRespond: HandlerDidRespondCallbackParam; handlerWillRespond: HandlerWillRespondCallbackParam; handlerWillStart: HandlerWillStartCallbackParam; requestWillFetch: RequestWillFetchCallbackParam; } export interface SerwistGlobalConfig { /** * Whether Serwist should disable development logging. * * @default false */ __WB_DISABLE_DEV_LOGS: boolean; } export interface RuntimeCaching { /** * The HTTP method to match against. The default value of `'GET'` is normally * sufficient, unless you explicitly need to match `'POST'`, `'PUT'`, or * another type of request. * @default "GET" */ method?: HTTPMethod; /** * The match callback determines whether the configured handler will be used to * generate a response for any request that doesn't match one of the precached * URLs. If multiple routes are defined, then the first one to match the request * will be the one that responds. * * This value directly maps to the first parameter passed to * {@linkcode Serwist.registerRoute}. It's recommended to use a * {@linkcode RouteMatchCallback} function for greatest flexibility. */ matcher: RegExp | string | RouteMatchCallback; /** * This determines how the runtime route will generate a response. It * can be a {@linkcode RouteHandler} callback function with custom * response logic. */ handler: RouteHandler; } export interface InstallResult { updatedURLs: string[]; notUpdatedURLs: string[]; } export interface CleanupResult { deletedCacheRequests: string[]; } export declare interface PrecacheEntry { integrity?: string; url: string; revision?: string | null; } export interface PrecacheRouteOptions { /** * Tells Serwist to check the precache for an entry whose URL is the request URL appended * with the specified value. Only applies if the request URL ends with "/". * * @default "index.html" */ directoryIndex?: string | null; /** * An array of `RegExp` objects matching search params that should be removed when looking * for a precache match. */ ignoreURLParametersMatching?: RegExp[]; /** * Tells Serwist to check the precache for an entry whose URL is the request URL appended * with ".html". * * @default true */ cleanURLs?: boolean; /** * A function that should take a URL and return an array of alternative URLs that should * be checked for precache matches. */ urlManipulation?: UrlManipulation; } export interface PrecacheOptions extends PrecacheStrategyOptions, PrecacheRouteOptions { /** * Whether outdated caches should be removed. * * @default false */ cleanupOutdatedCaches?: boolean; /** * The number of precache requests that should be made concurrently. * * @default 10 */ concurrency?: number; /** * An URL that should point to a HTML file with which navigation requests for URLs that aren't * precached will be fulfilled. */ navigateFallback?: string; /** * URLs that should be allowed to use the `navigateFallback` handler. */ navigateFallbackAllowlist?: RegExp[]; /** * URLs that should not be allowed to use the `navigateFallback` handler. This takes precedence * over `navigateFallbackAllowlist`. */ navigateFallbackDenylist?: RegExp[]; } export type UrlManipulation = ({ url }: { url: URL; }) => URL[]; //# sourceMappingURL=types.d.ts.map