{"ast":null,"code":"import { __values, __read, __awaiter, __generator, __spreadArray } from 'tslib';\nimport { Deferred } from '@firebase/util';\n/**\r\n * Component for service name T, e.g. `auth`, `auth-internal`\r\n */\n\nvar Component =\n/** @class */\nfunction () {\n /**\r\n *\r\n * @param name The public service name, e.g. app, auth, firestore, database\r\n * @param instanceFactory Service factory responsible for creating the public interface\r\n * @param type whether the service provided by the component is public or private\r\n */\n function Component(name, instanceFactory, type) {\n this.name = name;\n this.instanceFactory = instanceFactory;\n this.type = type;\n this.multipleInstances = false;\n /**\r\n * Properties to be added to the service namespace\r\n */\n\n this.serviceProps = {};\n this.instantiationMode = \"LAZY\"\n /* LAZY */\n ;\n this.onInstanceCreated = null;\n }\n\n Component.prototype.setInstantiationMode = function (mode) {\n this.instantiationMode = mode;\n return this;\n };\n\n Component.prototype.setMultipleInstances = function (multipleInstances) {\n this.multipleInstances = multipleInstances;\n return this;\n };\n\n Component.prototype.setServiceProps = function (props) {\n this.serviceProps = props;\n return this;\n };\n\n Component.prototype.setInstanceCreatedCallback = function (callback) {\n this.onInstanceCreated = callback;\n return this;\n };\n\n return Component;\n}();\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\n\n\nvar DEFAULT_ENTRY_NAME = '[DEFAULT]';\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\n\n/**\r\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\r\n * NameServiceMapping[T] is an alias for the type of the instance\r\n */\n\nvar Provider =\n/** @class */\nfunction () {\n function Provider(name, container) {\n this.name = name;\n this.container = container;\n this.component = null;\n this.instances = new Map();\n this.instancesDeferred = new Map();\n this.onInitCallbacks = new Map();\n }\n /**\r\n * @param identifier A provider can provide mulitple instances of a service\r\n * if this.component.multipleInstances is true.\r\n */\n\n\n Provider.prototype.get = function (identifier) {\n // if multipleInstances is not supported, use the default name\n var normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\n\n if (!this.instancesDeferred.has(normalizedIdentifier)) {\n var deferred = new Deferred();\n this.instancesDeferred.set(normalizedIdentifier, deferred);\n\n if (this.isInitialized(normalizedIdentifier) || this.shouldAutoInitialize()) {\n // initialize the service if it can be auto-initialized\n try {\n var instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n\n if (instance) {\n deferred.resolve(instance);\n }\n } catch (e) {// when the instance factory throws an exception during get(), it should not cause\n // a fatal error. We just return the unresolved promise in this case.\n }\n }\n }\n\n return this.instancesDeferred.get(normalizedIdentifier).promise;\n };\n\n Provider.prototype.getImmediate = function (options) {\n var _a; // if multipleInstances is not supported, use the default name\n\n\n var normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier);\n var optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false;\n\n if (this.isInitialized(normalizedIdentifier) || this.shouldAutoInitialize()) {\n try {\n return this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n } catch (e) {\n if (optional) {\n return null;\n } else {\n throw e;\n }\n }\n } else {\n // In case a component is not initialized and should/can not be auto-initialized at the moment, return null if the optional flag is set, or throw\n if (optional) {\n return null;\n } else {\n throw Error(\"Service \" + this.name + \" is not available\");\n }\n }\n };\n\n Provider.prototype.getComponent = function () {\n return this.component;\n };\n\n Provider.prototype.setComponent = function (component) {\n var e_1, _a;\n\n if (component.name !== this.name) {\n throw Error(\"Mismatching Component \" + component.name + \" for Provider \" + this.name + \".\");\n }\n\n if (this.component) {\n throw Error(\"Component for \" + this.name + \" has already been provided\");\n }\n\n this.component = component; // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\n\n if (!this.shouldAutoInitialize()) {\n return;\n } // if the service is eager, initialize the default instance\n\n\n if (isComponentEager(component)) {\n try {\n this.getOrInitializeService({\n instanceIdentifier: DEFAULT_ENTRY_NAME\n });\n } catch (e) {// when the instance factory for an eager Component throws an exception during the eager\n // initialization, it should not cause a fatal error.\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\n // a fatal error in this case?\n }\n }\n\n try {\n // Create service instances for the pending promises and resolve them\n // NOTE: if this.multipleInstances is false, only the default instance will be created\n // and all promises with resolve with it regardless of the identifier.\n for (var _b = __values(this.instancesDeferred.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {\n var _d = __read(_c.value, 2),\n instanceIdentifier = _d[0],\n instanceDeferred = _d[1];\n\n var normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\n\n try {\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\n var instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n instanceDeferred.resolve(instance);\n } catch (e) {// when the instance factory throws an exception, it should not cause\n // a fatal error. We just leave the promise unresolved.\n }\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n };\n\n Provider.prototype.clearInstance = function (identifier) {\n if (identifier === void 0) {\n identifier = DEFAULT_ENTRY_NAME;\n }\n\n this.instancesDeferred.delete(identifier);\n this.instances.delete(identifier);\n }; // app.delete() will call this method on every provider to delete the services\n // TODO: should we mark the provider as deleted?\n\n\n Provider.prototype.delete = function () {\n return __awaiter(this, void 0, void 0, function () {\n var services;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n services = Array.from(this.instances.values());\n return [4\n /*yield*/\n , Promise.all(__spreadArray(__spreadArray([], __read(services.filter(function (service) {\n return 'INTERNAL' in service;\n }) // legacy services\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(function (service) {\n return service.INTERNAL.delete();\n }))), __read(services.filter(function (service) {\n return '_delete' in service;\n }) // modularized services\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(function (service) {\n return service._delete();\n }))))];\n\n case 1:\n _a.sent();\n\n return [2\n /*return*/\n ];\n }\n });\n });\n };\n\n Provider.prototype.isComponentSet = function () {\n return this.component != null;\n };\n\n Provider.prototype.isInitialized = function (identifier) {\n if (identifier === void 0) {\n identifier = DEFAULT_ENTRY_NAME;\n }\n\n return this.instances.has(identifier);\n };\n\n Provider.prototype.initialize = function (opts) {\n var e_2, _a;\n\n if (opts === void 0) {\n opts = {};\n }\n\n var _b = opts.options,\n options = _b === void 0 ? {} : _b;\n var normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);\n\n if (this.isInitialized(normalizedIdentifier)) {\n throw Error(this.name + \"(\" + normalizedIdentifier + \") has already been initialized\");\n }\n\n if (!this.isComponentSet()) {\n throw Error(\"Component \" + this.name + \" has not been registered yet\");\n }\n\n var instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier,\n options: options\n });\n\n try {\n // resolve any pending promise waiting for the service instance\n for (var _c = __values(this.instancesDeferred.entries()), _d = _c.next(); !_d.done; _d = _c.next()) {\n var _e = __read(_d.value, 2),\n instanceIdentifier = _e[0],\n instanceDeferred = _e[1];\n\n var normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\n\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\n instanceDeferred.resolve(instance);\n }\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n\n return instance;\n };\n /**\r\n *\r\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\r\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\r\n *\r\n * @param identifier An optional instance identifier\r\n * @returns a function to unregister the callback\r\n */\n\n\n Provider.prototype.onInit = function (callback, identifier) {\n var _a;\n\n var normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\n var existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set();\n existingCallbacks.add(callback);\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\n var existingInstance = this.instances.get(normalizedIdentifier);\n\n if (existingInstance) {\n callback(existingInstance, normalizedIdentifier);\n }\n\n return function () {\n existingCallbacks.delete(callback);\n };\n };\n /**\r\n * Invoke onInit callbacks synchronously\r\n * @param instance the service instance`\r\n */\n\n\n Provider.prototype.invokeOnInitCallbacks = function (instance, identifier) {\n var e_3, _a;\n\n var callbacks = this.onInitCallbacks.get(identifier);\n\n if (!callbacks) {\n return;\n }\n\n try {\n for (var callbacks_1 = __values(callbacks), callbacks_1_1 = callbacks_1.next(); !callbacks_1_1.done; callbacks_1_1 = callbacks_1.next()) {\n var callback = callbacks_1_1.value;\n\n try {\n callback(instance, identifier);\n } catch (_b) {// ignore errors in the onInit callback\n }\n }\n } catch (e_3_1) {\n e_3 = {\n error: e_3_1\n };\n } finally {\n try {\n if (callbacks_1_1 && !callbacks_1_1.done && (_a = callbacks_1.return)) _a.call(callbacks_1);\n } finally {\n if (e_3) throw e_3.error;\n }\n }\n };\n\n Provider.prototype.getOrInitializeService = function (_a) {\n var instanceIdentifier = _a.instanceIdentifier,\n _b = _a.options,\n options = _b === void 0 ? {} : _b;\n var instance = this.instances.get(instanceIdentifier);\n\n if (!instance && this.component) {\n instance = this.component.instanceFactory(this.container, {\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\n options: options\n });\n this.instances.set(instanceIdentifier, instance);\n /**\r\n * Invoke onInit listeners.\r\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\r\n * while onInit listeners are registered by consumers of the provider.\r\n */\n\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\n /**\r\n * Order is important\r\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\r\n * makes `isInitialized()` return true.\r\n */\n\n if (this.component.onInstanceCreated) {\n try {\n this.component.onInstanceCreated(this.container, instanceIdentifier, instance);\n } catch (_c) {// ignore errors in the onInstanceCreatedCallback\n }\n }\n }\n\n return instance || null;\n };\n\n Provider.prototype.normalizeInstanceIdentifier = function (identifier) {\n if (identifier === void 0) {\n identifier = DEFAULT_ENTRY_NAME;\n }\n\n if (this.component) {\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\n } else {\n return identifier; // assume multiple instances are supported before the component is provided.\n }\n };\n\n Provider.prototype.shouldAutoInitialize = function () {\n return !!this.component && this.component.instantiationMode !== \"EXPLICIT\"\n /* EXPLICIT */\n ;\n };\n\n return Provider;\n}(); // undefined should be passed to the service factory for the default instance\n\n\nfunction normalizeIdentifierForFactory(identifier) {\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\n}\n\nfunction isComponentEager(component) {\n return component.instantiationMode === \"EAGER\"\n /* EAGER */\n ;\n}\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\n\n/**\r\n * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\r\n */\n\n\nvar ComponentContainer =\n/** @class */\nfunction () {\n function ComponentContainer(name) {\n this.name = name;\n this.providers = new Map();\n }\n /**\r\n *\r\n * @param component Component being added\r\n * @param overwrite When a component with the same name has already been registered,\r\n * if overwrite is true: overwrite the existing component with the new component and create a new\r\n * provider with the new component. It can be useful in tests where you want to use different mocks\r\n * for different tests.\r\n * if overwrite is false: throw an exception\r\n */\n\n\n ComponentContainer.prototype.addComponent = function (component) {\n var provider = this.getProvider(component.name);\n\n if (provider.isComponentSet()) {\n throw new Error(\"Component \" + component.name + \" has already been registered with \" + this.name);\n }\n\n provider.setComponent(component);\n };\n\n ComponentContainer.prototype.addOrOverwriteComponent = function (component) {\n var provider = this.getProvider(component.name);\n\n if (provider.isComponentSet()) {\n // delete the existing provider from the container, so we can register the new component\n this.providers.delete(component.name);\n }\n\n this.addComponent(component);\n };\n /**\r\n * getProvider provides a type safe interface where it can only be called with a field name\r\n * present in NameServiceMapping interface.\r\n *\r\n * Firebase SDKs providing services should extend NameServiceMapping interface to register\r\n * themselves.\r\n */\n\n\n ComponentContainer.prototype.getProvider = function (name) {\n if (this.providers.has(name)) {\n return this.providers.get(name);\n } // create a Provider for a service that hasn't registered with Firebase\n\n\n var provider = new Provider(name, this);\n this.providers.set(name, provider);\n return provider;\n };\n\n ComponentContainer.prototype.getProviders = function () {\n return Array.from(this.providers.values());\n };\n\n return ComponentContainer;\n}();\n\nexport { Component, ComponentContainer, Provider };","map":{"version":3,"sources":["../src/component.ts","../src/constants.ts","../src/provider.ts","../src/component_container.ts"],"names":[],"mappings":"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","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 */\nimport {\n InstantiationMode,\n InstanceFactory,\n ComponentType,\n Dictionary,\n Name,\n onInstanceCreatedCallback\n} from './types';\n\n/**\n * Component for service name T, e.g. `auth`, `auth-internal`\n */\nexport class Component {\n multipleInstances = false;\n /**\n * Properties to be added to the service namespace\n */\n serviceProps: Dictionary = {};\n\n instantiationMode = InstantiationMode.LAZY;\n\n onInstanceCreated: onInstanceCreatedCallback | null = null;\n\n /**\n *\n * @param name The public service name, e.g. app, auth, firestore, database\n * @param instanceFactory Service factory responsible for creating the public interface\n * @param type whether the service provided by the component is public or private\n */\n constructor(\n readonly name: T,\n readonly instanceFactory: InstanceFactory,\n readonly type: ComponentType\n ) {}\n\n setInstantiationMode(mode: InstantiationMode): this {\n this.instantiationMode = mode;\n return this;\n }\n\n setMultipleInstances(multipleInstances: boolean): this {\n this.multipleInstances = multipleInstances;\n return this;\n }\n\n setServiceProps(props: Dictionary): this {\n this.serviceProps = props;\n return this;\n }\n\n setInstanceCreatedCallback(callback: onInstanceCreatedCallback): this {\n this.onInstanceCreated = callback;\n return this;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const DEFAULT_ENTRY_NAME = '[DEFAULT]';\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 { Deferred } from '@firebase/util';\nimport { ComponentContainer } from './component_container';\nimport { DEFAULT_ENTRY_NAME } from './constants';\nimport {\n InitializeOptions,\n InstantiationMode,\n Name,\n NameServiceMapping,\n OnInitCallBack\n} from './types';\nimport { Component } from './component';\n\n/**\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\n * NameServiceMapping[T] is an alias for the type of the instance\n */\nexport class Provider {\n private component: Component | null = null;\n private readonly instances: Map = new Map();\n private readonly instancesDeferred: Map<\n string,\n Deferred\n > = new Map();\n private onInitCallbacks: Map>> = new Map();\n\n constructor(\n private readonly name: T,\n private readonly container: ComponentContainer\n ) {}\n\n /**\n * @param identifier A provider can provide mulitple instances of a service\n * if this.component.multipleInstances is true.\n */\n get(identifier?: string): Promise {\n // if multipleInstances is not supported, use the default name\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\n\n if (!this.instancesDeferred.has(normalizedIdentifier)) {\n const deferred = new Deferred();\n this.instancesDeferred.set(normalizedIdentifier, deferred);\n\n if (\n this.isInitialized(normalizedIdentifier) ||\n this.shouldAutoInitialize()\n ) {\n // initialize the service if it can be auto-initialized\n try {\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n if (instance) {\n deferred.resolve(instance);\n }\n } catch (e) {\n // when the instance factory throws an exception during get(), it should not cause\n // a fatal error. We just return the unresolved promise in this case.\n }\n }\n }\n\n return this.instancesDeferred.get(normalizedIdentifier)!.promise;\n }\n\n /**\n *\n * @param options.identifier A provider can provide mulitple instances of a service\n * if this.component.multipleInstances is true.\n * @param options.optional If optional is false or not provided, the method throws an error when\n * the service is not immediately available.\n * If optional is true, the method returns null if the service is not immediately available.\n */\n getImmediate(options: {\n identifier?: string;\n optional: true;\n }): NameServiceMapping[T] | null;\n getImmediate(options?: {\n identifier?: string;\n optional?: false;\n }): NameServiceMapping[T];\n getImmediate(options?: {\n identifier?: string;\n optional?: boolean;\n }): NameServiceMapping[T] | null {\n // if multipleInstances is not supported, use the default name\n const normalizedIdentifier = this.normalizeInstanceIdentifier(\n options?.identifier\n );\n const optional = options?.optional ?? false;\n\n if (\n this.isInitialized(normalizedIdentifier) ||\n this.shouldAutoInitialize()\n ) {\n try {\n return this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n } catch (e) {\n if (optional) {\n return null;\n } else {\n throw e;\n }\n }\n } else {\n // In case a component is not initialized and should/can not be auto-initialized at the moment, return null if the optional flag is set, or throw\n if (optional) {\n return null;\n } else {\n throw Error(`Service ${this.name} is not available`);\n }\n }\n }\n\n getComponent(): Component | null {\n return this.component;\n }\n\n setComponent(component: Component): void {\n if (component.name !== this.name) {\n throw Error(\n `Mismatching Component ${component.name} for Provider ${this.name}.`\n );\n }\n\n if (this.component) {\n throw Error(`Component for ${this.name} has already been provided`);\n }\n\n this.component = component;\n\n // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\n if (!this.shouldAutoInitialize()) {\n return;\n }\n\n // if the service is eager, initialize the default instance\n if (isComponentEager(component)) {\n try {\n this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\n } catch (e) {\n // when the instance factory for an eager Component throws an exception during the eager\n // initialization, it should not cause a fatal error.\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\n // a fatal error in this case?\n }\n }\n\n // Create service instances for the pending promises and resolve them\n // NOTE: if this.multipleInstances is false, only the default instance will be created\n // and all promises with resolve with it regardless of the identifier.\n for (const [\n instanceIdentifier,\n instanceDeferred\n ] of this.instancesDeferred.entries()) {\n const normalizedIdentifier = this.normalizeInstanceIdentifier(\n instanceIdentifier\n );\n\n try {\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n })!;\n instanceDeferred.resolve(instance);\n } catch (e) {\n // when the instance factory throws an exception, it should not cause\n // a fatal error. We just leave the promise unresolved.\n }\n }\n }\n\n clearInstance(identifier: string = DEFAULT_ENTRY_NAME): void {\n this.instancesDeferred.delete(identifier);\n this.instances.delete(identifier);\n }\n\n // app.delete() will call this method on every provider to delete the services\n // TODO: should we mark the provider as deleted?\n async delete(): Promise {\n const services = Array.from(this.instances.values());\n\n await Promise.all([\n ...services\n .filter(service => 'INTERNAL' in service) // legacy services\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(service => (service as any).INTERNAL!.delete()),\n ...services\n .filter(service => '_delete' in service) // modularized services\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(service => (service as any)._delete())\n ]);\n }\n\n isComponentSet(): boolean {\n return this.component != null;\n }\n\n isInitialized(identifier: string = DEFAULT_ENTRY_NAME): boolean {\n return this.instances.has(identifier);\n }\n\n initialize(opts: InitializeOptions = {}): NameServiceMapping[T] {\n const { options = {} } = opts;\n const normalizedIdentifier = this.normalizeInstanceIdentifier(\n opts.instanceIdentifier\n );\n if (this.isInitialized(normalizedIdentifier)) {\n throw Error(\n `${this.name}(${normalizedIdentifier}) has already been initialized`\n );\n }\n\n if (!this.isComponentSet()) {\n throw Error(`Component ${this.name} has not been registered yet`);\n }\n\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier,\n options\n })!;\n\n // resolve any pending promise waiting for the service instance\n for (const [\n instanceIdentifier,\n instanceDeferred\n ] of this.instancesDeferred.entries()) {\n const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(\n instanceIdentifier\n );\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\n instanceDeferred.resolve(instance);\n }\n }\n\n return instance;\n }\n\n /**\n *\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\n *\n * @param identifier An optional instance identifier\n * @returns a function to unregister the callback\n */\n onInit(callback: OnInitCallBack, identifier?: string): () => void {\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\n const existingCallbacks =\n this.onInitCallbacks.get(normalizedIdentifier) ??\n new Set>();\n existingCallbacks.add(callback);\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\n\n const existingInstance = this.instances.get(normalizedIdentifier);\n if (existingInstance) {\n callback(existingInstance, normalizedIdentifier);\n }\n\n return () => {\n existingCallbacks.delete(callback);\n };\n }\n\n /**\n * Invoke onInit callbacks synchronously\n * @param instance the service instance`\n */\n private invokeOnInitCallbacks(\n instance: NameServiceMapping[T],\n identifier: string\n ): void {\n const callbacks = this.onInitCallbacks.get(identifier);\n if (!callbacks) {\n return;\n }\n for (const callback of callbacks) {\n try {\n callback(instance, identifier);\n } catch {\n // ignore errors in the onInit callback\n }\n }\n }\n\n private getOrInitializeService({\n instanceIdentifier,\n options = {}\n }: {\n instanceIdentifier: string;\n options?: Record;\n }): NameServiceMapping[T] | null {\n let instance = this.instances.get(instanceIdentifier);\n if (!instance && this.component) {\n instance = this.component.instanceFactory(this.container, {\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\n options\n });\n this.instances.set(instanceIdentifier, instance);\n\n /**\n * Invoke onInit listeners.\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\n * while onInit listeners are registered by consumers of the provider.\n */\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\n\n /**\n * Order is important\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\n * makes `isInitialized()` return true.\n */\n if (this.component.onInstanceCreated) {\n try {\n this.component.onInstanceCreated(\n this.container,\n instanceIdentifier,\n instance\n );\n } catch {\n // ignore errors in the onInstanceCreatedCallback\n }\n }\n }\n\n return instance || null;\n }\n\n private normalizeInstanceIdentifier(\n identifier: string = DEFAULT_ENTRY_NAME\n ): string {\n if (this.component) {\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\n } else {\n return identifier; // assume multiple instances are supported before the component is provided.\n }\n }\n\n private shouldAutoInitialize(): boolean {\n return (\n !!this.component &&\n this.component.instantiationMode !== InstantiationMode.EXPLICIT\n );\n }\n}\n\n// undefined should be passed to the service factory for the default instance\nfunction normalizeIdentifierForFactory(identifier: string): string | undefined {\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\n}\n\nfunction isComponentEager(component: Component): boolean {\n return component.instantiationMode === InstantiationMode.EAGER;\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 { Provider } from './provider';\nimport { Component } from './component';\nimport { Name } from './types';\n\n/**\n * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\n */\nexport class ComponentContainer {\n private readonly providers = new Map>();\n\n constructor(private readonly name: string) {}\n\n /**\n *\n * @param component Component being added\n * @param overwrite When a component with the same name has already been registered,\n * if overwrite is true: overwrite the existing component with the new component and create a new\n * provider with the new component. It can be useful in tests where you want to use different mocks\n * for different tests.\n * if overwrite is false: throw an exception\n */\n addComponent(component: Component): void {\n const provider = this.getProvider(component.name);\n if (provider.isComponentSet()) {\n throw new Error(\n `Component ${component.name} has already been registered with ${this.name}`\n );\n }\n\n provider.setComponent(component);\n }\n\n addOrOverwriteComponent(component: Component): void {\n const provider = this.getProvider(component.name);\n if (provider.isComponentSet()) {\n // delete the existing provider from the container, so we can register the new component\n this.providers.delete(component.name);\n }\n\n this.addComponent(component);\n }\n\n /**\n * getProvider provides a type safe interface where it can only be called with a field name\n * present in NameServiceMapping interface.\n *\n * Firebase SDKs providing services should extend NameServiceMapping interface to register\n * themselves.\n */\n getProvider(name: T): Provider {\n if (this.providers.has(name)) {\n return (this.providers.get(name) as unknown) as Provider;\n }\n\n // create a Provider for a service that hasn't registered with Firebase\n const provider = new Provider(name, this);\n this.providers.set(name, (provider as unknown) as Provider);\n\n return provider as Provider;\n }\n\n getProviders(): Array> {\n return Array.from(this.providers.values());\n }\n}\n"]},"metadata":{},"sourceType":"module"}