{"version":3,"file":"index.esm.js","sources":["../src/util/constants.ts","../src/util/errors.ts","../src/api/common.ts","../src/api/create-installation-request.ts","../src/util/sleep.ts","../src/helpers/buffer-to-base64-url-safe.ts","../src/helpers/generate-fid.ts","../src/util/get-key.ts","../src/helpers/fid-changed.ts","../src/helpers/idb-manager.ts","../src/helpers/get-installation-entry.ts","../src/api/generate-auth-token-request.ts","../src/helpers/refresh-auth-token.ts","../src/functions/get-id.ts","../src/functions/get-token.ts","../src/api/delete-installation-request.ts","../src/functions/delete-installation.ts","../src/functions/on-id-change.ts","../src/helpers/extract-app-config.ts","../src/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\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 { version } from '../../package.json';\n\nexport const PENDING_TIMEOUT_MS = 10000;\n\nexport const PACKAGE_VERSION = `w:${version}`;\nexport const INTERNAL_AUTH_VERSION = 'FIS_v2';\n\nexport const INSTALLATIONS_API_URL =\n 'https://firebaseinstallations.googleapis.com/v1';\n\nexport const TOKEN_EXPIRATION_BUFFER = 60 * 60 * 1000; // One hour\n\nexport const SERVICE = 'installations';\nexport const SERVICE_NAME = 'Installations';\n","/**\n * @license\n * Copyright 2019 Google LLC\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, FirebaseError } from '@firebase/util';\nimport { SERVICE, SERVICE_NAME } from './constants';\n\nexport const enum ErrorCode {\n MISSING_APP_CONFIG_VALUES = 'missing-app-config-values',\n NOT_REGISTERED = 'not-registered',\n INSTALLATION_NOT_FOUND = 'installation-not-found',\n REQUEST_FAILED = 'request-failed',\n APP_OFFLINE = 'app-offline',\n DELETE_PENDING_REGISTRATION = 'delete-pending-registration'\n}\n\nconst ERROR_DESCRIPTION_MAP: { readonly [key in ErrorCode]: string } = {\n [ErrorCode.MISSING_APP_CONFIG_VALUES]:\n 'Missing App configuration value: \"{$valueName}\"',\n [ErrorCode.NOT_REGISTERED]: 'Firebase Installation is not registered.',\n [ErrorCode.INSTALLATION_NOT_FOUND]: 'Firebase Installation not found.',\n [ErrorCode.REQUEST_FAILED]:\n '{$requestName} request failed with error \"{$serverCode} {$serverStatus}: {$serverMessage}\"',\n [ErrorCode.APP_OFFLINE]: 'Could not process request. Application offline.',\n [ErrorCode.DELETE_PENDING_REGISTRATION]:\n \"Can't delete installation while there is a pending registration request.\"\n};\n\ninterface ErrorParams {\n [ErrorCode.MISSING_APP_CONFIG_VALUES]: {\n valueName: string;\n };\n [ErrorCode.REQUEST_FAILED]: {\n requestName: string;\n [index: string]: string | number; // to make Typescript 3.8 happy\n } & ServerErrorData;\n}\n\nexport const ERROR_FACTORY = new ErrorFactory(\n SERVICE,\n SERVICE_NAME,\n ERROR_DESCRIPTION_MAP\n);\n\nexport interface ServerErrorData {\n serverCode: number;\n serverMessage: string;\n serverStatus: string;\n}\n\nexport type ServerError = FirebaseError & ServerErrorData;\n\n/** Returns true if error is a FirebaseError that is based on an error from the server. */\nexport function isServerError(error: unknown): error is ServerError {\n return (\n error instanceof FirebaseError &&\n error.code.includes(ErrorCode.REQUEST_FAILED)\n );\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { FirebaseError } from '@firebase/util';\nimport { GenerateAuthTokenResponse } from '../interfaces/api-response';\nimport { AppConfig } from '../interfaces/app-config';\nimport {\n CompletedAuthToken,\n RegisteredInstallationEntry,\n RequestStatus\n} from '../interfaces/installation-entry';\nimport {\n INSTALLATIONS_API_URL,\n INTERNAL_AUTH_VERSION\n} from '../util/constants';\nimport { ERROR_FACTORY, ErrorCode } from '../util/errors';\n\nexport function getInstallationsEndpoint({ projectId }: AppConfig): string {\n return `${INSTALLATIONS_API_URL}/projects/${projectId}/installations`;\n}\n\nexport function extractAuthTokenInfoFromResponse(\n response: GenerateAuthTokenResponse\n): CompletedAuthToken {\n return {\n token: response.token,\n requestStatus: RequestStatus.COMPLETED,\n expiresIn: getExpiresInFromResponseExpiresIn(response.expiresIn),\n creationTime: Date.now()\n };\n}\n\nexport async function getErrorFromResponse(\n requestName: string,\n response: Response\n): Promise {\n const responseJson: ErrorResponse = await response.json();\n const errorData = responseJson.error;\n return ERROR_FACTORY.create(ErrorCode.REQUEST_FAILED, {\n requestName,\n serverCode: errorData.code,\n serverMessage: errorData.message,\n serverStatus: errorData.status\n });\n}\n\nexport function getHeaders({ apiKey }: AppConfig): Headers {\n return new Headers({\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-goog-api-key': apiKey\n });\n}\n\nexport function getHeadersWithAuth(\n appConfig: AppConfig,\n { refreshToken }: RegisteredInstallationEntry\n): Headers {\n const headers = getHeaders(appConfig);\n headers.append('Authorization', getAuthorizationHeader(refreshToken));\n return headers;\n}\n\nexport interface ErrorResponse {\n error: {\n code: number;\n message: string;\n status: string;\n };\n}\n\n/**\n * Calls the passed in fetch wrapper and returns the response.\n * If the returned response has a status of 5xx, re-runs the function once and\n * returns the response.\n */\nexport async function retryIfServerError(\n fn: () => Promise\n): Promise {\n const result = await fn();\n\n if (result.status >= 500 && result.status < 600) {\n // Internal Server Error. Retry request.\n return fn();\n }\n\n return result;\n}\n\nfunction getExpiresInFromResponseExpiresIn(responseExpiresIn: string): number {\n // This works because the server will never respond with fractions of a second.\n return Number(responseExpiresIn.replace('s', '000'));\n}\n\nfunction getAuthorizationHeader(refreshToken: string): string {\n return `${INTERNAL_AUTH_VERSION} ${refreshToken}`;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { CreateInstallationResponse } from '../interfaces/api-response';\nimport { AppConfig } from '../interfaces/app-config';\nimport {\n InProgressInstallationEntry,\n RegisteredInstallationEntry,\n RequestStatus\n} from '../interfaces/installation-entry';\nimport { INTERNAL_AUTH_VERSION, PACKAGE_VERSION } from '../util/constants';\nimport {\n extractAuthTokenInfoFromResponse,\n getErrorFromResponse,\n getHeaders,\n getInstallationsEndpoint,\n retryIfServerError\n} from './common';\n\nexport async function createInstallationRequest(\n appConfig: AppConfig,\n { fid }: InProgressInstallationEntry\n): Promise {\n const endpoint = getInstallationsEndpoint(appConfig);\n\n const headers = getHeaders(appConfig);\n const body = {\n fid,\n authVersion: INTERNAL_AUTH_VERSION,\n appId: appConfig.appId,\n sdkVersion: PACKAGE_VERSION\n };\n\n const request: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n\n const response = await retryIfServerError(() => fetch(endpoint, request));\n if (response.ok) {\n const responseValue: CreateInstallationResponse = await response.json();\n const registeredInstallationEntry: RegisteredInstallationEntry = {\n fid: responseValue.fid || fid,\n registrationStatus: RequestStatus.COMPLETED,\n refreshToken: responseValue.refreshToken,\n authToken: extractAuthTokenInfoFromResponse(responseValue.authToken)\n };\n return registeredInstallationEntry;\n } else {\n throw await getErrorFromResponse('Create Installation', response);\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 bufferToBase64UrlSafe(array: Uint8Array): string {\n const b64 = btoa(String.fromCharCode(...array));\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { bufferToBase64UrlSafe } from './buffer-to-base64-url-safe';\n\nexport const VALID_FID_PATTERN = /^[cdef][\\w-]{21}$/;\nexport const INVALID_FID = '';\n\n/**\n * Generates a new FID using random values from Web Crypto API.\n * Returns an empty string if FID generation fails for any reason.\n */\nexport function generateFid(): string {\n try {\n // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5\n // bytes. our implementation generates a 17 byte array instead.\n const fidByteArray = new Uint8Array(17);\n const crypto =\n self.crypto || ((self as unknown) as { msCrypto: Crypto }).msCrypto;\n crypto.getRandomValues(fidByteArray);\n\n // Replace the first 4 random bits with the constant FID header of 0b0111.\n fidByteArray[0] = 0b01110000 + (fidByteArray[0] % 0b00010000);\n\n const fid = encode(fidByteArray);\n\n return VALID_FID_PATTERN.test(fid) ? fid : INVALID_FID;\n } catch {\n // FID generation errored\n return INVALID_FID;\n }\n}\n\n/** Converts a FID Uint8Array to a base64 string representation. */\nfunction encode(fidByteArray: Uint8Array): string {\n const b64String = bufferToBase64UrlSafe(fidByteArray);\n\n // Remove the 23rd character that was added because of the extra 4 bits at the\n // end of our 17 byte array, and the '=' padding.\n return b64String.substr(0, 22);\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { AppConfig } from '../interfaces/app-config';\n\n/** Returns a string key that can be used to identify the app. */\nexport function getKey(appConfig: AppConfig): string {\n return `${appConfig.appName}!${appConfig.appId}`;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { getKey } from '../util/get-key';\nimport { AppConfig } from '../interfaces/app-config';\nimport { IdChangeCallbackFn } from '../functions';\n\nconst fidChangeCallbacks: Map> = new Map();\n\n/**\n * Calls the onIdChange callbacks with the new FID value, and broadcasts the\n * change to other tabs.\n */\nexport function fidChanged(appConfig: AppConfig, fid: string): void {\n const key = getKey(appConfig);\n\n callFidChangeCallbacks(key, fid);\n broadcastFidChange(key, fid);\n}\n\nexport function addCallback(\n appConfig: AppConfig,\n callback: IdChangeCallbackFn\n): void {\n // Open the broadcast channel if it's not already open,\n // to be able to listen to change events from other tabs.\n getBroadcastChannel();\n\n const key = getKey(appConfig);\n\n let callbackSet = fidChangeCallbacks.get(key);\n if (!callbackSet) {\n callbackSet = new Set();\n fidChangeCallbacks.set(key, callbackSet);\n }\n callbackSet.add(callback);\n}\n\nexport function removeCallback(\n appConfig: AppConfig,\n callback: IdChangeCallbackFn\n): void {\n const key = getKey(appConfig);\n\n const callbackSet = fidChangeCallbacks.get(key);\n\n if (!callbackSet) {\n return;\n }\n\n callbackSet.delete(callback);\n if (callbackSet.size === 0) {\n fidChangeCallbacks.delete(key);\n }\n\n // Close broadcast channel if there are no more callbacks.\n closeBroadcastChannel();\n}\n\nfunction callFidChangeCallbacks(key: string, fid: string): void {\n const callbacks = fidChangeCallbacks.get(key);\n if (!callbacks) {\n return;\n }\n\n for (const callback of callbacks) {\n callback(fid);\n }\n}\n\nfunction broadcastFidChange(key: string, fid: string): void {\n const channel = getBroadcastChannel();\n if (channel) {\n channel.postMessage({ key, fid });\n }\n closeBroadcastChannel();\n}\n\nlet broadcastChannel: BroadcastChannel | null = null;\n/** Opens and returns a BroadcastChannel if it is supported by the browser. */\nfunction getBroadcastChannel(): BroadcastChannel | null {\n if (!broadcastChannel && 'BroadcastChannel' in self) {\n broadcastChannel = new BroadcastChannel('[Firebase] FID Change');\n broadcastChannel.onmessage = e => {\n callFidChangeCallbacks(e.data.key, e.data.fid);\n };\n }\n return broadcastChannel;\n}\n\nfunction closeBroadcastChannel(): void {\n if (fidChangeCallbacks.size === 0 && broadcastChannel) {\n broadcastChannel.close();\n broadcastChannel = null;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 } from 'idb';\nimport { AppConfig } from '../interfaces/app-config';\nimport { InstallationEntry } from '../interfaces/installation-entry';\nimport { getKey } from '../util/get-key';\nimport { fidChanged } from './fid-changed';\n\nconst DATABASE_NAME = 'firebase-installations-database';\nconst DATABASE_VERSION = 1;\nconst OBJECT_STORE_NAME = 'firebase-installations-store';\n\nlet dbPromise: Promise | null = null;\nfunction getDbPromise(): Promise {\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 get(\n appConfig: AppConfig\n): Promise {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n return db\n .transaction(OBJECT_STORE_NAME)\n .objectStore(OBJECT_STORE_NAME)\n .get(key);\n}\n\n/** Assigns or overwrites the record for the given key with the given value. */\nexport async function set(\n appConfig: AppConfig,\n value: ValueType\n): Promise {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n const objectStore = tx.objectStore(OBJECT_STORE_NAME);\n const oldValue = await objectStore.get(key);\n await objectStore.put(value, key);\n await tx.complete;\n\n if (!oldValue || oldValue.fid !== value.fid) {\n fidChanged(appConfig, value.fid);\n }\n\n return value;\n}\n\n/** Removes record(s) from the objectStore that match the given key. */\nexport async function remove(appConfig: AppConfig): Promise {\n const key = getKey(appConfig);\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/**\n * Atomically updates a record with the result of updateFn, which gets\n * called with the current value. If newValue is undefined, the record is\n * deleted instead.\n * @return Updated value\n */\nexport async function update(\n appConfig: AppConfig,\n updateFn: (previousValue: InstallationEntry | undefined) => ValueType\n): Promise {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n const store = tx.objectStore(OBJECT_STORE_NAME);\n const oldValue: InstallationEntry | undefined = await store.get(key);\n const newValue = updateFn(oldValue);\n\n if (newValue === undefined) {\n await store.delete(key);\n } else {\n await store.put(newValue, key);\n }\n await tx.complete;\n\n if (newValue && (!oldValue || oldValue.fid !== newValue.fid)) {\n fidChanged(appConfig, newValue.fid);\n }\n\n return newValue;\n}\n\nexport async function clear(): Promise {\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n await tx.objectStore(OBJECT_STORE_NAME).clear();\n await tx.complete;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { createInstallationRequest } from '../api/create-installation-request';\nimport { AppConfig } from '../interfaces/app-config';\nimport {\n InProgressInstallationEntry,\n InstallationEntry,\n RegisteredInstallationEntry,\n RequestStatus\n} from '../interfaces/installation-entry';\nimport { PENDING_TIMEOUT_MS } from '../util/constants';\nimport { ERROR_FACTORY, ErrorCode, isServerError } from '../util/errors';\nimport { sleep } from '../util/sleep';\nimport { generateFid, INVALID_FID } from './generate-fid';\nimport { remove, set, update } from './idb-manager';\n\nexport interface InstallationEntryWithRegistrationPromise {\n installationEntry: InstallationEntry;\n /** Exist iff the installationEntry is not registered. */\n registrationPromise?: Promise;\n}\n\n/**\n * Updates and returns the InstallationEntry from the database.\n * Also triggers a registration request if it is necessary and possible.\n */\nexport async function getInstallationEntry(\n appConfig: AppConfig\n): Promise {\n let registrationPromise: Promise | undefined;\n\n const installationEntry = await update(appConfig, oldEntry => {\n const installationEntry = updateOrCreateInstallationEntry(oldEntry);\n const entryWithPromise = triggerRegistrationIfNecessary(\n appConfig,\n installationEntry\n );\n registrationPromise = entryWithPromise.registrationPromise;\n return entryWithPromise.installationEntry;\n });\n\n if (installationEntry.fid === INVALID_FID) {\n // FID generation failed. Waiting for the FID from the server.\n return { installationEntry: await registrationPromise! };\n }\n\n return {\n installationEntry,\n registrationPromise\n };\n}\n\n/**\n * Creates a new Installation Entry if one does not exist.\n * Also clears timed out pending requests.\n */\nfunction updateOrCreateInstallationEntry(\n oldEntry: InstallationEntry | undefined\n): InstallationEntry {\n const entry: InstallationEntry = oldEntry || {\n fid: generateFid(),\n registrationStatus: RequestStatus.NOT_STARTED\n };\n\n return clearTimedOutRequest(entry);\n}\n\n/**\n * If the Firebase Installation is not registered yet, this will trigger the\n * registration and return an InProgressInstallationEntry.\n *\n * If registrationPromise does not exist, the installationEntry is guaranteed\n * to be registered.\n */\nfunction triggerRegistrationIfNecessary(\n appConfig: AppConfig,\n installationEntry: InstallationEntry\n): InstallationEntryWithRegistrationPromise {\n if (installationEntry.registrationStatus === RequestStatus.NOT_STARTED) {\n if (!navigator.onLine) {\n // Registration required but app is offline.\n const registrationPromiseWithError = Promise.reject(\n ERROR_FACTORY.create(ErrorCode.APP_OFFLINE)\n );\n return {\n installationEntry,\n registrationPromise: registrationPromiseWithError\n };\n }\n\n // Try registering. Change status to IN_PROGRESS.\n const inProgressEntry: InProgressInstallationEntry = {\n fid: installationEntry.fid,\n registrationStatus: RequestStatus.IN_PROGRESS,\n registrationTime: Date.now()\n };\n const registrationPromise = registerInstallation(\n appConfig,\n inProgressEntry\n );\n return { installationEntry: inProgressEntry, registrationPromise };\n } else if (\n installationEntry.registrationStatus === RequestStatus.IN_PROGRESS\n ) {\n return {\n installationEntry,\n registrationPromise: waitUntilFidRegistration(appConfig)\n };\n } else {\n return { installationEntry };\n }\n}\n\n/** This will be executed only once for each new Firebase Installation. */\nasync function registerInstallation(\n appConfig: AppConfig,\n installationEntry: InProgressInstallationEntry\n): Promise {\n try {\n const registeredInstallationEntry = await createInstallationRequest(\n appConfig,\n installationEntry\n );\n return set(appConfig, registeredInstallationEntry);\n } catch (e) {\n if (isServerError(e) && e.serverCode === 409) {\n // Server returned a \"FID can not be used\" error.\n // Generate a new ID next time.\n await remove(appConfig);\n } else {\n // Registration failed. Set FID as not registered.\n await set(appConfig, {\n fid: installationEntry.fid,\n registrationStatus: RequestStatus.NOT_STARTED\n });\n }\n throw e;\n }\n}\n\n/** Call if FID registration is pending in another request. */\nasync function waitUntilFidRegistration(\n appConfig: AppConfig\n): Promise {\n // Unfortunately, there is no way of reliably observing when a value in\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\n // so we need to poll.\n\n let entry: InstallationEntry = await updateInstallationRequest(appConfig);\n while (entry.registrationStatus === RequestStatus.IN_PROGRESS) {\n // createInstallation request still in progress.\n await sleep(100);\n\n entry = await updateInstallationRequest(appConfig);\n }\n\n if (entry.registrationStatus === RequestStatus.NOT_STARTED) {\n // The request timed out or failed in a different call. Try again.\n const {\n installationEntry,\n registrationPromise\n } = await getInstallationEntry(appConfig);\n\n if (registrationPromise) {\n return registrationPromise;\n } else {\n // if there is no registrationPromise, entry is registered.\n return installationEntry as RegisteredInstallationEntry;\n }\n }\n\n return entry;\n}\n\n/**\n * Called only if there is a CreateInstallation request in progress.\n *\n * Updates the InstallationEntry in the DB based on the status of the\n * CreateInstallation request.\n *\n * Returns the updated InstallationEntry.\n */\nfunction updateInstallationRequest(\n appConfig: AppConfig\n): Promise {\n return update(appConfig, oldEntry => {\n if (!oldEntry) {\n throw ERROR_FACTORY.create(ErrorCode.INSTALLATION_NOT_FOUND);\n }\n return clearTimedOutRequest(oldEntry);\n });\n}\n\nfunction clearTimedOutRequest(entry: InstallationEntry): InstallationEntry {\n if (hasInstallationRequestTimedOut(entry)) {\n return {\n fid: entry.fid,\n registrationStatus: RequestStatus.NOT_STARTED\n };\n }\n\n return entry;\n}\n\nfunction hasInstallationRequestTimedOut(\n installationEntry: InstallationEntry\n): boolean {\n return (\n installationEntry.registrationStatus === RequestStatus.IN_PROGRESS &&\n installationEntry.registrationTime + PENDING_TIMEOUT_MS < Date.now()\n );\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { GenerateAuthTokenResponse } from '../interfaces/api-response';\nimport { AppConfig } from '../interfaces/app-config';\nimport { FirebaseDependencies } from '../interfaces/firebase-dependencies';\nimport {\n CompletedAuthToken,\n RegisteredInstallationEntry\n} from '../interfaces/installation-entry';\nimport { PACKAGE_VERSION } from '../util/constants';\nimport {\n extractAuthTokenInfoFromResponse,\n getErrorFromResponse,\n getHeadersWithAuth,\n getInstallationsEndpoint,\n retryIfServerError\n} from './common';\n\nexport async function generateAuthTokenRequest(\n { appConfig, platformLoggerProvider }: FirebaseDependencies,\n installationEntry: RegisteredInstallationEntry\n): Promise {\n const endpoint = getGenerateAuthTokenEndpoint(appConfig, installationEntry);\n\n const headers = getHeadersWithAuth(appConfig, installationEntry);\n\n // If platform logger exists, add the platform info string to the header.\n const platformLogger = platformLoggerProvider.getImmediate({\n optional: true\n });\n if (platformLogger) {\n headers.append('x-firebase-client', platformLogger.getPlatformInfoString());\n }\n\n const body = {\n installation: {\n sdkVersion: PACKAGE_VERSION\n }\n };\n\n const request: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n\n const response = await retryIfServerError(() => fetch(endpoint, request));\n if (response.ok) {\n const responseValue: GenerateAuthTokenResponse = await response.json();\n const completedAuthToken: CompletedAuthToken = extractAuthTokenInfoFromResponse(\n responseValue\n );\n return completedAuthToken;\n } else {\n throw await getErrorFromResponse('Generate Auth Token', response);\n }\n}\n\nfunction getGenerateAuthTokenEndpoint(\n appConfig: AppConfig,\n { fid }: RegisteredInstallationEntry\n): string {\n return `${getInstallationsEndpoint(appConfig)}/${fid}/authTokens:generate`;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { generateAuthTokenRequest } from '../api/generate-auth-token-request';\nimport { AppConfig } from '../interfaces/app-config';\nimport { FirebaseDependencies } from '../interfaces/firebase-dependencies';\nimport {\n AuthToken,\n CompletedAuthToken,\n InProgressAuthToken,\n InstallationEntry,\n RegisteredInstallationEntry,\n RequestStatus\n} from '../interfaces/installation-entry';\nimport { PENDING_TIMEOUT_MS, TOKEN_EXPIRATION_BUFFER } from '../util/constants';\nimport { ERROR_FACTORY, ErrorCode, isServerError } from '../util/errors';\nimport { sleep } from '../util/sleep';\nimport { remove, set, update } from './idb-manager';\n\n/**\n * Returns a valid authentication token for the installation. Generates a new\n * token if one doesn't exist, is expired or about to expire.\n *\n * Should only be called if the Firebase Installation is registered.\n */\nexport async function refreshAuthToken(\n dependencies: FirebaseDependencies,\n forceRefresh = false\n): Promise {\n let tokenPromise: Promise | undefined;\n const entry = await update(dependencies.appConfig, oldEntry => {\n if (!isEntryRegistered(oldEntry)) {\n throw ERROR_FACTORY.create(ErrorCode.NOT_REGISTERED);\n }\n\n const oldAuthToken = oldEntry.authToken;\n if (!forceRefresh && isAuthTokenValid(oldAuthToken)) {\n // There is a valid token in the DB.\n return oldEntry;\n } else if (oldAuthToken.requestStatus === RequestStatus.IN_PROGRESS) {\n // There already is a token request in progress.\n tokenPromise = waitUntilAuthTokenRequest(dependencies, forceRefresh);\n return oldEntry;\n } else {\n // No token or token expired.\n if (!navigator.onLine) {\n throw ERROR_FACTORY.create(ErrorCode.APP_OFFLINE);\n }\n\n const inProgressEntry = makeAuthTokenRequestInProgressEntry(oldEntry);\n tokenPromise = fetchAuthTokenFromServer(dependencies, inProgressEntry);\n return inProgressEntry;\n }\n });\n\n const authToken = tokenPromise\n ? await tokenPromise\n : (entry.authToken as CompletedAuthToken);\n return authToken;\n}\n\n/**\n * Call only if FID is registered and Auth Token request is in progress.\n *\n * Waits until the current pending request finishes. If the request times out,\n * tries once in this thread as well.\n */\nasync function waitUntilAuthTokenRequest(\n dependencies: FirebaseDependencies,\n forceRefresh: boolean\n): Promise {\n // Unfortunately, there is no way of reliably observing when a value in\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\n // so we need to poll.\n\n let entry = await updateAuthTokenRequest(dependencies.appConfig);\n while (entry.authToken.requestStatus === RequestStatus.IN_PROGRESS) {\n // generateAuthToken still in progress.\n await sleep(100);\n\n entry = await updateAuthTokenRequest(dependencies.appConfig);\n }\n\n const authToken = entry.authToken;\n if (authToken.requestStatus === RequestStatus.NOT_STARTED) {\n // The request timed out or failed in a different call. Try again.\n return refreshAuthToken(dependencies, forceRefresh);\n } else {\n return authToken;\n }\n}\n\n/**\n * Called only if there is a GenerateAuthToken request in progress.\n *\n * Updates the InstallationEntry in the DB based on the status of the\n * GenerateAuthToken request.\n *\n * Returns the updated InstallationEntry.\n */\nfunction updateAuthTokenRequest(\n appConfig: AppConfig\n): Promise {\n return update(appConfig, oldEntry => {\n if (!isEntryRegistered(oldEntry)) {\n throw ERROR_FACTORY.create(ErrorCode.NOT_REGISTERED);\n }\n\n const oldAuthToken = oldEntry.authToken;\n if (hasAuthTokenRequestTimedOut(oldAuthToken)) {\n return {\n ...oldEntry,\n authToken: { requestStatus: RequestStatus.NOT_STARTED }\n };\n }\n\n return oldEntry;\n });\n}\n\nasync function fetchAuthTokenFromServer(\n dependencies: FirebaseDependencies,\n installationEntry: RegisteredInstallationEntry\n): Promise {\n try {\n const authToken = await generateAuthTokenRequest(\n dependencies,\n installationEntry\n );\n const updatedInstallationEntry: RegisteredInstallationEntry = {\n ...installationEntry,\n authToken\n };\n await set(dependencies.appConfig, updatedInstallationEntry);\n return authToken;\n } catch (e) {\n if (isServerError(e) && (e.serverCode === 401 || e.serverCode === 404)) {\n // Server returned a \"FID not found\" or a \"Invalid authentication\" error.\n // Generate a new ID next time.\n await remove(dependencies.appConfig);\n } else {\n const updatedInstallationEntry: RegisteredInstallationEntry = {\n ...installationEntry,\n authToken: { requestStatus: RequestStatus.NOT_STARTED }\n };\n await set(dependencies.appConfig, updatedInstallationEntry);\n }\n throw e;\n }\n}\n\nfunction isEntryRegistered(\n installationEntry: InstallationEntry | undefined\n): installationEntry is RegisteredInstallationEntry {\n return (\n installationEntry !== undefined &&\n installationEntry.registrationStatus === RequestStatus.COMPLETED\n );\n}\n\nfunction isAuthTokenValid(authToken: AuthToken): boolean {\n return (\n authToken.requestStatus === RequestStatus.COMPLETED &&\n !isAuthTokenExpired(authToken)\n );\n}\n\nfunction isAuthTokenExpired(authToken: CompletedAuthToken): boolean {\n const now = Date.now();\n return (\n now < authToken.creationTime ||\n authToken.creationTime + authToken.expiresIn < now + TOKEN_EXPIRATION_BUFFER\n );\n}\n\n/** Returns an updated InstallationEntry with an InProgressAuthToken. */\nfunction makeAuthTokenRequestInProgressEntry(\n oldEntry: RegisteredInstallationEntry\n): RegisteredInstallationEntry {\n const inProgressAuthToken: InProgressAuthToken = {\n requestStatus: RequestStatus.IN_PROGRESS,\n requestTime: Date.now()\n };\n return {\n ...oldEntry,\n authToken: inProgressAuthToken\n };\n}\n\nfunction hasAuthTokenRequestTimedOut(authToken: AuthToken): boolean {\n return (\n authToken.requestStatus === RequestStatus.IN_PROGRESS &&\n authToken.requestTime + PENDING_TIMEOUT_MS < Date.now()\n );\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { getInstallationEntry } from '../helpers/get-installation-entry';\nimport { refreshAuthToken } from '../helpers/refresh-auth-token';\nimport { FirebaseDependencies } from '../interfaces/firebase-dependencies';\n\nexport async function getId(\n dependencies: FirebaseDependencies\n): Promise {\n const { installationEntry, registrationPromise } = await getInstallationEntry(\n dependencies.appConfig\n );\n\n if (registrationPromise) {\n registrationPromise.catch(console.error);\n } else {\n // If the installation is already registered, update the authentication\n // token if needed.\n refreshAuthToken(dependencies).catch(console.error);\n }\n\n return installationEntry.fid;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { getInstallationEntry } from '../helpers/get-installation-entry';\nimport { refreshAuthToken } from '../helpers/refresh-auth-token';\nimport { AppConfig } from '../interfaces/app-config';\nimport { FirebaseDependencies } from '../interfaces/firebase-dependencies';\n\nexport async function getToken(\n dependencies: FirebaseDependencies,\n forceRefresh = false\n): Promise {\n await completeInstallationRegistration(dependencies.appConfig);\n\n // At this point we either have a Registered Installation in the DB, or we've\n // already thrown an error.\n const authToken = await refreshAuthToken(dependencies, forceRefresh);\n return authToken.token;\n}\n\nasync function completeInstallationRegistration(\n appConfig: AppConfig\n): Promise {\n const { registrationPromise } = await getInstallationEntry(appConfig);\n\n if (registrationPromise) {\n // A createInstallation request is in progress. Wait until it finishes.\n await registrationPromise;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { AppConfig } from '../interfaces/app-config';\nimport { RegisteredInstallationEntry } from '../interfaces/installation-entry';\nimport {\n getErrorFromResponse,\n getHeadersWithAuth,\n getInstallationsEndpoint,\n retryIfServerError\n} from './common';\n\nexport async function deleteInstallationRequest(\n appConfig: AppConfig,\n installationEntry: RegisteredInstallationEntry\n): Promise {\n const endpoint = getDeleteEndpoint(appConfig, installationEntry);\n\n const headers = getHeadersWithAuth(appConfig, installationEntry);\n const request: RequestInit = {\n method: 'DELETE',\n headers\n };\n\n const response = await retryIfServerError(() => fetch(endpoint, request));\n if (!response.ok) {\n throw await getErrorFromResponse('Delete Installation', response);\n }\n}\n\nfunction getDeleteEndpoint(\n appConfig: AppConfig,\n { fid }: RegisteredInstallationEntry\n): string {\n return `${getInstallationsEndpoint(appConfig)}/${fid}`;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { deleteInstallationRequest } from '../api/delete-installation-request';\nimport { remove, update } from '../helpers/idb-manager';\nimport { FirebaseDependencies } from '../interfaces/firebase-dependencies';\nimport { RequestStatus } from '../interfaces/installation-entry';\nimport { ERROR_FACTORY, ErrorCode } from '../util/errors';\n\nexport async function deleteInstallation(\n dependencies: FirebaseDependencies\n): Promise {\n const { appConfig } = dependencies;\n\n const entry = await update(appConfig, oldEntry => {\n if (oldEntry && oldEntry.registrationStatus === RequestStatus.NOT_STARTED) {\n // Delete the unregistered entry without sending a deleteInstallation request.\n return undefined;\n }\n return oldEntry;\n });\n\n if (entry) {\n if (entry.registrationStatus === RequestStatus.IN_PROGRESS) {\n // Can't delete while trying to register.\n throw ERROR_FACTORY.create(ErrorCode.DELETE_PENDING_REGISTRATION);\n } else if (entry.registrationStatus === RequestStatus.COMPLETED) {\n if (!navigator.onLine) {\n throw ERROR_FACTORY.create(ErrorCode.APP_OFFLINE);\n } else {\n await deleteInstallationRequest(appConfig, entry);\n await remove(appConfig);\n }\n }\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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 { addCallback, removeCallback } from '../helpers/fid-changed';\nimport { FirebaseDependencies } from '../interfaces/firebase-dependencies';\n\nexport type IdChangeCallbackFn = (installationId: string) => void;\nexport type IdChangeUnsubscribeFn = () => void;\n\n/**\n * Sets a new callback that will get called when Installation ID changes.\n * Returns an unsubscribe function that will remove the callback when called.\n */\nexport function onIdChange(\n { appConfig }: FirebaseDependencies,\n callback: IdChangeCallbackFn\n): IdChangeUnsubscribeFn {\n addCallback(appConfig, callback);\n\n return () => {\n removeCallback(appConfig, callback);\n };\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\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');\n }\n\n if (!app.name) {\n throw getMissingValueError('App Name');\n }\n\n // Required app config keys\n const configKeys: Array = [\n 'projectId',\n 'apiKey',\n 'appId'\n ];\n\n for (const keyName of configKeys) {\n if (!app.options[keyName]) {\n throw getMissingValueError(keyName);\n }\n }\n\n return {\n appName: app.name,\n projectId: app.options.projectId!,\n apiKey: app.options.apiKey!,\n appId: app.options.appId!\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 2019 Google LLC\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 FirebaseService\n} from '@firebase/app-types/private';\nimport { Component, ComponentType } from '@firebase/component';\nimport { FirebaseInstallations } from '@firebase/installations-types';\nimport {\n deleteInstallation,\n getId,\n getToken,\n IdChangeCallbackFn,\n IdChangeUnsubscribeFn,\n onIdChange\n} from './functions';\nimport { extractAppConfig } from './helpers/extract-app-config';\nimport { FirebaseDependencies } from './interfaces/firebase-dependencies';\n\nimport { name, version } from '../package.json';\n\nexport function registerInstallations(instance: _FirebaseNamespace): void {\n const installationsName = 'installations';\n\n instance.INTERNAL.registerComponent(\n new Component(\n installationsName,\n container => {\n const app = container.getProvider('app').getImmediate();\n\n // Throws if app isn't configured properly.\n const appConfig = extractAppConfig(app);\n const platformLoggerProvider = container.getProvider('platform-logger');\n const dependencies: FirebaseDependencies = {\n appConfig,\n platformLoggerProvider\n };\n\n const installations: FirebaseInstallations & FirebaseService = {\n app,\n getId: () => getId(dependencies),\n getToken: (forceRefresh?: boolean) =>\n getToken(dependencies, forceRefresh),\n delete: () => deleteInstallation(dependencies),\n onIdChange: (callback: IdChangeCallbackFn): IdChangeUnsubscribeFn =>\n onIdChange(dependencies, callback)\n };\n return installations;\n },\n ComponentType.PUBLIC\n )\n );\n\n instance.registerVersion(name, version);\n}\n\nregisterInstallations(firebase as _FirebaseNamespace);\n\n/**\n * Define extension behavior of `registerInstallations`\n */\ndeclare module '@firebase/app-types' {\n interface FirebaseNamespace {\n installations(app?: FirebaseApp): FirebaseInstallations;\n }\n interface FirebaseApp {\n installations(): FirebaseInstallations;\n }\n}\n"],"names":[],"mappings":"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"}