UNPKG

198 kBSource Map (JSON)View Raw
1{"version":3,"file":"internal.js","sources":["../../src/platform_browser/persistence/browser.ts","../../src/platform_browser/persistence/local_storage.ts","../../src/platform_browser/persistence/session_storage.ts","../../src/platform_browser/messagechannel/promise.ts","../../src/platform_browser/messagechannel/receiver.ts","../../src/core/util/event_id.ts","../../src/platform_browser/messagechannel/sender.ts","../../src/platform_browser/persistence/indexed_db.ts","../../src/core/util/resolver.ts","../../src/core/strategies/idp.ts","../../src/core/strategies/abstract_popup_redirect_operation.ts","../../src/platform_browser/strategies/popup.ts","../../src/core/strategies/redirect.ts","../../src/platform_browser/strategies/redirect.ts","../../src/core/auth/auth_event_manager.ts","../../src/api/project_config/get_project_config.ts","../../src/core/util/validate_origin.ts","../../src/platform_browser/iframe/gapi.ts","../../src/platform_browser/iframe/iframe.ts","../../src/platform_browser/util/popup.ts","../../src/core/util/handler.ts","../../src/platform_browser/popup_redirect.ts","../../src/platform_browser/index.ts","../../src/platform_cordova/plugins.ts","../../src/platform_cordova/popup_redirect/utils.ts","../../src/platform_cordova/popup_redirect/events.ts","../../src/platform_cordova/popup_redirect/popup_redirect.ts","../../internal/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 {\n PersistenceValue,\n STORAGE_AVAILABLE_KEY,\n PersistenceType\n} from '../../core/persistence';\n\n// There are two different browser persistence types: local and session.\n// Both have the same implementation but use a different underlying storage\n// object.\n\nexport abstract class BrowserPersistenceClass {\n protected constructor(\n protected readonly storageRetriever: () => Storage,\n readonly type: PersistenceType\n ) {}\n\n _isAvailable(): Promise<boolean> {\n try {\n if (!this.storage) {\n return Promise.resolve(false);\n }\n this.storage.setItem(STORAGE_AVAILABLE_KEY, '1');\n this.storage.removeItem(STORAGE_AVAILABLE_KEY);\n return Promise.resolve(true);\n } catch {\n return Promise.resolve(false);\n }\n }\n\n _set(key: string, value: PersistenceValue): Promise<void> {\n this.storage.setItem(key, JSON.stringify(value));\n return Promise.resolve();\n }\n\n _get<T extends PersistenceValue>(key: string): Promise<T | null> {\n const json = this.storage.getItem(key);\n return Promise.resolve(json ? JSON.parse(json) : null);\n }\n\n _remove(key: string): Promise<void> {\n this.storage.removeItem(key);\n return Promise.resolve();\n }\n\n protected get storage(): Storage {\n return this.storageRetriever();\n }\n}\n","/**\n * @license\n * Copyright 2020 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 { Persistence } from '../../model/public_types';\n\nimport { getUA } from '@firebase/util';\nimport {\n _isSafari,\n _isIOS,\n _isIframe,\n _isMobileBrowser,\n _isIE10\n} from '../../core/util/browser';\nimport {\n PersistenceInternal as InternalPersistence,\n PersistenceType,\n PersistenceValue,\n StorageEventListener\n} from '../../core/persistence';\nimport { BrowserPersistenceClass } from './browser';\n\nfunction _iframeCannotSyncWebStorage(): boolean {\n const ua = getUA();\n return _isSafari(ua) || _isIOS(ua);\n}\n\n// The polling period in case events are not supported\nexport const _POLLING_INTERVAL_MS = 1000;\n\n// The IE 10 localStorage cross tab synchronization delay in milliseconds\nconst IE10_LOCAL_STORAGE_SYNC_DELAY = 10;\n\nclass BrowserLocalPersistence\n extends BrowserPersistenceClass\n implements InternalPersistence\n{\n static type: 'LOCAL' = 'LOCAL';\n\n constructor() {\n super(() => window.localStorage, PersistenceType.LOCAL);\n }\n\n private readonly boundEventHandler = (event: StorageEvent, poll?: boolean): void => this.onStorageEvent(event, poll);\n private readonly listeners: Record<string, Set<StorageEventListener>> = {};\n private readonly localCache: Record<string, string | null> = {};\n // setTimeout return value is platform specific\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private pollTimer: any | null = null;\n\n // Safari or iOS browser and embedded in an iframe.\n private readonly safariLocalStorageNotSynced =\n _iframeCannotSyncWebStorage() && _isIframe();\n // Whether to use polling instead of depending on window events\n private readonly fallbackToPolling = _isMobileBrowser();\n readonly _shouldAllowMigration = true;\n\n private forAllChangedKeys(\n cb: (key: string, oldValue: string | null, newValue: string | null) => void\n ): void {\n // Check all keys with listeners on them.\n for (const key of Object.keys(this.listeners)) {\n // Get value from localStorage.\n const newValue = this.storage.getItem(key);\n const oldValue = this.localCache[key];\n // If local map value does not match, trigger listener with storage event.\n // Differentiate this simulated event from the real storage event.\n if (newValue !== oldValue) {\n cb(key, oldValue, newValue);\n }\n }\n }\n\n private onStorageEvent(event: StorageEvent, poll = false): void {\n // Key would be null in some situations, like when localStorage is cleared\n if (!event.key) {\n this.forAllChangedKeys(\n (key: string, _oldValue: string | null, newValue: string | null) => {\n this.notifyListeners(key, newValue);\n }\n );\n return;\n }\n\n const key = event.key;\n\n // Check the mechanism how this event was detected.\n // The first event will dictate the mechanism to be used.\n if (poll) {\n // Environment detects storage changes via polling.\n // Remove storage event listener to prevent possible event duplication.\n this.detachListener();\n } else {\n // Environment detects storage changes via storage event listener.\n // Remove polling listener to prevent possible event duplication.\n this.stopPolling();\n }\n\n // Safari embedded iframe. Storage event will trigger with the delta\n // changes but no changes will be applied to the iframe localStorage.\n if (this.safariLocalStorageNotSynced) {\n // Get current iframe page value.\n const storedValue = this.storage.getItem(key);\n // Value not synchronized, synchronize manually.\n if (event.newValue !== storedValue) {\n if (event.newValue !== null) {\n // Value changed from current value.\n this.storage.setItem(key, event.newValue);\n } else {\n // Current value deleted.\n this.storage.removeItem(key);\n }\n } else if (this.localCache[key] === event.newValue && !poll) {\n // Already detected and processed, do not trigger listeners again.\n return;\n }\n }\n\n const triggerListeners = (): void => {\n // Keep local map up to date in case storage event is triggered before\n // poll.\n const storedValue = this.storage.getItem(key);\n if (!poll && this.localCache[key] === storedValue) {\n // Real storage event which has already been detected, do nothing.\n // This seems to trigger in some IE browsers for some reason.\n return;\n }\n this.notifyListeners(key, storedValue);\n };\n\n const storedValue = this.storage.getItem(key);\n if (\n _isIE10() &&\n storedValue !== event.newValue &&\n event.newValue !== event.oldValue\n ) {\n // IE 10 has this weird bug where a storage event would trigger with the\n // correct key, oldValue and newValue but localStorage.getItem(key) does\n // not yield the updated value until a few milliseconds. This ensures\n // this recovers from that situation.\n setTimeout(triggerListeners, IE10_LOCAL_STORAGE_SYNC_DELAY);\n } else {\n triggerListeners();\n }\n }\n\n private notifyListeners(key: string, value: string | null): void {\n this.localCache[key] = value;\n const listeners = this.listeners[key];\n if (listeners) {\n for (const listener of Array.from(listeners)) {\n listener(value ? JSON.parse(value) : value);\n }\n }\n }\n\n private startPolling(): void {\n this.stopPolling();\n\n this.pollTimer = setInterval(() => {\n this.forAllChangedKeys(\n (key: string, oldValue: string | null, newValue: string | null) => {\n this.onStorageEvent(\n new StorageEvent('storage', {\n key,\n oldValue,\n newValue\n }),\n /* poll */ true\n );\n }\n );\n }, _POLLING_INTERVAL_MS);\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n }\n\n private attachListener(): void {\n window.addEventListener('storage', this.boundEventHandler);\n }\n\n private detachListener(): void {\n window.removeEventListener('storage', this.boundEventHandler);\n }\n\n _addListener(key: string, listener: StorageEventListener): void {\n if (Object.keys(this.listeners).length === 0) {\n // Whether browser can detect storage event when it had already been pushed to the background.\n // This may happen in some mobile browsers. A localStorage change in the foreground window\n // will not be detected in the background window via the storage event.\n // This was detected in iOS 7.x mobile browsers\n if (this.fallbackToPolling) {\n this.startPolling();\n } else {\n this.attachListener();\n }\n }\n if (!this.listeners[key]) {\n this.listeners[key] = new Set();\n // Populate the cache to avoid spuriously triggering on first poll.\n this.localCache[key] = this.storage.getItem(key);\n }\n this.listeners[key].add(listener);\n }\n\n _removeListener(key: string, listener: StorageEventListener): void {\n if (this.listeners[key]) {\n this.listeners[key].delete(listener);\n\n if (this.listeners[key].size === 0) {\n delete this.listeners[key];\n }\n }\n\n if (Object.keys(this.listeners).length === 0) {\n this.detachListener();\n this.stopPolling();\n }\n }\n\n // Update local cache on base operations:\n\n async _set(key: string, value: PersistenceValue): Promise<void> {\n await super._set(key, value);\n this.localCache[key] = JSON.stringify(value);\n }\n\n async _get<T extends PersistenceValue>(key: string): Promise<T | null> {\n const value = await super._get<T>(key);\n this.localCache[key] = JSON.stringify(value);\n return value;\n }\n\n async _remove(key: string): Promise<void> {\n await super._remove(key);\n delete this.localCache[key];\n }\n}\n\n/**\n * An implementation of {@link Persistence} of type `LOCAL` using `localStorage`\n * for the underlying storage.\n *\n * @public\n */\nexport const browserLocalPersistence: Persistence = BrowserLocalPersistence;\n","/**\n * @license\n * Copyright 2020 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 { Persistence } from '../../model/public_types';\n\nimport {\n PersistenceInternal as InternalPersistence,\n PersistenceType,\n StorageEventListener\n} from '../../core/persistence';\nimport { BrowserPersistenceClass } from './browser';\n\nclass BrowserSessionPersistence\n extends BrowserPersistenceClass\n implements InternalPersistence\n{\n static type: 'SESSION' = 'SESSION';\n\n constructor() {\n super(() => window.sessionStorage, PersistenceType.SESSION);\n }\n\n _addListener(_key: string, _listener: StorageEventListener): void {\n // Listeners are not supported for session storage since it cannot be shared across windows\n return;\n }\n\n _removeListener(_key: string, _listener: StorageEventListener): void {\n // Listeners are not supported for session storage since it cannot be shared across windows\n return;\n }\n}\n\n/**\n * An implementation of {@link Persistence} of `SESSION` using `sessionStorage`\n * for the underlying storage.\n *\n * @public\n */\nexport const browserSessionPersistence: Persistence = BrowserSessionPersistence;\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/** TODO: remove this once tslib has a polyfill for Promise.allSettled */\ninterface PromiseFulfilledResult<T> {\n fulfilled: true;\n value: T;\n}\n\ninterface PromiseRejectedResult {\n fulfilled: false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reason: any;\n}\n\nexport type PromiseSettledResult<T> =\n | PromiseFulfilledResult<T>\n | PromiseRejectedResult;\n\n/**\n * Shim for Promise.allSettled, note the slightly different format of `fulfilled` vs `status`.\n *\n * @param promises - Array of promises to wait on.\n */\nexport function _allSettled<T>(\n promises: Array<Promise<T>>\n): Promise<Array<PromiseSettledResult<T>>> {\n return Promise.all(\n promises.map(async promise => {\n try {\n const value = await promise;\n return {\n fulfilled: true,\n value\n } as PromiseFulfilledResult<T>;\n } catch (reason) {\n return {\n fulfilled: false,\n reason\n } as PromiseRejectedResult;\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 {\n ReceiverHandler,\n _EventType,\n _ReceiverResponse,\n SenderMessageEvent,\n _Status,\n _SenderRequest\n} from './index';\nimport { _allSettled } from './promise';\n\n/**\n * Interface class for receiving messages.\n *\n */\nexport class Receiver {\n private static readonly receivers: Receiver[] = [];\n private readonly boundEventHandler: EventListener;\n\n private readonly handlersMap: {\n // Typescript doesn't have existential types :(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [eventType: string]: Set<ReceiverHandler<any, any>>;\n } = {};\n\n constructor(private readonly eventTarget: EventTarget) {\n this.boundEventHandler = this.handleEvent.bind(this);\n }\n\n /**\n * Obtain an instance of a Receiver for a given event target, if none exists it will be created.\n *\n * @param eventTarget - An event target (such as window or self) through which the underlying\n * messages will be received.\n */\n static _getInstance(eventTarget: EventTarget): Receiver {\n // The results are stored in an array since objects can't be keys for other\n // objects. In addition, setting a unique property on an event target as a\n // hash map key may not be allowed due to CORS restrictions.\n const existingInstance = this.receivers.find(receiver =>\n receiver.isListeningto(eventTarget)\n );\n if (existingInstance) {\n return existingInstance;\n }\n const newInstance = new Receiver(eventTarget);\n this.receivers.push(newInstance);\n return newInstance;\n }\n\n private isListeningto(eventTarget: EventTarget): boolean {\n return this.eventTarget === eventTarget;\n }\n\n /**\n * Fans out a MessageEvent to the appropriate listeners.\n *\n * @remarks\n * Sends an {@link Status.ACK} upon receipt and a {@link Status.DONE} once all handlers have\n * finished processing.\n *\n * @param event - The MessageEvent.\n *\n */\n private async handleEvent<\n T extends _ReceiverResponse,\n S extends _SenderRequest\n >(event: Event): Promise<void> {\n const messageEvent = event as MessageEvent<SenderMessageEvent<S>>;\n const { eventId, eventType, data } = messageEvent.data;\n\n const handlers: Set<ReceiverHandler<T, S>> | undefined = this.handlersMap[\n eventType\n ];\n if (!handlers?.size) {\n return;\n }\n\n messageEvent.ports[0].postMessage({\n status: _Status.ACK,\n eventId,\n eventType\n });\n\n const promises = Array.from(handlers).map(async handler =>\n handler(messageEvent.origin, data)\n );\n const response = await _allSettled(promises);\n messageEvent.ports[0].postMessage({\n status: _Status.DONE,\n eventId,\n eventType,\n response\n });\n }\n\n /**\n * Subscribe an event handler for a particular event.\n *\n * @param eventType - Event name to subscribe to.\n * @param eventHandler - The event handler which should receive the events.\n *\n */\n _subscribe<T extends _ReceiverResponse, S extends _SenderRequest>(\n eventType: _EventType,\n eventHandler: ReceiverHandler<T, S>\n ): void {\n if (Object.keys(this.handlersMap).length === 0) {\n this.eventTarget.addEventListener('message', this.boundEventHandler);\n }\n\n if (!this.handlersMap[eventType]) {\n this.handlersMap[eventType] = new Set();\n }\n\n this.handlersMap[eventType].add(eventHandler);\n }\n\n /**\n * Unsubscribe an event handler from a particular event.\n *\n * @param eventType - Event name to unsubscribe from.\n * @param eventHandler - Optinoal event handler, if none provided, unsubscribe all handlers on this event.\n *\n */\n _unsubscribe<T extends _ReceiverResponse, S extends _SenderRequest>(\n eventType: _EventType,\n eventHandler?: ReceiverHandler<T, S>\n ): void {\n if (this.handlersMap[eventType] && eventHandler) {\n this.handlersMap[eventType].delete(eventHandler);\n }\n if (!eventHandler || this.handlersMap[eventType].size === 0) {\n delete this.handlersMap[eventType];\n }\n\n if (Object.keys(this.handlersMap).length === 0) {\n this.eventTarget.removeEventListener('message', this.boundEventHandler);\n }\n }\n}\n","/**\n * @license\n * Copyright 2020 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 _generateEventId(prefix = '', digits = 10): string {\n let random = '';\n for (let i = 0; i < digits; i++) {\n random += Math.floor(Math.random() * 10);\n }\n return prefix + random;\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 { _generateEventId } from '../../core/util/event_id';\nimport {\n _SenderRequest,\n _EventType,\n ReceiverMessageEvent,\n _MessageError,\n SenderMessageEvent,\n _Status,\n _ReceiverMessageResponse,\n _ReceiverResponse,\n _TimeoutDuration\n} from './index';\n\ninterface MessageHandler {\n messageChannel: MessageChannel;\n onMessage: EventListenerOrEventListenerObject;\n}\n\n/**\n * Interface for sending messages and waiting for a completion response.\n *\n */\nexport class Sender {\n private readonly handlers = new Set<MessageHandler>();\n\n constructor(private readonly target: ServiceWorker) {}\n\n /**\n * Unsubscribe the handler and remove it from our tracking Set.\n *\n * @param handler - The handler to unsubscribe.\n */\n private removeMessageHandler(handler: MessageHandler): void {\n if (handler.messageChannel) {\n handler.messageChannel.port1.removeEventListener(\n 'message',\n handler.onMessage\n );\n handler.messageChannel.port1.close();\n }\n this.handlers.delete(handler);\n }\n\n /**\n * Send a message to the Receiver located at {@link target}.\n *\n * @remarks\n * We'll first wait a bit for an ACK , if we get one we will wait significantly longer until the\n * receiver has had a chance to fully process the event.\n *\n * @param eventType - Type of event to send.\n * @param data - The payload of the event.\n * @param timeout - Timeout for waiting on an ACK from the receiver.\n *\n * @returns An array of settled promises from all the handlers that were listening on the receiver.\n */\n async _send<T extends _ReceiverResponse, S extends _SenderRequest>(\n eventType: _EventType,\n data: S,\n timeout = _TimeoutDuration.ACK\n ): Promise<_ReceiverMessageResponse<T>> {\n const messageChannel =\n typeof MessageChannel !== 'undefined' ? new MessageChannel() : null;\n if (!messageChannel) {\n throw new Error(_MessageError.CONNECTION_UNAVAILABLE);\n }\n // Node timers and browser timers return fundamentally different types.\n // We don't actually care what the value is but TS won't accept unknown and\n // we can't cast properly in both environments.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let completionTimer: any;\n let handler: MessageHandler;\n return new Promise<_ReceiverMessageResponse<T>>((resolve, reject) => {\n const eventId = _generateEventId('', 20);\n messageChannel.port1.start();\n const ackTimer = setTimeout(() => {\n reject(new Error(_MessageError.UNSUPPORTED_EVENT));\n }, timeout);\n handler = {\n messageChannel,\n onMessage(event: Event): void {\n const messageEvent = event as MessageEvent<ReceiverMessageEvent<T>>;\n if (messageEvent.data.eventId !== eventId) {\n return;\n }\n switch (messageEvent.data.status) {\n case _Status.ACK:\n // The receiver should ACK first.\n clearTimeout(ackTimer);\n completionTimer = setTimeout(() => {\n reject(new Error(_MessageError.TIMEOUT));\n }, _TimeoutDuration.COMPLETION);\n break;\n case _Status.DONE:\n // Once the receiver's handlers are finished we will get the results.\n clearTimeout(completionTimer);\n resolve(messageEvent.data.response);\n break;\n default:\n clearTimeout(ackTimer);\n clearTimeout(completionTimer);\n reject(new Error(_MessageError.INVALID_RESPONSE));\n break;\n }\n }\n };\n this.handlers.add(handler);\n messageChannel.port1.addEventListener('message', handler.onMessage);\n this.target.postMessage(\n {\n eventType,\n eventId,\n data\n } as SenderMessageEvent<S>,\n [messageChannel.port2]\n );\n }).finally(() => {\n if (handler) {\n this.removeMessageHandler(handler);\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 { Persistence } from '../../model/public_types';\nimport {\n PersistedBlob,\n PersistenceInternal as InternalPersistence,\n PersistenceType,\n PersistenceValue,\n StorageEventListener,\n STORAGE_AVAILABLE_KEY\n} from '../../core/persistence/';\nimport {\n _EventType,\n _PingResponse,\n KeyChangedResponse,\n KeyChangedRequest,\n PingRequest,\n _TimeoutDuration\n} from '../messagechannel/index';\nimport { Receiver } from '../messagechannel/receiver';\nimport { Sender } from '../messagechannel/sender';\nimport {\n _isWorker,\n _getActiveServiceWorker,\n _getServiceWorkerController,\n _getWorkerGlobalScope\n} from '../util/worker';\n\nexport const DB_NAME = 'firebaseLocalStorageDb';\nconst DB_VERSION = 1;\nconst DB_OBJECTSTORE_NAME = 'firebaseLocalStorage';\nconst DB_DATA_KEYPATH = 'fbase_key';\n\ninterface DBObject {\n [DB_DATA_KEYPATH]: string;\n value: PersistedBlob;\n}\n\n/**\n * Promise wrapper for IDBRequest\n *\n * Unfortunately we can't cleanly extend Promise<T> since promises are not callable in ES6\n *\n */\nclass DBPromise<T> {\n constructor(private readonly request: IDBRequest) {}\n\n toPromise(): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n this.request.addEventListener('success', () => {\n resolve(this.request.result);\n });\n this.request.addEventListener('error', () => {\n reject(this.request.error);\n });\n });\n }\n}\n\nfunction getObjectStore(db: IDBDatabase, isReadWrite: boolean): IDBObjectStore {\n return db\n .transaction([DB_OBJECTSTORE_NAME], isReadWrite ? 'readwrite' : 'readonly')\n .objectStore(DB_OBJECTSTORE_NAME);\n}\n\nexport async function _clearDatabase(db: IDBDatabase): Promise<void> {\n const objectStore = getObjectStore(db, true);\n return new DBPromise<void>(objectStore.clear()).toPromise();\n}\n\nexport function _deleteDatabase(): Promise<void> {\n const request = indexedDB.deleteDatabase(DB_NAME);\n return new DBPromise<void>(request).toPromise();\n}\n\nexport function _openDatabase(): Promise<IDBDatabase> {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n return new Promise((resolve, reject) => {\n request.addEventListener('error', () => {\n reject(request.error);\n });\n\n request.addEventListener('upgradeneeded', () => {\n const db = request.result;\n\n try {\n db.createObjectStore(DB_OBJECTSTORE_NAME, { keyPath: DB_DATA_KEYPATH });\n } catch (e) {\n reject(e);\n }\n });\n\n request.addEventListener('success', async () => {\n const db: IDBDatabase = request.result;\n // Strange bug that occurs in Firefox when multiple tabs are opened at the\n // same time. The only way to recover seems to be deleting the database\n // and re-initializing it.\n // https://github.com/firebase/firebase-js-sdk/issues/634\n\n if (!db.objectStoreNames.contains(DB_OBJECTSTORE_NAME)) {\n // Need to close the database or else you get a `blocked` event\n db.close();\n await _deleteDatabase();\n resolve(await _openDatabase());\n } else {\n resolve(db);\n }\n });\n });\n}\n\nexport async function _putObject(\n db: IDBDatabase,\n key: string,\n value: PersistenceValue | string\n): Promise<void> {\n const request = getObjectStore(db, true).put({\n [DB_DATA_KEYPATH]: key,\n value\n });\n return new DBPromise<void>(request).toPromise();\n}\n\nasync function getObject(\n db: IDBDatabase,\n key: string\n): Promise<PersistedBlob | null> {\n const request = getObjectStore(db, false).get(key);\n const data = await new DBPromise<DBObject | undefined>(request).toPromise();\n return data === undefined ? null : data.value;\n}\n\nexport function _deleteObject(db: IDBDatabase, key: string): Promise<void> {\n const request = getObjectStore(db, true).delete(key);\n return new DBPromise<void>(request).toPromise();\n}\n\nexport const _POLLING_INTERVAL_MS = 800;\nexport const _TRANSACTION_RETRY_COUNT = 3;\n\nclass IndexedDBLocalPersistence implements InternalPersistence {\n static type: 'LOCAL' = 'LOCAL';\n\n type = PersistenceType.LOCAL;\n db?: IDBDatabase;\n readonly _shouldAllowMigration = true;\n\n private readonly listeners: Record<string, Set<StorageEventListener>> = {};\n private readonly localCache: Record<string, PersistenceValue | null> = {};\n // setTimeout return value is platform specific\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private pollTimer: any | null = null;\n private pendingWrites = 0;\n\n private receiver: Receiver | null = null;\n private sender: Sender | null = null;\n private serviceWorkerReceiverAvailable = false;\n private activeServiceWorker: ServiceWorker | null = null;\n // Visible for testing only\n readonly _workerInitializationPromise: Promise<void>;\n\n constructor() {\n // Fire & forget the service worker registration as it may never resolve\n this._workerInitializationPromise =\n this.initializeServiceWorkerMessaging().then(\n () => {},\n () => {}\n );\n }\n\n async _openDb(): Promise<IDBDatabase> {\n if (this.db) {\n return this.db;\n }\n this.db = await _openDatabase();\n return this.db;\n }\n\n async _withRetries<T>(op: (db: IDBDatabase) => Promise<T>): Promise<T> {\n let numAttempts = 0;\n\n while (true) {\n try {\n const db = await this._openDb();\n return await op(db);\n } catch (e) {\n if (numAttempts++ > _TRANSACTION_RETRY_COUNT) {\n throw e;\n }\n if (this.db) {\n this.db.close();\n this.db = undefined;\n }\n // TODO: consider adding exponential backoff\n }\n }\n }\n\n /**\n * IndexedDB events do not propagate from the main window to the worker context. We rely on a\n * postMessage interface to send these events to the worker ourselves.\n */\n private async initializeServiceWorkerMessaging(): Promise<void> {\n return _isWorker() ? this.initializeReceiver() : this.initializeSender();\n }\n\n /**\n * As the worker we should listen to events from the main window.\n */\n private async initializeReceiver(): Promise<void> {\n this.receiver = Receiver._getInstance(_getWorkerGlobalScope()!);\n // Refresh from persistence if we receive a KeyChanged message.\n this.receiver._subscribe(\n _EventType.KEY_CHANGED,\n async (_origin: string, data: KeyChangedRequest) => {\n const keys = await this._poll();\n return {\n keyProcessed: keys.includes(data.key)\n };\n }\n );\n // Let the sender know that we are listening so they give us more timeout.\n this.receiver._subscribe(\n _EventType.PING,\n async (_origin: string, _data: PingRequest) => {\n return [_EventType.KEY_CHANGED];\n }\n );\n }\n\n /**\n * As the main window, we should let the worker know when keys change (set and remove).\n *\n * @remarks\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/ready | ServiceWorkerContainer.ready}\n * may not resolve.\n */\n private async initializeSender(): Promise<void> {\n // Check to see if there's an active service worker.\n this.activeServiceWorker = await _getActiveServiceWorker();\n if (!this.activeServiceWorker) {\n return;\n }\n this.sender = new Sender(this.activeServiceWorker);\n // Ping the service worker to check what events they can handle.\n const results = await this.sender._send<_PingResponse, PingRequest>(\n _EventType.PING,\n {},\n _TimeoutDuration.LONG_ACK\n );\n if (!results) {\n return;\n }\n if (\n results[0]?.fulfilled &&\n results[0]?.value.includes(_EventType.KEY_CHANGED)\n ) {\n this.serviceWorkerReceiverAvailable = true;\n }\n }\n\n /**\n * Let the worker know about a changed key, the exact key doesn't technically matter since the\n * worker will just trigger a full sync anyway.\n *\n * @remarks\n * For now, we only support one service worker per page.\n *\n * @param key - Storage key which changed.\n */\n private async notifyServiceWorker(key: string): Promise<void> {\n if (\n !this.sender ||\n !this.activeServiceWorker ||\n _getServiceWorkerController() !== this.activeServiceWorker\n ) {\n return;\n }\n try {\n await this.sender._send<KeyChangedResponse, KeyChangedRequest>(\n _EventType.KEY_CHANGED,\n { key },\n // Use long timeout if receiver has previously responded to a ping from us.\n this.serviceWorkerReceiverAvailable\n ? _TimeoutDuration.LONG_ACK\n : _TimeoutDuration.ACK\n );\n } catch {\n // This is a best effort approach. Ignore errors.\n }\n }\n\n async _isAvailable(): Promise<boolean> {\n try {\n if (!indexedDB) {\n return false;\n }\n const db = await _openDatabase();\n await _putObject(db, STORAGE_AVAILABLE_KEY, '1');\n await _deleteObject(db, STORAGE_AVAILABLE_KEY);\n return true;\n } catch {}\n return false;\n }\n\n private async _withPendingWrite(write: () => Promise<void>): Promise<void> {\n this.pendingWrites++;\n try {\n await write();\n } finally {\n this.pendingWrites--;\n }\n }\n\n async _set(key: string, value: PersistenceValue): Promise<void> {\n return this._withPendingWrite(async () => {\n await this._withRetries((db: IDBDatabase) => _putObject(db, key, value));\n this.localCache[key] = value;\n return this.notifyServiceWorker(key);\n });\n }\n\n async _get<T extends PersistenceValue>(key: string): Promise<T | null> {\n const obj = (await this._withRetries((db: IDBDatabase) =>\n getObject(db, key)\n )) as T;\n this.localCache[key] = obj;\n return obj;\n }\n\n async _remove(key: string): Promise<void> {\n return this._withPendingWrite(async () => {\n await this._withRetries((db: IDBDatabase) => _deleteObject(db, key));\n delete this.localCache[key];\n return this.notifyServiceWorker(key);\n });\n }\n\n private async _poll(): Promise<string[]> {\n // TODO: check if we need to fallback if getAll is not supported\n const result = await this._withRetries((db: IDBDatabase) => {\n const getAllRequest = getObjectStore(db, false).getAll();\n return new DBPromise<DBObject[] | null>(getAllRequest).toPromise();\n });\n\n if (!result) {\n return [];\n }\n\n // If we have pending writes in progress abort, we'll get picked up on the next poll\n if (this.pendingWrites !== 0) {\n return [];\n }\n\n const keys = [];\n const keysInResult = new Set();\n for (const { fbase_key: key, value } of result) {\n keysInResult.add(key);\n if (JSON.stringify(this.localCache[key]) !== JSON.stringify(value)) {\n this.notifyListeners(key, value as PersistenceValue);\n keys.push(key);\n }\n }\n for (const localKey of Object.keys(this.localCache)) {\n if (this.localCache[localKey] && !keysInResult.has(localKey)) {\n // Deleted\n this.notifyListeners(localKey, null);\n keys.push(localKey);\n }\n }\n return keys;\n }\n\n private notifyListeners(\n key: string,\n newValue: PersistenceValue | null\n ): void {\n this.localCache[key] = newValue;\n const listeners = this.listeners[key];\n if (listeners) {\n for (const listener of Array.from(listeners)) {\n listener(newValue);\n }\n }\n }\n\n private startPolling(): void {\n this.stopPolling();\n\n this.pollTimer = setInterval(\n async () => this._poll(),\n _POLLING_INTERVAL_MS\n );\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n }\n\n _addListener(key: string, listener: StorageEventListener): void {\n if (Object.keys(this.listeners).length === 0) {\n this.startPolling();\n }\n if (!this.listeners[key]) {\n this.listeners[key] = new Set();\n // Populate the cache to avoid spuriously triggering on first poll.\n void this._get(key); // This can happen in the background async and we can return immediately.\n }\n this.listeners[key].add(listener);\n }\n\n _removeListener(key: string, listener: StorageEventListener): void {\n if (this.listeners[key]) {\n this.listeners[key].delete(listener);\n\n if (this.listeners[key].size === 0) {\n delete this.listeners[key];\n }\n }\n\n if (Object.keys(this.listeners).length === 0) {\n this.stopPolling();\n }\n }\n}\n\n/**\n * An implementation of {@link Persistence} of type `LOCAL` using `indexedDB`\n * for the underlying storage.\n *\n * @public\n */\nexport const indexedDBLocalPersistence: Persistence = IndexedDBLocalPersistence;\n","/**\n * @license\n * Copyright 2021 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 { PopupRedirectResolver } from '../../model/public_types';\nimport { AuthInternal } from '../../model/auth';\nimport { PopupRedirectResolverInternal } from '../../model/popup_redirect';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from './assert';\nimport { _getInstance } from './instantiator';\n\n/**\n * Chooses a popup/redirect resolver to use. This prefers the override (which\n * is directly passed in), and falls back to the property set on the auth\n * object. If neither are available, this function errors w/ an argument error.\n */\nexport function _withDefaultResolver(\n auth: AuthInternal,\n resolverOverride: PopupRedirectResolver | undefined\n): PopupRedirectResolverInternal {\n if (resolverOverride) {\n return _getInstance(resolverOverride);\n }\n\n _assert(auth._popupRedirectResolver, auth, AuthErrorCode.ARGUMENT_ERROR);\n\n return auth._popupRedirectResolver;\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 {\n signInWithIdp,\n SignInWithIdpRequest\n} from '../../api/authentication/idp';\nimport { PhoneOrOauthTokenResponse } from '../../api/authentication/mfa';\nimport { AuthInternal } from '../../model/auth';\nimport { IdTokenResponse } from '../../model/id_token';\nimport { UserInternal, UserCredentialInternal } from '../../model/user';\nimport { AuthCredential } from '../credentials';\nimport { _link as _linkUser } from '../user/link_unlink';\nimport { _reauthenticate } from '../user/reauthenticate';\nimport { _assert } from '../util/assert';\nimport { _signInWithCredential } from './credential';\nimport { AuthErrorCode } from '../errors';\nimport { ProviderId } from '../../model/enums';\n\nexport interface IdpTaskParams {\n auth: AuthInternal;\n requestUri: string;\n sessionId?: string;\n tenantId?: string;\n postBody?: string;\n pendingToken?: string;\n user?: UserInternal;\n bypassAuthState?: boolean;\n}\n\nexport type IdpTask = (\n params: IdpTaskParams\n) => Promise<UserCredentialInternal>;\n\nclass IdpCredential extends AuthCredential {\n constructor(readonly params: IdpTaskParams) {\n super(ProviderId.CUSTOM, ProviderId.CUSTOM);\n }\n\n _getIdTokenResponse(auth: AuthInternal): Promise<PhoneOrOauthTokenResponse> {\n return signInWithIdp(auth, this._buildIdpRequest());\n }\n\n _linkToIdToken(\n auth: AuthInternal,\n idToken: string\n ): Promise<IdTokenResponse> {\n return signInWithIdp(auth, this._buildIdpRequest(idToken));\n }\n\n _getReauthenticationResolver(auth: AuthInternal): Promise<IdTokenResponse> {\n return signInWithIdp(auth, this._buildIdpRequest());\n }\n\n private _buildIdpRequest(idToken?: string): SignInWithIdpRequest {\n const request: SignInWithIdpRequest = {\n requestUri: this.params.requestUri,\n sessionId: this.params.sessionId,\n postBody: this.params.postBody,\n tenantId: this.params.tenantId,\n pendingToken: this.params.pendingToken,\n returnSecureToken: true,\n returnIdpCredential: true\n };\n\n if (idToken) {\n request.idToken = idToken;\n }\n\n return request;\n }\n}\n\nexport function _signIn(\n params: IdpTaskParams\n): Promise<UserCredentialInternal> {\n return _signInWithCredential(\n params.auth,\n new IdpCredential(params),\n params.bypassAuthState\n ) as Promise<UserCredentialInternal>;\n}\n\nexport function _reauth(\n params: IdpTaskParams\n): Promise<UserCredentialInternal> {\n const { auth, user } = params;\n _assert(user, auth, AuthErrorCode.INTERNAL_ERROR);\n return _reauthenticate(\n user,\n new IdpCredential(params),\n params.bypassAuthState\n );\n}\n\nexport async function _link(\n params: IdpTaskParams\n): Promise<UserCredentialInternal> {\n const { auth, user } = params;\n _assert(user, auth, AuthErrorCode.INTERNAL_ERROR);\n return _linkUser(user, new IdpCredential(params), params.bypassAuthState);\n}\n","/**\n * @license\n * Copyright 2020 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';\n\nimport {\n AuthEvent,\n AuthEventConsumer,\n AuthEventType,\n EventManager,\n PopupRedirectResolverInternal\n} from '../../model/popup_redirect';\nimport { UserInternal, UserCredentialInternal } from '../../model/user';\nimport { AuthErrorCode } from '../errors';\nimport { debugAssert, _fail } from '../util/assert';\nimport {\n _link,\n _reauth,\n _signIn,\n IdpTask,\n IdpTaskParams\n} from '../strategies/idp';\nimport { AuthInternal } from '../../model/auth';\n\ninterface PendingPromise {\n resolve: (cred: UserCredentialInternal | null) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Popup event manager. Handles the popup's entire lifecycle; listens to auth\n * events\n */\nexport abstract class AbstractPopupRedirectOperation\n implements AuthEventConsumer {\n private pendingPromise: PendingPromise | null = null;\n private eventManager: EventManager | null = null;\n readonly filter: AuthEventType[];\n\n abstract eventId: string | null;\n\n constructor(\n protected readonly auth: AuthInternal,\n filter: AuthEventType | AuthEventType[],\n protected readonly resolver: PopupRedirectResolverInternal,\n protected user?: UserInternal,\n protected readonly bypassAuthState = false\n ) {\n this.filter = Array.isArray(filter) ? filter : [filter];\n }\n\n abstract onExecution(): Promise<void>;\n\n execute(): Promise<UserCredentialInternal | null> {\n return new Promise<UserCredentialInternal | null>(\n async (resolve, reject) => {\n this.pendingPromise = { resolve, reject };\n\n try {\n this.eventManager = await this.resolver._initialize(this.auth);\n await this.onExecution();\n this.eventManager.registerConsumer(this);\n } catch (e) {\n this.reject(e);\n }\n }\n );\n }\n\n async onAuthEvent(event: AuthEvent): Promise<void> {\n const { urlResponse, sessionId, postBody, tenantId, error, type } = event;\n if (error) {\n this.reject(error);\n return;\n }\n\n const params: IdpTaskParams = {\n auth: this.auth,\n requestUri: urlResponse!,\n sessionId: sessionId!,\n tenantId: tenantId || undefined,\n postBody: postBody || undefined,\n user: this.user,\n bypassAuthState: this.bypassAuthState\n };\n\n try {\n this.resolve(await this.getIdpTask(type)(params));\n } catch (e) {\n this.reject(e);\n }\n }\n\n onError(error: FirebaseError): void {\n this.reject(error);\n }\n\n private getIdpTask(type: AuthEventType): IdpTask {\n switch (type) {\n case AuthEventType.SIGN_IN_VIA_POPUP:\n case AuthEventType.SIGN_IN_VIA_REDIRECT:\n return _signIn;\n case AuthEventType.LINK_VIA_POPUP:\n case AuthEventType.LINK_VIA_REDIRECT:\n return _link;\n case AuthEventType.REAUTH_VIA_POPUP:\n case AuthEventType.REAUTH_VIA_REDIRECT:\n return _reauth;\n default:\n _fail(this.auth, AuthErrorCode.INTERNAL_ERROR);\n }\n }\n\n protected resolve(cred: UserCredentialInternal | null): void {\n debugAssert(this.pendingPromise, 'Pending promise was never set');\n this.pendingPromise.resolve(cred);\n this.unregisterAndCleanUp();\n }\n\n protected reject(error: Error): void {\n debugAssert(this.pendingPromise, 'Pending promise was never set');\n this.pendingPromise.reject(error);\n this.unregisterAndCleanUp();\n }\n\n private unregisterAndCleanUp(): void {\n if (this.eventManager) {\n this.eventManager.unregisterConsumer(this);\n }\n\n this.pendingPromise = null;\n this.cleanUp();\n }\n\n abstract cleanUp(): void;\n}\n","/**\n * @license\n * Copyright 2020 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 {\n Auth,\n AuthProvider,\n PopupRedirectResolver,\n User,\n UserCredential\n} from '../../model/public_types';\n\nimport { _castAuth } from '../../core/auth/auth_impl';\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assert, debugAssert, _createError, _assertInstanceOf } from '../../core/util/assert';\nimport { Delay } from '../../core/util/delay';\nimport { _generateEventId } from '../../core/util/event_id';\nimport { AuthInternal } from '../../model/auth';\nimport {\n AuthEventType,\n PopupRedirectResolverInternal\n} from '../../model/popup_redirect';\nimport { UserInternal } from '../../model/user';\nimport { _withDefaultResolver } from '../../core/util/resolver';\nimport { AuthPopup } from '../util/popup';\nimport { AbstractPopupRedirectOperation } from '../../core/strategies/abstract_popup_redirect_operation';\nimport { FederatedAuthProvider } from '../../core/providers/federated';\nimport { getModularInstance } from '@firebase/util';\n\n/*\n * The event timeout is the same on mobile and desktop, no need for Delay.\n */\nexport const enum _Timeout {\n AUTH_EVENT = 2000\n}\nexport const _POLL_WINDOW_CLOSE_TIMEOUT = new Delay(2000, 10000);\n\n/**\n * Authenticates a Firebase client using a popup-based OAuth authentication flow.\n *\n * @remarks\n * If succeeds, returns the signed in user along with the provider's credential. If sign in was\n * unsuccessful, returns an error object containing additional information about the error.\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new FacebookAuthProvider();\n * const result = await signInWithPopup(auth, provider);\n *\n * // The signed-in user info.\n * const user = result.user;\n * // This gives you a Facebook Access Token.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * ```\n *\n * @param auth - The {@link Auth} instance.\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n *\n * @public\n */\nexport async function signInWithPopup(\n auth: Auth,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<UserCredential> {\n const authInternal = _castAuth(auth);\n _assertInstanceOf(auth, provider, FederatedAuthProvider);\n const resolverInternal = _withDefaultResolver(authInternal, resolver);\n const action = new PopupOperation(\n authInternal,\n AuthEventType.SIGN_IN_VIA_POPUP,\n provider,\n resolverInternal\n );\n return action.executeNotNull();\n}\n\n/**\n * Reauthenticates the current user with the specified {@link OAuthProvider} using a pop-up based\n * OAuth flow.\n *\n * @remarks\n * If the reauthentication is successful, the returned result will contain the user and the\n * provider's credential.\n *\n * @example\n * ```javascript\n * // Sign in using a popup.\n * const provider = new FacebookAuthProvider();\n * const result = await signInWithPopup(auth, provider);\n * // Reauthenticate using a popup.\n * await reauthenticateWithPopup(result.user, provider);\n * ```\n *\n * @param user - The user.\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n * @public\n */\nexport async function reauthenticateWithPopup(\n user: User,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<UserCredential> {\n const userInternal = getModularInstance(user) as UserInternal;\n _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider);\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\n const action = new PopupOperation(\n userInternal.auth,\n AuthEventType.REAUTH_VIA_POPUP,\n provider,\n resolverInternal,\n userInternal\n );\n return action.executeNotNull();\n}\n\n/**\n * Links the authenticated provider to the user account using a pop-up based OAuth flow.\n *\n * @remarks\n * If the linking is successful, the returned result will contain the user and the provider's credential.\n *\n *\n * @example\n * ```javascript\n * // Sign in using some other provider.\n * const result = await signInWithEmailAndPassword(auth, email, password);\n * // Link using a popup.\n * const provider = new FacebookAuthProvider();\n * await linkWithPopup(result.user, provider);\n * ```\n *\n * @param user - The user.\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n * @public\n */\nexport async function linkWithPopup(\n user: User,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<UserCredential> {\n const userInternal = getModularInstance(user) as UserInternal;\n _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider);\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\n\n const action = new PopupOperation(\n userInternal.auth,\n AuthEventType.LINK_VIA_POPUP,\n provider,\n resolverInternal,\n userInternal\n );\n return action.executeNotNull();\n}\n\n/**\n * Popup event manager. Handles the popup's entire lifecycle; listens to auth\n * events\n *\n */\nclass PopupOperation extends AbstractPopupRedirectOperation {\n // Only one popup is ever shown at once. The lifecycle of the current popup\n // can be managed / cancelled by the constructor.\n private static currentPopupAction: PopupOperation | null = null;\n private authWindow: AuthPopup | null = null;\n private pollId: number | null = null;\n\n constructor(\n auth: AuthInternal,\n filter: AuthEventType,\n private readonly provider: AuthProvider,\n resolver: PopupRedirectResolverInternal,\n user?: UserInternal\n ) {\n super(auth, filter, resolver, user);\n if (PopupOperation.currentPopupAction) {\n PopupOperation.currentPopupAction.cancel();\n }\n\n PopupOperation.currentPopupAction = this;\n }\n\n async executeNotNull(): Promise<UserCredential> {\n const result = await this.execute();\n _assert(result, this.auth, AuthErrorCode.INTERNAL_ERROR);\n return result;\n }\n\n async onExecution(): Promise<void> {\n debugAssert(\n this.filter.length === 1,\n 'Popup operations only handle one event'\n );\n const eventId = _generateEventId();\n this.authWindow = await this.resolver._openPopup(\n this.auth,\n this.provider,\n this.filter[0], // There's always one, see constructor\n eventId\n );\n this.authWindow.associatedEvent = eventId;\n\n // Check for web storage support and origin validation _after_ the popup is\n // loaded. These operations are slow (~1 second or so) Rather than\n // waiting on them before opening the window, optimistically open the popup\n // and check for storage support at the same time. If storage support is\n // not available, this will cause the whole thing to reject properly. It\n // will also close the popup, but since the promise has already rejected,\n // the popup closed by user poll will reject into the void.\n this.resolver._originValidation(this.auth).catch(e => {\n this.reject(e);\n });\n\n this.resolver._isIframeWebStorageSupported(this.auth, isSupported => {\n if (!isSupported) {\n this.reject(\n _createError(this.auth, AuthErrorCode.WEB_STORAGE_UNSUPPORTED)\n );\n }\n });\n\n // Handle user closure. Notice this does *not* use await\n this.pollUserCancellation();\n }\n\n get eventId(): string | null {\n return this.authWindow?.associatedEvent || null;\n }\n\n cancel(): void {\n this.reject(_createError(this.auth, AuthErrorCode.EXPIRED_POPUP_REQUEST));\n }\n\n cleanUp(): void {\n if (this.authWindow) {\n this.authWindow.close();\n }\n\n if (this.pollId) {\n window.clearTimeout(this.pollId);\n }\n\n this.authWindow = null;\n this.pollId = null;\n PopupOperation.currentPopupAction = null;\n }\n\n private pollUserCancellation(): void {\n const poll = (): void => {\n if (this.authWindow?.window?.closed) {\n // Make sure that there is sufficient time for whatever action to\n // complete. The window could have closed but the sign in network\n // call could still be in flight.\n this.pollId = window.setTimeout(() => {\n this.pollId = null;\n this.reject(\n _createError(this.auth, AuthErrorCode.POPUP_CLOSED_BY_USER)\n );\n }, _Timeout.AUTH_EVENT);\n return;\n }\n\n this.pollId = window.setTimeout(poll, _POLL_WINDOW_CLOSE_TIMEOUT.get());\n };\n\n poll();\n }\n}\n","/**\n * @license\n * Copyright 2020 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 { AuthInternal } from '../../model/auth';\nimport {\n AuthEvent,\n AuthEventType,\n PopupRedirectResolverInternal\n} from '../../model/popup_redirect';\nimport { UserCredentialInternal } from '../../model/user';\nimport { PersistenceInternal } from '../persistence';\nimport { _persistenceKeyName } from '../persistence/persistence_user_manager';\nimport { _getInstance } from '../util/instantiator';\nimport { AbstractPopupRedirectOperation } from './abstract_popup_redirect_operation';\n\nconst PENDING_REDIRECT_KEY = 'pendingRedirect';\n\n// We only get one redirect outcome for any one auth, so just store it\n// in here.\nconst redirectOutcomeMap: Map<\n string,\n () => Promise<UserCredentialInternal | null>\n> = new Map();\n\nexport class RedirectAction extends AbstractPopupRedirectOperation {\n eventId = null;\n\n constructor(\n auth: AuthInternal,\n resolver: PopupRedirectResolverInternal,\n bypassAuthState = false\n ) {\n super(\n auth,\n [\n AuthEventType.SIGN_IN_VIA_REDIRECT,\n AuthEventType.LINK_VIA_REDIRECT,\n AuthEventType.REAUTH_VIA_REDIRECT,\n AuthEventType.UNKNOWN\n ],\n resolver,\n undefined,\n bypassAuthState\n );\n }\n\n /**\n * Override the execute function; if we already have a redirect result, then\n * just return it.\n */\n async execute(): Promise<UserCredentialInternal | null> {\n let readyOutcome = redirectOutcomeMap.get(this.auth._key());\n if (!readyOutcome) {\n try {\n const hasPendingRedirect = await _getAndClearPendingRedirectStatus(\n this.resolver,\n this.auth\n );\n const result = hasPendingRedirect ? await super.execute() : null;\n readyOutcome = () => Promise.resolve(result);\n } catch (e) {\n readyOutcome = () => Promise.reject(e);\n }\n\n redirectOutcomeMap.set(this.auth._key(), readyOutcome);\n }\n\n // If we're not bypassing auth state, the ready outcome should be set to\n // null.\n if (!this.bypassAuthState) {\n redirectOutcomeMap.set(this.auth._key(), () => Promise.resolve(null));\n }\n\n return readyOutcome();\n }\n\n async onAuthEvent(event: AuthEvent): Promise<void> {\n if (event.type === AuthEventType.SIGN_IN_VIA_REDIRECT) {\n return super.onAuthEvent(event);\n } else if (event.type === AuthEventType.UNKNOWN) {\n // This is a sentinel value indicating there's no pending redirect\n this.resolve(null);\n return;\n }\n\n if (event.eventId) {\n const user = await this.auth._redirectUserForId(event.eventId);\n if (user) {\n this.user = user;\n return super.onAuthEvent(event);\n } else {\n this.resolve(null);\n }\n }\n }\n\n async onExecution(): Promise<void> {}\n\n cleanUp(): void {}\n}\n\nexport async function _getAndClearPendingRedirectStatus(\n resolver: PopupRedirectResolverInternal,\n auth: AuthInternal\n): Promise<boolean> {\n const key = pendingRedirectKey(auth);\n const persistence = resolverPersistence(resolver);\n if (!(await persistence._isAvailable())) {\n return false;\n }\n const hasPendingRedirect =\n (await persistence._get(key)) === 'true';\n await persistence._remove(key);\n return hasPendingRedirect;\n}\n\nexport async function _setPendingRedirectStatus(\n resolver: PopupRedirectResolverInternal,\n auth: AuthInternal\n): Promise<void> {\n return resolverPersistence(resolver)._set(pendingRedirectKey(auth), 'true');\n}\n\nexport function _clearRedirectOutcomes(): void {\n redirectOutcomeMap.clear();\n}\n\nexport function _overrideRedirectResult(auth: AuthInternal, result: () => Promise<UserCredentialInternal | null>): void {\n redirectOutcomeMap.set(auth._key(), result);\n}\n\nfunction resolverPersistence(\n resolver: PopupRedirectResolverInternal\n): PersistenceInternal {\n return _getInstance(resolver._redirectPersistence);\n}\n\nfunction pendingRedirectKey(auth: AuthInternal): string {\n return _persistenceKeyName(\n PENDING_REDIRECT_KEY,\n auth.config.apiKey,\n auth.name\n );\n}\n","/**\n * @license\n * Copyright 2020 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 {\n Auth,\n AuthProvider,\n PopupRedirectResolver,\n User,\n UserCredential\n} from '../../model/public_types';\n\nimport { _castAuth } from '../../core/auth/auth_impl';\nimport { _assertLinkedStatus } from '../../core/user/link_unlink';\nimport { _assertInstanceOf } from '../../core/util/assert';\nimport { _generateEventId } from '../../core/util/event_id';\nimport { AuthEventType } from '../../model/popup_redirect';\nimport { UserInternal } from '../../model/user';\nimport { _withDefaultResolver } from '../../core/util/resolver';\nimport {\n RedirectAction,\n _setPendingRedirectStatus\n} from '../../core/strategies/redirect';\nimport { FederatedAuthProvider } from '../../core/providers/federated';\nimport { getModularInstance } from '@firebase/util';\n\n/**\n * Authenticates a Firebase client using a full-page redirect flow.\n *\n * @remarks\n * To handle the results and errors for this operation, refer to {@link getRedirectResult}.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new FacebookAuthProvider();\n * // You can add additional scopes to the provider:\n * provider.addScope('user_birthday');\n * // Start a sign in process for an unauthenticated user.\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n * // This is the signed-in user\n * const user = result.user;\n * // This gives you a Facebook Access Token.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * }\n * // As this API can be used for sign-in, linking and reauthentication,\n * // check the operationType to determine what triggered this redirect\n * // operation.\n * const operationType = result.operationType;\n * ```\n *\n * @param auth - The {@link Auth} instance.\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n * @public\n */\nexport function signInWithRedirect(\n auth: Auth,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<never> {\n return _signInWithRedirect(auth, provider, resolver) as Promise<never>;\n}\n\nexport async function _signInWithRedirect(\n auth: Auth,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<void | never> {\n const authInternal = _castAuth(auth);\n _assertInstanceOf(auth, provider, FederatedAuthProvider);\n const resolverInternal = _withDefaultResolver(authInternal, resolver);\n await _setPendingRedirectStatus(resolverInternal, authInternal);\n\n return resolverInternal._openRedirect(\n authInternal,\n provider,\n AuthEventType.SIGN_IN_VIA_REDIRECT\n );\n}\n\n/**\n * Reauthenticates the current user with the specified {@link OAuthProvider} using a full-page redirect flow.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new FacebookAuthProvider();\n * const result = await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * // Link using a redirect.\n * await linkWithRedirect(result.user, provider);\n * // This will again trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * ```\n *\n * @param user - The user.\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n * @public\n */\nexport function reauthenticateWithRedirect(\n user: User,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<never> {\n return _reauthenticateWithRedirect(\n user,\n provider,\n resolver\n ) as Promise<never>;\n}\nexport async function _reauthenticateWithRedirect(\n user: User,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<void | never> {\n const userInternal = getModularInstance(user) as UserInternal;\n _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider);\n // Allow the resolver to error before persisting the redirect user\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\n await _setPendingRedirectStatus(resolverInternal, userInternal.auth);\n\n const eventId = await prepareUserForRedirect(userInternal);\n return resolverInternal._openRedirect(\n userInternal.auth,\n provider,\n AuthEventType.REAUTH_VIA_REDIRECT,\n eventId\n );\n}\n\n/**\n * Links the {@link OAuthProvider} to the user account using a full-page redirect flow.\n *\n * @example\n * ```javascript\n * // Sign in using some other provider.\n * const result = await signInWithEmailAndPassword(auth, email, password);\n * // Link using a redirect.\n * const provider = new FacebookAuthProvider();\n * await linkWithRedirect(result.user, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * ```\n *\n * @param user - The user.\n * @param provider - The provider to authenticate. The provider has to be an {@link OAuthProvider}.\n * Non-OAuth providers like {@link EmailAuthProvider} will throw an error.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n *\n * @public\n */\nexport function linkWithRedirect(\n user: User,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<never> {\n return _linkWithRedirect(user, provider, resolver) as Promise<never>;\n}\nexport async function _linkWithRedirect(\n user: User,\n provider: AuthProvider,\n resolver?: PopupRedirectResolver\n): Promise<void | never> {\n const userInternal = getModularInstance(user) as UserInternal;\n _assertInstanceOf(userInternal.auth, provider, FederatedAuthProvider);\n // Allow the resolver to error before persisting the redirect user\n const resolverInternal = _withDefaultResolver(userInternal.auth, resolver);\n await _assertLinkedStatus(false, userInternal, provider.providerId);\n await _setPendingRedirectStatus(resolverInternal, userInternal.auth);\n\n const eventId = await prepareUserForRedirect(userInternal);\n return resolverInternal._openRedirect(\n userInternal.auth,\n provider,\n AuthEventType.LINK_VIA_REDIRECT,\n eventId\n );\n}\n\n/**\n * Returns a {@link UserCredential} from the redirect-based sign-in flow.\n *\n * @remarks\n * If sign-in succeeded, returns the signed in user. If sign-in was unsuccessful, fails with an\n * error. If no redirect operation was called, returns a {@link UserCredential}\n * with a null `user`.\n *\n * @example\n * ```javascript\n * // Sign in using a redirect.\n * const provider = new FacebookAuthProvider();\n * // You can add additional scopes to the provider:\n * provider.addScope('user_birthday');\n * // Start a sign in process for an unauthenticated user.\n * await signInWithRedirect(auth, provider);\n * // This will trigger a full page redirect away from your app\n *\n * // After returning from the redirect when your app initializes you can obtain the result\n * const result = await getRedirectResult(auth);\n * if (result) {\n * // This is the signed-in user\n * const user = result.user;\n * // This gives you a Facebook Access Token.\n * const credential = provider.credentialFromResult(auth, result);\n * const token = credential.accessToken;\n * }\n * // As this API can be used for sign-in, linking and reauthentication,\n * // check the operationType to determine what triggered this redirect\n * // operation.\n * const operationType = result.operationType;\n * ```\n *\n * @param auth - The {@link Auth} instance.\n * @param resolver - An instance of {@link PopupRedirectResolver}, optional\n * if already supplied to {@link initializeAuth} or provided by {@link getAuth}.\n *\n * @public\n */\nexport async function getRedirectResult(\n auth: Auth,\n resolver?: PopupRedirectResolver\n): Promise<UserCredential | null> {\n await _castAuth(auth)._initializationPromise;\n return _getRedirectResult(auth, resolver, false);\n}\n\nexport async function _getRedirectResult(\n auth: Auth,\n resolverExtern?: PopupRedirectResolver,\n bypassAuthState = false\n): Promise<UserCredential | null> {\n const authInternal = _castAuth(auth);\n const resolver = _withDefaultResolver(authInternal, resolverExtern);\n const action = new RedirectAction(authInternal, resolver, bypassAuthState);\n const result = await action.execute();\n\n if (result && !bypassAuthState) {\n delete result.user._redirectEventId;\n await authInternal._persistUserIfCurrent(result.user as UserInternal);\n await authInternal._setRedirectUser(null, resolverExtern);\n }\n\n return result;\n}\n\nasync function prepareUserForRedirect(user: UserInternal): Promise<string> {\n const eventId = _generateEventId(`${user.uid}:::`);\n user._redirectEventId = eventId;\n await user.auth._setRedirectUser(user);\n await user.auth._persistUserIfCurrent(user);\n return eventId;\n}\n","/**\n * @license\n * Copyright 2020 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 {\n AuthEvent,\n AuthEventConsumer,\n AuthEventType,\n EventManager\n} from '../../model/popup_redirect';\nimport { AuthErrorCode } from '../errors';\nimport { AuthInternal } from '../../model/auth';\nimport { _createError } from '../util/assert';\n\n// The amount of time to store the UIDs of seen events; this is\n// set to 10 min by default\nconst EVENT_DUPLICATION_CACHE_DURATION_MS = 10 * 60 * 1000;\n\nexport class AuthEventManager implements EventManager {\n private readonly cachedEventUids: Set<string> = new Set();\n private readonly consumers: Set<AuthEventConsumer> = new Set();\n protected queuedRedirectEvent: AuthEvent | null = null;\n protected hasHandledPotentialRedirect = false;\n private lastProcessedEventTime = Date.now();\n\n constructor(private readonly auth: AuthInternal) {}\n\n registerConsumer(authEventConsumer: AuthEventConsumer): void {\n this.consumers.add(authEventConsumer);\n\n if (\n this.queuedRedirectEvent &&\n this.isEventForConsumer(this.queuedRedirectEvent, authEventConsumer)\n ) {\n this.sendToConsumer(this.queuedRedirectEvent, authEventConsumer);\n this.saveEventToCache(this.queuedRedirectEvent);\n this.queuedRedirectEvent = null;\n }\n }\n\n unregisterConsumer(authEventConsumer: AuthEventConsumer): void {\n this.consumers.delete(authEventConsumer);\n }\n\n onEvent(event: AuthEvent): boolean {\n // Check if the event has already been handled\n if (this.hasEventBeenHandled(event)) {\n return false;\n }\n\n let handled = false;\n this.consumers.forEach(consumer => {\n if (this.isEventForConsumer(event, consumer)) {\n handled = true;\n this.sendToConsumer(event, consumer);\n this.saveEventToCache(event);\n }\n });\n\n if (this.hasHandledPotentialRedirect || !isRedirectEvent(event)) {\n // If we've already seen a redirect before, or this is a popup event,\n // bail now\n return handled;\n }\n\n this.hasHandledPotentialRedirect = true;\n\n // If the redirect wasn't handled, hang on to it\n if (!handled) {\n this.queuedRedirectEvent = event;\n handled = true;\n }\n\n return handled;\n }\n\n private sendToConsumer(event: AuthEvent, consumer: AuthEventConsumer): void {\n if (event.error && !isNullRedirectEvent(event)) {\n const code =\n (event.error.code?.split('auth/')[1] as AuthErrorCode) ||\n AuthErrorCode.INTERNAL_ERROR;\n consumer.onError(_createError(this.auth, code));\n } else {\n consumer.onAuthEvent(event);\n }\n }\n\n private isEventForConsumer(\n event: AuthEvent,\n consumer: AuthEventConsumer\n ): boolean {\n const eventIdMatches =\n consumer.eventId === null ||\n (!!event.eventId && event.eventId === consumer.eventId);\n return consumer.filter.includes(event.type) && eventIdMatches;\n }\n\n private hasEventBeenHandled(event: AuthEvent): boolean {\n if (\n Date.now() - this.lastProcessedEventTime >=\n EVENT_DUPLICATION_CACHE_DURATION_MS\n ) {\n this.cachedEventUids.clear();\n }\n\n return this.cachedEventUids.has(eventUid(event));\n }\n\n private saveEventToCache(event: AuthEvent): void {\n this.cachedEventUids.add(eventUid(event));\n this.lastProcessedEventTime = Date.now();\n }\n}\n\nfunction eventUid(e: AuthEvent): string {\n return [e.type, e.eventId, e.sessionId, e.tenantId].filter(v => v).join('-');\n}\n\nfunction isNullRedirectEvent({ type, error }: AuthEvent): boolean {\n return (\n type === AuthEventType.UNKNOWN &&\n error?.code === `auth/${AuthErrorCode.NO_AUTH_EVENT}`\n );\n}\n\nfunction isRedirectEvent(event: AuthEvent): boolean {\n switch (event.type) {\n case AuthEventType.SIGN_IN_VIA_REDIRECT:\n case AuthEventType.LINK_VIA_REDIRECT:\n case AuthEventType.REAUTH_VIA_REDIRECT:\n return true;\n case AuthEventType.UNKNOWN:\n return isNullRedirectEvent(event);\n default:\n return false;\n }\n}\n","/**\n * @license\n * Copyright 2020 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 { _performApiRequest, Endpoint, HttpMethod } from '../index';\nimport { Auth } from '../../model/public_types';\n\nexport interface GetProjectConfigRequest {\n androidPackageName?: string;\n iosBundleId?: string;\n}\n\nexport interface GetProjectConfigResponse {\n authorizedDomains: string[];\n}\n\nexport async function _getProjectConfig(\n auth: Auth,\n request: GetProjectConfigRequest = {}\n): Promise<GetProjectConfigResponse> {\n return _performApiRequest<GetProjectConfigRequest, GetProjectConfigResponse>(\n auth,\n HttpMethod.GET,\n Endpoint.GET_PROJECT_CONFIG,\n request\n );\n}\n","/**\n * @license\n * Copyright 2020 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 { _getProjectConfig } from '../../api/project_config/get_project_config';\nimport { AuthInternal } from '../../model/auth';\nimport { AuthErrorCode } from '../errors';\nimport { _fail } from './assert';\nimport { _getCurrentUrl } from './location';\n\nconst IP_ADDRESS_REGEX = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\nconst HTTP_REGEX = /^https?/;\n\nexport async function _validateOrigin(auth: AuthInternal): Promise<void> {\n // Skip origin validation if we are in an emulated environment\n if (auth.config.emulator) {\n return;\n }\n\n const { authorizedDomains } = await _getProjectConfig(auth);\n\n for (const domain of authorizedDomains) {\n try {\n if (matchDomain(domain)) {\n return;\n }\n } catch {\n // Do nothing if there's a URL error; just continue searching\n }\n }\n\n // In the old SDK, this error also provides helpful messages.\n _fail(auth, AuthErrorCode.INVALID_ORIGIN);\n}\n\nfunction matchDomain(expected: string): boolean {\n const currentUrl = _getCurrentUrl();\n const { protocol, hostname } = new URL(currentUrl);\n if (expected.startsWith('chrome-extension://')) {\n const ceUrl = new URL(expected);\n\n if (ceUrl.hostname === '' && hostname === '') {\n // For some reason we're not parsing chrome URLs properly\n return (\n protocol === 'chrome-extension:' &&\n expected.replace('chrome-extension://', '') ===\n currentUrl.replace('chrome-extension://', '')\n );\n }\n\n return protocol === 'chrome-extension:' && ceUrl.hostname === hostname;\n }\n\n if (!HTTP_REGEX.test(protocol)) {\n return false;\n }\n\n if (IP_ADDRESS_REGEX.test(expected)) {\n // The domain has to be exactly equal to the pattern, as an IP domain will\n // only contain the IP, no extra character.\n return hostname === expected;\n }\n\n // Dots in pattern should be escaped.\n const escapedDomainPattern = expected.replace(/\\./g, '\\\\.');\n // Non ip address domains.\n // domain.com = *.domain.com OR domain.com\n const re = new RegExp(\n '^(.+\\\\.' + escapedDomainPattern + '|' + escapedDomainPattern + ')$',\n 'i'\n );\n return re.test(hostname);\n}\n","/**\n * @license\n * Copyright 2020 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 { AuthErrorCode } from '../../core/errors';\nimport { _createError } from '../../core/util/assert';\nimport { Delay } from '../../core/util/delay';\nimport { AuthInternal } from '../../model/auth';\nimport { _window } from '../auth_window';\nimport * as js from '../load_js';\n\nconst NETWORK_TIMEOUT = new Delay(30000, 60000);\n\n/**\n * Reset unlaoded GApi modules. If gapi.load fails due to a network error,\n * it will stop working after a retrial. This is a hack to fix this issue.\n */\nfunction resetUnloadedGapiModules(): void {\n // Clear last failed gapi.load state to force next gapi.load to first\n // load the failed gapi.iframes module.\n // Get gapix.beacon context.\n const beacon = _window().___jsl;\n // Get current hint.\n if (beacon?.H) {\n // Get gapi hint.\n for (const hint of Object.keys(beacon.H)) {\n // Requested modules.\n beacon.H[hint].r = beacon.H[hint].r || [];\n // Loaded modules.\n beacon.H[hint].L = beacon.H[hint].L || [];\n // Set requested modules to a copy of the loaded modules.\n beacon.H[hint].r = [...beacon.H[hint].L];\n // Clear pending callbacks.\n if (beacon.CP) {\n for (let i = 0; i < beacon.CP.length; i++) {\n // Remove all failed pending callbacks.\n beacon.CP[i] = null;\n }\n }\n }\n }\n}\n\nfunction loadGapi(auth: AuthInternal): Promise<gapi.iframes.Context> {\n return new Promise<gapi.iframes.Context>((resolve, reject) => {\n // Function to run when gapi.load is ready.\n function loadGapiIframe(): void {\n // The developer may have tried to previously run gapi.load and failed.\n // Run this to fix that.\n resetUnloadedGapiModules();\n gapi.load('gapi.iframes', {\n callback: () => {\n resolve(gapi.iframes.getContext());\n },\n ontimeout: () => {\n // The above reset may be sufficient, but having this reset after\n // failure ensures that if the developer calls gapi.load after the\n // connection is re-established and before another attempt to embed\n // the iframe, it would work and would not be broken because of our\n // failed attempt.\n // Timeout when gapi.iframes.Iframe not loaded.\n resetUnloadedGapiModules();\n reject(_createError(auth, AuthErrorCode.NETWORK_REQUEST_FAILED));\n },\n timeout: NETWORK_TIMEOUT.get()\n });\n }\n\n if (_window().gapi?.iframes?.Iframe) {\n // If gapi.iframes.Iframe available, resolve.\n resolve(gapi.iframes.getContext());\n } else if (!!_window().gapi?.load) {\n // Gapi loader ready, load gapi.iframes.\n loadGapiIframe();\n } else {\n // Create a new iframe callback when this is called so as not to overwrite\n // any previous defined callback. This happens if this method is called\n // multiple times in parallel and could result in the later callback\n // overwriting the previous one. This would end up with a iframe\n // timeout.\n const cbName = js._generateCallbackName('iframefcb');\n // GApi loader not available, dynamically load platform.js.\n _window()[cbName] = () => {\n // GApi loader should be ready.\n if (!!gapi.load) {\n loadGapiIframe();\n } else {\n // Gapi loader failed, throw error.\n reject(_createError(auth, AuthErrorCode.NETWORK_REQUEST_FAILED));\n }\n };\n // Load GApi loader.\n return js._loadJS(`https://apis.google.com/js/api.js?onload=${cbName}`).catch(e => reject(e));\n }\n }).catch(error => {\n // Reset cached promise to allow for retrial.\n cachedGApiLoader = null;\n throw error;\n });\n}\n\nlet cachedGApiLoader: Promise<gapi.iframes.Context> | null = null;\nexport function _loadGapi(auth: AuthInternal): Promise<gapi.iframes.Context> {\n cachedGApiLoader = cachedGApiLoader || loadGapi(auth);\n return cachedGApiLoader;\n}\n\nexport function _resetLoader(): void {\n cachedGApiLoader = null;\n}\n","/**\n * @license\n * Copyright 2020 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 { SDK_VERSION } from '@firebase/app';\nimport { querystring } from '@firebase/util';\nimport { DefaultConfig } from '../../../internal';\n\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assert, _createError } from '../../core/util/assert';\nimport { Delay } from '../../core/util/delay';\nimport { _emulatorUrl } from '../../core/util/emulator';\nimport { AuthInternal } from '../../model/auth';\nimport { _window } from '../auth_window';\nimport * as gapiLoader from './gapi';\n\nconst PING_TIMEOUT = new Delay(5000, 15000);\nconst IFRAME_PATH = '__/auth/iframe';\nconst EMULATED_IFRAME_PATH = 'emulator/auth/iframe';\n\nconst IFRAME_ATTRIBUTES = {\n style: {\n position: 'absolute',\n top: '-100px',\n width: '1px',\n height: '1px'\n },\n 'aria-hidden': 'true',\n tabindex: '-1'\n};\n\n// Map from apiHost to endpoint ID for passing into iframe. In current SDK, apiHost can be set to\n// anything (not from a list of endpoints with IDs as in legacy), so this is the closest we can get.\nconst EID_FROM_APIHOST = new Map([\n [DefaultConfig.API_HOST, 'p'], // production\n ['staging-identitytoolkit.sandbox.googleapis.com', 's'], // staging\n ['test-identitytoolkit.sandbox.googleapis.com', 't'] // test\n]);\n\nfunction getIframeUrl(auth: AuthInternal): string {\n const config = auth.config;\n _assert(config.authDomain, auth, AuthErrorCode.MISSING_AUTH_DOMAIN);\n const url = config.emulator\n ? _emulatorUrl(config, EMULATED_IFRAME_PATH)\n : `https://${auth.config.authDomain}/${IFRAME_PATH}`;\n\n const params: Record<string, string> = {\n apiKey: config.apiKey,\n appName: auth.name,\n v: SDK_VERSION\n };\n const eid = EID_FROM_APIHOST.get(auth.config.apiHost);\n if (eid) {\n params.eid = eid;\n }\n const frameworks = auth._getFrameworks();\n if (frameworks.length) {\n params.fw = frameworks.join(',');\n }\n return `${url}?${querystring(params).slice(1)}`;\n}\n\nexport async function _openIframe(\n auth: AuthInternal\n): Promise<gapi.iframes.Iframe> {\n const context = await gapiLoader._loadGapi(auth);\n const gapi = _window().gapi;\n _assert(gapi, auth, AuthErrorCode.INTERNAL_ERROR);\n return context.open(\n {\n where: document.body,\n url: getIframeUrl(auth),\n messageHandlersFilter: gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER,\n attributes: IFRAME_ATTRIBUTES,\n dontclear: true\n },\n (iframe: gapi.iframes.Iframe) =>\n new Promise(async (resolve, reject) => {\n await iframe.restyle({\n // Prevent iframe from closing on mouse out.\n setHideOnLeave: false\n });\n\n const networkError = _createError(\n auth,\n AuthErrorCode.NETWORK_REQUEST_FAILED\n );\n // Confirm iframe is correctly loaded.\n // To fallback on failure, set a timeout.\n const networkErrorTimer = _window().setTimeout(() => {\n reject(networkError);\n }, PING_TIMEOUT.get());\n // Clear timer and resolve pending iframe ready promise.\n function clearTimerAndResolve(): void {\n _window().clearTimeout(networkErrorTimer);\n resolve(iframe);\n }\n // This returns an IThenable. However the reject part does not call\n // when the iframe is not loaded.\n iframe.ping(clearTimerAndResolve).then(clearTimerAndResolve, () => {\n reject(networkError);\n });\n })\n );\n}\n","/**\n * @license\n * Copyright 2020 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 { getUA } from '@firebase/util';\n\nimport { AuthErrorCode } from '../../core/errors';\nimport { _assert } from '../../core/util/assert';\nimport {\n _isChromeIOS,\n _isFirefox,\n _isIOSStandalone\n} from '../../core/util/browser';\nimport { AuthInternal } from '../../model/auth';\n\nconst BASE_POPUP_OPTIONS = {\n location: 'yes',\n resizable: 'yes',\n statusbar: 'yes',\n toolbar: 'no'\n};\n\nconst DEFAULT_WIDTH = 500;\nconst DEFAULT_HEIGHT = 600;\nconst TARGET_BLANK = '_blank';\n\nconst FIREFOX_EMPTY_URL = 'http://localhost';\n\nexport class AuthPopup {\n associatedEvent: string | null = null;\n\n constructor(readonly window: Window | null) {}\n\n close(): void {\n if (this.window) {\n try {\n this.window.close();\n } catch (e) {}\n }\n }\n}\n\nexport function _open(\n auth: AuthInternal,\n url?: string,\n name?: string,\n width = DEFAULT_WIDTH,\n height = DEFAULT_HEIGHT\n): AuthPopup {\n const top = Math.max((window.screen.availHeight - height) / 2, 0).toString();\n const left = Math.max((window.screen.availWidth - width) / 2, 0).toString();\n let target = '';\n\n const options: { [key: string]: string } = {\n ...BASE_POPUP_OPTIONS,\n width: width.toString(),\n height: height.toString(),\n top,\n left\n };\n\n // Chrome iOS 7 and 8 is returning an undefined popup win when target is\n // specified, even though the popup is not necessarily blocked.\n const ua = getUA().toLowerCase();\n\n if (name) {\n target = _isChromeIOS(ua) ? TARGET_BLANK : name;\n }\n\n if (_isFirefox(ua)) {\n // Firefox complains when invalid URLs are popped out. Hacky way to bypass.\n url = url || FIREFOX_EMPTY_URL;\n // Firefox disables by default scrolling on popup windows, which can create\n // issues when the user has many Google accounts, for instance.\n options.scrollbars = 'yes';\n }\n\n const optionsString = Object.entries(options).reduce(\n (accum, [key, value]) => `${accum}${key}=${value},`,\n ''\n );\n\n if (_isIOSStandalone(ua) && target !== '_self') {\n openAsNewWindowIOS(url || '', target);\n return new AuthPopup(null);\n }\n\n // about:blank getting sanitized causing browsers like IE/Edge to display\n // brief error message before redirecting to handler.\n const newWin = window.open(url || '', target, optionsString);\n _assert(newWin, auth, AuthErrorCode.POPUP_BLOCKED);\n\n // Flaky on IE edge, encapsulate with a try and catch.\n try {\n newWin.focus();\n } catch (e) {}\n\n return new AuthPopup(newWin);\n}\n\nfunction openAsNewWindowIOS(url: string, target: string): void {\n const el = document.createElement('a');\n el.href = url;\n el.target = target;\n const click = document.createEvent('MouseEvent');\n click.initMouseEvent(\n 'click',\n true,\n true,\n window,\n 1,\n 0,\n 0,\n 0,\n 0,\n false,\n false,\n false,\n false,\n 1,\n null\n );\n el.dispatchEvent(click);\n}\n","/**\n * @license\n * Copyright 2021 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 { SDK_VERSION } from '@firebase/app';\nimport { AuthProvider } from '../../model/public_types';\nimport { ApiKey, AppName, AuthInternal } from '../../model/auth';\nimport { AuthEventType } from '../../model/popup_redirect';\nimport { AuthErrorCode } from '../errors';\nimport { _assert } from './assert';\nimport { isEmpty, querystring } from '@firebase/util';\nimport { _emulatorUrl } from './emulator';\nimport { FederatedAuthProvider } from '../providers/federated';\nimport { BaseOAuthProvider } from '../providers/oauth';\n\n/**\n * URL for Authentication widget which will initiate the OAuth handshake\n *\n * @internal\n */\nconst WIDGET_PATH = '__/auth/handler';\n\n/**\n * URL for emulated environment\n *\n * @internal\n */\nconst EMULATOR_WIDGET_PATH = 'emulator/auth/handler';\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\ntype WidgetParams = {\n apiKey: ApiKey;\n appName: AppName;\n authType: AuthEventType;\n redirectUrl?: string;\n v: string;\n providerId?: string;\n scopes?: string;\n customParameters?: string;\n eventId?: string;\n tid?: string;\n} & { [key: string]: string | undefined };\n\nexport function _getRedirectUrl(\n auth: AuthInternal,\n provider: AuthProvider,\n authType: AuthEventType,\n redirectUrl?: string,\n eventId?: string,\n additionalParams?: Record<string, string>\n): string {\n _assert(auth.config.authDomain, auth, AuthErrorCode.MISSING_AUTH_DOMAIN);\n _assert(auth.config.apiKey, auth, AuthErrorCode.INVALID_API_KEY);\n\n const params: WidgetParams = {\n apiKey: auth.config.apiKey,\n appName: auth.name,\n authType,\n redirectUrl,\n v: SDK_VERSION,\n eventId\n };\n\n if (provider instanceof FederatedAuthProvider) {\n provider.setDefaultLanguage(auth.languageCode);\n params.providerId = provider.providerId || '';\n if (!isEmpty(provider.getCustomParameters())) {\n params.customParameters = JSON.stringify(provider.getCustomParameters());\n }\n\n // TODO set additionalParams from the provider as well?\n for (const [key, value] of Object.entries(additionalParams || {})) {\n params[key] = value;\n }\n }\n\n if (provider instanceof BaseOAuthProvider) {\n const scopes = provider.getScopes().filter(scope => scope !== '');\n if (scopes.length > 0) {\n params.scopes = scopes.join(',');\n }\n }\n\n if (auth.tenantId) {\n params.tid = auth.tenantId;\n }\n\n // TODO: maybe set eid as endipointId\n // TODO: maybe set fw as Frameworks.join(\",\")\n\n const paramsDict = params as Record<string, string | number>;\n for (const key of Object.keys(paramsDict)) {\n if (paramsDict[key] === undefined) {\n delete paramsDict[key];\n }\n }\n return `${getHandlerBase(auth)}?${querystring(paramsDict).slice(1)}`;\n}\n\nfunction getHandlerBase({ config }: AuthInternal): string {\n if (!config.emulator) {\n return `https://${config.authDomain}/${WIDGET_PATH}`;\n }\n\n return _emulatorUrl(config, EMULATOR_WIDGET_PATH);\n}\n","/**\n * @license\n * Copyright 2020 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 { AuthProvider, PopupRedirectResolver } from '../model/public_types';\n\nimport { AuthEventManager } from '../core/auth/auth_event_manager';\nimport { AuthErrorCode } from '../core/errors';\nimport { _assert, debugAssert, _fail } from '../core/util/assert';\nimport { _generateEventId } from '../core/util/event_id';\nimport { _getCurrentUrl } from '../core/util/location';\nimport { _validateOrigin } from '../core/util/validate_origin';\nimport { AuthInternal } from '../model/auth';\nimport {\n AuthEventType,\n EventManager,\n GapiAuthEvent,\n GapiOutcome,\n PopupRedirectResolverInternal\n} from '../model/popup_redirect';\nimport { _setWindowLocation } from './auth_window';\nimport { _openIframe } from './iframe/iframe';\nimport { browserSessionPersistence } from './persistence/session_storage';\nimport { _open, AuthPopup } from './util/popup';\nimport { _getRedirectResult } from './strategies/redirect';\nimport { _getRedirectUrl } from '../core/util/handler';\nimport { _isIOS, _isMobileBrowser, _isSafari } from '../core/util/browser';\nimport { _overrideRedirectResult } from '../core/strategies/redirect';\n\n/**\n * The special web storage event\n *\n */\nconst WEB_STORAGE_SUPPORT_KEY = 'webStorageSupport';\n\ninterface WebStorageSupportMessage extends gapi.iframes.Message {\n [index: number]: Record<string, boolean>;\n}\n\ninterface ManagerOrPromise {\n manager?: EventManager;\n promise?: Promise<EventManager>;\n}\n\nclass BrowserPopupRedirectResolver implements PopupRedirectResolverInternal {\n private readonly eventManagers: Record<string, ManagerOrPromise> = {};\n private readonly iframes: Record<string, gapi.iframes.Iframe> = {};\n private readonly originValidationPromises: Record<string, Promise<void>> = {};\n\n readonly _redirectPersistence = browserSessionPersistence;\n\n // Wrapping in async even though we don't await anywhere in order\n // to make sure errors are raised as promise rejections\n async _openPopup(\n auth: AuthInternal,\n provider: AuthProvider,\n authType: AuthEventType,\n eventId?: string\n ): Promise<AuthPopup> {\n debugAssert(\n this.eventManagers[auth._key()]?.manager,\n '_initialize() not called before _openPopup()'\n );\n\n const url = _getRedirectUrl(\n auth,\n provider,\n authType,\n _getCurrentUrl(),\n eventId\n );\n return _open(auth, url, _generateEventId());\n }\n\n async _openRedirect(\n auth: AuthInternal,\n provider: AuthProvider,\n authType: AuthEventType,\n eventId?: string\n ): Promise<never> {\n await this._originValidation(auth);\n _setWindowLocation(\n _getRedirectUrl(auth, provider, authType, _getCurrentUrl(), eventId)\n );\n return new Promise(() => {});\n }\n\n _initialize(auth: AuthInternal): Promise<EventManager> {\n const key = auth._key();\n if (this.eventManagers[key]) {\n const { manager, promise } = this.eventManagers[key];\n if (manager) {\n return Promise.resolve(manager);\n } else {\n debugAssert(promise, 'If manager is not set, promise should be');\n return promise;\n }\n }\n\n const promise = this.initAndGetManager(auth);\n this.eventManagers[key] = { promise };\n\n // If the promise is rejected, the key should be removed so that the\n // operation can be retried later.\n promise.catch(() => {\n delete this.eventManagers[key];\n });\n\n return promise;\n }\n\n private async initAndGetManager(auth: AuthInternal): Promise<EventManager> {\n const iframe = await _openIframe(auth);\n const manager = new AuthEventManager(auth);\n iframe.register<GapiAuthEvent>(\n 'authEvent',\n (iframeEvent: GapiAuthEvent | null) => {\n _assert(iframeEvent?.authEvent, auth, AuthErrorCode.INVALID_AUTH_EVENT);\n // TODO: Consider splitting redirect and popup events earlier on\n\n const handled = manager.onEvent(iframeEvent.authEvent);\n return { status: handled ? GapiOutcome.ACK : GapiOutcome.ERROR };\n },\n gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER\n );\n\n this.eventManagers[auth._key()] = { manager };\n this.iframes[auth._key()] = iframe;\n return manager;\n }\n\n _isIframeWebStorageSupported(\n auth: AuthInternal,\n cb: (supported: boolean) => unknown\n ): void {\n const iframe = this.iframes[auth._key()];\n iframe.send<gapi.iframes.Message, WebStorageSupportMessage>(\n WEB_STORAGE_SUPPORT_KEY,\n { type: WEB_STORAGE_SUPPORT_KEY },\n result => {\n const isSupported = result?.[0]?.[WEB_STORAGE_SUPPORT_KEY];\n if (isSupported !== undefined) {\n cb(!!isSupported);\n }\n\n _fail(auth, AuthErrorCode.INTERNAL_ERROR);\n },\n gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER\n );\n }\n\n _originValidation(auth: AuthInternal): Promise<void> {\n const key = auth._key();\n if (!this.originValidationPromises[key]) {\n this.originValidationPromises[key] = _validateOrigin(auth);\n }\n\n return this.originValidationPromises[key];\n }\n\n get _shouldInitProactively(): boolean {\n // Mobile browsers and Safari need to optimistically initialize\n return _isMobileBrowser() || _isSafari() || _isIOS();\n }\n\n _completeRedirectFn = _getRedirectResult;\n\n _overrideRedirectResult = _overrideRedirectResult;\n}\n\n/**\n * An implementation of {@link PopupRedirectResolver} suitable for browser\n * based applications.\n *\n * @public\n */\nexport const browserPopupRedirectResolver: PopupRedirectResolver = BrowserPopupRedirectResolver;\n","/**\n * @license\n * Copyright 2021 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, getApp, _getProvider } from '@firebase/app';\n\nimport { initializeAuth } from '..';\nimport { registerAuth } from '../core/auth/register';\nimport { ClientPlatform } from '../core/util/version';\nimport { browserLocalPersistence } from './persistence/local_storage';\nimport { browserSessionPersistence } from './persistence/session_storage';\nimport { indexedDBLocalPersistence } from './persistence/indexed_db';\nimport { browserPopupRedirectResolver } from './popup_redirect';\nimport { Auth } from '../model/public_types';\n\n/**\n * Returns the Auth instance associated with the provided {@link @firebase/app#FirebaseApp}.\n * If no instance exists, initializes an Auth instance with platform-specific default dependencies.\n *\n * @param app - The Firebase App.\n *\n * @public\n */\nexport function getAuth(app: FirebaseApp = getApp()): Auth {\n const provider = _getProvider(app, 'auth');\n\n if (provider.isInitialized()) {\n return provider.getImmediate();\n }\n\n return initializeAuth(app, {\n popupRedirectResolver: browserPopupRedirectResolver,\n persistence: [\n indexedDBLocalPersistence,\n browserLocalPersistence,\n browserSessionPersistence\n ]\n });\n}\n\nregisterAuth(ClientPlatform.BROWSER);\n","/**\n * @license\n * Copyright 2021 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 interface CordovaWindow extends Window {\n cordova: {\n plugins: {\n browsertab: {\n isAvailable(cb: (available: boolean) => void): void;\n openUrl(url: string): void;\n close(): void;\n };\n };\n\n InAppBrowser: {\n open(url: string, target: string, options: string): InAppBrowserRef;\n };\n };\n\n universalLinks: {\n subscribe(\n n: null,\n cb: (event: Record<string, string> | null) => void\n ): void;\n };\n\n BuildInfo: {\n readonly packageName: string;\n readonly displayName: string;\n };\n\n handleOpenURL(url: string): void;\n}\n\nexport interface InAppBrowserRef {\n close?: () => void;\n}\n\nexport function _cordovaWindow(): CordovaWindow {\n return (window as unknown) as CordovaWindow;\n}\n","/**\n * @license\n * Copyright 2020 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 { AuthProvider } from '../../model/public_types';\nimport { AuthErrorCode } from '../../core/errors';\nimport {\n debugAssert,\n _assert,\n _createError,\n _fail\n} from '../../core/util/assert';\nimport { _isAndroid, _isIOS, _isIOS7Or8 } from '../../core/util/browser';\nimport { _getRedirectUrl } from '../../core/util/handler';\nimport { AuthInternal } from '../../model/auth';\nimport { AuthEvent } from '../../model/popup_redirect';\nimport { InAppBrowserRef, _cordovaWindow } from '../plugins';\nimport {\n GetProjectConfigRequest,\n _getProjectConfig\n} from '../../api/project_config/get_project_config';\n\n/**\n * How long to wait after the app comes back into focus before concluding that\n * the user closed the sign in tab.\n */\nconst REDIRECT_TIMEOUT_MS = 2000;\n\n/**\n * Generates the URL for the OAuth handler.\n */\nexport async function _generateHandlerUrl(\n auth: AuthInternal,\n event: AuthEvent,\n provider: AuthProvider\n): Promise<string> {\n // Get the cordova plugins\n const { BuildInfo } = _cordovaWindow();\n debugAssert(event.sessionId, 'AuthEvent did not contain a session ID');\n const sessionDigest = await computeSha256(event.sessionId);\n\n const additionalParams: Record<string, string> = {};\n if (_isIOS()) {\n // iOS app identifier\n additionalParams['ibi'] = BuildInfo.packageName;\n } else if (_isAndroid()) {\n // Android app identifier\n additionalParams['apn'] = BuildInfo.packageName;\n } else {\n _fail(auth, AuthErrorCode.OPERATION_NOT_SUPPORTED);\n }\n\n // Add the display name if available\n if (BuildInfo.displayName) {\n additionalParams['appDisplayName'] = BuildInfo.displayName;\n }\n\n // Attached the hashed session ID\n additionalParams['sessionId'] = sessionDigest;\n return _getRedirectUrl(\n auth,\n provider,\n event.type,\n undefined,\n event.eventId ?? undefined,\n additionalParams\n );\n}\n\n/**\n * Validates that this app is valid for this project configuration\n */\nexport async function _validateOrigin(auth: AuthInternal): Promise<void> {\n const { BuildInfo } = _cordovaWindow();\n const request: GetProjectConfigRequest = {};\n if (_isIOS()) {\n request.iosBundleId = BuildInfo.packageName;\n } else if (_isAndroid()) {\n request.androidPackageName = BuildInfo.packageName;\n } else {\n _fail(auth, AuthErrorCode.OPERATION_NOT_SUPPORTED);\n }\n\n // Will fail automatically if package name is not authorized\n await _getProjectConfig(auth, request);\n}\n\nexport function _performRedirect(\n handlerUrl: string\n): Promise<InAppBrowserRef | null> {\n // Get the cordova plugins\n const { cordova } = _cordovaWindow();\n\n return new Promise(resolve => {\n cordova.plugins.browsertab.isAvailable(browserTabIsAvailable => {\n let iabRef: InAppBrowserRef | null = null;\n if (browserTabIsAvailable) {\n cordova.plugins.browsertab.openUrl(handlerUrl);\n } else {\n // TODO: Return the inappbrowser ref that's returned from the open call\n iabRef = cordova.InAppBrowser.open(\n handlerUrl,\n _isIOS7Or8() ? '_blank' : '_system',\n 'location=yes'\n );\n }\n resolve(iabRef);\n });\n });\n}\n\n// Thin interface wrapper to avoid circular dependency with ./events module\ninterface PassiveAuthEventListener {\n addPassiveListener(cb: () => void): void;\n removePassiveListener(cb: () => void): void;\n}\n\n/**\n * This function waits for app activity to be seen before resolving. It does\n * this by attaching listeners to various dom events. Once the app is determined\n * to be visible, this promise resolves. AFTER that resolution, the listeners\n * are detached and any browser tabs left open will be closed.\n */\nexport async function _waitForAppResume(\n auth: AuthInternal,\n eventListener: PassiveAuthEventListener,\n iabRef: InAppBrowserRef | null\n): Promise<void> {\n // Get the cordova plugins\n const { cordova } = _cordovaWindow();\n\n let cleanup = (): void => {};\n try {\n await new Promise<void>((resolve, reject) => {\n let onCloseTimer: number | null = null;\n\n // DEFINE ALL THE CALLBACKS =====\n function authEventSeen(): void {\n // Auth event was detected. Resolve this promise and close the extra\n // window if it's still open.\n resolve();\n const closeBrowserTab = cordova.plugins.browsertab?.close;\n if (typeof closeBrowserTab === 'function') {\n closeBrowserTab();\n }\n // Close inappbrowser emebedded webview in iOS7 and 8 case if still\n // open.\n if (typeof iabRef?.close === 'function') {\n iabRef.close();\n }\n }\n\n function resumed(): void {\n if (onCloseTimer) {\n // This code already ran; do not rerun.\n return;\n }\n\n onCloseTimer = window.setTimeout(() => {\n // Wait two seeconds after resume then reject.\n reject(_createError(auth, AuthErrorCode.REDIRECT_CANCELLED_BY_USER));\n }, REDIRECT_TIMEOUT_MS);\n }\n\n function visibilityChanged(): void {\n if (document?.visibilityState === 'visible') {\n resumed();\n }\n }\n\n // ATTACH ALL THE LISTENERS =====\n // Listen for the auth event\n eventListener.addPassiveListener(authEventSeen);\n\n // Listen for resume and visibility events\n document.addEventListener('resume', resumed, false);\n if (_isAndroid()) {\n document.addEventListener('visibilitychange', visibilityChanged, false);\n }\n\n // SETUP THE CLEANUP FUNCTION =====\n cleanup = () => {\n eventListener.removePassiveListener(authEventSeen);\n document.removeEventListener('resume', resumed, false);\n document.removeEventListener(\n 'visibilitychange',\n visibilityChanged,\n false\n );\n if (onCloseTimer) {\n window.clearTimeout(onCloseTimer);\n }\n };\n });\n } finally {\n cleanup();\n }\n}\n\n/**\n * Checks the configuration of the Cordova environment. This has no side effect\n * if the configuration is correct; otherwise it throws an error with the\n * missing plugin.\n */\nexport function _checkCordovaConfiguration(auth: AuthInternal): void {\n const win = _cordovaWindow();\n // Check all dependencies installed.\n // https://github.com/nordnet/cordova-universal-links-plugin\n // Note that cordova-universal-links-plugin has been abandoned.\n // A fork with latest fixes is available at:\n // https://www.npmjs.com/package/cordova-universal-links-plugin-fix\n _assert(\n typeof win?.universalLinks?.subscribe === 'function',\n auth,\n AuthErrorCode.INVALID_CORDOVA_CONFIGURATION,\n {\n missingPlugin: 'cordova-universal-links-plugin-fix'\n }\n );\n\n // https://www.npmjs.com/package/cordova-plugin-buildinfo\n _assert(\n typeof win?.BuildInfo?.packageName !== 'undefined',\n auth,\n AuthErrorCode.INVALID_CORDOVA_CONFIGURATION,\n {\n missingPlugin: 'cordova-plugin-buildInfo'\n }\n );\n\n // https://github.com/google/cordova-plugin-browsertab\n _assert(\n typeof win?.cordova?.plugins?.browsertab?.openUrl === 'function',\n auth,\n AuthErrorCode.INVALID_CORDOVA_CONFIGURATION,\n {\n missingPlugin: 'cordova-plugin-browsertab'\n }\n );\n _assert(\n typeof win?.cordova?.plugins?.browsertab?.isAvailable === 'function',\n auth,\n AuthErrorCode.INVALID_CORDOVA_CONFIGURATION,\n {\n missingPlugin: 'cordova-plugin-browsertab'\n }\n );\n\n // https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-inappbrowser/\n _assert(\n typeof win?.cordova?.InAppBrowser?.open === 'function',\n auth,\n AuthErrorCode.INVALID_CORDOVA_CONFIGURATION,\n {\n missingPlugin: 'cordova-plugin-inappbrowser'\n }\n );\n}\n\n/**\n * Computes the SHA-256 of a session ID. The SubtleCrypto interface is only\n * available in \"secure\" contexts, which covers Cordova (which is served on a file\n * protocol).\n */\nasync function computeSha256(sessionId: string): Promise<string> {\n const bytes = stringToArrayBuffer(sessionId);\n\n // TODO: For IE11 crypto has a different name and this operation comes back\n // as an object, not a promise. This is the old proposed standard that\n // is used by IE11:\n // https://www.w3.org/TR/2013/WD-WebCryptoAPI-20130108/#cryptooperation-interface\n const buf = await crypto.subtle.digest('SHA-256', bytes);\n const arr = Array.from(new Uint8Array(buf));\n return arr.map(num => num.toString(16).padStart(2, '0')).join('');\n}\n\nfunction stringToArrayBuffer(str: string): Uint8Array {\n // This function is only meant to deal with an ASCII charset and makes\n // certain simplifying assumptions.\n debugAssert(\n /[0-9a-zA-Z]+/.test(str),\n 'Can only convert alpha-numeric strings'\n );\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(str);\n }\n\n const buff = new ArrayBuffer(str.length);\n const view = new Uint8Array(buff);\n for (let i = 0; i < str.length; i++) {\n view[i] = str.charCodeAt(i);\n }\n return view;\n}\n","/**\n * @license\n * Copyright 2020 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 { querystringDecode } from '@firebase/util';\nimport { AuthEventManager } from '../../core/auth/auth_event_manager';\nimport { AuthErrorCode } from '../../core/errors';\nimport { PersistedBlob, PersistenceInternal } from '../../core/persistence';\nimport {\n KeyName,\n _persistenceKeyName\n} from '../../core/persistence/persistence_user_manager';\nimport { _createError } from '../../core/util/assert';\nimport { _getInstance } from '../../core/util/instantiator';\nimport { AuthInternal } from '../../model/auth';\nimport { AuthEvent, AuthEventType } from '../../model/popup_redirect';\nimport { browserLocalPersistence } from '../../platform_browser/persistence/local_storage';\n\nconst SESSION_ID_LENGTH = 20;\n\n/** Custom AuthEventManager that adds passive listeners to events */\nexport class CordovaAuthEventManager extends AuthEventManager {\n private readonly passiveListeners = new Set<(e: AuthEvent) => void>();\n private resolveInialized!: () => void;\n private initPromise = new Promise<void>(resolve => {\n this.resolveInialized = resolve;\n });\n\n addPassiveListener(cb: (e: AuthEvent) => void): void {\n this.passiveListeners.add(cb);\n }\n\n removePassiveListener(cb: (e: AuthEvent) => void): void {\n this.passiveListeners.delete(cb);\n }\n\n // In a Cordova environment, this manager can live through multiple redirect\n // operations\n resetRedirect(): void {\n this.queuedRedirectEvent = null;\n this.hasHandledPotentialRedirect = false;\n }\n\n /** Override the onEvent method */\n onEvent(event: AuthEvent): boolean {\n this.resolveInialized();\n this.passiveListeners.forEach(cb => cb(event));\n return super.onEvent(event);\n }\n\n async initialized(): Promise<void> {\n await this.initPromise;\n }\n}\n\n/**\n * Generates a (partial) {@link AuthEvent}.\n */\nexport function _generateNewEvent(\n auth: AuthInternal,\n type: AuthEventType,\n eventId: string | null = null\n): AuthEvent {\n return {\n type,\n eventId,\n urlResponse: null,\n sessionId: generateSessionId(),\n postBody: null,\n tenantId: auth.tenantId,\n error: _createError(auth, AuthErrorCode.NO_AUTH_EVENT)\n };\n}\n\nexport function _savePartialEvent(\n auth: AuthInternal,\n event: AuthEvent\n): Promise<void> {\n return storage()._set(\n persistenceKey(auth),\n (event as object) as PersistedBlob\n );\n}\n\nexport async function _getAndRemoveEvent(\n auth: AuthInternal\n): Promise<AuthEvent | null> {\n const event = (await storage()._get(\n persistenceKey(auth)\n )) as AuthEvent | null;\n if (event) {\n await storage()._remove(persistenceKey(auth));\n }\n return event;\n}\n\nexport function _eventFromPartialAndUrl(\n partialEvent: AuthEvent,\n url: string\n): AuthEvent | null {\n // Parse the deep link within the dynamic link URL.\n const callbackUrl = _getDeepLinkFromCallback(url);\n // Confirm it is actually a callback URL.\n // Currently the universal link will be of this format:\n // https://<AUTH_DOMAIN>/__/auth/callback<OAUTH_RESPONSE>\n // This is a fake URL but is not intended to take the user anywhere\n // and just redirect to the app.\n if (callbackUrl.includes('/__/auth/callback')) {\n // Check if there is an error in the URL.\n // This mechanism is also used to pass errors back to the app:\n // https://<AUTH_DOMAIN>/__/auth/callback?firebaseError=<STRINGIFIED_ERROR>\n const params = searchParamsOrEmpty(callbackUrl);\n // Get the error object corresponding to the stringified error if found.\n const errorObject = params['firebaseError']\n ? parseJsonOrNull(decodeURIComponent(params['firebaseError']))\n : null;\n const code = errorObject?.['code']?.split('auth/')?.[1];\n const error = code ? _createError(code) : null;\n if (error) {\n return {\n type: partialEvent.type,\n eventId: partialEvent.eventId,\n tenantId: partialEvent.tenantId,\n error,\n urlResponse: null,\n sessionId: null,\n postBody: null\n };\n } else {\n return {\n type: partialEvent.type,\n eventId: partialEvent.eventId,\n tenantId: partialEvent.tenantId,\n sessionId: partialEvent.sessionId,\n urlResponse: callbackUrl,\n postBody: null\n };\n }\n }\n\n return null;\n}\n\nfunction generateSessionId(): string {\n const chars = [];\n const allowedChars =\n '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n for (let i = 0; i < SESSION_ID_LENGTH; i++) {\n const idx = Math.floor(Math.random() * allowedChars.length);\n chars.push(allowedChars.charAt(idx));\n }\n return chars.join('');\n}\n\nfunction storage(): PersistenceInternal {\n return _getInstance(browserLocalPersistence);\n}\n\nfunction persistenceKey(auth: AuthInternal): string {\n return _persistenceKeyName(KeyName.AUTH_EVENT, auth.config.apiKey, auth.name);\n}\n\nfunction parseJsonOrNull(json: string): ReturnType<typeof JSON.parse> | null {\n try {\n return JSON.parse(json);\n } catch (e) {\n return null;\n }\n}\n\n// Exported for testing\nexport function _getDeepLinkFromCallback(url: string): string {\n const params = searchParamsOrEmpty(url);\n const link = params['link'] ? decodeURIComponent(params['link']) : undefined;\n // Double link case (automatic redirect)\n const doubleDeepLink = searchParamsOrEmpty(link)['link'];\n // iOS custom scheme links.\n const iOSDeepLink = params['deep_link_id']\n ? decodeURIComponent(params['deep_link_id'])\n : undefined;\n const iOSDoubleDeepLink = searchParamsOrEmpty(iOSDeepLink)['link'];\n return iOSDoubleDeepLink || iOSDeepLink || doubleDeepLink || link || url;\n}\n\n/**\n * Optimistically tries to get search params from a string, or else returns an\n * empty search params object.\n */\nfunction searchParamsOrEmpty(url: string | undefined): Record<string, string> {\n if (!url?.includes('?')) {\n return {};\n }\n\n const [_, ...rest] = url.split('?');\n return querystringDecode(rest.join('?')) as Record<string, string>;\n}\n","/**\n * @license\n * Copyright 2021 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 { AuthProvider, PopupRedirectResolver } from '../../model/public_types';\nimport { browserSessionPersistence } from '../../platform_browser/persistence/session_storage';\nimport { AuthInternal } from '../../model/auth';\nimport {\n AuthEvent,\n AuthEventType,\n PopupRedirectResolverInternal\n} from '../../model/popup_redirect';\nimport { AuthPopup } from '../../platform_browser/util/popup';\nimport { _createError, _fail } from '../../core/util/assert';\nimport { AuthErrorCode } from '../../core/errors';\nimport {\n _checkCordovaConfiguration,\n _generateHandlerUrl,\n _performRedirect,\n _validateOrigin,\n _waitForAppResume\n} from './utils';\nimport {\n CordovaAuthEventManager,\n _eventFromPartialAndUrl,\n _generateNewEvent,\n _getAndRemoveEvent,\n _savePartialEvent\n} from './events';\nimport { AuthEventManager } from '../../core/auth/auth_event_manager';\nimport { _getRedirectResult } from '../../platform_browser/strategies/redirect';\nimport { _clearRedirectOutcomes, _overrideRedirectResult } from '../../core/strategies/redirect';\nimport { _cordovaWindow } from '../plugins';\n\n/**\n * How long to wait for the initial auth event before concluding no\n * redirect pending\n */\nconst INITIAL_EVENT_TIMEOUT_MS = 500;\n\nclass CordovaPopupRedirectResolver implements PopupRedirectResolverInternal {\n readonly _redirectPersistence = browserSessionPersistence;\n readonly _shouldInitProactively = true; // This is lightweight for Cordova\n private readonly eventManagers = new Map<string, CordovaAuthEventManager>();\n private readonly originValidationPromises: Record<string, Promise<void>> = {};\n\n _completeRedirectFn = _getRedirectResult;\n _overrideRedirectResult = _overrideRedirectResult;\n\n async _initialize(auth: AuthInternal): Promise<CordovaAuthEventManager> {\n const key = auth._key();\n let manager = this.eventManagers.get(key);\n if (!manager) {\n manager = new CordovaAuthEventManager(auth);\n this.eventManagers.set(key, manager);\n this.attachCallbackListeners(auth, manager);\n }\n return manager;\n }\n\n _openPopup(auth: AuthInternal): Promise<AuthPopup> {\n _fail(auth, AuthErrorCode.OPERATION_NOT_SUPPORTED);\n }\n\n async _openRedirect(\n auth: AuthInternal,\n provider: AuthProvider,\n authType: AuthEventType,\n eventId?: string\n ): Promise<void> {\n _checkCordovaConfiguration(auth);\n const manager = await this._initialize(auth);\n await manager.initialized();\n\n // Reset the persisted redirect states. This does not matter on Web where\n // the redirect always blows away application state entirely. On Cordova,\n // the app maintains control flow through the redirect.\n manager.resetRedirect();\n _clearRedirectOutcomes();\n\n await this._originValidation(auth);\n\n const event = _generateNewEvent(auth, authType, eventId);\n await _savePartialEvent(auth, event);\n const url = await _generateHandlerUrl(auth, event, provider);\n const iabRef = await _performRedirect(url);\n return _waitForAppResume(auth, manager, iabRef);\n }\n\n _isIframeWebStorageSupported(\n _auth: AuthInternal,\n _cb: (support: boolean) => unknown\n ): void {\n throw new Error('Method not implemented.');\n }\n\n _originValidation(auth: AuthInternal): Promise<void> {\n const key = auth._key();\n if (!this.originValidationPromises[key]) {\n this.originValidationPromises[key] = _validateOrigin(auth);\n }\n\n return this.originValidationPromises[key];\n }\n\n private attachCallbackListeners(\n auth: AuthInternal,\n manager: AuthEventManager\n ): void {\n // Get the global plugins\n const { universalLinks, handleOpenURL, BuildInfo } = _cordovaWindow();\n\n const noEventTimeout = setTimeout(async () => {\n // We didn't see that initial event. Clear any pending object and\n // dispatch no event\n await _getAndRemoveEvent(auth);\n manager.onEvent(generateNoEvent());\n }, INITIAL_EVENT_TIMEOUT_MS);\n\n const universalLinksCb = async (\n eventData: Record<string, string> | null\n ): Promise<void> => {\n // We have an event so we can clear the no event timeout\n clearTimeout(noEventTimeout);\n\n const partialEvent = await _getAndRemoveEvent(auth);\n let finalEvent: AuthEvent | null = null;\n if (partialEvent && eventData?.['url']) {\n finalEvent = _eventFromPartialAndUrl(partialEvent, eventData['url']);\n }\n\n // If finalEvent is never filled, trigger with no event\n manager.onEvent(finalEvent || generateNoEvent());\n };\n\n // Universal links subscriber doesn't exist for iOS, so we need to check\n if (\n typeof universalLinks !== 'undefined' &&\n typeof universalLinks.subscribe === 'function'\n ) {\n universalLinks.subscribe(null, universalLinksCb);\n }\n\n // iOS 7 or 8 custom URL schemes.\n // This is also the current default behavior for iOS 9+.\n // For this to work, cordova-plugin-customurlscheme needs to be installed.\n // https://github.com/EddyVerbruggen/Custom-URL-scheme\n // Do not overwrite the existing developer's URL handler.\n const existingHandleOpenURL = handleOpenURL;\n const packagePrefix = `${BuildInfo.packageName.toLowerCase()}://`;\n _cordovaWindow().handleOpenURL = async url => {\n if (url.toLowerCase().startsWith(packagePrefix)) {\n // We want this intentionally to float\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n universalLinksCb({ url });\n }\n // Call the developer's handler if it is present.\n if (typeof existingHandleOpenURL === 'function') {\n try {\n existingHandleOpenURL(url);\n } catch (e) {\n // This is a developer error. Don't stop the flow of the SDK.\n console.error(e);\n }\n }\n };\n }\n}\n\n/**\n * An implementation of {@link PopupRedirectResolver} suitable for Cordova\n * based applications.\n *\n * @public\n */\nexport const cordovaPopupRedirectResolver: PopupRedirectResolver =\n CordovaPopupRedirectResolver;\n\nfunction generateNoEvent(): AuthEvent {\n return {\n type: AuthEventType.UNKNOWN,\n eventId: null,\n sessionId: null,\n urlResponse: null,\n postBody: null,\n tenantId: null,\n error: _createError(AuthErrorCode.NO_AUTH_EVENT)\n };\n}\n","/**\n * @license\n * Copyright 2017 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 { _castAuth } from '../src/core/auth/auth_impl';\nimport { Auth } from '../src/model/public_types';\n\n/**\n * This interface is intended only for use by @firebase/auth-compat, do not use directly\n */\nexport * from '../index';\n\nexport { SignInWithIdpResponse } from '../src/api/authentication/idp';\nexport { AuthErrorCode } from '../src/core/errors';\nexport { PersistenceInternal } from '../src/core/persistence';\nexport { _persistenceKeyName } from '../src/core/persistence/persistence_user_manager';\nexport { UserImpl } from '../src/core/user/user_impl';\nexport { _getInstance } from '../src/core/util/instantiator';\nexport {\n PopupRedirectResolverInternal,\n EventManager,\n AuthEventType\n} from '../src/model/popup_redirect';\nexport { UserCredentialInternal, UserParameters } from '../src/model/user';\nexport { AuthInternal, ConfigInternal } from '../src/model/auth';\nexport { DefaultConfig, AuthImpl, _castAuth } from '../src/core/auth/auth_impl';\n\nexport { ClientPlatform, _getClientVersion } from '../src/core/util/version';\n\nexport { _generateEventId } from '../src/core/util/event_id';\nexport { TaggedWithTokenResponse } from '../src/model/id_token';\nexport { _fail, _assert } from '../src/core/util/assert';\nexport { AuthPopup } from '../src/platform_browser/util/popup';\nexport { _getRedirectResult } from '../src/platform_browser/strategies/redirect';\nexport { _overrideRedirectResult } from '../src/core/strategies/redirect';\nexport { cordovaPopupRedirectResolver } from '../src/platform_cordova/popup_redirect/popup_redirect';\nexport { FetchProvider } from '../src/core/util/fetch_provider';\nexport { SAMLAuthCredential } from '../src/core/credentials/saml';\n\n// This function should only be called by frameworks (e.g. FirebaseUI-web) to log their usage.\n// It is not intended for direct use by developer apps. NO jsdoc here to intentionally leave it out\n// of autogenerated documentation pages to reduce accidental misuse.\nexport function addFrameworkForLogging(auth: Auth, framework: string): void {\n _castAuth(auth)._logFramework(framework);\n}\n"],"names":["STORAGE_AVAILABLE_KEY","getUA","_isSafari","_isIOS","_POLLING_INTERVAL_MS","__extends","_isIframe","_isMobileBrowser","_isIE10","_isWorker","_getWorkerGlobalScope","_getActiveServiceWorker","_getServiceWorkerController","_getInstance","_assert","signInWithIdp","AuthCredential","_signInWithCredential","_reauthenticate","_linkUser","_fail","debugAssert","Delay","_castAuth","_assertInstanceOf","FederatedAuthProvider","getModularInstance","_createError","_persistenceKeyName","_assertLinkedStatus","_performApiRequest","_validateOrigin","_getCurrentUrl","_window","js._generateCallbackName","js._loadJS","_emulatorUrl","SDK_VERSION","querystring","gapiLoader._loadGapi","_isChromeIOS","_isFirefox","_isIOSStandalone","isEmpty","BaseOAuthProvider","_setWindowLocation","app","getApp","_getProvider","initializeAuth","registerAuth","_isAndroid","_isIOS7Or8","querystringDecode"],"mappings":"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"}
\No newline at end of file