1
0
mirror of https://github.com/musix-org/musix-oss synced 2024-11-14 06:40:21 +00:00
musix-oss/node_modules/@firebase/messaging/dist/index.cjs.js.map
2020-03-03 22:30:50 +02:00

1 line
78 KiB
Plaintext

{"version":3,"file":"index.cjs.js","sources":["../src/util/errors.ts","../src/helpers/extract-app-config.ts","../src/helpers/array-to-base64.ts","../src/helpers/migrate-old-database.ts","../src/helpers/idb-manager.ts","../src/util/constants.ts","../src/core/api.ts","../src/core/token-management.ts","../src/interfaces/internal-message.ts","../src/helpers/is-console-message.ts","../src/controllers/window-controller.ts","../src/helpers/sleep.ts","../src/controllers/sw-controller.ts","../src/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ErrorFactory, ErrorMap } from '@firebase/util';\n\nexport const enum ErrorCode {\n MISSING_APP_CONFIG_VALUES = 'missing-app-config-values',\n AVAILABLE_IN_WINDOW = 'only-available-in-window',\n AVAILABLE_IN_SW = 'only-available-in-sw',\n PERMISSION_DEFAULT = 'permission-default',\n PERMISSION_BLOCKED = 'permission-blocked',\n UNSUPPORTED_BROWSER = 'unsupported-browser',\n FAILED_DEFAULT_REGISTRATION = 'failed-service-worker-registration',\n TOKEN_SUBSCRIBE_FAILED = 'token-subscribe-failed',\n TOKEN_SUBSCRIBE_NO_TOKEN = 'token-subscribe-no-token',\n TOKEN_UNSUBSCRIBE_FAILED = 'token-unsubscribe-failed',\n TOKEN_UPDATE_FAILED = 'token-update-failed',\n TOKEN_UPDATE_NO_TOKEN = 'token-update-no-token',\n INVALID_BG_HANDLER = 'invalid-bg-handler',\n USE_SW_AFTER_GET_TOKEN = 'use-sw-after-get-token',\n INVALID_SW_REGISTRATION = 'invalid-sw-registration',\n USE_VAPID_KEY_AFTER_GET_TOKEN = 'use-vapid-key-after-get-token',\n INVALID_VAPID_KEY = 'invalid-vapid-key'\n}\n\nexport const ERROR_MAP: ErrorMap<ErrorCode> = {\n [ErrorCode.MISSING_APP_CONFIG_VALUES]:\n 'Missing App configuration value: \"{$valueName}\"',\n [ErrorCode.AVAILABLE_IN_WINDOW]:\n 'This method is available in a Window context.',\n [ErrorCode.AVAILABLE_IN_SW]:\n 'This method is available in a service worker context.',\n [ErrorCode.PERMISSION_DEFAULT]:\n 'The notification permission was not granted and dismissed instead.',\n [ErrorCode.PERMISSION_BLOCKED]:\n 'The notification permission was not granted and blocked instead.',\n [ErrorCode.UNSUPPORTED_BROWSER]:\n \"This browser doesn't support the API's required to use the firebase SDK.\",\n [ErrorCode.FAILED_DEFAULT_REGISTRATION]:\n 'We are unable to register the default service worker. {$browserErrorMessage}',\n [ErrorCode.TOKEN_SUBSCRIBE_FAILED]:\n 'A problem occured while subscribing the user to FCM: {$errorInfo}',\n [ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN]:\n 'FCM returned no token when subscribing the user to push.',\n [ErrorCode.TOKEN_UNSUBSCRIBE_FAILED]:\n 'A problem occured while unsubscribing the ' +\n 'user from FCM: {$errorInfo}',\n [ErrorCode.TOKEN_UPDATE_FAILED]:\n 'A problem occured while updating the user from FCM: {$errorInfo}',\n [ErrorCode.TOKEN_UPDATE_NO_TOKEN]:\n 'FCM returned no token when updating the user to push.',\n [ErrorCode.USE_SW_AFTER_GET_TOKEN]:\n 'The useServiceWorker() method may only be called once and must be ' +\n 'called before calling getToken() to ensure your service worker is used.',\n [ErrorCode.INVALID_SW_REGISTRATION]:\n 'The input to useServiceWorker() must be a ServiceWorkerRegistration.',\n [ErrorCode.INVALID_BG_HANDLER]:\n 'The input to setBackgroundMessageHandler() must be a function.',\n [ErrorCode.INVALID_VAPID_KEY]: 'The public VAPID key must be a string.',\n [ErrorCode.USE_VAPID_KEY_AFTER_GET_TOKEN]:\n 'The usePublicVapidKey() method may only be called once and must be ' +\n 'called before calling getToken() to ensure your VAPID key is used.'\n};\n\ninterface ErrorParams {\n [ErrorCode.MISSING_APP_CONFIG_VALUES]: {\n valueName: string;\n };\n [ErrorCode.FAILED_DEFAULT_REGISTRATION]: { browserErrorMessage: string };\n [ErrorCode.TOKEN_SUBSCRIBE_FAILED]: { errorInfo: string };\n [ErrorCode.TOKEN_UNSUBSCRIBE_FAILED]: { errorInfo: string };\n [ErrorCode.TOKEN_UPDATE_FAILED]: { errorInfo: string };\n}\n\nexport const ERROR_FACTORY = new ErrorFactory<ErrorCode, ErrorParams>(\n 'messaging',\n 'Messaging',\n ERROR_MAP\n);\n","/**\n * @license\n * Copyright 2019 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseApp, FirebaseOptions } from '@firebase/app-types';\nimport { FirebaseError } from '@firebase/util';\nimport { AppConfig } from '../interfaces/app-config';\nimport { ERROR_FACTORY, ErrorCode } from '../util/errors';\n\nexport function extractAppConfig(app: FirebaseApp): AppConfig {\n if (!app || !app.options) {\n throw getMissingValueError('App Configuration Object');\n }\n\n if (!app.name) {\n throw getMissingValueError('App Name');\n }\n\n // Required app config keys\n const configKeys: ReadonlyArray<keyof FirebaseOptions> = [\n 'projectId',\n 'apiKey',\n 'appId',\n 'messagingSenderId'\n ];\n\n const { options } = app;\n for (const keyName of configKeys) {\n if (!options[keyName]) {\n throw getMissingValueError(keyName);\n }\n }\n\n return {\n appName: app.name,\n projectId: options.projectId!,\n apiKey: options.apiKey!,\n appId: options.appId!,\n senderId: options.messagingSenderId!\n };\n}\n\nfunction getMissingValueError(valueName: string): FirebaseError {\n return ERROR_FACTORY.create(ErrorCode.MISSING_APP_CONFIG_VALUES, {\n valueName\n });\n}\n","/**\n * @license\n * Copyright 2017 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function arrayToBase64(array: Uint8Array | ArrayBuffer): string {\n const uint8Array = new Uint8Array(array);\n const base64String = btoa(String.fromCharCode(...uint8Array));\n return base64String\n .replace(/=/g, '')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_');\n}\n","/**\n * @license\n * Copyright 2019 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { openDb, deleteDb } from 'idb';\nimport { TokenDetails } from '../interfaces/token-details';\nimport { arrayToBase64 } from './array-to-base64';\n\n// https://github.com/firebase/firebase-js-sdk/blob/7857c212f944a2a9eb421fd4cb7370181bc034b5/packages/messaging/src/interfaces/token-details.ts\nexport interface V2TokenDetails {\n fcmToken: string;\n swScope: string;\n vapidKey: string | Uint8Array;\n subscription: PushSubscription;\n fcmSenderId: string;\n fcmPushSet: string;\n createTime?: number;\n endpoint?: string;\n auth?: string;\n p256dh?: string;\n}\n\n// https://github.com/firebase/firebase-js-sdk/blob/6b5b15ce4ea3df5df5df8a8b33a4e41e249c7715/packages/messaging/src/interfaces/token-details.ts\nexport interface V3TokenDetails {\n fcmToken: string;\n swScope: string;\n vapidKey: Uint8Array;\n fcmSenderId: string;\n fcmPushSet: string;\n endpoint: string;\n auth: ArrayBuffer;\n p256dh: ArrayBuffer;\n createTime: number;\n}\n\n// https://github.com/firebase/firebase-js-sdk/blob/9567dba664732f681fa7fe60f5b7032bb1daf4c9/packages/messaging/src/interfaces/token-details.ts\nexport interface V4TokenDetails {\n fcmToken: string;\n swScope: string;\n vapidKey: Uint8Array;\n fcmSenderId: string;\n endpoint: string;\n auth: ArrayBufferLike;\n p256dh: ArrayBufferLike;\n createTime: number;\n}\n\nconst OLD_DB_NAME = 'fcm_token_details_db';\n/**\n * The last DB version of 'fcm_token_details_db' was 4. This is one higher,\n * so that the upgrade callback is called for all versions of the old DB.\n */\nconst OLD_DB_VERSION = 5;\nconst OLD_OBJECT_STORE_NAME = 'fcm_token_object_Store';\n\nexport async function migrateOldDatabase(\n senderId: string\n): Promise<TokenDetails | null> {\n if ('databases' in indexedDB) {\n // indexedDb.databases() is an IndexedDB v3 API\n // and does not exist in all browsers.\n // TODO: Remove typecast when it lands in TS types.\n const databases = await (indexedDB as {\n databases(): Promise<Array<{ name: string; version: number }>>;\n }).databases();\n const dbNames = databases.map(db => db.name);\n\n if (!dbNames.includes(OLD_DB_NAME)) {\n // old DB didn't exist, no need to open.\n return null;\n }\n }\n\n let tokenDetails: TokenDetails | null = null;\n\n const db = await openDb(OLD_DB_NAME, OLD_DB_VERSION, async db => {\n if (db.oldVersion < 2) {\n // Database too old, skip migration.\n return;\n }\n\n if (!db.objectStoreNames.contains(OLD_OBJECT_STORE_NAME)) {\n // Database did not exist. Nothing to do.\n return;\n }\n\n const objectStore = db.transaction.objectStore(OLD_OBJECT_STORE_NAME);\n const value = await objectStore.index('fcmSenderId').get(senderId);\n await objectStore.clear();\n\n if (!value) {\n // No entry in the database, nothing to migrate.\n return;\n }\n\n if (db.oldVersion === 2) {\n const oldDetails = value as V2TokenDetails;\n\n if (!oldDetails.auth || !oldDetails.p256dh || !oldDetails.endpoint) {\n return;\n }\n\n tokenDetails = {\n token: oldDetails.fcmToken,\n createTime: oldDetails.createTime ?? Date.now(),\n subscriptionOptions: {\n auth: oldDetails.auth,\n p256dh: oldDetails.p256dh,\n endpoint: oldDetails.endpoint,\n swScope: oldDetails.swScope,\n vapidKey:\n typeof oldDetails.vapidKey === 'string'\n ? oldDetails.vapidKey\n : arrayToBase64(oldDetails.vapidKey)\n }\n };\n } else if (db.oldVersion === 3) {\n const oldDetails = value as V3TokenDetails;\n\n tokenDetails = {\n token: oldDetails.fcmToken,\n createTime: oldDetails.createTime,\n subscriptionOptions: {\n auth: arrayToBase64(oldDetails.auth),\n p256dh: arrayToBase64(oldDetails.p256dh),\n endpoint: oldDetails.endpoint,\n swScope: oldDetails.swScope,\n vapidKey: arrayToBase64(oldDetails.vapidKey)\n }\n };\n } else if (db.oldVersion === 4) {\n const oldDetails = value as V4TokenDetails;\n\n tokenDetails = {\n token: oldDetails.fcmToken,\n createTime: oldDetails.createTime,\n subscriptionOptions: {\n auth: arrayToBase64(oldDetails.auth),\n p256dh: arrayToBase64(oldDetails.p256dh),\n endpoint: oldDetails.endpoint,\n swScope: oldDetails.swScope,\n vapidKey: arrayToBase64(oldDetails.vapidKey)\n }\n };\n }\n });\n db.close();\n\n // Delete all old databases.\n await deleteDb(OLD_DB_NAME);\n await deleteDb('fcm_vapid_details_db');\n await deleteDb('undefined');\n\n return checkTokenDetails(tokenDetails) ? tokenDetails : null;\n}\n\nfunction checkTokenDetails(\n tokenDetails: TokenDetails | null\n): tokenDetails is TokenDetails {\n if (!tokenDetails || !tokenDetails.subscriptionOptions) {\n return false;\n }\n const { subscriptionOptions } = tokenDetails;\n return (\n typeof tokenDetails.createTime === 'number' &&\n tokenDetails.createTime > 0 &&\n typeof tokenDetails.token === 'string' &&\n tokenDetails.token.length > 0 &&\n typeof subscriptionOptions.auth === 'string' &&\n subscriptionOptions.auth.length > 0 &&\n typeof subscriptionOptions.p256dh === 'string' &&\n subscriptionOptions.p256dh.length > 0 &&\n typeof subscriptionOptions.endpoint === 'string' &&\n subscriptionOptions.endpoint.length > 0 &&\n typeof subscriptionOptions.swScope === 'string' &&\n subscriptionOptions.swScope.length > 0 &&\n typeof subscriptionOptions.vapidKey === 'string' &&\n subscriptionOptions.vapidKey.length > 0\n );\n}\n","/**\n * @license\n * Copyright 2019 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DB, openDb, deleteDb } from 'idb';\nimport { TokenDetails } from '../interfaces/token-details';\nimport { migrateOldDatabase } from './migrate-old-database';\nimport { FirebaseInternalDependencies } from '../interfaces/internal-dependencies';\n\n// Exported for tests.\nexport const DATABASE_NAME = 'firebase-messaging-database';\nconst DATABASE_VERSION = 1;\nconst OBJECT_STORE_NAME = 'firebase-messaging-store';\n\nlet dbPromise: Promise<DB> | null = null;\nfunction getDbPromise(): Promise<DB> {\n if (!dbPromise) {\n dbPromise = openDb(DATABASE_NAME, DATABASE_VERSION, upgradeDb => {\n // We don't use 'break' in this switch statement, the fall-through\n // behavior is what we want, because if there are multiple versions between\n // the old version and the current version, we want ALL the migrations\n // that correspond to those versions to run, not only the last one.\n // eslint-disable-next-line default-case\n switch (upgradeDb.oldVersion) {\n case 0:\n upgradeDb.createObjectStore(OBJECT_STORE_NAME);\n }\n });\n }\n return dbPromise;\n}\n\n/** Gets record(s) from the objectStore that match the given key. */\nexport async function dbGet(\n firebaseDependencies: FirebaseInternalDependencies\n): Promise<TokenDetails | undefined> {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n const tokenDetails = await db\n .transaction(OBJECT_STORE_NAME)\n .objectStore(OBJECT_STORE_NAME)\n .get(key);\n\n if (tokenDetails) {\n return tokenDetails;\n } else {\n // Check if there is a tokenDetails object in the old DB.\n const oldTokenDetails = await migrateOldDatabase(\n firebaseDependencies.appConfig.senderId\n );\n if (oldTokenDetails) {\n await dbSet(firebaseDependencies, oldTokenDetails);\n return oldTokenDetails;\n }\n }\n}\n\n/** Assigns or overwrites the record for the given key with the given value. */\nexport async function dbSet(\n firebaseDependencies: FirebaseInternalDependencies,\n tokenDetails: TokenDetails\n): Promise<TokenDetails> {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n await tx.objectStore(OBJECT_STORE_NAME).put(tokenDetails, key);\n await tx.complete;\n return tokenDetails;\n}\n\n/** Removes record(s) from the objectStore that match the given key. */\nexport async function dbRemove(\n firebaseDependencies: FirebaseInternalDependencies\n): Promise<void> {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\n await tx.complete;\n}\n\n/** Deletes the DB. Useful for tests. */\nexport async function dbDelete(): Promise<void> {\n if (dbPromise) {\n (await dbPromise).close();\n await deleteDb(DATABASE_NAME);\n dbPromise = null;\n }\n}\n\nfunction getKey({ appConfig }: FirebaseInternalDependencies): string {\n return appConfig.appId;\n}\n","/**\n * @license\n * Copyright 2019 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const DEFAULT_SW_PATH = '/firebase-messaging-sw.js';\nexport const DEFAULT_SW_SCOPE = '/firebase-cloud-messaging-push-scope';\n\nexport const DEFAULT_VAPID_KEY =\n 'BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4';\n\nexport const ENDPOINT = 'https://fcmregistrations.googleapis.com/v1';\n\n/** Key of FCM Payload in Notification's data field. */\nexport const FCM_MSG = 'FCM_MSG';\n\nexport const CONSOLE_CAMPAIGN_ID = 'google.c.a.c_id';\nexport const CONSOLE_CAMPAIGN_NAME = 'google.c.a.c_l';\nexport const CONSOLE_CAMPAIGN_TIME = 'google.c.a.ts';\n/** Set to '1' if Analytics is enabled for the campaign */\nexport const CONSOLE_CAMPAIGN_ANALYTICS_ENABLED = 'google.c.a.e';\n","/**\n * @license\n * Copyright 2019 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ErrorCode, ERROR_FACTORY } from '../util/errors';\nimport { DEFAULT_VAPID_KEY, ENDPOINT } from '../util/constants';\nimport { TokenDetails, SubscriptionOptions } from '../interfaces/token-details';\nimport { FirebaseInternalDependencies } from '../interfaces/internal-dependencies';\nimport { AppConfig } from '../interfaces/app-config';\n\nexport interface ApiResponse {\n token?: string;\n error?: { message: string };\n}\n\nexport interface ApiRequestBody {\n web: {\n endpoint: string;\n p256dh: string;\n auth: string;\n applicationPubKey?: string;\n };\n}\n\nexport async function requestGetToken(\n firebaseDependencies: FirebaseInternalDependencies,\n subscriptionOptions: SubscriptionOptions\n): Promise<string> {\n const headers = await getHeaders(firebaseDependencies);\n const body = getBody(subscriptionOptions);\n\n const subscribeOptions = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n\n let responseData: ApiResponse;\n try {\n const response = await fetch(\n getEndpoint(firebaseDependencies.appConfig),\n subscribeOptions\n );\n responseData = await response.json();\n } catch (err) {\n throw ERROR_FACTORY.create(ErrorCode.TOKEN_SUBSCRIBE_FAILED, {\n errorInfo: err\n });\n }\n\n if (responseData.error) {\n const message = responseData.error.message;\n throw ERROR_FACTORY.create(ErrorCode.TOKEN_SUBSCRIBE_FAILED, {\n errorInfo: message\n });\n }\n\n if (!responseData.token) {\n throw ERROR_FACTORY.create(ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN);\n }\n\n return responseData.token;\n}\n\nexport async function requestUpdateToken(\n firebaseDependencies: FirebaseInternalDependencies,\n tokenDetails: TokenDetails\n): Promise<string> {\n const headers = await getHeaders(firebaseDependencies);\n const body = getBody(tokenDetails.subscriptionOptions!);\n\n const updateOptions = {\n method: 'PATCH',\n headers,\n body: JSON.stringify(body)\n };\n\n let responseData: ApiResponse;\n try {\n const response = await fetch(\n `${getEndpoint(firebaseDependencies.appConfig)}/${tokenDetails.token}`,\n updateOptions\n );\n responseData = await response.json();\n } catch (err) {\n throw ERROR_FACTORY.create(ErrorCode.TOKEN_UPDATE_FAILED, {\n errorInfo: err\n });\n }\n\n if (responseData.error) {\n const message = responseData.error.message;\n throw ERROR_FACTORY.create(ErrorCode.TOKEN_UPDATE_FAILED, {\n errorInfo: message\n });\n }\n\n if (!responseData.token) {\n throw ERROR_FACTORY.create(ErrorCode.TOKEN_UPDATE_NO_TOKEN);\n }\n\n return responseData.token;\n}\n\nexport async function requestDeleteToken(\n firebaseDependencies: FirebaseInternalDependencies,\n token: string\n): Promise<void> {\n const headers = await getHeaders(firebaseDependencies);\n\n const unsubscribeOptions = {\n method: 'DELETE',\n headers\n };\n\n try {\n const response = await fetch(\n `${getEndpoint(firebaseDependencies.appConfig)}/${token}`,\n unsubscribeOptions\n );\n const responseData: ApiResponse = await response.json();\n if (responseData.error) {\n const message = responseData.error.message;\n throw ERROR_FACTORY.create(ErrorCode.TOKEN_UNSUBSCRIBE_FAILED, {\n errorInfo: message\n });\n }\n } catch (err) {\n throw ERROR_FACTORY.create(ErrorCode.TOKEN_UNSUBSCRIBE_FAILED, {\n errorInfo: err\n });\n }\n}\n\nfunction getEndpoint({ projectId }: AppConfig): string {\n return `${ENDPOINT}/projects/${projectId!}/registrations`;\n}\n\nasync function getHeaders({\n appConfig,\n installations\n}: FirebaseInternalDependencies): Promise<Headers> {\n const authToken = await installations.getToken();\n\n return new Headers({\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-goog-api-key': appConfig.apiKey!,\n 'x-goog-firebase-installations-auth': `FIS ${authToken}`\n });\n}\n\nfunction getBody({\n p256dh,\n auth,\n endpoint,\n vapidKey\n}: SubscriptionOptions): ApiRequestBody {\n const body: ApiRequestBody = {\n web: {\n endpoint,\n auth,\n p256dh\n }\n };\n\n if (vapidKey !== DEFAULT_VAPID_KEY) {\n body.web.applicationPubKey = vapidKey;\n }\n\n return body;\n}\n","/**\n * @license\n * Copyright 2019 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { dbGet, dbSet, dbRemove } from '../helpers/idb-manager';\nimport { FirebaseInternalDependencies } from '../interfaces/internal-dependencies';\nimport { TokenDetails, SubscriptionOptions } from '../interfaces/token-details';\nimport { requestUpdateToken, requestGetToken, requestDeleteToken } from './api';\nimport { arrayToBase64 } from '../helpers/array-to-base64';\nimport { ERROR_FACTORY, ErrorCode } from '../util/errors';\n\n/** UpdateRegistration will be called once every week. */\nconst TOKEN_EXPIRATION_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\nexport async function getToken(\n firebaseDependencies: FirebaseInternalDependencies,\n swRegistration: ServiceWorkerRegistration,\n vapidKey: string\n): Promise<string> {\n if (Notification.permission !== 'granted') {\n throw ERROR_FACTORY.create(ErrorCode.PERMISSION_BLOCKED);\n }\n\n // If a PushSubscription exists it's returned, otherwise a new subscription\n // is generated and returned.\n const pushSubscription = await getPushSubscription(swRegistration, vapidKey);\n const tokenDetails = await dbGet(firebaseDependencies);\n\n const subscriptionOptions: SubscriptionOptions = {\n vapidKey,\n swScope: swRegistration.scope,\n endpoint: pushSubscription.endpoint,\n auth: arrayToBase64(pushSubscription.getKey('auth')!),\n p256dh: arrayToBase64(pushSubscription.getKey('p256dh')!)\n };\n\n if (!tokenDetails) {\n // No token, get a new one.\n return getNewToken(firebaseDependencies, subscriptionOptions);\n } else if (\n !isTokenValid(tokenDetails.subscriptionOptions!, subscriptionOptions)\n ) {\n // Invalid token, get a new one.\n try {\n await requestDeleteToken(firebaseDependencies, tokenDetails.token);\n } catch (e) {\n // Suppress errors because of #2364\n console.warn(e);\n }\n\n return getNewToken(firebaseDependencies, subscriptionOptions);\n } else if (Date.now() >= tokenDetails.createTime + TOKEN_EXPIRATION_MS) {\n // Weekly token refresh\n return updateToken(\n {\n token: tokenDetails.token,\n createTime: Date.now(),\n subscriptionOptions\n },\n firebaseDependencies,\n swRegistration\n );\n } else {\n // Valid token, nothing to do.\n return tokenDetails.token;\n }\n}\n\n/**\n * This method deletes the token from the database, unsubscribes the token from\n * FCM, and unregisters the push subscription if it exists.\n */\nexport async function deleteToken(\n firebaseDependencies: FirebaseInternalDependencies,\n swRegistration: ServiceWorkerRegistration\n): Promise<boolean> {\n const tokenDetails = await dbGet(firebaseDependencies);\n if (tokenDetails) {\n await requestDeleteToken(firebaseDependencies, tokenDetails.token);\n await dbRemove(firebaseDependencies);\n }\n\n // Unsubscribe from the push subscription.\n const pushSubscription = await swRegistration.pushManager.getSubscription();\n if (pushSubscription) {\n return pushSubscription.unsubscribe();\n }\n\n // If there's no SW, consider it a success.\n return true;\n}\n\nasync function updateToken(\n tokenDetails: TokenDetails,\n firebaseDependencies: FirebaseInternalDependencies,\n swRegistration: ServiceWorkerRegistration\n): Promise<string> {\n try {\n const updatedToken = await requestUpdateToken(\n firebaseDependencies,\n tokenDetails\n );\n\n const updatedTokenDetails: TokenDetails = {\n token: updatedToken,\n createTime: Date.now(),\n ...tokenDetails\n };\n\n await dbSet(firebaseDependencies, updatedTokenDetails);\n return updatedToken;\n } catch (e) {\n await deleteToken(firebaseDependencies, swRegistration);\n throw e;\n }\n}\n\nasync function getNewToken(\n firebaseDependencies: FirebaseInternalDependencies,\n subscriptionOptions: SubscriptionOptions\n): Promise<string> {\n const token = await requestGetToken(\n firebaseDependencies,\n subscriptionOptions\n );\n const tokenDetails: TokenDetails = {\n token,\n createTime: Date.now(),\n subscriptionOptions\n };\n await dbSet(firebaseDependencies, tokenDetails);\n return tokenDetails.token;\n}\n\n/**\n * Gets a PushSubscription for the current user.\n */\nasync function getPushSubscription(\n swRegistration: ServiceWorkerRegistration,\n vapidKey: string\n): Promise<PushSubscription> {\n const subscription = await swRegistration.pushManager.getSubscription();\n if (subscription) {\n return subscription;\n }\n return swRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: vapidKey\n });\n}\n\n/**\n * Checks if the saved tokenDetails object matches the configuration provided.\n */\nfunction isTokenValid(\n dbOptions: SubscriptionOptions,\n currentOptions: SubscriptionOptions\n): boolean {\n const isVapidKeyEqual = currentOptions.vapidKey === dbOptions.vapidKey;\n const isEndpointEqual = currentOptions.endpoint === dbOptions.endpoint;\n const isAuthEqual = currentOptions.auth === dbOptions.auth;\n const isP256dhEqual = currentOptions.p256dh === dbOptions.p256dh;\n\n return isVapidKeyEqual && isEndpointEqual && isAuthEqual && isP256dhEqual;\n}\n","/**\n * @license\n * Copyright 2017 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MessagePayload } from './message-payload';\n\nexport enum MessageType {\n PUSH_RECEIVED = 'push-received',\n NOTIFICATION_CLICKED = 'notification-clicked'\n}\n\nexport interface InternalMessage {\n firebaseMessaging: {\n type: MessageType;\n payload: MessagePayload;\n };\n}\n","/**\n * @license\n * Copyright 2019 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ConsoleMessageData } from '../interfaces/message-payload';\nimport { CONSOLE_CAMPAIGN_ID } from '../util/constants';\n\nexport function isConsoleMessage(data: unknown): data is ConsoleMessageData {\n // This message has a campaign ID, meaning it was sent using the\n // Firebase Console.\n return typeof data === 'object' && !!data && CONSOLE_CAMPAIGN_ID in data;\n}\n","/**\n * @license\n * Copyright 2017 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getToken, deleteToken } from '../core/token-management';\nimport { FirebaseInternalDependencies } from '../interfaces/internal-dependencies';\nimport { FirebaseMessaging } from '@firebase/messaging-types';\nimport { ERROR_FACTORY, ErrorCode } from '../util/errors';\nimport { NextFn, Observer, Unsubscribe } from '@firebase/util';\nimport { InternalMessage, MessageType } from '../interfaces/internal-message';\nimport {\n CONSOLE_CAMPAIGN_ID,\n CONSOLE_CAMPAIGN_ANALYTICS_ENABLED,\n CONSOLE_CAMPAIGN_NAME,\n CONSOLE_CAMPAIGN_TIME,\n DEFAULT_SW_PATH,\n DEFAULT_SW_SCOPE,\n DEFAULT_VAPID_KEY\n} from '../util/constants';\nimport { FirebaseApp } from '@firebase/app-types';\nimport { ConsoleMessageData } from '../interfaces/message-payload';\nimport { isConsoleMessage } from '../helpers/is-console-message';\nimport { FirebaseService } from '@firebase/app-types/private';\n\nexport class WindowController implements FirebaseMessaging, FirebaseService {\n private vapidKey: string | null = null;\n private swRegistration?: ServiceWorkerRegistration;\n private onMessageCallback: NextFn<object> | null = null;\n\n constructor(\n private readonly firebaseDependencies: FirebaseInternalDependencies\n ) {\n navigator.serviceWorker.addEventListener('message', e =>\n this.messageEventListener(e)\n );\n }\n\n get app(): FirebaseApp {\n return this.firebaseDependencies.app;\n }\n\n async getToken(): Promise<string> {\n if (!this.vapidKey) {\n this.vapidKey = DEFAULT_VAPID_KEY;\n }\n\n const swRegistration = await this.getServiceWorkerRegistration();\n\n // Check notification permission.\n if (Notification.permission === 'default') {\n // The user hasn't allowed or denied notifications yet. Ask them.\n await Notification.requestPermission();\n }\n\n if (Notification.permission !== 'granted') {\n throw ERROR_FACTORY.create(ErrorCode.PERMISSION_BLOCKED);\n }\n\n return getToken(this.firebaseDependencies, swRegistration, this.vapidKey);\n }\n\n async deleteToken(): Promise<boolean> {\n const swRegistration = await this.getServiceWorkerRegistration();\n\n return deleteToken(this.firebaseDependencies, swRegistration);\n }\n\n /**\n * Request permission if it is not currently granted.\n *\n * @return Resolves if the permission was granted, rejects otherwise.\n *\n * @deprecated Use Notification.requestPermission() instead.\n * https://developer.mozilla.org/en-US/docs/Web/API/Notification/requestPermission\n */\n async requestPermission(): Promise<void> {\n if (Notification.permission === 'granted') {\n return;\n }\n\n const permissionResult = await Notification.requestPermission();\n if (permissionResult === 'granted') {\n return;\n } else if (permissionResult === 'denied') {\n throw ERROR_FACTORY.create(ErrorCode.PERMISSION_BLOCKED);\n } else {\n throw ERROR_FACTORY.create(ErrorCode.PERMISSION_DEFAULT);\n }\n }\n\n // TODO: Deprecate this and make VAPID key a parameter in getToken.\n usePublicVapidKey(vapidKey: string): void {\n if (this.vapidKey !== null) {\n throw ERROR_FACTORY.create(ErrorCode.USE_VAPID_KEY_AFTER_GET_TOKEN);\n }\n\n if (typeof vapidKey !== 'string' || vapidKey.length === 0) {\n throw ERROR_FACTORY.create(ErrorCode.INVALID_VAPID_KEY);\n }\n\n this.vapidKey = vapidKey;\n }\n\n useServiceWorker(swRegistration: ServiceWorkerRegistration): void {\n if (!(swRegistration instanceof ServiceWorkerRegistration)) {\n throw ERROR_FACTORY.create(ErrorCode.INVALID_SW_REGISTRATION);\n }\n\n if (this.swRegistration) {\n throw ERROR_FACTORY.create(ErrorCode.USE_SW_AFTER_GET_TOKEN);\n }\n\n this.swRegistration = swRegistration;\n }\n\n /**\n * @param nextOrObserver An observer object or a function triggered on\n * message.\n * @return The unsubscribe function for the observer.\n */\n // TODO: Simplify this to only accept a function and not an Observer.\n onMessage(nextOrObserver: NextFn<object> | Observer<object>): Unsubscribe {\n this.onMessageCallback =\n typeof nextOrObserver === 'function'\n ? nextOrObserver\n : nextOrObserver.next;\n\n return () => {\n this.onMessageCallback = null;\n };\n }\n\n setBackgroundMessageHandler(): void {\n throw ERROR_FACTORY.create(ErrorCode.AVAILABLE_IN_SW);\n }\n\n // Unimplemented\n onTokenRefresh(): Unsubscribe {\n return () => {};\n }\n\n /**\n * Creates or updates the default service worker registration.\n * @return The service worker registration to be used for the push service.\n */\n private async getServiceWorkerRegistration(): Promise<\n ServiceWorkerRegistration\n > {\n if (!this.swRegistration) {\n try {\n this.swRegistration = await navigator.serviceWorker.register(\n DEFAULT_SW_PATH,\n {\n scope: DEFAULT_SW_SCOPE\n }\n );\n } catch (e) {\n throw ERROR_FACTORY.create(ErrorCode.FAILED_DEFAULT_REGISTRATION, {\n browserErrorMessage: e.message\n });\n }\n }\n\n return this.swRegistration;\n }\n\n private async messageEventListener(event: MessageEvent): Promise<void> {\n if (!event.data?.firebaseMessaging) {\n // Not a message from FCM\n return;\n }\n\n const { type, payload } = (event.data as InternalMessage).firebaseMessaging;\n\n if (this.onMessageCallback && type === MessageType.PUSH_RECEIVED) {\n this.onMessageCallback(payload);\n }\n\n const { data } = payload;\n if (\n isConsoleMessage(data) &&\n data[CONSOLE_CAMPAIGN_ANALYTICS_ENABLED] === '1'\n ) {\n // Analytics is enabled on this message, so we should log it.\n await this.logEvent(type, data);\n }\n }\n\n private async logEvent(\n messageType: MessageType,\n data: ConsoleMessageData\n ): Promise<void> {\n const eventType = getEventType(messageType);\n const analytics = await this.firebaseDependencies.analyticsProvider.get();\n analytics.logEvent(eventType, {\n /* eslint-disable camelcase */\n message_id: data[CONSOLE_CAMPAIGN_ID],\n message_name: data[CONSOLE_CAMPAIGN_NAME],\n message_time: data[CONSOLE_CAMPAIGN_TIME],\n message_device_time: Math.floor(Date.now() / 1000)\n /* eslint-enable camelcase */\n });\n }\n}\n\nfunction getEventType(messageType: MessageType): string {\n switch (messageType) {\n case MessageType.NOTIFICATION_CLICKED:\n return 'notification_open';\n case MessageType.PUSH_RECEIVED:\n return 'notification_foreground';\n default:\n throw new Error();\n }\n}\n","/**\n * @license\n * Copyright 2019 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** Returns a promise that resolves after given time passes. */\nexport function sleep(ms: number): Promise<void> {\n return new Promise<void>(resolve => {\n setTimeout(resolve, ms);\n });\n}\n","/**\n * @license\n * Copyright 2017 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { deleteToken, getToken } from '../core/token-management';\nimport { FirebaseInternalDependencies } from '../interfaces/internal-dependencies';\nimport { FirebaseMessaging } from '@firebase/messaging-types';\nimport { ERROR_FACTORY, ErrorCode } from '../util/errors';\nimport {\n MessagePayload,\n NotificationDetails\n} from '../interfaces/message-payload';\nimport { FCM_MSG, DEFAULT_VAPID_KEY } from '../util/constants';\nimport { MessageType, InternalMessage } from '../interfaces/internal-message';\nimport { dbGet } from '../helpers/idb-manager';\nimport { Unsubscribe } from '@firebase/util';\nimport { sleep } from '../helpers/sleep';\nimport { FirebaseApp } from '@firebase/app-types';\nimport { isConsoleMessage } from '../helpers/is-console-message';\nimport { FirebaseService } from '@firebase/app-types/private';\n\n// Let TS know that this is a service worker\ndeclare const self: ServiceWorkerGlobalScope;\n\nexport type BgMessageHandler = (payload: MessagePayload) => unknown;\n\nexport class SwController implements FirebaseMessaging, FirebaseService {\n private vapidKey: string | null = null;\n private bgMessageHandler: BgMessageHandler | null = null;\n\n constructor(\n private readonly firebaseDependencies: FirebaseInternalDependencies\n ) {\n self.addEventListener('push', e => {\n e.waitUntil(this.onPush(e));\n });\n self.addEventListener('pushsubscriptionchange', e => {\n e.waitUntil(this.onSubChange(e));\n });\n self.addEventListener('notificationclick', e => {\n e.waitUntil(this.onNotificationClick(e));\n });\n }\n\n get app(): FirebaseApp {\n return this.firebaseDependencies.app;\n }\n\n /**\n * Calling setBackgroundMessageHandler will opt in to some specific\n * behaviours.\n * 1.) If a notification doesn't need to be shown due to a window already\n * being visible, then push messages will be sent to the page.\n * 2.) If a notification needs to be shown, and the message contains no\n * notification data this method will be called\n * and the promise it returns will be passed to event.waitUntil.\n * If you do not set this callback then all push messages will let and the\n * developer can handle them in a their own 'push' event callback\n *\n * @param callback The callback to be called when a push message is received\n * and a notification must be shown. The callback will be given the data from\n * the push message.\n */\n setBackgroundMessageHandler(callback: BgMessageHandler): void {\n if (!callback || typeof callback !== 'function') {\n throw ERROR_FACTORY.create(ErrorCode.INVALID_BG_HANDLER);\n }\n\n this.bgMessageHandler = callback;\n }\n\n // TODO: Remove getToken from SW Controller.\n // Calling this from an old SW can cause all kinds of trouble.\n async getToken(): Promise<string> {\n if (!this.vapidKey) {\n // Call getToken using the current VAPID key if there already is a token.\n // This is needed because usePublicVapidKey was not available in SW.\n // It will be removed when vapidKey becomes a parameter of getToken, or\n // when getToken is removed from SW.\n const tokenDetails = await dbGet(this.firebaseDependencies);\n this.vapidKey =\n tokenDetails?.subscriptionOptions?.vapidKey ?? DEFAULT_VAPID_KEY;\n }\n\n return getToken(\n this.firebaseDependencies,\n self.registration,\n this.vapidKey\n );\n }\n\n // TODO: Remove deleteToken from SW Controller.\n // Calling this from an old SW can cause all kinds of trouble.\n deleteToken(): Promise<boolean> {\n return deleteToken(this.firebaseDependencies, self.registration);\n }\n\n requestPermission(): Promise<void> {\n throw ERROR_FACTORY.create(ErrorCode.AVAILABLE_IN_WINDOW);\n }\n\n // TODO: Deprecate this and make VAPID key a parameter in getToken.\n // TODO: Remove this together with getToken from SW Controller.\n usePublicVapidKey(vapidKey: string): void {\n if (this.vapidKey !== null) {\n throw ERROR_FACTORY.create(ErrorCode.USE_VAPID_KEY_AFTER_GET_TOKEN);\n }\n\n if (typeof vapidKey !== 'string' || vapidKey.length === 0) {\n throw ERROR_FACTORY.create(ErrorCode.INVALID_VAPID_KEY);\n }\n\n this.vapidKey = vapidKey;\n }\n\n useServiceWorker(): void {\n throw ERROR_FACTORY.create(ErrorCode.AVAILABLE_IN_WINDOW);\n }\n\n onMessage(): Unsubscribe {\n throw ERROR_FACTORY.create(ErrorCode.AVAILABLE_IN_WINDOW);\n }\n\n onTokenRefresh(): Unsubscribe {\n throw ERROR_FACTORY.create(ErrorCode.AVAILABLE_IN_WINDOW);\n }\n\n /**\n * A handler for push events that shows notifications based on the content of\n * the payload.\n *\n * The payload must be a JSON-encoded Object with a `notification` key. The\n * value of the `notification` property will be used as the NotificationOptions\n * object passed to showNotification. Additionally, the `title` property of the\n * notification object will be used as the title.\n *\n * If there is no notification data in the payload then no notification will be\n * shown.\n */\n async onPush(event: PushEvent): Promise<void> {\n const payload = getMessagePayload(event);\n if (!payload) {\n return;\n }\n\n const clientList = await getClientList();\n if (hasVisibleClients(clientList)) {\n // App in foreground. Send to page.\n return sendMessageToWindowClients(clientList, payload);\n }\n\n const notificationDetails = getNotificationData(payload);\n if (notificationDetails) {\n await showNotification(notificationDetails);\n } else if (this.bgMessageHandler) {\n await this.bgMessageHandler(payload);\n }\n }\n\n async onSubChange(event: PushSubscriptionChangeEvent): Promise<void> {\n const { newSubscription } = event;\n if (!newSubscription) {\n // Subscription revoked, delete token\n await deleteToken(this.firebaseDependencies, self.registration);\n return;\n }\n\n const tokenDetails = await dbGet(this.firebaseDependencies);\n await deleteToken(this.firebaseDependencies, self.registration);\n await getToken(\n this.firebaseDependencies,\n self.registration,\n tokenDetails?.subscriptionOptions?.vapidKey ?? DEFAULT_VAPID_KEY\n );\n }\n\n async onNotificationClick(event: NotificationEvent): Promise<void> {\n const payload: MessagePayload = event.notification?.data?.[FCM_MSG];\n if (!payload) {\n // Not an FCM notification, do nothing.\n return;\n } else if (event.action) {\n // User clicked on an action button.\n // This will allow devs to act on action button clicks by using a custom\n // onNotificationClick listener that they define.\n return;\n }\n\n // Prevent other listeners from receiving the event\n event.stopImmediatePropagation();\n event.notification.close();\n\n const link = getLink(payload);\n if (!link) {\n return;\n }\n\n let client = await getWindowClient(link);\n if (!client) {\n // Unable to find window client so need to open one.\n // This also focuses the opened client.\n client = await self.clients.openWindow(link);\n // Wait three seconds for the client to initialize and set up the message\n // handler so that it can receive the message.\n await sleep(3000);\n } else {\n client = await client.focus();\n }\n\n if (!client) {\n // Window Client will not be returned if it's for a third party origin.\n return;\n }\n\n const message = createNewMessage(MessageType.NOTIFICATION_CLICKED, payload);\n return client.postMessage(message);\n }\n}\n\nfunction getMessagePayload({ data }: PushEvent): MessagePayload | null {\n if (!data) {\n return null;\n }\n\n try {\n return data.json();\n } catch (err) {\n // Not JSON so not an FCM message.\n return null;\n }\n}\n\nfunction getNotificationData(\n payload: MessagePayload\n): NotificationDetails | undefined {\n if (!payload || typeof payload.notification !== 'object') {\n return;\n }\n\n const notificationInformation: NotificationDetails = {\n ...payload.notification\n };\n\n // Put the message payload under FCM_MSG name so we can identify the\n // notification as being an FCM notification vs a notification from\n // somewhere else (i.e. normal web push or developer generated\n // notification).\n notificationInformation.data = {\n ...payload.notification.data,\n [FCM_MSG]: payload\n };\n\n return notificationInformation;\n}\n\n/**\n * @param url The URL to look for when focusing a client.\n * @return Returns an existing window client or a newly opened WindowClient.\n */\nasync function getWindowClient(url: string): Promise<WindowClient | null> {\n // Use URL to normalize the URL when comparing to windowClients.\n // This at least handles whether to include trailing slashes or not\n const parsedURL = new URL(url, self.location.href).href;\n\n const clientList = await getClientList();\n\n for (const client of clientList) {\n const parsedClientUrl = new URL(client.url, self.location.href).href;\n if (parsedClientUrl === parsedURL) {\n return client;\n }\n }\n\n return null;\n}\n\n/**\n * @returns If there is currently a visible WindowClient, this method will\n * resolve to true, otherwise false.\n */\nfunction hasVisibleClients(clientList: WindowClient[]): boolean {\n return clientList.some(\n client =>\n client.visibilityState === 'visible' &&\n // Ignore chrome-extension clients as that matches the background pages\n // of extensions, which are always considered visible for some reason.\n !client.url.startsWith('chrome-extension://')\n );\n}\n\n/**\n * @param payload The data from the push event that should be sent to all\n * available pages.\n * @returns Returns a promise that resolves once the message has been sent to\n * all WindowClients.\n */\nfunction sendMessageToWindowClients(\n clientList: WindowClient[],\n payload: MessagePayload\n): void {\n const message = createNewMessage(MessageType.PUSH_RECEIVED, payload);\n\n for (const client of clientList) {\n client.postMessage(message);\n }\n}\n\nfunction getClientList(): Promise<WindowClient[]> {\n return self.clients.matchAll({\n type: 'window',\n includeUncontrolled: true\n // TS doesn't know that \"type: 'window'\" means it'll return WindowClient[]\n }) as Promise<WindowClient[]>;\n}\n\nfunction createNewMessage(\n type: MessageType,\n payload: MessagePayload\n): InternalMessage {\n return {\n firebaseMessaging: { type, payload }\n };\n}\n\nfunction showNotification(details: NotificationDetails): Promise<void> {\n const title = details.title ?? '';\n\n const { actions } = details;\n const { maxActions } = Notification;\n if (actions && maxActions && actions.length > maxActions) {\n console.warn(\n `This browser only supports ${maxActions} actions. The remaining actions will not be displayed.`\n );\n }\n\n return self.registration.showNotification(title, details);\n}\n\nfunction getLink(payload: MessagePayload): string | null {\n // eslint-disable-next-line camelcase\n const link = payload.fcmOptions?.link ?? payload.notification?.click_action;\n if (link) {\n return link;\n }\n\n if (isConsoleMessage(payload.data)) {\n // Notification created in the Firebase Console. Redirect to origin.\n return self.location.origin;\n } else {\n return null;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport firebase from '@firebase/app';\nimport '@firebase/installations';\nimport {\n _FirebaseNamespace,\n FirebaseService\n} from '@firebase/app-types/private';\nimport { FirebaseMessaging } from '@firebase/messaging-types';\nimport {\n Component,\n ComponentType,\n ComponentContainer\n} from '@firebase/component';\nimport { extractAppConfig } from './helpers/extract-app-config';\nimport { FirebaseInternalDependencies } from './interfaces/internal-dependencies';\nimport { ERROR_FACTORY, ErrorCode } from './util/errors';\nimport { WindowController } from './controllers/window-controller';\nimport { SwController } from './controllers/sw-controller';\n\nconst MESSAGING_NAME = 'messaging';\nfunction factoryMethod(\n container: ComponentContainer\n): FirebaseService & FirebaseMessaging {\n // Dependencies.\n const app = container.getProvider('app').getImmediate();\n const appConfig = extractAppConfig(app);\n const installations = container.getProvider('installations').getImmediate();\n const analyticsProvider = container.getProvider('analytics-internal');\n\n const firebaseDependencies: FirebaseInternalDependencies = {\n app,\n appConfig,\n installations,\n analyticsProvider\n };\n\n if (!isSupported()) {\n throw ERROR_FACTORY.create(ErrorCode.UNSUPPORTED_BROWSER);\n }\n\n if (self && 'ServiceWorkerGlobalScope' in self) {\n // Running in ServiceWorker context\n return new SwController(firebaseDependencies);\n } else {\n // Assume we are in the window context.\n return new WindowController(firebaseDependencies);\n }\n}\n\nconst NAMESPACE_EXPORTS = {\n isSupported\n};\n\n(firebase as _FirebaseNamespace).INTERNAL.registerComponent(\n new Component(\n MESSAGING_NAME,\n factoryMethod,\n ComponentType.PUBLIC\n ).setServiceProps(NAMESPACE_EXPORTS)\n);\n\n/**\n * Define extension behavior of `registerMessaging`\n */\ndeclare module '@firebase/app-types' {\n interface FirebaseNamespace {\n messaging: {\n (app?: FirebaseApp): FirebaseMessaging;\n isSupported(): boolean;\n };\n }\n interface FirebaseApp {\n messaging(): FirebaseMessaging;\n }\n}\n\nfunction isSupported(): boolean {\n if (self && 'ServiceWorkerGlobalScope' in self) {\n // Running in ServiceWorker context\n return isSWControllerSupported();\n } else {\n // Assume we are in the window context.\n return isWindowControllerSupported();\n }\n}\n\n/**\n * Checks to see if the required APIs exist.\n */\nfunction isWindowControllerSupported(): boolean {\n return (\n 'indexedDB' in window &&\n indexedDB !== null &&\n navigator.cookieEnabled &&\n 'serviceWorker' in navigator &&\n 'PushManager' in window &&\n 'Notification' in window &&\n 'fetch' in window &&\n ServiceWorkerRegistration.prototype.hasOwnProperty('showNotification') &&\n PushSubscription.prototype.hasOwnProperty('getKey')\n );\n}\n\n/**\n * Checks to see if the required APIs exist within SW Context.\n */\nfunction isSWControllerSupported(): boolean {\n return (\n 'indexedDB' in self &&\n indexedDB !== null &&\n 'PushManager' in self &&\n 'Notification' in self &&\n ServiceWorkerRegistration.prototype.hasOwnProperty('showNotification') &&\n PushSubscription.prototype.hasOwnProperty('getKey')\n );\n}\n"],"names":["ErrorFactory","__values","openDb","deleteDb","Component"],"mappings":"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"}