mirror of
https://github.com/musix-org/musix-oss
synced 2024-11-14 16:00:17 +00:00
1 line
106 KiB
Plaintext
1 line
106 KiB
Plaintext
{"version":3,"file":"index.esm2017.js","sources":["../src/models/errors.ts","../src/models/fcm-details.ts","../src/models/worker-page-message.ts","../src/helpers/is-array-buffer-equal.ts","../src/helpers/array-buffer-to-base64.ts","../src/models/iid-model.ts","../src/helpers/base64-to-array-buffer.ts","../src/models/clean-v1-undefined.ts","../src/models/db-interface.ts","../src/models/token-details-model.ts","../src/models/vapid-details-model.ts","../src/controllers/base-controller.ts","../src/controllers/sw-controller.ts","../src/models/default-sw.ts","../src/controllers/window-controller.ts","../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 AVAILABLE_IN_WINDOW = 'only-available-in-window',\n AVAILABLE_IN_SW = 'only-available-in-sw',\n SHOULD_BE_INHERITED = 'should-be-overriden',\n BAD_SENDER_ID = 'bad-sender-id',\n PERMISSION_DEFAULT = 'permission-default',\n PERMISSION_BLOCKED = 'permission-blocked',\n UNSUPPORTED_BROWSER = 'unsupported-browser',\n NOTIFICATIONS_BLOCKED = 'notifications-blocked',\n FAILED_DEFAULT_REGISTRATION = 'failed-serviceworker-registration',\n SW_REGISTRATION_EXPECTED = 'sw-registration-expected',\n GET_SUBSCRIPTION_FAILED = 'get-subscription-failed',\n INVALID_SAVED_TOKEN = 'invalid-saved-token',\n SW_REG_REDUNDANT = 'sw-reg-redundant',\n TOKEN_SUBSCRIBE_FAILED = 'token-subscribe-failed',\n TOKEN_SUBSCRIBE_NO_TOKEN = 'token-subscribe-no-token',\n TOKEN_SUBSCRIBE_NO_PUSH_SET = 'token-subscribe-no-push-set',\n TOKEN_UNSUBSCRIBE_FAILED = 'token-unsubscribe-failed',\n TOKEN_UPDATE_FAILED = 'token-update-failed',\n TOKEN_UPDATE_NO_TOKEN = 'token-update-no-token',\n USE_SW_BEFORE_GET_TOKEN = 'use-sw-before-get-token',\n INVALID_DELETE_TOKEN = 'invalid-delete-token',\n DELETE_TOKEN_NOT_FOUND = 'delete-token-not-found',\n DELETE_SCOPE_NOT_FOUND = 'delete-scope-not-found',\n BG_HANDLER_FUNCTION_EXPECTED = 'bg-handler-function-expected',\n NO_WINDOW_CLIENT_TO_MSG = 'no-window-client-to-msg',\n UNABLE_TO_RESUBSCRIBE = 'unable-to-resubscribe',\n NO_FCM_TOKEN_FOR_RESUBSCRIBE = 'no-fcm-token-for-resubscribe',\n FAILED_TO_DELETE_TOKEN = 'failed-to-delete-token',\n NO_SW_IN_REG = 'no-sw-in-reg',\n BAD_SCOPE = 'bad-scope',\n BAD_VAPID_KEY = 'bad-vapid-key',\n BAD_SUBSCRIPTION = 'bad-subscription',\n BAD_TOKEN = 'bad-token',\n BAD_PUSH_SET = 'bad-push-set',\n FAILED_DELETE_VAPID_KEY = 'failed-delete-vapid-key',\n INVALID_PUBLIC_VAPID_KEY = 'invalid-public-vapid-key',\n USE_PUBLIC_KEY_BEFORE_GET_TOKEN = 'use-public-key-before-get-token',\n PUBLIC_KEY_DECRYPTION_FAILED = 'public-vapid-key-decryption-failed'\n}\n\nexport const ERROR_MAP: ErrorMap<ErrorCode> = {\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.SHOULD_BE_INHERITED]:\n 'This method should be overriden by extended classes.',\n [ErrorCode.BAD_SENDER_ID]:\n \"Please ensure that 'messagingSenderId' is set \" +\n 'correctly in the options passed into firebase.initializeApp().',\n [ErrorCode.PERMISSION_DEFAULT]:\n 'The required permissions were not granted and dismissed instead.',\n [ErrorCode.PERMISSION_BLOCKED]:\n 'The required permissions were not granted and blocked instead.',\n [ErrorCode.UNSUPPORTED_BROWSER]:\n \"This browser doesn't support the API's \" +\n 'required to use the firebase SDK.',\n [ErrorCode.NOTIFICATIONS_BLOCKED]: 'Notifications have been blocked.',\n [ErrorCode.FAILED_DEFAULT_REGISTRATION]:\n 'We are unable to register the ' +\n 'default service worker. {$browserErrorMessage}',\n [ErrorCode.SW_REGISTRATION_EXPECTED]:\n 'A service worker registration was the expected input.',\n [ErrorCode.GET_SUBSCRIPTION_FAILED]:\n 'There was an error when trying to get ' +\n 'any existing Push Subscriptions.',\n [ErrorCode.INVALID_SAVED_TOKEN]:\n 'Unable to access details of the saved token.',\n [ErrorCode.SW_REG_REDUNDANT]:\n 'The service worker being used for push was made redundant.',\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_SUBSCRIBE_NO_PUSH_SET]:\n 'FCM returned an invalid response when getting an FCM token.',\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_BEFORE_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_DELETE_TOKEN]:\n 'You must pass a valid token into ' +\n 'deleteToken(), i.e. the token from getToken().',\n [ErrorCode.DELETE_TOKEN_NOT_FOUND]:\n 'The deletion attempt for token could not ' +\n 'be performed as the token was not found.',\n [ErrorCode.DELETE_SCOPE_NOT_FOUND]:\n 'The deletion attempt for service worker ' +\n 'scope could not be performed as the scope was not found.',\n [ErrorCode.BG_HANDLER_FUNCTION_EXPECTED]:\n 'The input to setBackgroundMessageHandler() must be a function.',\n [ErrorCode.NO_WINDOW_CLIENT_TO_MSG]:\n 'An attempt was made to message a non-existant window client.',\n [ErrorCode.UNABLE_TO_RESUBSCRIBE]:\n 'There was an error while re-subscribing ' +\n 'the FCM token for push messaging. Will have to resubscribe the ' +\n 'user on next visit. {$errorInfo}',\n [ErrorCode.NO_FCM_TOKEN_FOR_RESUBSCRIBE]:\n 'Could not find an FCM token ' +\n 'and as a result, unable to resubscribe. Will have to resubscribe the ' +\n 'user on next visit.',\n [ErrorCode.FAILED_TO_DELETE_TOKEN]:\n 'Unable to delete the currently saved token.',\n [ErrorCode.NO_SW_IN_REG]:\n 'Even though the service worker registration was ' +\n 'successful, there was a problem accessing the service worker itself.',\n [ErrorCode.BAD_SCOPE]:\n 'The service worker scope must be a string with at ' +\n 'least one character.',\n [ErrorCode.BAD_VAPID_KEY]:\n 'The public VAPID key is not a Uint8Array with 65 bytes.',\n [ErrorCode.BAD_SUBSCRIPTION]:\n 'The subscription must be a valid PushSubscription.',\n [ErrorCode.BAD_TOKEN]:\n 'The FCM Token used for storage / lookup was not ' +\n 'a valid token string.',\n [ErrorCode.BAD_PUSH_SET]:\n 'The FCM push set used for storage / lookup was not ' +\n 'not a valid push set string.',\n [ErrorCode.FAILED_DELETE_VAPID_KEY]: 'The VAPID key could not be deleted.',\n [ErrorCode.INVALID_PUBLIC_VAPID_KEY]:\n 'The public VAPID key must be a string.',\n [ErrorCode.USE_PUBLIC_KEY_BEFORE_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 [ErrorCode.PUBLIC_KEY_DECRYPTION_FAILED]:\n 'The public VAPID key did not equal 65 bytes when decrypted.'\n};\n\ninterface ErrorParams {\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 [ErrorCode.UNABLE_TO_RESUBSCRIBE]: { errorInfo: string };\n}\n\nexport const errorFactory = new ErrorFactory<ErrorCode, ErrorParams>(\n 'messaging',\n 'Messaging',\n ERROR_MAP\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 const DEFAULT_PUBLIC_VAPID_KEY = new Uint8Array([\n 0x04,\n 0x33,\n 0x94,\n 0xf7,\n 0xdf,\n 0xa1,\n 0xeb,\n 0xb1,\n 0xdc,\n 0x03,\n 0xa2,\n 0x5e,\n 0x15,\n 0x71,\n 0xdb,\n 0x48,\n 0xd3,\n 0x2e,\n 0xed,\n 0xed,\n 0xb2,\n 0x34,\n 0xdb,\n 0xb7,\n 0x47,\n 0x3a,\n 0x0c,\n 0x8f,\n 0xc4,\n 0xcc,\n 0xe1,\n 0x6f,\n 0x3c,\n 0x8c,\n 0x84,\n 0xdf,\n 0xab,\n 0xb6,\n 0x66,\n 0x3e,\n 0xf2,\n 0x0c,\n 0xd4,\n 0x8b,\n 0xfe,\n 0xe3,\n 0xf9,\n 0x76,\n 0x2f,\n 0x14,\n 0x1c,\n 0x63,\n 0x08,\n 0x6a,\n 0x6f,\n 0x2d,\n 0xb1,\n 0x1a,\n 0x95,\n 0xb0,\n 0xce,\n 0x37,\n 0xc0,\n 0x9c,\n 0x6e\n]);\n\nexport const SUBSCRIPTION_DETAILS = {\n userVisibleOnly: true,\n applicationServerKey: DEFAULT_PUBLIC_VAPID_KEY\n};\n\nexport const ENDPOINT = 'https://fcm.googleapis.com';\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 '../interfaces/message-payload';\n\nexport enum MessageParameter {\n TYPE_OF_MSG = 'firebase-messaging-msg-type',\n DATA = 'firebase-messaging-msg-data'\n}\n\nexport enum MessageType {\n PUSH_MSG_RECEIVED = 'push-msg-received',\n NOTIFICATION_CLICKED = 'notification-clicked'\n}\n\nexport interface InternalMessage {\n [MessageParameter.TYPE_OF_MSG]: MessageType;\n [MessageParameter.DATA]: MessagePayload;\n}\n","/**\n * @license\n * Copyright 2018 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 isArrayBufferEqual(\n a: ArrayBufferLike | undefined | null,\n b: ArrayBufferLike | undefined | null\n): boolean {\n if (a == null || b == null) {\n return false;\n }\n\n if (a === b) {\n return true;\n }\n\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n\n const viewA = new DataView(a);\n const viewB = new DataView(b);\n\n for (let i = 0; i < a.byteLength; i++) {\n if (viewA.getUint8(i) !== viewB.getUint8(i)) {\n return false;\n }\n }\n\n return true;\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\nfunction toBase64(arrayBuffer: ArrayBuffer | Uint8Array): string {\n const uint8Version = new Uint8Array(arrayBuffer);\n return btoa(String.fromCharCode(...uint8Version));\n}\n\nexport function arrayBufferToBase64(\n arrayBuffer: ArrayBuffer | Uint8Array\n): string {\n const base64String = toBase64(arrayBuffer);\n return base64String\n .replace(/=/g, '')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_');\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 { arrayBufferToBase64 } from '../helpers/array-buffer-to-base64';\nimport { isArrayBufferEqual } from '../helpers/is-array-buffer-equal';\nimport { ErrorCode, errorFactory } from './errors';\nimport { DEFAULT_PUBLIC_VAPID_KEY, ENDPOINT } from './fcm-details';\n\nexport interface IidDetails {\n token: string;\n pushSet: string;\n}\n\ninterface ApiResponse extends Partial<IidDetails> {\n error?: { message: string };\n}\n\nexport class IidModel {\n async getToken(\n senderId: string,\n subscription: PushSubscription,\n publicVapidKey: Uint8Array\n ): Promise<IidDetails> {\n const p256dh = arrayBufferToBase64(subscription.getKey('p256dh')!);\n const auth = arrayBufferToBase64(subscription.getKey('auth')!);\n\n let fcmSubscribeBody =\n `authorized_entity=${senderId}&` +\n `endpoint=${subscription.endpoint}&` +\n `encryption_key=${p256dh}&` +\n `encryption_auth=${auth}`;\n\n if (\n !isArrayBufferEqual(\n publicVapidKey.buffer,\n DEFAULT_PUBLIC_VAPID_KEY.buffer\n )\n ) {\n const applicationPubKey = arrayBufferToBase64(publicVapidKey);\n fcmSubscribeBody += `&application_pub_key=${applicationPubKey}`;\n }\n\n const headers = new Headers();\n headers.append('Content-Type', 'application/x-www-form-urlencoded');\n\n const subscribeOptions = {\n method: 'POST',\n headers,\n body: fcmSubscribeBody\n };\n\n let responseData: ApiResponse;\n try {\n const response = await fetch(\n ENDPOINT + '/fcm/connect/subscribe',\n subscribeOptions\n );\n\n responseData = await response.json();\n } catch (err) {\n throw errorFactory.create(ErrorCode.TOKEN_SUBSCRIBE_FAILED, {\n errorInfo: err\n });\n }\n\n if (responseData.error) {\n const message = responseData.error.message;\n throw errorFactory.create(ErrorCode.TOKEN_SUBSCRIBE_FAILED, {\n errorInfo: message\n });\n }\n\n if (!responseData.token) {\n throw errorFactory.create(ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN);\n }\n\n if (!responseData.pushSet) {\n throw errorFactory.create(ErrorCode.TOKEN_SUBSCRIBE_NO_PUSH_SET);\n }\n\n return {\n token: responseData.token,\n pushSet: responseData.pushSet\n };\n }\n\n /**\n * Update the underlying token details for fcmToken.\n */\n async updateToken(\n senderId: string,\n fcmToken: string,\n fcmPushSet: string,\n subscription: PushSubscription,\n publicVapidKey: Uint8Array\n ): Promise<string> {\n const p256dh = arrayBufferToBase64(subscription.getKey('p256dh')!);\n const auth = arrayBufferToBase64(subscription.getKey('auth')!);\n\n let fcmUpdateBody =\n `push_set=${fcmPushSet}&` +\n `token=${fcmToken}&` +\n `authorized_entity=${senderId}&` +\n `endpoint=${subscription.endpoint}&` +\n `encryption_key=${p256dh}&` +\n `encryption_auth=${auth}`;\n\n if (\n !isArrayBufferEqual(\n publicVapidKey.buffer,\n DEFAULT_PUBLIC_VAPID_KEY.buffer\n )\n ) {\n const applicationPubKey = arrayBufferToBase64(publicVapidKey);\n fcmUpdateBody += `&application_pub_key=${applicationPubKey}`;\n }\n\n const headers = new Headers();\n headers.append('Content-Type', 'application/x-www-form-urlencoded');\n\n const updateOptions = {\n method: 'POST',\n headers,\n body: fcmUpdateBody\n };\n\n let responseData: ApiResponse;\n try {\n const response = await fetch(\n ENDPOINT + '/fcm/connect/subscribe',\n updateOptions\n );\n responseData = await response.json();\n } catch (err) {\n throw errorFactory.create(ErrorCode.TOKEN_UPDATE_FAILED, {\n errorInfo: err\n });\n }\n\n if (responseData.error) {\n const message = responseData.error.message;\n throw errorFactory.create(ErrorCode.TOKEN_UPDATE_FAILED, {\n errorInfo: message\n });\n }\n\n if (!responseData.token) {\n throw errorFactory.create(ErrorCode.TOKEN_UPDATE_NO_TOKEN);\n }\n\n return responseData.token;\n }\n\n /**\n * Given a fcmToken, pushSet and messagingSenderId, delete an FCM token.\n */\n async deleteToken(\n senderId: string,\n fcmToken: string,\n fcmPushSet: string\n ): Promise<void> {\n const fcmUnsubscribeBody =\n `authorized_entity=${senderId}&` +\n `token=${fcmToken}&` +\n `pushSet=${fcmPushSet}`;\n\n const headers = new Headers();\n headers.append('Content-Type', 'application/x-www-form-urlencoded');\n\n const unsubscribeOptions = {\n method: 'POST',\n headers,\n body: fcmUnsubscribeBody\n };\n\n try {\n const response = await fetch(\n ENDPOINT + '/fcm/connect/unsubscribe',\n unsubscribeOptions\n );\n const responseData: ApiResponse = await response.json();\n if (responseData.error) {\n const message = responseData.error.message;\n throw errorFactory.create(ErrorCode.TOKEN_UNSUBSCRIBE_FAILED, {\n errorInfo: message\n });\n }\n } catch (err) {\n throw errorFactory.create(ErrorCode.TOKEN_UNSUBSCRIBE_FAILED, {\n errorInfo: err\n });\n }\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 base64ToArrayBuffer(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding)\n .replace(/\\-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\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\n/**\n * There seems to have been a bug in the messaging SDK versions <= 4.9.x\n * where the IndexedDB model was using a database name of 'undefined'.\n *\n * In 4.10.x we changed the model implementation, but kept the database\n * name as it should have been. This however introduced an issue where\n * two tokens were pointing to the same underlying PushSubscription.\n *\n * This code will look for the undefined database and delete any of the\n * underlying tokens.\n */\n\nimport { IidModel } from '../models/iid-model';\n\nconst OLD_DB_NAME = 'undefined';\nconst OLD_OBJECT_STORE_NAME = 'fcm_token_object_Store';\n\nfunction handleDb(db: IDBDatabase): void {\n if (!db.objectStoreNames.contains(OLD_OBJECT_STORE_NAME)) {\n // We found a database with the name 'undefined', but our expected object\n // store isn't defined.\n return;\n }\n\n const transaction = db.transaction(OLD_OBJECT_STORE_NAME);\n const objectStore = transaction.objectStore(OLD_OBJECT_STORE_NAME);\n\n const iidModel = new IidModel();\n\n const openCursorRequest: IDBRequest = objectStore.openCursor();\n openCursorRequest.onerror = event => {\n // NOOP - Nothing we can do.\n console.warn('Unable to cleanup old IDB.', event);\n };\n\n openCursorRequest.onsuccess = () => {\n const cursor = openCursorRequest.result;\n if (cursor) {\n // cursor.value contains the current record being iterated through\n // this is where you'd do something with the result\n const tokenDetails = cursor.value;\n\n // tslint:disable-next-line:no-floating-promises\n iidModel.deleteToken(\n tokenDetails.fcmSenderId,\n tokenDetails.fcmToken,\n tokenDetails.fcmPushSet\n );\n\n cursor.continue();\n } else {\n db.close();\n indexedDB.deleteDatabase(OLD_DB_NAME);\n }\n };\n}\n\nexport function cleanV1(): void {\n const request: IDBOpenDBRequest = indexedDB.open(OLD_DB_NAME);\n request.onerror = _event => {\n // NOOP - Nothing we can do.\n };\n request.onsuccess = _event => {\n const db = request.result;\n handleDb(db);\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 abstract class DbInterface {\n private dbPromise: Promise<IDBDatabase> | null = null;\n\n protected abstract readonly dbName: string;\n protected abstract readonly dbVersion: number;\n protected abstract readonly objectStoreName: string;\n\n /**\n * Database initialization.\n *\n * This function should create and update object stores.\n */\n protected abstract onDbUpgrade(\n request: IDBOpenDBRequest,\n event: IDBVersionChangeEvent\n ): void;\n\n /** Gets record(s) from the objectStore that match the given key. */\n get<T>(key: IDBValidKey): Promise<T | undefined> {\n return this.createTransaction(objectStore => objectStore.get(key));\n }\n\n /** Gets record(s) from the objectStore that match the given index. */\n getIndex<T>(index: string, key: IDBValidKey): Promise<T | undefined> {\n function runRequest(objectStore: IDBObjectStore): IDBRequest {\n const idbIndex = objectStore.index(index);\n return idbIndex.get(key);\n }\n\n return this.createTransaction(runRequest);\n }\n\n /** Assigns or overwrites the record for the given value. */\n // IndexedDB values are of type \"any\"\n put(value: unknown): Promise<void> {\n return this.createTransaction(\n objectStore => objectStore.put(value),\n 'readwrite'\n );\n }\n\n /** Deletes record(s) from the objectStore that match the given key. */\n delete(key: IDBValidKey | IDBKeyRange): Promise<void> {\n return this.createTransaction(\n objectStore => objectStore.delete(key),\n 'readwrite'\n );\n }\n\n /**\n * Close the currently open database.\n */\n async closeDatabase(): Promise<void> {\n if (this.dbPromise) {\n const db = await this.dbPromise;\n db.close();\n this.dbPromise = null;\n }\n }\n\n /**\n * Creates an IndexedDB Transaction and passes its objectStore to the\n * runRequest function, which runs the database request.\n *\n * @return Promise that resolves with the result of the runRequest function\n */\n private async createTransaction<T>(\n runRequest: (objectStore: IDBObjectStore) => IDBRequest,\n mode: 'readonly' | 'readwrite' = 'readonly'\n ): Promise<T> {\n const db = await this.getDb();\n const transaction = db.transaction(this.objectStoreName, mode);\n const request = transaction.objectStore(this.objectStoreName);\n const result = await promisify<T>(runRequest(request));\n\n return new Promise<T>((resolve, reject) => {\n transaction.oncomplete = () => {\n resolve(result);\n };\n transaction.onerror = () => {\n reject(transaction.error);\n };\n });\n }\n\n /** Gets the cached db connection or opens a new one. */\n private getDb(): Promise<IDBDatabase> {\n if (!this.dbPromise) {\n this.dbPromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.dbVersion);\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n this.dbPromise = null;\n reject(request.error);\n };\n request.onupgradeneeded = event => this.onDbUpgrade(request, event);\n });\n }\n\n return this.dbPromise;\n }\n}\n\n/** Promisifies an IDBRequest. Resolves with the IDBRequest's result. */\nfunction promisify<T>(request: IDBRequest): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n request.onsuccess = () => {\n resolve(request.result);\n };\n request.onerror = () => {\n reject(request.error);\n };\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 { base64ToArrayBuffer } from '../helpers/base64-to-array-buffer';\nimport { TokenDetails } from '../interfaces/token-details';\nimport { cleanV1 } from './clean-v1-undefined';\nimport { DbInterface } from './db-interface';\nimport { ErrorCode, errorFactory } from './errors';\n\nexport class TokenDetailsModel extends DbInterface {\n protected readonly dbName: string = 'fcm_token_details_db';\n protected readonly dbVersion: number = 3;\n protected readonly objectStoreName: string = 'fcm_token_object_Store';\n\n protected onDbUpgrade(\n request: IDBOpenDBRequest,\n event: IDBVersionChangeEvent\n ): void {\n const db: IDBDatabase = request.result;\n\n // Lack of 'break' statements is intentional.\n switch (event.oldVersion) {\n case 0: {\n // New IDB instance\n const objectStore = db.createObjectStore(this.objectStoreName, {\n keyPath: 'swScope'\n });\n\n // Make sure the sender ID can be searched\n objectStore.createIndex('fcmSenderId', 'fcmSenderId', {\n unique: false\n });\n\n objectStore.createIndex('fcmToken', 'fcmToken', { unique: true });\n }\n\n case 1: {\n // Prior to version 2, we were using either 'fcm_token_details_db'\n // or 'undefined' as the database name due to bug in the SDK\n // So remove the old tokens and databases.\n cleanV1();\n }\n\n case 2: {\n const objectStore = request.transaction!.objectStore(\n this.objectStoreName\n );\n const cursorRequest = objectStore.openCursor();\n cursorRequest.onsuccess = () => {\n const cursor: IDBCursorWithValue | null = cursorRequest.result;\n if (cursor) {\n const value = cursor.value;\n const newValue: Partial<TokenDetails> = { ...value };\n\n if (!value.createTime) {\n newValue.createTime = Date.now();\n }\n\n if (typeof value.vapidKey === 'string') {\n newValue.vapidKey = base64ToArrayBuffer(value.vapidKey);\n }\n\n if (typeof value.auth === 'string') {\n newValue.auth = base64ToArrayBuffer(value.auth).buffer;\n }\n\n if (typeof value.auth === 'string') {\n newValue.p256dh = base64ToArrayBuffer(value.p256dh).buffer;\n }\n\n cursor.update(newValue);\n cursor.continue();\n }\n };\n }\n\n default: // ignore\n }\n }\n\n /**\n * Given a token, this method will look up the details in indexedDB.\n */\n async getTokenDetailsFromToken(\n fcmToken: string\n ): Promise<TokenDetails | undefined> {\n if (!fcmToken) {\n throw errorFactory.create(ErrorCode.BAD_TOKEN);\n }\n\n validateInputs({ fcmToken });\n\n return this.getIndex<TokenDetails>('fcmToken', fcmToken);\n }\n\n /**\n * Given a service worker scope, this method will look up the details in\n * indexedDB.\n * @return The details associated with that token.\n */\n async getTokenDetailsFromSWScope(\n swScope: string\n ): Promise<TokenDetails | undefined> {\n if (!swScope) {\n throw errorFactory.create(ErrorCode.BAD_SCOPE);\n }\n\n validateInputs({ swScope });\n\n return this.get<TokenDetails>(swScope);\n }\n\n /**\n * Save the details for the fcm token for re-use at a later date.\n * @param input A plain js object containing args to save.\n */\n async saveTokenDetails(tokenDetails: TokenDetails): Promise<void> {\n if (!tokenDetails.swScope) {\n throw errorFactory.create(ErrorCode.BAD_SCOPE);\n }\n\n if (!tokenDetails.vapidKey) {\n throw errorFactory.create(ErrorCode.BAD_VAPID_KEY);\n }\n\n if (!tokenDetails.endpoint || !tokenDetails.auth || !tokenDetails.p256dh) {\n throw errorFactory.create(ErrorCode.BAD_SUBSCRIPTION);\n }\n\n if (!tokenDetails.fcmSenderId) {\n throw errorFactory.create(ErrorCode.BAD_SENDER_ID);\n }\n\n if (!tokenDetails.fcmToken) {\n throw errorFactory.create(ErrorCode.BAD_TOKEN);\n }\n\n if (!tokenDetails.fcmPushSet) {\n throw errorFactory.create(ErrorCode.BAD_PUSH_SET);\n }\n\n validateInputs(tokenDetails);\n\n return this.put(tokenDetails);\n }\n\n /**\n * This method deletes details of the current FCM token.\n * It's returning a promise in case we need to move to an async\n * method for deleting at a later date.\n *\n * @return Resolves once the FCM token details have been deleted and returns\n * the deleted details.\n */\n async deleteToken(token: string): Promise<TokenDetails> {\n if (typeof token !== 'string' || token.length === 0) {\n return Promise.reject(\n errorFactory.create(ErrorCode.INVALID_DELETE_TOKEN)\n );\n }\n\n const details = await this.getTokenDetailsFromToken(token);\n if (!details) {\n throw errorFactory.create(ErrorCode.DELETE_TOKEN_NOT_FOUND);\n }\n\n await this.delete(details.swScope);\n return details;\n }\n}\n\n/**\n * This method takes an object and will check for known arguments and\n * validate the input.\n * @return Promise that resolves if input is valid, rejects otherwise.\n */\nfunction validateInputs(input: Partial<TokenDetails>): void {\n if (input.fcmToken) {\n if (typeof input.fcmToken !== 'string' || input.fcmToken.length === 0) {\n throw errorFactory.create(ErrorCode.BAD_TOKEN);\n }\n }\n\n if (input.swScope) {\n if (typeof input.swScope !== 'string' || input.swScope.length === 0) {\n throw errorFactory.create(ErrorCode.BAD_SCOPE);\n }\n }\n\n if (input.vapidKey) {\n if (\n !(input.vapidKey instanceof Uint8Array) ||\n input.vapidKey.length !== 65\n ) {\n throw errorFactory.create(ErrorCode.BAD_VAPID_KEY);\n }\n }\n\n if (input.endpoint) {\n if (typeof input.endpoint !== 'string' || input.endpoint.length === 0) {\n throw errorFactory.create(ErrorCode.BAD_SUBSCRIPTION);\n }\n }\n\n if (input.auth) {\n if (!(input.auth instanceof ArrayBuffer)) {\n throw errorFactory.create(ErrorCode.BAD_SUBSCRIPTION);\n }\n }\n\n if (input.p256dh) {\n if (!(input.p256dh instanceof ArrayBuffer)) {\n throw errorFactory.create(ErrorCode.BAD_SUBSCRIPTION);\n }\n }\n\n if (input.fcmSenderId) {\n if (\n typeof input.fcmSenderId !== 'string' ||\n input.fcmSenderId.length === 0\n ) {\n throw errorFactory.create(ErrorCode.BAD_SENDER_ID);\n }\n }\n\n if (input.fcmPushSet) {\n if (typeof input.fcmPushSet !== 'string' || input.fcmPushSet.length === 0) {\n throw errorFactory.create(ErrorCode.BAD_PUSH_SET);\n }\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 { VapidDetails } from '../interfaces/vapid-details';\nimport { DbInterface } from './db-interface';\nimport { ErrorCode, errorFactory } from './errors';\n\nconst UNCOMPRESSED_PUBLIC_KEY_SIZE = 65;\n\nexport class VapidDetailsModel extends DbInterface {\n protected readonly dbName: string = 'fcm_vapid_details_db';\n protected readonly dbVersion: number = 1;\n protected readonly objectStoreName: string = 'fcm_vapid_object_Store';\n\n protected onDbUpgrade(request: IDBOpenDBRequest): void {\n const db: IDBDatabase = request.result;\n db.createObjectStore(this.objectStoreName, { keyPath: 'swScope' });\n }\n\n /**\n * Given a service worker scope, this method will look up the vapid key\n * in indexedDB.\n */\n async getVapidFromSWScope(swScope: string): Promise<Uint8Array | undefined> {\n if (typeof swScope !== 'string' || swScope.length === 0) {\n throw errorFactory.create(ErrorCode.BAD_SCOPE);\n }\n\n const result = await this.get<VapidDetails>(swScope);\n return result ? result.vapidKey : undefined;\n }\n\n /**\n * Save a vapid key against a swScope for later date.\n */\n async saveVapidDetails(swScope: string, vapidKey: Uint8Array): Promise<void> {\n if (typeof swScope !== 'string' || swScope.length === 0) {\n throw errorFactory.create(ErrorCode.BAD_SCOPE);\n }\n\n if (vapidKey === null || vapidKey.length !== UNCOMPRESSED_PUBLIC_KEY_SIZE) {\n throw errorFactory.create(ErrorCode.BAD_VAPID_KEY);\n }\n\n const details: VapidDetails = {\n swScope,\n vapidKey\n };\n\n return this.put(details);\n }\n\n /**\n * This method deletes details of the current FCM VAPID key for a SW scope.\n * Resolves once the scope/vapid details have been deleted and returns the\n * deleted vapid key.\n */\n async deleteVapidDetails(swScope: string): Promise<Uint8Array> {\n const vapidKey = await this.getVapidFromSWScope(swScope);\n if (!vapidKey) {\n throw errorFactory.create(ErrorCode.DELETE_SCOPE_NOT_FOUND);\n }\n\n await this.delete(swScope);\n return vapidKey;\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 { FirebaseApp } from '@firebase/app-types';\nimport { FirebaseServiceInternals } from '@firebase/app-types/private';\nimport { FirebaseMessaging } from '@firebase/messaging-types';\nimport {\n CompleteFn,\n ErrorFn,\n NextFn,\n Observer,\n Unsubscribe\n} from '@firebase/util';\n\nimport { isArrayBufferEqual } from '../helpers/is-array-buffer-equal';\nimport { MessagePayload } from '../interfaces/message-payload';\nimport { TokenDetails } from '../interfaces/token-details';\nimport { ErrorCode, errorFactory } from '../models/errors';\nimport { IidModel } from '../models/iid-model';\nimport { TokenDetailsModel } from '../models/token-details-model';\nimport { VapidDetailsModel } from '../models/vapid-details-model';\n\nexport type BgMessageHandler = (\n payload: MessagePayload\n) => Promise<unknown> | void;\n\nconst SENDER_ID_OPTION_NAME = 'messagingSenderId';\n// Database cache should be invalidated once a week.\nexport const TOKEN_EXPIRATION_MILLIS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\nexport abstract class BaseController implements FirebaseMessaging {\n app: FirebaseApp;\n INTERNAL: FirebaseServiceInternals;\n private readonly messagingSenderId: string;\n private readonly tokenDetailsModel: TokenDetailsModel;\n private readonly vapidDetailsModel: VapidDetailsModel;\n private readonly iidModel: IidModel;\n\n /**\n * An interface of the Messaging Service API\n */\n constructor(app: FirebaseApp) {\n if (\n !app.options[SENDER_ID_OPTION_NAME] ||\n typeof app.options[SENDER_ID_OPTION_NAME] !== 'string'\n ) {\n throw errorFactory.create(ErrorCode.BAD_SENDER_ID);\n }\n\n this.messagingSenderId = app.options[SENDER_ID_OPTION_NAME]!;\n\n this.tokenDetailsModel = new TokenDetailsModel();\n this.vapidDetailsModel = new VapidDetailsModel();\n this.iidModel = new IidModel();\n\n this.app = app;\n this.INTERNAL = {\n delete: () => this.delete()\n };\n }\n\n /**\n * @export\n */\n async getToken(): Promise<string | null> {\n // Check with permissions\n const currentPermission = this.getNotificationPermission_();\n if (currentPermission === 'denied') {\n throw errorFactory.create(ErrorCode.NOTIFICATIONS_BLOCKED);\n } else if (currentPermission !== 'granted') {\n // We must wait for permission to be granted\n return null;\n }\n\n const swReg = await this.getSWRegistration_();\n const publicVapidKey = await this.getPublicVapidKey_();\n // If a PushSubscription exists it's returned, otherwise a new subscription\n // is generated and returned.\n const pushSubscription = await this.getPushSubscription(\n swReg,\n publicVapidKey\n );\n const tokenDetails = await this.tokenDetailsModel.getTokenDetailsFromSWScope(\n swReg.scope\n );\n\n if (tokenDetails) {\n return this.manageExistingToken(\n swReg,\n pushSubscription,\n publicVapidKey,\n tokenDetails\n );\n }\n return this.getNewToken(swReg, pushSubscription, publicVapidKey);\n }\n\n /**\n * manageExistingToken is triggered if there's an existing FCM token in the\n * database and it can take 3 different actions:\n * 1) Retrieve the existing FCM token from the database.\n * 2) If VAPID details have changed: Delete the existing token and create a\n * new one with the new VAPID key.\n * 3) If the database cache is invalidated: Send a request to FCM to update\n * the token, and to check if the token is still valid on FCM-side.\n */\n private async manageExistingToken(\n swReg: ServiceWorkerRegistration,\n pushSubscription: PushSubscription,\n publicVapidKey: Uint8Array,\n tokenDetails: TokenDetails\n ): Promise<string> {\n const isTokenValid = isTokenStillValid(\n pushSubscription,\n publicVapidKey,\n tokenDetails\n );\n if (isTokenValid) {\n const now = Date.now();\n if (now < tokenDetails.createTime + TOKEN_EXPIRATION_MILLIS) {\n return tokenDetails.fcmToken;\n } else {\n return this.updateToken(\n swReg,\n pushSubscription,\n publicVapidKey,\n tokenDetails\n );\n }\n }\n\n // If the token is no longer valid (for example if the VAPID details\n // have changed), delete the existing token from the FCM client and server\n // database. No need to unsubscribe from the Service Worker as we have a\n // good push subscription that we'd like to use in getNewToken.\n await this.deleteTokenFromDB(tokenDetails.fcmToken);\n return this.getNewToken(swReg, pushSubscription, publicVapidKey);\n }\n\n private async updateToken(\n swReg: ServiceWorkerRegistration,\n pushSubscription: PushSubscription,\n publicVapidKey: Uint8Array,\n tokenDetails: TokenDetails\n ): Promise<string> {\n try {\n const updatedToken = await this.iidModel.updateToken(\n this.messagingSenderId,\n tokenDetails.fcmToken,\n tokenDetails.fcmPushSet,\n pushSubscription,\n publicVapidKey\n );\n\n const allDetails: TokenDetails = {\n swScope: swReg.scope,\n vapidKey: publicVapidKey,\n fcmSenderId: this.messagingSenderId,\n fcmToken: updatedToken,\n fcmPushSet: tokenDetails.fcmPushSet,\n createTime: Date.now(),\n endpoint: pushSubscription.endpoint,\n auth: pushSubscription.getKey('auth')!,\n p256dh: pushSubscription.getKey('p256dh')!\n };\n\n await this.tokenDetailsModel.saveTokenDetails(allDetails);\n await this.vapidDetailsModel.saveVapidDetails(\n swReg.scope,\n publicVapidKey\n );\n return updatedToken;\n } catch (e) {\n await this.deleteToken(tokenDetails.fcmToken);\n throw e;\n }\n }\n\n private async getNewToken(\n swReg: ServiceWorkerRegistration,\n pushSubscription: PushSubscription,\n publicVapidKey: Uint8Array\n ): Promise<string> {\n const tokenDetails = await this.iidModel.getToken(\n this.messagingSenderId,\n pushSubscription,\n publicVapidKey\n );\n const allDetails: TokenDetails = {\n swScope: swReg.scope,\n vapidKey: publicVapidKey,\n fcmSenderId: this.messagingSenderId,\n fcmToken: tokenDetails.token,\n fcmPushSet: tokenDetails.pushSet,\n createTime: Date.now(),\n endpoint: pushSubscription.endpoint,\n auth: pushSubscription.getKey('auth')!,\n p256dh: pushSubscription.getKey('p256dh')!\n };\n await this.tokenDetailsModel.saveTokenDetails(allDetails);\n await this.vapidDetailsModel.saveVapidDetails(swReg.scope, publicVapidKey);\n return tokenDetails.token;\n }\n\n /**\n * This method deletes tokens that the token manager looks after,\n * unsubscribes the token from FCM and then unregisters the push\n * subscription if it exists. It returns a promise that indicates\n * whether or not the unsubscribe request was processed successfully.\n */\n async deleteToken(token: string): Promise<boolean> {\n // Delete the token details from the database.\n await this.deleteTokenFromDB(token);\n // Unsubscribe from the SW.\n const registration = await this.getSWRegistration_();\n if (registration) {\n const pushSubscription = await registration.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\n /**\n * This method will delete the token from the client database, and make a\n * call to FCM to remove it from the server DB. Does not temper with the\n * push subscription.\n */\n private async deleteTokenFromDB(token: string): Promise<void> {\n const details = await this.tokenDetailsModel.deleteToken(token);\n await this.iidModel.deleteToken(\n details.fcmSenderId,\n details.fcmToken,\n details.fcmPushSet\n );\n }\n\n // Visible for testing\n // TODO: Make protected\n abstract getSWRegistration_(): Promise<ServiceWorkerRegistration>;\n\n // Visible for testing\n // TODO: Make protected\n abstract getPublicVapidKey_(): Promise<Uint8Array>;\n\n /**\n * Gets a PushSubscription for the current user.\n */\n getPushSubscription(\n swRegistration: ServiceWorkerRegistration,\n publicVapidKey: Uint8Array\n ): Promise<PushSubscription> {\n return swRegistration.pushManager.getSubscription().then(subscription => {\n if (subscription) {\n return subscription;\n }\n\n return swRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: publicVapidKey\n });\n });\n }\n\n //\n // The following methods should only be available in the window.\n //\n\n /**\n * @deprecated Use Notification.requestPermission() instead.\n * https://developer.mozilla.org/en-US/docs/Web/API/Notification/requestPermission\n */\n requestPermission(): Promise<void> {\n throw errorFactory.create(ErrorCode.AVAILABLE_IN_WINDOW);\n }\n\n useServiceWorker(_registration: ServiceWorkerRegistration): void {\n throw errorFactory.create(ErrorCode.AVAILABLE_IN_WINDOW);\n }\n\n usePublicVapidKey(_b64PublicKey: string): void {\n throw errorFactory.create(ErrorCode.AVAILABLE_IN_WINDOW);\n }\n\n onMessage(\n _nextOrObserver: NextFn<object> | Observer<object>,\n _error?: ErrorFn,\n _completed?: CompleteFn\n ): Unsubscribe {\n throw errorFactory.create(ErrorCode.AVAILABLE_IN_WINDOW);\n }\n\n onTokenRefresh(\n _nextOrObserver: NextFn<object> | Observer<object>,\n _error?: ErrorFn,\n _completed?: CompleteFn\n ): Unsubscribe {\n throw errorFactory.create(ErrorCode.AVAILABLE_IN_WINDOW);\n }\n\n //\n // The following methods are used by the service worker only.\n //\n\n setBackgroundMessageHandler(_callback: BgMessageHandler): void {\n throw errorFactory.create(ErrorCode.AVAILABLE_IN_SW);\n }\n\n //\n // The following methods are used by the service themselves and not exposed\n // publicly or not expected to be used by developers.\n //\n\n /**\n * This method is required to adhere to the Firebase interface.\n * It closes any currently open indexdb database connections.\n */\n async delete(): Promise<void> {\n await Promise.all([\n this.tokenDetailsModel.closeDatabase(),\n this.vapidDetailsModel.closeDatabase()\n ]);\n }\n\n /**\n * Returns the current Notification Permission state.\n */\n getNotificationPermission_(): NotificationPermission {\n return Notification.permission;\n }\n\n getTokenDetailsModel(): TokenDetailsModel {\n return this.tokenDetailsModel;\n }\n\n getVapidDetailsModel(): VapidDetailsModel {\n return this.vapidDetailsModel;\n }\n\n // Visible for testing\n // TODO: make protected\n getIidModel(): IidModel {\n return this.iidModel;\n }\n}\n\n/**\n * Checks if the tokenDetails match the details provided in the clients.\n */\nfunction isTokenStillValid(\n pushSubscription: PushSubscription,\n publicVapidKey: Uint8Array,\n tokenDetails: TokenDetails\n): boolean {\n if (\n !tokenDetails.vapidKey ||\n !isArrayBufferEqual(publicVapidKey.buffer, tokenDetails.vapidKey.buffer)\n ) {\n return false;\n }\n\n const isEndpointEqual = pushSubscription.endpoint === tokenDetails.endpoint;\n const isAuthEqual = isArrayBufferEqual(\n pushSubscription.getKey('auth'),\n tokenDetails.auth\n );\n const isP256dhEqual = isArrayBufferEqual(\n pushSubscription.getKey('p256dh'),\n tokenDetails.p256dh\n );\n\n return 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 './sw-types';\n\nimport { FirebaseApp } from '@firebase/app-types';\n\nimport {\n MessagePayload,\n NotificationDetails\n} from '../interfaces/message-payload';\nimport { ErrorCode, errorFactory } from '../models/errors';\nimport { DEFAULT_PUBLIC_VAPID_KEY } from '../models/fcm-details';\nimport {\n InternalMessage,\n MessageParameter,\n MessageType\n} from '../models/worker-page-message';\nimport { BaseController, BgMessageHandler } from './base-controller';\n\n// Let TS know that this is a service worker\ndeclare const self: ServiceWorkerGlobalScope;\n\nconst FCM_MSG = 'FCM_MSG';\n\nexport class SwController extends BaseController {\n private bgMessageHandler: BgMessageHandler | null = null;\n\n constructor(app: FirebaseApp) {\n super(app);\n\n self.addEventListener('push', e => {\n this.onPush(e);\n });\n self.addEventListener('pushsubscriptionchange', e => {\n this.onSubChange(e);\n });\n self.addEventListener('notificationclick', e => {\n this.onNotificationClick(e);\n });\n }\n\n // Visible for testing\n // TODO: Make private\n onPush(event: PushEvent): void {\n event.waitUntil(this.onPush_(event));\n }\n\n // Visible for testing\n // TODO: Make private\n onSubChange(event: PushSubscriptionChangeEvent): void {\n event.waitUntil(this.onSubChange_(event));\n }\n\n // Visible for testing\n // TODO: Make private\n onNotificationClick(event: NotificationEvent): void {\n event.waitUntil(this.onNotificationClick_(event));\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 private async onPush_(event: PushEvent): Promise<void> {\n if (!event.data) {\n return;\n }\n\n let msgPayload: MessagePayload;\n try {\n msgPayload = event.data.json();\n } catch (err) {\n // Not JSON so not an FCM message\n return;\n }\n\n const hasVisibleClients = await this.hasVisibleClients_();\n if (hasVisibleClients) {\n // App in foreground. Send to page.\n return this.sendMessageToWindowClients_(msgPayload);\n }\n\n const notificationDetails = this.getNotificationData_(msgPayload);\n if (notificationDetails) {\n const notificationTitle = notificationDetails.title || '';\n const reg = await this.getSWRegistration_();\n\n const { actions } = notificationDetails;\n const { maxActions } = Notification;\n // tslint:enable no-any\n if (actions && maxActions && actions.length > maxActions) {\n console.warn(\n `This browser only supports ${maxActions} actions.` +\n `The remaining actions will not be displayed.`\n );\n }\n\n return reg.showNotification(notificationTitle, notificationDetails);\n } else if (this.bgMessageHandler) {\n await this.bgMessageHandler(msgPayload);\n return;\n }\n }\n\n private async onSubChange_(\n _event: PushSubscriptionChangeEvent\n ): Promise<void> {\n let registration: ServiceWorkerRegistration;\n try {\n registration = await this.getSWRegistration_();\n } catch (err) {\n throw errorFactory.create(ErrorCode.UNABLE_TO_RESUBSCRIBE, {\n errorInfo: err\n });\n }\n\n try {\n await registration.pushManager.getSubscription();\n // TODO: Check if it's still valid. If not, then update token.\n } catch (err) {\n // The best thing we can do is log this to the terminal so\n // developers might notice the error.\n const tokenDetailsModel = this.getTokenDetailsModel();\n const tokenDetails = await tokenDetailsModel.getTokenDetailsFromSWScope(\n registration.scope\n );\n if (!tokenDetails) {\n // This should rarely occure, but could if indexedDB\n // is corrupted or wiped\n throw err;\n }\n\n // Attempt to delete the token if we know it's bad\n await this.deleteToken(tokenDetails.fcmToken);\n throw err;\n }\n }\n\n private async onNotificationClick_(event: NotificationEvent): Promise<void> {\n if (\n !event.notification ||\n !event.notification.data ||\n !event.notification.data[FCM_MSG]\n ) {\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 msgPayload: MessagePayload = event.notification.data[FCM_MSG];\n if (!msgPayload.notification) {\n // Nothing to do.\n return;\n }\n\n const link =\n (msgPayload.fcmOptions && msgPayload.fcmOptions.link) ||\n msgPayload.notification.click_action;\n if (!link) {\n // Nothing to do.\n return;\n }\n\n let windowClient = await this.getWindowClient_(link);\n if (!windowClient) {\n // Unable to find window client so need to open one.\n windowClient = await self.clients.openWindow(link);\n } else {\n windowClient = await windowClient.focus();\n }\n\n if (!windowClient) {\n // Window Client will not be returned if it's for a third party origin.\n return;\n }\n\n // Delete notification and fcmOptions data from payload before sending to\n // the page.\n delete msgPayload.notification;\n delete msgPayload.fcmOptions;\n\n const internalMsg = createNewMsg(\n MessageType.NOTIFICATION_CLICKED,\n msgPayload\n );\n\n // Attempt to send a message to the client to handle the data\n // Is affected by: https://github.com/slightlyoff/ServiceWorker/issues/728\n return this.attemptToMessageClient_(windowClient, internalMsg);\n }\n\n // Visible for testing\n // TODO: Make private\n getNotificationData_(\n msgPayload: MessagePayload\n ): NotificationDetails | undefined {\n if (!msgPayload) {\n return;\n }\n\n if (typeof msgPayload.notification !== 'object') {\n return;\n }\n\n const notificationInformation: NotificationDetails = {\n ...msgPayload.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 ...msgPayload.notification.data,\n [FCM_MSG]: msgPayload\n };\n\n return notificationInformation;\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 errorFactory.create(ErrorCode.BG_HANDLER_FUNCTION_EXPECTED);\n }\n\n this.bgMessageHandler = callback;\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 */\n // Visible for testing\n // TODO: Make private\n async 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 let suitableClient: WindowClient | null = null;\n for (let i = 0; i < clientList.length; i++) {\n const parsedClientUrl = new URL(clientList[i].url, self.location.href)\n .href;\n if (parsedClientUrl === parsedURL) {\n suitableClient = clientList[i];\n break;\n }\n }\n\n return suitableClient;\n }\n\n /**\n * This message will attempt to send the message to a window client.\n * @param client The WindowClient to send the message to.\n * @param message The message to send to the client.\n * @returns Returns a promise that resolves after sending the message. This\n * does not guarantee that the message was successfully received.\n */\n // Visible for testing\n // TODO: Make private\n async attemptToMessageClient_(\n client: WindowClient,\n message: InternalMessage\n ): Promise<void> {\n // NOTE: This returns a promise in case this API is abstracted later on to\n // do additional work\n if (!client) {\n throw errorFactory.create(ErrorCode.NO_WINDOW_CLIENT_TO_MSG);\n }\n\n client.postMessage(message);\n }\n\n /**\n * @returns If there is currently a visible WindowClient, this method will\n * resolve to true, otherwise false.\n */\n // Visible for testing\n // TODO: Make private\n async hasVisibleClients_(): Promise<boolean> {\n const clientList = await getClientList();\n\n return clientList.some(\n (client: WindowClient) =>\n client.visibilityState === 'visible' &&\n // Ignore chrome-extension clients as that matches the background pages\n // of extensions, which are always considered visible.\n !client.url.startsWith('chrome-extension://')\n );\n }\n\n /**\n * @param msgPayload 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 */\n // Visible for testing\n // TODO: Make private\n async sendMessageToWindowClients_(msgPayload: MessagePayload): Promise<void> {\n const clientList = await getClientList();\n\n const internalMsg = createNewMsg(MessageType.PUSH_MSG_RECEIVED, msgPayload);\n\n await Promise.all(\n clientList.map(client =>\n this.attemptToMessageClient_(client, internalMsg)\n )\n );\n }\n\n /**\n * This will register the default service worker and return the registration.\n * @return he service worker registration to be used for the push service.\n */\n async getSWRegistration_(): Promise<ServiceWorkerRegistration> {\n return self.registration;\n }\n\n /**\n * This will return the default VAPID key or the uint8array version of the\n * public VAPID key provided by the developer.\n */\n async getPublicVapidKey_(): Promise<Uint8Array> {\n const swReg = await this.getSWRegistration_();\n if (!swReg) {\n throw errorFactory.create(ErrorCode.SW_REGISTRATION_EXPECTED);\n }\n\n const vapidKeyFromDatabase = await this.getVapidDetailsModel().getVapidFromSWScope(\n swReg.scope\n );\n if (vapidKeyFromDatabase == null) {\n return DEFAULT_PUBLIC_VAPID_KEY;\n }\n\n return vapidKeyFromDatabase;\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 createNewMsg(\n msgType: MessageType,\n msgData: MessagePayload\n): InternalMessage {\n return {\n [MessageParameter.TYPE_OF_MSG]: msgType,\n [MessageParameter.DATA]: msgData\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 const DEFAULT_SW_PATH = '/firebase-messaging-sw.js';\nexport const DEFAULT_SW_SCOPE = '/firebase-cloud-messaging-push-scope';\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 { FirebaseApp } from '@firebase/app-types';\nimport {\n CompleteFn,\n createSubscribe,\n ErrorFn,\n NextFn,\n Observer,\n Subscribe,\n Unsubscribe\n} from '@firebase/util';\n\nimport { base64ToArrayBuffer } from '../helpers/base64-to-array-buffer';\nimport { DEFAULT_SW_PATH, DEFAULT_SW_SCOPE } from '../models/default-sw';\nimport { ErrorCode, errorFactory } from '../models/errors';\nimport { DEFAULT_PUBLIC_VAPID_KEY } from '../models/fcm-details';\nimport {\n InternalMessage,\n MessageParameter,\n MessageType\n} from '../models/worker-page-message';\nimport { BaseController } from './base-controller';\n\nexport class WindowController extends BaseController {\n private registrationToUse: ServiceWorkerRegistration | null = null;\n private publicVapidKeyToUse: Uint8Array | null = null;\n\n private messageObserver: Observer<object> | null = null;\n // @ts-ignore: Unused variable error, this is not implemented yet.\n private tokenRefreshObserver: Observer<object> | null = null;\n\n private readonly onMessageInternal: Subscribe<object> = createSubscribe(\n observer => {\n this.messageObserver = observer;\n }\n );\n\n private readonly onTokenRefreshInternal: Subscribe<object> = createSubscribe(\n observer => {\n this.tokenRefreshObserver = observer;\n }\n );\n\n /**\n * A service that provides a MessagingService instance.\n */\n constructor(app: FirebaseApp) {\n super(app);\n\n this.setupSWMessageListener_();\n }\n\n /**\n * Request permission if it is not currently granted\n *\n * @return Resolves if the permission was granted, otherwise rejects\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 (this.getNotificationPermission_() === 'granted') {\n return;\n }\n\n const permissionResult = await Notification.requestPermission();\n if (permissionResult === 'granted') {\n return;\n } else if (permissionResult === 'denied') {\n throw errorFactory.create(ErrorCode.PERMISSION_BLOCKED);\n } else {\n throw errorFactory.create(ErrorCode.PERMISSION_DEFAULT);\n }\n }\n\n /**\n * This method allows a developer to override the default service worker and\n * instead use a custom service worker.\n *\n * @param registration The service worker registration that should be used to\n * receive the push messages.\n */\n useServiceWorker(registration: ServiceWorkerRegistration): void {\n if (!(registration instanceof ServiceWorkerRegistration)) {\n throw errorFactory.create(ErrorCode.SW_REGISTRATION_EXPECTED);\n }\n\n if (this.registrationToUse != null) {\n throw errorFactory.create(ErrorCode.USE_SW_BEFORE_GET_TOKEN);\n }\n\n this.registrationToUse = registration;\n }\n\n /**\n * This method allows a developer to override the default vapid key\n * and instead use a custom VAPID public key.\n *\n * @param publicKey A URL safe base64 encoded string.\n */\n usePublicVapidKey(publicKey: string): void {\n if (typeof publicKey !== 'string') {\n throw errorFactory.create(ErrorCode.INVALID_PUBLIC_VAPID_KEY);\n }\n\n if (this.publicVapidKeyToUse != null) {\n throw errorFactory.create(ErrorCode.USE_PUBLIC_KEY_BEFORE_GET_TOKEN);\n }\n\n const parsedKey = base64ToArrayBuffer(publicKey);\n\n if (parsedKey.length !== 65) {\n throw errorFactory.create(ErrorCode.PUBLIC_KEY_DECRYPTION_FAILED);\n }\n\n this.publicVapidKeyToUse = parsedKey;\n }\n\n /**\n * @export\n * @param nextOrObserver An observer object or a function triggered on\n * message.\n * @param error A function triggered on message error.\n * @param completed function triggered when the observer is removed.\n * @return The unsubscribe function for the observer.\n */\n onMessage(\n nextOrObserver: NextFn<object> | Observer<object>,\n error?: ErrorFn,\n completed?: CompleteFn\n ): Unsubscribe {\n if (typeof nextOrObserver === 'function') {\n return this.onMessageInternal(nextOrObserver, error, completed);\n } else {\n return this.onMessageInternal(nextOrObserver);\n }\n }\n\n /**\n * @param nextOrObserver An observer object or a function triggered on token\n * refresh.\n * @param error A function triggered on token refresh error.\n * @param completed function triggered when the observer is removed.\n * @return The unsubscribe function for the observer.\n */\n onTokenRefresh(\n nextOrObserver: NextFn<object> | Observer<object>,\n error?: ErrorFn,\n completed?: CompleteFn\n ): Unsubscribe {\n if (typeof nextOrObserver === 'function') {\n return this.onTokenRefreshInternal(nextOrObserver, error, completed);\n } else {\n return this.onTokenRefreshInternal(nextOrObserver);\n }\n }\n\n /**\n * Given a registration, wait for the service worker it relates to\n * become activer\n * @param registration Registration to wait for service worker to become active\n * @return Wait for service worker registration to become active\n */\n // Visible for testing\n // TODO: Make private\n waitForRegistrationToActivate_(\n registration: ServiceWorkerRegistration\n ): Promise<ServiceWorkerRegistration> {\n const serviceWorker =\n registration.installing || registration.waiting || registration.active;\n\n return new Promise<ServiceWorkerRegistration>((resolve, reject) => {\n if (!serviceWorker) {\n // This is a rare scenario but has occured in firefox\n reject(errorFactory.create(ErrorCode.NO_SW_IN_REG));\n return;\n }\n // Because the Promise function is called on next tick there is a\n // small chance that the worker became active or redundant already.\n if (serviceWorker.state === 'activated') {\n resolve(registration);\n return;\n }\n\n if (serviceWorker.state === 'redundant') {\n reject(errorFactory.create(ErrorCode.SW_REG_REDUNDANT));\n return;\n }\n\n const stateChangeListener = (): void => {\n if (serviceWorker.state === 'activated') {\n resolve(registration);\n } else if (serviceWorker.state === 'redundant') {\n reject(errorFactory.create(ErrorCode.SW_REG_REDUNDANT));\n } else {\n // Return early and wait to next state change\n return;\n }\n serviceWorker.removeEventListener('statechange', stateChangeListener);\n };\n serviceWorker.addEventListener('statechange', stateChangeListener);\n });\n }\n\n /**\n * This will register the default service worker and return the registration\n * @return The service worker registration to be used for the push service.\n */\n getSWRegistration_(): Promise<ServiceWorkerRegistration> {\n if (this.registrationToUse) {\n return this.waitForRegistrationToActivate_(this.registrationToUse);\n }\n\n // Make the registration null so we know useServiceWorker will not\n // use a new service worker as registrationToUse is no longer undefined\n this.registrationToUse = null;\n\n return navigator.serviceWorker\n .register(DEFAULT_SW_PATH, {\n scope: DEFAULT_SW_SCOPE\n })\n .catch((err: Error) => {\n throw errorFactory.create(ErrorCode.FAILED_DEFAULT_REGISTRATION, {\n browserErrorMessage: err.message\n });\n })\n .then((registration: ServiceWorkerRegistration) => {\n return this.waitForRegistrationToActivate_(registration).then(() => {\n this.registrationToUse = registration;\n\n // We update after activation due to an issue with Firefox v49 where\n // a race condition occassionally causes the service worker to not\n // install\n // tslint:disable-next-line:no-floating-promises\n registration.update();\n\n return registration;\n });\n });\n }\n\n /**\n * This will return the default VAPID key or the uint8array version of the public VAPID key\n * provided by the developer.\n */\n async getPublicVapidKey_(): Promise<Uint8Array> {\n if (this.publicVapidKeyToUse) {\n return this.publicVapidKeyToUse;\n }\n\n return DEFAULT_PUBLIC_VAPID_KEY;\n }\n\n /**\n * This method will set up a message listener to handle\n * events from the service worker that should trigger\n * events in the page.\n */\n // Visible for testing\n // TODO: Make private\n setupSWMessageListener_(): void {\n navigator.serviceWorker.addEventListener(\n 'message',\n event => {\n if (!event.data || !event.data[MessageParameter.TYPE_OF_MSG]) {\n // Not a message from FCM\n return;\n }\n\n const workerPageMessage: InternalMessage = event.data;\n switch (workerPageMessage[MessageParameter.TYPE_OF_MSG]) {\n case MessageType.PUSH_MSG_RECEIVED:\n case MessageType.NOTIFICATION_CLICKED:\n const pushMessage = workerPageMessage[MessageParameter.DATA];\n if (this.messageObserver) {\n this.messageObserver.next(pushMessage);\n }\n break;\n default:\n // Noop.\n break;\n }\n },\n false\n );\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 {\n _FirebaseNamespace,\n FirebaseServiceFactory\n} from '@firebase/app-types/private';\nimport { FirebaseMessaging } from '@firebase/messaging-types';\n\nimport { SwController } from './src/controllers/sw-controller';\nimport { WindowController } from './src/controllers/window-controller';\nimport { ErrorCode, errorFactory } from './src/models/errors';\n\nexport function registerMessaging(instance: _FirebaseNamespace): void {\n const messagingName = 'messaging';\n\n const factoryMethod: FirebaseServiceFactory = app => {\n if (!isSupported()) {\n throw errorFactory.create(ErrorCode.UNSUPPORTED_BROWSER);\n }\n\n if (self && 'ServiceWorkerGlobalScope' in self) {\n // Running in ServiceWorker context\n return new SwController(app);\n } else {\n // Assume we are in the window context.\n return new WindowController(app);\n }\n };\n\n const namespaceExports = {\n isSupported\n };\n\n instance.INTERNAL.registerService(\n messagingName,\n factoryMethod,\n namespaceExports\n );\n}\n\nregisterMessaging(firebase as _FirebaseNamespace);\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\nexport function 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 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 'PushManager' in self &&\n 'Notification' in self &&\n ServiceWorkerRegistration.prototype.hasOwnProperty('showNotification') &&\n PushSubscription.prototype.hasOwnProperty('getKey')\n );\n}\n"],"names":[],"mappings":"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"} |