@serwist/window
Version:
Simplifies communications with Serwist packages running in the service worker
246 lines • 8.5 kB
text/typescript
//#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