@angular/service-worker
Version:
Angular - service worker tooling!
1 lines • 51.1 kB
Source Map (JSON)
{"version":3,"file":"service-worker.mjs","sources":["../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/service-worker/src/low_level.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/service-worker/src/push.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/service-worker/src/update.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/service-worker/src/provider.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/service-worker/src/module.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ApplicationRef, type Injector, ɵRuntimeError as RuntimeError} from '@angular/core';\nimport {Observable, Subject} from 'rxjs';\nimport {filter, map, switchMap, take} from 'rxjs/operators';\n\nimport {RuntimeErrorCode} from './errors';\n\nexport const ERR_SW_NOT_SUPPORTED = 'Service workers are disabled or not supported by this browser';\n\n/**\n * An event emitted when the service worker has checked the version of the app on the server and it\n * didn't find a new version that it doesn't have already downloaded.\n *\n * @see {@link /ecosystem/service-workers/communications Service Worker Communication Guide}\n\n *\n * @publicApi\n */\nexport interface NoNewVersionDetectedEvent {\n type: 'NO_NEW_VERSION_DETECTED';\n version: {hash: string; appData?: Object};\n}\n\n/**\n * An event emitted when the service worker has detected a new version of the app on the server and\n * is about to start downloading it.\n *\n * @see {@link /ecosystem/service-workers/communications Service Worker Communication Guide}\n\n *\n * @publicApi\n */\nexport interface VersionDetectedEvent {\n type: 'VERSION_DETECTED';\n version: {hash: string; appData?: object};\n}\n\n/**\n * An event emitted when the installation of a new version failed.\n * It may be used for logging/monitoring purposes.\n *\n * @see {@link /ecosystem/service-workers/communications Service Worker Communication Guide}\n *a\n * @publicApi\n */\nexport interface VersionInstallationFailedEvent {\n type: 'VERSION_INSTALLATION_FAILED';\n version: {hash: string; appData?: object};\n error: string;\n}\n\n/**\n * An event emitted when a new version of the app is available.\n *\n * @see {@link /ecosystem/service-workers/communications Service Worker Communication Guide}\n\n *\n * @publicApi\n */\nexport interface VersionReadyEvent {\n type: 'VERSION_READY';\n currentVersion: {hash: string; appData?: object};\n latestVersion: {hash: string; appData?: object};\n}\n\n/**\n * A union of all event types that can be emitted by\n * {@link SwUpdate#versionUpdates}.\n *\n * @publicApi\n */\nexport type VersionEvent =\n | VersionDetectedEvent\n | VersionInstallationFailedEvent\n | VersionReadyEvent\n | NoNewVersionDetectedEvent;\n\n/**\n * An event emitted when the version of the app used by the service worker to serve this client is\n * in a broken state that cannot be recovered from and a full page reload is required.\n *\n * For example, the service worker may not be able to retrieve a required resource, neither from the\n * cache nor from the server. This could happen if a new version is deployed to the server and the\n * service worker cache has been partially cleaned by the browser, removing some files of a previous\n * app version but not all.\n *\n * @see [Handling an unrecoverable state](ecosystem/service-workers/communications#handling-an-unrecoverable-state)\n\n *\n * @publicApi\n */\nexport interface UnrecoverableStateEvent {\n type: 'UNRECOVERABLE_STATE';\n reason: string;\n}\n\n/**\n * An event emitted when a `PushEvent` is received by the service worker.\n */\nexport interface PushEvent {\n type: 'PUSH';\n data: any;\n}\n\nexport type IncomingEvent = UnrecoverableStateEvent | VersionEvent;\n\nexport interface TypedEvent {\n type: string;\n}\n\ntype OperationCompletedEvent =\n | {\n type: 'OPERATION_COMPLETED';\n nonce: number;\n result: boolean;\n }\n | {\n type: 'OPERATION_COMPLETED';\n nonce: number;\n result?: undefined;\n error: string;\n };\n\n/**\n * @publicApi\n */\nexport class NgswCommChannel {\n readonly worker: Observable<ServiceWorker>;\n\n readonly registration: Observable<ServiceWorkerRegistration>;\n\n readonly events: Observable<TypedEvent>;\n\n constructor(\n private serviceWorker: ServiceWorkerContainer | undefined,\n injector?: Injector,\n ) {\n if (!serviceWorker) {\n this.worker =\n this.events =\n this.registration =\n new Observable<never>((subscriber) =>\n subscriber.error(\n new RuntimeError(\n RuntimeErrorCode.SERVICE_WORKER_DISABLED_OR_NOT_SUPPORTED_BY_THIS_BROWSER,\n (typeof ngDevMode === 'undefined' || ngDevMode) && ERR_SW_NOT_SUPPORTED,\n ),\n ),\n );\n } else {\n let currentWorker: ServiceWorker | null = null;\n const workerSubject = new Subject<ServiceWorker>();\n this.worker = new Observable((subscriber) => {\n if (currentWorker !== null) {\n subscriber.next(currentWorker);\n }\n return workerSubject.subscribe((v) => subscriber.next(v));\n });\n const updateController = () => {\n const {controller} = serviceWorker;\n if (controller === null) {\n return;\n }\n currentWorker = controller;\n workerSubject.next(currentWorker);\n };\n serviceWorker.addEventListener('controllerchange', updateController);\n updateController();\n\n this.registration = this.worker.pipe(\n switchMap(() =>\n serviceWorker.getRegistration().then((registration) => {\n // The `getRegistration()` method may return undefined in\n // non-secure contexts or incognito mode, where service worker\n // registration might not be allowed.\n if (!registration) {\n throw new RuntimeError(\n RuntimeErrorCode.SERVICE_WORKER_DISABLED_OR_NOT_SUPPORTED_BY_THIS_BROWSER,\n (typeof ngDevMode === 'undefined' || ngDevMode) && ERR_SW_NOT_SUPPORTED,\n );\n }\n\n return registration;\n }),\n ),\n );\n\n const _events = new Subject<TypedEvent>();\n this.events = _events.asObservable();\n\n const messageListener = (event: MessageEvent) => {\n const {data} = event;\n if (data?.type) {\n _events.next(data);\n }\n };\n serviceWorker.addEventListener('message', messageListener);\n\n // The injector is optional to avoid breaking changes.\n const appRef = injector?.get(ApplicationRef, null, {optional: true});\n appRef?.onDestroy(() => {\n serviceWorker.removeEventListener('controllerchange', updateController);\n serviceWorker.removeEventListener('message', messageListener);\n });\n }\n }\n\n postMessage(action: string, payload: Object): Promise<void> {\n return new Promise<void>((resolve) => {\n this.worker.pipe(take(1)).subscribe((sw) => {\n sw.postMessage({\n action,\n ...payload,\n });\n\n resolve();\n });\n });\n }\n\n postMessageWithOperation(\n type: string,\n payload: Object,\n operationNonce: number,\n ): Promise<boolean> {\n const waitForOperationCompleted = this.waitForOperationCompleted(operationNonce);\n const postMessage = this.postMessage(type, payload);\n return Promise.all([postMessage, waitForOperationCompleted]).then(([, result]) => result);\n }\n\n generateNonce(): number {\n return Math.round(Math.random() * 10000000);\n }\n\n eventsOfType<T extends TypedEvent>(type: T['type'] | T['type'][]): Observable<T> {\n let filterFn: (event: TypedEvent) => event is T;\n if (typeof type === 'string') {\n filterFn = (event: TypedEvent): event is T => event.type === type;\n } else {\n filterFn = (event: TypedEvent): event is T => type.includes(event.type);\n }\n return this.events.pipe(filter(filterFn));\n }\n\n nextEventOfType<T extends TypedEvent>(type: T['type']): Observable<T> {\n return this.eventsOfType(type).pipe(take(1));\n }\n\n waitForOperationCompleted(nonce: number): Promise<boolean> {\n return new Promise<boolean>((resolve, reject) => {\n this.eventsOfType<OperationCompletedEvent>('OPERATION_COMPLETED')\n .pipe(\n filter((event) => event.nonce === nonce),\n take(1),\n map((event) => {\n if (event.result !== undefined) {\n return event.result;\n }\n throw new Error(event.error!);\n }),\n )\n .subscribe({\n next: resolve,\n error: reject,\n });\n });\n }\n\n get isEnabled(): boolean {\n return !!this.serviceWorker;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injectable, ɵRuntimeError as RuntimeError} from '@angular/core';\nimport {NEVER, Observable, Subject} from 'rxjs';\nimport {map, switchMap, take} from 'rxjs/operators';\n\nimport {RuntimeErrorCode} from './errors';\nimport {ERR_SW_NOT_SUPPORTED, NgswCommChannel, PushEvent} from './low_level';\n\n/**\n * Subscribe and listen to\n * [Web Push\n * Notifications](https://developer.mozilla.org/en-US/docs/Web/API/Push_API/Best_Practices) through\n * Angular Service Worker.\n *\n * @usageNotes\n *\n * You can inject a `SwPush` instance into any component or service\n * as a dependency.\n *\n * <code-example path=\"service-worker/push/service_worker_component.ts\" region=\"inject-sw-push\"\n * header=\"app.component.ts\"></code-example>\n *\n * To subscribe, call `SwPush.requestSubscription()`, which asks the user for permission.\n * The call returns a `Promise` with a new\n * [`PushSubscription`](https://developer.mozilla.org/en-US/docs/Web/API/PushSubscription)\n * instance.\n *\n * <code-example path=\"service-worker/push/service_worker_component.ts\" region=\"subscribe-to-push\"\n * header=\"app.component.ts\"></code-example>\n *\n * A request is rejected if the user denies permission, or if the browser\n * blocks or does not support the Push API or ServiceWorkers.\n * Check `SwPush.isEnabled` to confirm status.\n *\n * Invoke Push Notifications by pushing a message with the following payload.\n *\n * ```ts\n * {\n * \"notification\": {\n * \"actions\": NotificationAction[],\n * \"badge\": USVString,\n * \"body\": DOMString,\n * \"data\": any,\n * \"dir\": \"auto\"|\"ltr\"|\"rtl\",\n * \"icon\": USVString,\n * \"image\": USVString,\n * \"lang\": DOMString,\n * \"renotify\": boolean,\n * \"requireInteraction\": boolean,\n * \"silent\": boolean,\n * \"tag\": DOMString,\n * \"timestamp\": DOMTimeStamp,\n * \"title\": DOMString,\n * \"vibrate\": number[]\n * }\n * }\n * ```\n *\n * Only `title` is required. See `Notification`\n * [instance\n * properties](https://developer.mozilla.org/en-US/docs/Web/API/Notification#Instance_properties).\n *\n * While the subscription is active, Service Worker listens for\n * [PushEvent](https://developer.mozilla.org/en-US/docs/Web/API/PushEvent)\n * occurrences and creates\n * [Notification](https://developer.mozilla.org/en-US/docs/Web/API/Notification)\n * instances in response.\n *\n * Unsubscribe using `SwPush.unsubscribe()`.\n *\n * An application can subscribe to `SwPush.notificationClicks` observable to be notified when a user\n * clicks on a notification. For example:\n *\n * <code-example path=\"service-worker/push/service_worker_component.ts\" region=\"subscribe-to-notification-clicks\"\n * header=\"app.component.ts\"></code-example>\n *\n * You can read more on handling notification clicks in the [Service worker notifications\n * guide](ecosystem/service-workers/push-notifications).\n *\n * @see [Push Notifications](https://developers.google.com/web/fundamentals/codelabs/push-notifications/)\n * @see [Angular Push Notifications](https://blog.angular-university.io/angular-push-notifications/)\n * @see [MDN: Push API](https://developer.mozilla.org/en-US/docs/Web/API/Push_API)\n * @see [MDN: Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API)\n * @see [MDN: Web Push API Notifications best practices](https://developer.mozilla.org/en-US/docs/Web/API/Push_API/Best_Practices)\n * @see [Push notifications guide](ecosystem/service-workers/push-notifications)\n *\n * @publicApi\n */\n@Injectable()\nexport class SwPush {\n /**\n * Emits the payloads of the received push notification messages.\n */\n readonly messages: Observable<object>;\n\n /**\n * Emits the payloads of the received push notification messages as well as the action the user\n * interacted with. If no action was used the `action` property contains an empty string `''`.\n *\n * Note that the `notification` property does **not** contain a\n * [Notification][Mozilla Notification] object but rather a\n * [NotificationOptions](https://notifications.spec.whatwg.org/#dictdef-notificationoptions)\n * object that also includes the `title` of the [Notification][Mozilla Notification] object.\n *\n * [Mozilla Notification]: https://developer.mozilla.org/en-US/docs/Web/API/Notification\n *\n * @see [Notification click handling](ecosystem/service-workers/push-notifications#notification-click-handling)\n *\n */\n readonly notificationClicks: Observable<{\n action: string;\n notification: NotificationOptions & {\n title: string;\n };\n }>;\n\n /**\n * Emits the payloads of notifications that were closed, along with the action (if any)\n * associated with the close event. If no action was used, the `action` property contains\n * an empty string `''`.\n *\n * Note that the `notification` property does **not** contain a\n * [Notification][Mozilla Notification] object but rather a\n * [NotificationOptions](https://notifications.spec.whatwg.org/#dictdef-notificationoptions)\n * object that also includes the `title` of the [Notification][Mozilla Notification] object.\n *\n * [Mozilla Notification]: https://developer.mozilla.org/en-US/docs/Web/API/Notification\n */\n readonly notificationCloses: Observable<{\n action: string;\n notification: NotificationOptions & {\n title: string;\n };\n }>;\n\n /**\n * Emits updates to the push subscription, including both the previous (`oldSubscription`)\n * and current (`newSubscription`) values. Either subscription may be `null`, depending on\n * the context:\n *\n * - `oldSubscription` is `null` if no previous subscription existed.\n * - `newSubscription` is `null` if the subscription was invalidated and not replaced.\n *\n * This stream allows clients to react to automatic changes in push subscriptions,\n * such as those triggered by browser expiration or key rotation.\n *\n * [Push API]: https://w3c.github.io/push-api\n */\n readonly pushSubscriptionChanges: Observable<{\n oldSubscription: PushSubscription | null;\n newSubscription: PushSubscription | null;\n }>;\n\n /**\n * Emits the currently active\n * [PushSubscription](https://developer.mozilla.org/en-US/docs/Web/API/PushSubscription)\n * associated to the Service Worker registration or `null` if there is no subscription.\n */\n readonly subscription: Observable<PushSubscription | null>;\n\n /**\n * True if the Service Worker is enabled (supported by the browser and enabled via\n * `ServiceWorkerModule`).\n */\n get isEnabled(): boolean {\n return this.sw.isEnabled;\n }\n\n private pushManager: Observable<PushManager> | null = null;\n private subscriptionChanges = new Subject<PushSubscription | null>();\n\n constructor(private sw: NgswCommChannel) {\n if (!sw.isEnabled) {\n this.messages = NEVER;\n this.notificationClicks = NEVER;\n this.notificationCloses = NEVER;\n this.pushSubscriptionChanges = NEVER;\n this.subscription = NEVER;\n return;\n }\n\n this.messages = this.sw.eventsOfType<PushEvent>('PUSH').pipe(map((message) => message.data));\n\n this.notificationClicks = this.sw\n .eventsOfType('NOTIFICATION_CLICK')\n .pipe(map((message: any) => message.data));\n\n this.notificationCloses = this.sw\n .eventsOfType('NOTIFICATION_CLOSE')\n .pipe(map((message: any) => message.data));\n\n this.pushSubscriptionChanges = this.sw\n .eventsOfType('PUSH_SUBSCRIPTION_CHANGE')\n .pipe(map((message: any) => message.data));\n\n this.pushManager = this.sw.registration.pipe(map((registration) => registration.pushManager));\n\n const workerDrivenSubscriptions = this.pushManager.pipe(\n switchMap((pm) => pm.getSubscription()),\n );\n this.subscription = new Observable((subscriber) => {\n const workerDrivenSubscription = workerDrivenSubscriptions.subscribe(subscriber);\n const subscriptionChanges = this.subscriptionChanges.subscribe(subscriber);\n return () => {\n workerDrivenSubscription.unsubscribe();\n subscriptionChanges.unsubscribe();\n };\n });\n }\n\n /**\n * Subscribes to Web Push Notifications,\n * after requesting and receiving user permission.\n *\n * @param options An object containing the `serverPublicKey` string.\n * @returns A Promise that resolves to the new subscription object.\n */\n requestSubscription(options: {serverPublicKey: string}): Promise<PushSubscription> {\n if (!this.sw.isEnabled || this.pushManager === null) {\n return Promise.reject(new Error(ERR_SW_NOT_SUPPORTED));\n }\n const pushOptions: PushSubscriptionOptionsInit = {userVisibleOnly: true};\n let key = this.decodeBase64(options.serverPublicKey.replace(/_/g, '/').replace(/-/g, '+'));\n let applicationServerKey = new Uint8Array(new ArrayBuffer(key.length));\n for (let i = 0; i < key.length; i++) {\n applicationServerKey[i] = key.charCodeAt(i);\n }\n pushOptions.applicationServerKey = applicationServerKey;\n\n return new Promise((resolve, reject) => {\n this.pushManager!.pipe(\n switchMap((pm) => pm.subscribe(pushOptions)),\n take(1),\n ).subscribe({\n next: (sub) => {\n this.subscriptionChanges.next(sub);\n resolve(sub);\n },\n error: reject,\n });\n });\n }\n\n /**\n * Unsubscribes from Service Worker push notifications.\n *\n * @returns A Promise that is resolved when the operation succeeds, or is rejected if there is no\n * active subscription or the unsubscribe operation fails.\n */\n unsubscribe(): Promise<void> {\n if (!this.sw.isEnabled) {\n return Promise.reject(new Error(ERR_SW_NOT_SUPPORTED));\n }\n\n const doUnsubscribe = (sub: PushSubscription | null) => {\n if (sub === null) {\n throw new RuntimeError(\n RuntimeErrorCode.NOT_SUBSCRIBED_TO_PUSH_NOTIFICATIONS,\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n 'Not subscribed to push notifications.',\n );\n }\n\n return sub.unsubscribe().then((success) => {\n if (!success) {\n throw new RuntimeError(\n RuntimeErrorCode.PUSH_SUBSCRIPTION_UNSUBSCRIBE_FAILED,\n (typeof ngDevMode === 'undefined' || ngDevMode) && 'Unsubscribe failed!',\n );\n }\n\n this.subscriptionChanges.next(null);\n });\n };\n\n return new Promise((resolve, reject) => {\n this.subscription\n .pipe(take(1), switchMap(doUnsubscribe))\n .subscribe({next: resolve, error: reject});\n });\n }\n\n private decodeBase64(input: string): string {\n return atob(input);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {Injectable, ɵRuntimeError as RuntimeError} from '@angular/core';\nimport {NEVER, Observable} from 'rxjs';\n\nimport {RuntimeErrorCode} from './errors';\nimport {\n ERR_SW_NOT_SUPPORTED,\n NgswCommChannel,\n UnrecoverableStateEvent,\n VersionEvent,\n} from './low_level';\n\n/**\n * Subscribe to update notifications from the Service Worker, trigger update\n * checks, and forcibly activate updates.\n *\n * @see {@link /ecosystem/service-workers/communications Service Worker Communication Guide}\n *\n * @publicApi\n */\n@Injectable()\nexport class SwUpdate {\n /**\n * Emits a `VersionDetectedEvent` event whenever a new version is detected on the server.\n *\n * Emits a `VersionInstallationFailedEvent` event whenever checking for or downloading a new\n * version fails.\n *\n * Emits a `VersionReadyEvent` event whenever a new version has been downloaded and is ready for\n * activation.\n *\n * @see [Version updates](ecosystem/service-workers/communications#version-updates)\n *\n */\n readonly versionUpdates: Observable<VersionEvent>;\n\n /**\n * Emits an `UnrecoverableStateEvent` event whenever the version of the app used by the service\n * worker to serve this client is in a broken state that cannot be recovered from without a full\n * page reload.\n */\n readonly unrecoverable: Observable<UnrecoverableStateEvent>;\n\n /**\n * True if the Service Worker is enabled (supported by the browser and enabled via\n * `ServiceWorkerModule`).\n */\n get isEnabled(): boolean {\n return this.sw.isEnabled;\n }\n\n private ongoingCheckForUpdate: Promise<boolean> | null = null;\n\n constructor(private sw: NgswCommChannel) {\n if (!sw.isEnabled) {\n this.versionUpdates = NEVER;\n this.unrecoverable = NEVER;\n return;\n }\n this.versionUpdates = this.sw.eventsOfType<VersionEvent>([\n 'VERSION_DETECTED',\n 'VERSION_INSTALLATION_FAILED',\n 'VERSION_READY',\n 'NO_NEW_VERSION_DETECTED',\n ]);\n this.unrecoverable = this.sw.eventsOfType<UnrecoverableStateEvent>('UNRECOVERABLE_STATE');\n }\n\n /**\n * Checks for an update and waits until the new version is downloaded from the server and ready\n * for activation.\n *\n * @returns a promise that\n * - resolves to `true` if a new version was found and is ready to be activated.\n * - resolves to `false` if no new version was found\n * - rejects if any error occurs\n */\n checkForUpdate(): Promise<boolean> {\n if (!this.sw.isEnabled) {\n return Promise.reject(new Error(ERR_SW_NOT_SUPPORTED));\n }\n if (this.ongoingCheckForUpdate) {\n return this.ongoingCheckForUpdate;\n }\n const nonce = this.sw.generateNonce();\n this.ongoingCheckForUpdate = this.sw\n .postMessageWithOperation('CHECK_FOR_UPDATES', {nonce}, nonce)\n .finally(() => {\n this.ongoingCheckForUpdate = null;\n });\n return this.ongoingCheckForUpdate;\n }\n\n /**\n * Updates the current client (i.e. browser tab) to the latest version that is ready for\n * activation.\n *\n * In most cases, you should not use this method and instead should update a client by reloading\n * the page.\n *\n * <div class=\"docs-alert docs-alert-important\">\n *\n * Updating a client without reloading can easily result in a broken application due to a version\n * mismatch between the application shell and other page resources,\n * such as lazy-loaded chunks, whose filenames may change between\n * versions.\n *\n * Only use this method, if you are certain it is safe for your specific use case.\n *\n * </div>\n *\n * @returns a promise that\n * - resolves to `true` if an update was activated successfully\n * - resolves to `false` if no update was available (for example, the client was already on the\n * latest version).\n * - rejects if any error occurs\n */\n activateUpdate(): Promise<boolean> {\n if (!this.sw.isEnabled) {\n return Promise.reject(\n new RuntimeError(\n RuntimeErrorCode.SERVICE_WORKER_DISABLED_OR_NOT_SUPPORTED_BY_THIS_BROWSER,\n (typeof ngDevMode === 'undefined' || ngDevMode) && ERR_SW_NOT_SUPPORTED,\n ),\n );\n }\n const nonce = this.sw.generateNonce();\n return this.sw.postMessageWithOperation('ACTIVATE_UPDATE', {nonce}, nonce);\n }\n}\n","/*!\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n ApplicationRef,\n EnvironmentProviders,\n inject,\n InjectionToken,\n Injector,\n makeEnvironmentProviders,\n NgZone,\n provideAppInitializer,\n ɵRuntimeError as RuntimeError,\n ɵformatRuntimeError as formatRuntimeError,\n} from '@angular/core';\nimport type {Observable} from 'rxjs';\n\nimport {NgswCommChannel} from './low_level';\nimport {SwPush} from './push';\nimport {SwUpdate} from './update';\nimport {RuntimeErrorCode} from './errors';\n\nexport const SCRIPT = new InjectionToken<string>(\n typeof ngDevMode !== 'undefined' && ngDevMode ? 'NGSW_REGISTER_SCRIPT' : '',\n);\n\nexport function ngswAppInitializer(): void {\n if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n return;\n }\n\n const options = inject(SwRegistrationOptions);\n\n if (!('serviceWorker' in navigator && options.enabled !== false)) {\n return;\n }\n\n const script = inject(SCRIPT);\n const ngZone = inject(NgZone);\n const appRef = inject(ApplicationRef);\n\n // Set up the `controllerchange` event listener outside of\n // the Angular zone to avoid unnecessary change detections,\n // as this event has no impact on view updates.\n ngZone.runOutsideAngular(() => {\n // Wait for service worker controller changes, and fire an INITIALIZE action when a new SW\n // becomes active. This allows the SW to initialize itself even if there is no application\n // traffic.\n const sw = navigator.serviceWorker;\n const onControllerChange = () => sw.controller?.postMessage({action: 'INITIALIZE'});\n\n sw.addEventListener('controllerchange', onControllerChange);\n\n appRef.onDestroy(() => {\n sw.removeEventListener('controllerchange', onControllerChange);\n });\n });\n\n // Run outside the Angular zone to avoid preventing the app from stabilizing (especially\n // given that some registration strategies wait for the app to stabilize).\n ngZone.runOutsideAngular(() => {\n let readyToRegister: Promise<void>;\n\n const {registrationStrategy} = options;\n if (typeof registrationStrategy === 'function') {\n readyToRegister = new Promise((resolve) => registrationStrategy().subscribe(() => resolve()));\n } else {\n const [strategy, ...args] = (registrationStrategy || 'registerWhenStable:30000').split(':');\n\n switch (strategy) {\n case 'registerImmediately':\n readyToRegister = Promise.resolve();\n break;\n case 'registerWithDelay':\n readyToRegister = delayWithTimeout(+args[0] || 0);\n break;\n case 'registerWhenStable':\n readyToRegister = Promise.race([appRef.whenStable(), delayWithTimeout(+args[0])]);\n break;\n default:\n // Unknown strategy.\n throw new RuntimeError(\n RuntimeErrorCode.UNKNOWN_REGISTRATION_STRATEGY,\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n `Unknown ServiceWorker registration strategy: ${options.registrationStrategy}`,\n );\n }\n }\n\n // Don't return anything to avoid blocking the application until the SW is registered.\n // Catch and log the error if SW registration fails to avoid uncaught rejection warning.\n readyToRegister.then(() => {\n // If the registration strategy has resolved after the application has\n // been explicitly destroyed by the user (e.g., by navigating away to\n // another application), we simply should not register the worker.\n if (appRef.destroyed) {\n return;\n }\n\n navigator.serviceWorker\n .register(script, {\n scope: options.scope,\n updateViaCache: options.updateViaCache,\n type: options.type,\n })\n .catch((err) =>\n console.error(\n formatRuntimeError(\n RuntimeErrorCode.SERVICE_WORKER_REGISTRATION_FAILED,\n (typeof ngDevMode === 'undefined' || ngDevMode) &&\n 'Service worker registration failed with: ' + err,\n ),\n ),\n );\n });\n });\n}\n\nfunction delayWithTimeout(timeout: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n\nexport function ngswCommChannelFactory(): NgswCommChannel {\n const opts = inject(SwRegistrationOptions);\n const injector = inject(Injector);\n const isBrowser = !(typeof ngServerMode !== 'undefined' && ngServerMode);\n\n return new NgswCommChannel(\n isBrowser && opts.enabled !== false ? navigator.serviceWorker : undefined,\n injector,\n );\n}\n\n/**\n * Token that can be used to provide options for `ServiceWorkerModule` outside of\n * `ServiceWorkerModule.register()`.\n *\n * You can use this token to define a provider that generates the registration options at runtime,\n * for example via a function call:\n *\n * {@example service-worker/registration-options/module.ts region=\"registration-options\"\n * header=\"app.module.ts\"}\n *\n * @see [Service worker configuration](ecosystem/service-workers/getting-started#service-worker-configuration)\n *\n * @publicApi\n */\nexport abstract class SwRegistrationOptions {\n /**\n * Whether the ServiceWorker will be registered and the related services (such as `SwPush` and\n * `SwUpdate`) will attempt to communicate and interact with it.\n *\n * Default: true\n */\n enabled?: boolean;\n\n /**\n * The value of the setting used to determine the circumstances in which the browser\n * will consult the HTTP cache when it tries to update the service worker or any scripts that are imported via importScripts().\n * [ServiceWorkerRegistration.updateViaCache](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/updateViaCache)\n */\n updateViaCache?: ServiceWorkerUpdateViaCache;\n\n /**\n * The type of the ServiceWorker script to register.\n * [ServiceWorkerRegistration#type](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register#type)\n * - `classic`: Registers the script as a classic worker. ES module features such as `import` and `export` are NOT allowed in the script.\n * - `module`: Registers the script as an ES module. Allows use of `import`/`export` syntax and module features.\n *\n * @default 'classic'\n */\n type?: WorkerType;\n\n /**\n * A URL that defines the ServiceWorker's registration scope; that is, what range of URLs it can\n * control. It will be used when calling\n * [ServiceWorkerContainer#register()](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register).\n */\n scope?: string;\n\n /**\n * Defines the ServiceWorker registration strategy, which determines when it will be registered\n * with the browser.\n *\n * The default behavior of registering once the application stabilizes (i.e. as soon as there are\n * no pending micro- and macro-tasks) is designed to register the ServiceWorker as soon as\n * possible but without affecting the application's first time load.\n *\n * Still, there might be cases where you want more control over when the ServiceWorker is\n * registered (for example, there might be a long-running timeout or polling interval, preventing\n * the app from stabilizing). The available option are:\n *\n * - `registerWhenStable:<timeout>`: Register as soon as the application stabilizes (no pending\n * micro-/macro-tasks) but no later than `<timeout>` milliseconds. If the app hasn't\n * stabilized after `<timeout>` milliseconds (for example, due to a recurrent asynchronous\n * task), the ServiceWorker will be registered anyway.\n * If `<timeout>` is omitted, the ServiceWorker will only be registered once the app\n * stabilizes.\n * - `registerImmediately`: Register immediately.\n * - `registerWithDelay:<timeout>`: Register with a delay of `<timeout>` milliseconds. For\n * example, use `registerWithDelay:5000` to register the ServiceWorker after 5 seconds. If\n * `<timeout>` is omitted, is defaults to `0`, which will register the ServiceWorker as soon\n * as possible but still asynchronously, once all pending micro-tasks are completed.\n * - An Observable factory function: A function that returns an `Observable`.\n * The function will be used at runtime to obtain and subscribe to the `Observable` and the\n * ServiceWorker will be registered as soon as the first value is emitted.\n *\n * Default: 'registerWhenStable:30000'\n */\n registrationStrategy?: string | (() => Observable<unknown>);\n}\n\n/**\n * @publicApi\n *\n * Sets up providers to register the given Angular Service Worker script.\n *\n * If `enabled` is set to `false` in the given options, the module will behave as if service\n * workers are not supported by the browser, and the service worker will not be registered.\n *\n * Example usage:\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideServiceWorker('ngsw-worker.js')\n * ],\n * });\n * ```\n *\n * @see [Custom service worker script](ecosystem/service-workers/custom-service-worker-scripts)\n *\n * @see [Service worker configuration](ecosystem/service-workers/getting-started#service-worker-configuration)\n *\n */\nexport function provideServiceWorker(\n script: string,\n options: SwRegistrationOptions = {},\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n SwPush,\n SwUpdate,\n {provide: SCRIPT, useValue: script},\n {provide: SwRegistrationOptions, useValue: options},\n {\n provide: NgswCommChannel,\n useFactory: ngswCommChannelFactory,\n },\n provideAppInitializer(ngswAppInitializer),\n ]);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {ModuleWithProviders, NgModule} from '@angular/core';\n\nimport {provideServiceWorker, SwRegistrationOptions} from './provider';\nimport {SwPush} from './push';\nimport {SwUpdate} from './update';\n\n/**\n *\n * @see [Custom service worker script](ecosystem/service-workers/custom-service-worker-scripts)\n * @see [Service worker configuration](ecosystem/service-workers/getting-started#service-worker-configuration)\n *\n * @publicApi\n */\n@NgModule({providers: [SwPush, SwUpdate]})\nexport class ServiceWorkerModule {\n /**\n * Register the given Angular Service Worker script.\n *\n * If `enabled` is set to `false` in the given options, the module will behave as if service\n * workers are not supported by the browser, and the service worker will not be registered.\n */\n static register(\n script: string,\n options: SwRegistrationOptions = {},\n ): ModuleWithProviders<ServiceWorkerModule> {\n return {\n ngModule: ServiceWorkerModule,\n providers: [provideServiceWorker(script, options)],\n };\n }\n}\n"],"names":["ERR_SW_NOT_SUPPORTED","NgswCommChannel","serviceWorker","worker","registration","events","constructor","injector","Observable","subscriber","error","RuntimeError","ngDevMode","currentWorker","workerSubject","Subject","next","subscribe","v","updateController","controller","addEventListener","pipe","switchMap","getRegistration","then","_events","asObservable","messageListener","event","data","type","appRef","get","ApplicationRef","optional","onDestroy","removeEventListener","postMessage","action","payload","Promise","resolve","take","sw","postMessageWithOperation","operationNonce","waitForOperationCompleted","all","result","generateNonce","Math","round","random","eventsOfType","filterFn","includes","filter","nextEventOfType","nonce","reject","map","undefined","Error","isEnabled","SwPush","messages","notificationClicks","notificationCloses","pushSubscriptionChanges","subscription","pushManager","subscriptionChanges","NEVER","message","workerDrivenSubscriptions","pm","getSubscription","workerDrivenSubscription","unsubscribe","requestSubscription","options","pushOptions","userVisibleOnly","key","decodeBase64","serverPublicKey","replace","applicationServerKey","Uint8Array","ArrayBuffer","length","i","charCodeAt","sub","doUnsubscribe","success","input","atob","deps","token","i1","target","i0","ɵɵFactoryTarget","Injectable","decorators","SwUpdate","versionUpdates","unrecoverable","ongoingCheckForUpdate","checkForUpdate","finally","activateUpdate","SCRIPT","InjectionToken","ngswAppInitializer","ngServerMode","inject","SwRegistrationOptions","navigator","enabled","script","ngZone","NgZone","runOutsideAngular","onControllerChange","readyToRegister","registrationStrategy","strategy","args","split","delayWithTimeout","race","whenStable","destroyed","register","scope","updateViaCache","catch","err","console","formatRuntimeError","timeout","setTimeout","ngswCommChannelFactory","opts","Injector","isBrowser","provideServiceWorker","makeEnvironmentProviders","provide","useValue","useFactory","provideAppInitializer","ServiceWorkerModule","ngModule","providers","NgModule","ɵinj","ɵɵngDeclareInjector","minVersion","version","ngImport"],"mappings":"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