UNPKG

@serwist/window

Version:

Simplifies communications with Serwist packages running in the service worker

246 lines 8.5 kB
//#region src/messageSW.d.ts /** * Sends a data object to a service worker via `postMessage` and resolves with * a response (if any). * * A response can be sent by calling `event.ports[0].postMessage(...)`, which will * resolve the promise returned by `messageSW()`. If no response is sent, the promise * will never resolve. * * @param sw The service worker to send the message to. * @param data An object to send to the service worker. * @returns */ declare const messageSW: (sw: ServiceWorker, data: any) => Promise<any>; //#endregion //#region src/utils/SerwistEvent.d.ts /** * A minimal `Event` subclass shim. * This doesn't *actually* subclass `Event` because not all browsers support * constructable `EventTarget`, and using a real `Event` will error. * @private */ declare class SerwistEvent<K extends keyof SerwistEventMap> { type: K; target?: SerwistEventTarget; sw?: ServiceWorker; originalEvent?: Event; isExternal?: boolean; constructor(type: K, props: Omit<SerwistEventMap[K], "target" | "type">); } interface SerwistMessageEvent extends SerwistEvent<"message"> { data: any; originalEvent: Event; ports: readonly MessagePort[]; } interface SerwistLifecycleEvent extends SerwistEvent<keyof SerwistLifecycleEventMap> { isUpdate?: boolean; } interface SerwistLifecycleWaitingEvent extends SerwistLifecycleEvent { wasWaitingBeforeRegister?: boolean; } interface SerwistLifecycleEventMap { installing: SerwistLifecycleEvent; installed: SerwistLifecycleEvent; waiting: SerwistLifecycleWaitingEvent; activating: SerwistLifecycleEvent; activated: SerwistLifecycleEvent; controlling: SerwistLifecycleEvent; redundant: SerwistLifecycleEvent; } interface SerwistEventMap extends SerwistLifecycleEventMap { message: SerwistMessageEvent; } //#endregion //#region src/utils/SerwistEventTarget.d.ts /** * A minimal `EventTarget` shim. * This is necessary because not all browsers support constructable * `EventTarget`, so using a real `EventTarget` will error. * @private */ declare class SerwistEventTarget { private readonly _eventListenerRegistry; /** * @param type * @param listener * @private */ addEventListener<K extends keyof SerwistEventMap>(type: K, listener: (event: SerwistEventMap[K]) => any): void; /** * @param type * @param listener * @private */ removeEventListener<K extends keyof SerwistEventMap>(type: K, listener: (event: SerwistEventMap[K]) => any): void; /** * @param event * @private */ dispatchEvent(event: SerwistEvent<any>): void; /** * Returns a Set of listeners associated with the passed event type. * If no handlers have been registered, an empty Set is returned. * * @param type The event type. * @returns An array of handler functions. * @private */ private _getEventListenersByType; } //#endregion //#region src/Serwist.d.ts /** * A class to aid in handling service worker registration, updates, and * reacting to service worker lifecycle events. * * @fires `@serwist/window.Serwist.message` * @fires `@serwist/window.Serwist.installed` * @fires `@serwist/window.Serwist.waiting` * @fires `@serwist/window.Serwist.controlling` * @fires `@serwist/window.Serwist.activated` * @fires `@serwist/window.Serwist.redundant` */ declare class Serwist extends SerwistEventTarget { private readonly _scriptURL; private readonly _registerOptions; private _updateFoundCount; private readonly _swDeferred; private readonly _activeDeferred; private readonly _controllingDeferred; private _registrationTime; private _isUpdate?; private _compatibleControllingSW?; private _registration?; private _sw?; private readonly _ownSWs; private _externalSW?; private _waitingTimeout?; /** * Creates a new Serwist instance with a script URL and service worker * options. The script URL and options are the same as those used when * calling [navigator.serviceWorker.register(scriptURL, options)](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register). * * @param scriptURL The service worker script associated with this instance. Using a * [`TrustedScriptURL`](https://developer.mozilla.org/en-US/docs/Web/API/TrustedScriptURL) is supported. * @param registerOptions The service worker options associated with this instance. */ constructor(scriptURL: string | TrustedScriptURL, registerOptions?: RegistrationOptions); /** * Registers a service worker for this instances script URL and service * worker options. By default this method delays registration until after * the window has loaded. * * @param options */ register({ immediate }?: { /** * Setting this to true will register the service worker immediately, * even if the window has not loaded (not recommended). */ immediate?: boolean; }): Promise<ServiceWorkerRegistration | undefined>; /** * Checks for updates of the registered service worker. */ update(): Promise<void>; /** * Resolves to the service worker registered by this instance as soon as it * is active. If a service worker was already controlling at registration * time then it will resolve to that if the script URLs (and optionally * script versions) match, otherwise it will wait until an update is found * and activates. * * @returns */ get active(): Promise<ServiceWorker>; /** * Resolves to the service worker registered by this instance as soon as it * is controlling the page. If a service worker was already controlling at * registration time then it will resolve to that if the script URLs (and * optionally script versions) match, otherwise it will wait until an update * is found and starts controlling the page. * Note: the first time a service worker is installed it will active but * not start controlling the page unless `clients.claim()` is called in the * service worker. * * @returns */ get controlling(): Promise<ServiceWorker>; /** * Resolves with a reference to a service worker that matches the script URL * of this instance, as soon as it's available. * * If, at registration time, there's already an active or waiting service * worker with a matching script URL, it will be used (with the waiting * service worker taking precedence over the active service worker if both * match, since the waiting service worker would have been registered more * recently). * If there's no matching active or waiting service worker at registration * time then the promise will not resolve until an update is found and starts * installing, at which point the installing service worker is used. * * @returns */ getSW(): Promise<ServiceWorker>; /** * Sends the passed data object to the service worker registered by this * instance (via `getSW`) and resolves with a response (if any). * * A response can be sent by calling `event.ports[0].postMessage(...)`, which will * resolve the promise returned by `messageSW()`. If no response is sent, the promise * will never resolve. * * @param data An object to send to the service worker * @returns */ messageSW(data: any): Promise<any>; /** * Sends a `{ type: "SKIP_WAITING" }` message to the service worker that is * currently waiting and associated with the current registration. * * If there is no current registration, or no service worker is waiting, * calling this will have no effect. */ messageSkipWaiting(): void; /** * Checks for a service worker already controlling the page and returns * it if its script URL matches. * * @private * @returns */ private _getControllingSWIfCompatible; /** * Registers a service worker for this instances script URL and register * options and tracks the time registration was complete. * * @private */ private _registerScript; /** * @private * @param originalEvent */ private readonly _onUpdateFound; /** * @private * @param originalEvent */ private readonly _onStateChange; /** * @private * @param originalEvent */ private readonly _onControllerChange; /** * @private * @param originalEvent */ private readonly _onMessage; } //#endregion export { Serwist, SerwistEvent, SerwistEventMap, SerwistLifecycleEvent, SerwistLifecycleEventMap, SerwistLifecycleWaitingEvent, SerwistMessageEvent, messageSW }; //# sourceMappingURL=index.d.mts.map