{"version":3,"file":"firebase-performance-standalone.js","sources":["../../node_modules/tslib/tslib.es6.js","../util/src/deepCopy.ts","../util/src/deferred.ts","../util/src/errors.ts","../util/src/obj.ts","../component/src/component.ts","../component/src/constants.ts","../component/src/provider.ts","../component/src/component_container.ts","../logger/src/logger.ts","../app/src/errors.ts","../app/src/constants.ts","../app/src/lite/firebaseAppLite.ts","../app/src/logger.ts","../app/src/firebaseNamespaceCore.ts","../app/src/platformLoggerService.ts","../app/src/registerCoreComponents.ts","../app/index.lite.ts","../app/src/lite/firebaseNamespaceLite.ts","../../node_modules/idb/lib/idb.mjs","../installations/src/util/constants.ts","../installations/src/util/errors.ts","../installations/src/api/common.ts","../installations/src/util/sleep.ts","../installations/src/helpers/buffer-to-base64-url-safe.ts","../installations/src/helpers/generate-fid.ts","../installations/src/util/get-key.ts","../installations/src/helpers/fid-changed.ts","../installations/src/helpers/idb-manager.ts","../installations/src/index.ts","../installations/src/helpers/get-installation-entry.ts","../installations/src/api/create-installation-request.ts","../installations/src/api/generate-auth-token-request.ts","../installations/src/helpers/refresh-auth-token.ts","../installations/src/functions/get-token.ts","../installations/src/api/delete-installation-request.ts","../installations/src/functions/on-id-change.ts","../installations/src/helpers/extract-app-config.ts","../installations/src/functions/get-id.ts","../installations/src/functions/delete-installation.ts","../performance/src/services/api_service.ts","../performance/src/services/settings_service.ts","../performance/src/constants.ts","../performance/src/utils/errors.ts","../performance/src/utils/string_merger.ts","../performance/src/services/iid_service.ts","../performance/src/utils/attributes_utils.ts","../performance/src/utils/console_logger.ts","../performance/src/services/remote_config_service.ts","../performance/src/services/initialization_service.ts","../performance/src/services/transport_service.ts","../performance/src/services/perf_logger.ts","../performance/src/utils/metric_utils.ts","../performance/src/resources/trace.ts","../performance/src/resources/network_request.ts","../performance/src/services/oob_resources_service.ts","../performance/src/controllers/perf.ts","../performance/index.ts","src/index.perf.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\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\n/**\n * Do a deep-copy of basic JavaScript Objects or Arrays.\n */\nexport function deepCopy(value: T): T {\n return deepExtend(undefined, value) as T;\n}\n\n/**\n * Copy properties from source to target (recursively allows extension\n * of Objects and Arrays). Scalar values in the target are over-written.\n * If target is undefined, an object of the appropriate type will be created\n * (and returned).\n *\n * We recursively copy all child properties of plain Objects in the source- so\n * that namespace- like dictionaries are merged.\n *\n * Note that the target can be a function, in which case the properties in\n * the source Object are copied onto it as static properties of the Function.\n */\nexport function deepExtend(target: unknown, source: unknown): unknown {\n if (!(source instanceof Object)) {\n return source;\n }\n\n switch (source.constructor) {\n case Date:\n // Treat Dates like scalars; if the target date object had any child\n // properties - they will be lost!\n const dateValue = source as Date;\n return new Date(dateValue.getTime());\n\n case Object:\n if (target === undefined) {\n target = {};\n }\n break;\n case Array:\n // Always copy the array source and overwrite the target.\n target = [];\n break;\n\n default:\n // Not a plain Object - treat it as a scalar.\n return source;\n }\n\n for (const prop in source) {\n if (!source.hasOwnProperty(prop)) {\n continue;\n }\n (target as { [key: string]: unknown })[prop] = deepExtend(\n (target as { [key: string]: unknown })[prop],\n (source as { [key: string]: unknown })[prop]\n );\n }\n\n return target;\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\nexport class Deferred {\n promise: Promise;\n reject: (value?: unknown) => void = () => {};\n resolve: (value?: unknown) => void = () => {};\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve as (value?: unknown) => void;\n this.reject = reject as (value?: unknown) => void;\n });\n }\n\n /**\n * Our API internals are not promiseified and cannot because our callback APIs have subtle expectations around\n * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\n * and returns a node-style callback which will resolve or reject the Deferred's promise.\n */\n wrapCallback(\n callback?: (error?: unknown, value?: unknown) => void\n ): (error: unknown, value?: unknown) => void {\n return (error, value?) => {\n if (error) {\n this.reject(error);\n } else {\n this.resolve(value);\n }\n if (typeof callback === 'function') {\n // Attaching noop handler just in case developer wasn't expecting\n // promises\n this.promise.catch(() => {});\n\n // Some of our callbacks don't expect a value and our own tests\n // assert that the parameter length is 1\n if (callback.length === 1) {\n callback(error);\n } else {\n callback(error, value);\n }\n }\n };\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/**\n * @fileoverview Standardized Firebase Error.\n *\n * Usage:\n *\n * // Typescript string literals for type-safe codes\n * type Err =\n * 'unknown' |\n * 'object-not-found'\n * ;\n *\n * // Closure enum for type-safe error codes\n * // at-enum {string}\n * var Err = {\n * UNKNOWN: 'unknown',\n * OBJECT_NOT_FOUND: 'object-not-found',\n * }\n *\n * let errors: Map = {\n * 'generic-error': \"Unknown error\",\n * 'file-not-found': \"Could not find file: {$file}\",\n * };\n *\n * // Type-safe function - must pass a valid error code as param.\n * let error = new ErrorFactory('service', 'Service', errors);\n *\n * ...\n * throw error.create(Err.GENERIC);\n * ...\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\n * ...\n * // Service: Could not file file: foo.txt (service/file-not-found).\n *\n * catch (e) {\n * assert(e.message === \"Could not find file: foo.txt.\");\n * if (e.code === 'service/file-not-found') {\n * console.log(\"Could not read file: \" + e['file']);\n * }\n * }\n */\n\nexport type ErrorMap = {\n readonly [K in ErrorCode]: string;\n};\n\nconst ERROR_NAME = 'FirebaseError';\n\nexport interface StringLike {\n toString(): string;\n}\n\nexport interface ErrorData {\n [key: string]: unknown;\n}\n\nexport interface FirebaseError extends Error, ErrorData {\n // Unique code for error - format is service/error-code-string.\n readonly code: string;\n\n // Developer-friendly error message.\n readonly message: string;\n\n // Always 'FirebaseError'.\n readonly name: typeof ERROR_NAME;\n\n // Where available - stack backtrace in a string.\n readonly stack?: string;\n}\n\n// Based on code from:\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\nexport class FirebaseError extends Error {\n readonly name = ERROR_NAME;\n\n constructor(readonly code: string, message: string) {\n super(message);\n\n // Fix For ES5\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, FirebaseError.prototype);\n\n // Maintains proper stack trace for where our error was thrown.\n // Only available on V8.\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ErrorFactory.prototype.create);\n }\n }\n}\n\nexport class ErrorFactory<\n ErrorCode extends string,\n ErrorParams extends { readonly [K in ErrorCode]?: ErrorData } = {}\n> {\n constructor(\n private readonly service: string,\n private readonly serviceName: string,\n private readonly errors: ErrorMap\n ) {}\n\n create(\n code: K,\n ...data: K extends keyof ErrorParams ? [ErrorParams[K]] : []\n ): FirebaseError {\n const customData = (data[0] as ErrorData) || {};\n const fullCode = `${this.service}/${code}`;\n const template = this.errors[code];\n\n const message = template ? replaceTemplate(template, customData) : 'Error';\n // Service Name: Error message (service/code).\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\n\n const error = new FirebaseError(fullCode, fullMessage);\n\n // Keys with an underscore at the end of their name are not included in\n // error.data for some reason.\n // TODO: Replace with Object.entries when lib is updated to es2017.\n for (const key of Object.keys(customData)) {\n if (key.slice(-1) !== '_') {\n if (key in error) {\n console.warn(\n `Overwriting FirebaseError base field \"${key}\" can cause unexpected behavior.`\n );\n }\n error[key] = customData[key];\n }\n }\n\n return error;\n }\n}\n\nfunction replaceTemplate(template: string, data: ErrorData): string {\n return template.replace(PATTERN, (_, key) => {\n const value = data[key];\n return value != null ? String(value) : `<${key}?>`;\n });\n}\n\nconst PATTERN = /\\{\\$([^}]+)}/g;\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\nexport function contains(obj: T, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function safeGet(\n obj: T,\n key: K\n): T[K] | undefined {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return obj[key];\n } else {\n return undefined;\n }\n}\n\nexport function isEmpty(obj: object): obj is {} {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return false;\n }\n }\n return true;\n}\n\nexport function map(\n obj: { [key in K]: V },\n fn: (value: V, key: K, obj: { [key in K]: V }) => U,\n contextObj?: unknown\n): { [key in K]: U } {\n const res: Partial<{ [key in K]: U }> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n res[key] = fn.call(contextObj, obj[key], key, obj);\n }\n }\n return res as { [key in K]: U };\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 */\nimport {\n InstantiationMode,\n InstanceFactory,\n ComponentType,\n Dictionary,\n Name\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 /**\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","/**\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 { InstantiationMode, Name, NameServiceMapping } 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\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 = DEFAULT_ENTRY_NAME): 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 // If the service instance is available, resolve the promise with it immediately\n try {\n const instance = this.getOrInitializeService(normalizedIdentifier);\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 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 const { identifier, optional } = {\n identifier: DEFAULT_ENTRY_NAME,\n optional: false,\n ...options\n };\n // if multipleInstances is not supported, use the default name\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\n try {\n const instance = this.getOrInitializeService(normalizedIdentifier);\n\n if (!instance) {\n if (optional) {\n return null;\n }\n throw Error(`Service ${this.name} is not available`);\n }\n return instance;\n } catch (e) {\n if (optional) {\n return null;\n } else {\n throw e;\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 // if the service is eager, initialize the default instance\n if (isComponentEager(component)) {\n try {\n this.getOrInitializeService(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(normalizedIdentifier)!;\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)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(service => (service as any).INTERNAL!.delete())\n );\n }\n\n isComponentSet(): boolean {\n return this.component != null;\n }\n\n private getOrInitializeService(\n identifier: string\n ): NameServiceMapping[T] | null {\n let instance = this.instances.get(identifier);\n if (!instance && this.component) {\n instance = this.component.instanceFactory(\n this.container,\n normalizeIdentifierForFactory(identifier)\n ) as NameServiceMapping[T];\n this.instances.set(identifier, instance);\n }\n\n return instance || null;\n }\n\n private normalizeInstanceIdentifier(identifier: string): 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\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 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);\n\n return provider as Provider;\n }\n\n getProviders(): Array> {\n return Array.from(this.providers.values());\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\nexport type LogLevelString =\n | 'debug'\n | 'verbose'\n | 'info'\n | 'warn'\n | 'error'\n | 'silent';\n\nexport interface LogOptions {\n level: LogLevelString;\n}\n\nexport type LogCallback = (callbackParams: LogCallbackParams) => void;\n\nexport interface LogCallbackParams {\n level: LogLevelString;\n message: string;\n args: unknown[];\n type: string;\n}\n\n/**\n * A container for all of the Logger instances\n */\nexport const instances: Logger[] = [];\n\n/**\n * The JS SDK supports 5 log levels and also allows a user the ability to\n * silence the logs altogether.\n *\n * The order is a follows:\n * DEBUG < VERBOSE < INFO < WARN < ERROR\n *\n * All of the log types above the current log level will be captured (i.e. if\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\n * `VERBOSE` logs will not)\n */\nexport enum LogLevel {\n DEBUG,\n VERBOSE,\n INFO,\n WARN,\n ERROR,\n SILENT\n}\n\nconst levelStringToEnum: { [key in LogLevelString]: LogLevel } = {\n 'debug': LogLevel.DEBUG,\n 'verbose': LogLevel.VERBOSE,\n 'info': LogLevel.INFO,\n 'warn': LogLevel.WARN,\n 'error': LogLevel.ERROR,\n 'silent': LogLevel.SILENT\n};\n\n/**\n * The default log level\n */\nconst defaultLogLevel: LogLevel = LogLevel.INFO;\n\n/**\n * We allow users the ability to pass their own log handler. We will pass the\n * type of log, the current log level, and any other arguments passed (i.e. the\n * messages that the user wants to log) to this function.\n */\nexport type LogHandler = (\n loggerInstance: Logger,\n logType: LogLevel,\n ...args: unknown[]\n) => void;\n\n/**\n * By default, `console.debug` is not displayed in the developer console (in\n * chrome). To avoid forcing users to have to opt-in to these logs twice\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\n * logs to the `console.log` function.\n */\nconst ConsoleMethod = {\n [LogLevel.DEBUG]: 'log',\n [LogLevel.VERBOSE]: 'log',\n [LogLevel.INFO]: 'info',\n [LogLevel.WARN]: 'warn',\n [LogLevel.ERROR]: 'error'\n};\n\n/**\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\n * messages on to their corresponding console counterparts (if the log method\n * is supported by the current log level)\n */\nconst defaultLogHandler: LogHandler = (instance, logType, ...args): void => {\n if (logType < instance.logLevel) {\n return;\n }\n const now = new Date().toISOString();\n const method = ConsoleMethod[logType as keyof typeof ConsoleMethod];\n if (method) {\n console[method as 'log' | 'info' | 'warn' | 'error'](\n `[${now}] ${instance.name}:`,\n ...args\n );\n } else {\n throw new Error(\n `Attempted to log a message with an invalid logType (value: ${logType})`\n );\n }\n};\n\nexport class Logger {\n /**\n * Gives you an instance of a Logger to capture messages according to\n * Firebase's logging scheme.\n *\n * @param name The name that the logs will be associated with\n */\n constructor(public name: string) {\n /**\n * Capture the current instance for later use\n */\n instances.push(this);\n }\n\n /**\n * The log level of the given Logger instance.\n */\n private _logLevel = defaultLogLevel;\n\n get logLevel(): LogLevel {\n return this._logLevel;\n }\n\n set logLevel(val: LogLevel) {\n if (!(val in LogLevel)) {\n throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\n }\n this._logLevel = val;\n }\n\n // Workaround for setter/getter having to be the same type.\n setLogLevel(val: LogLevel | LogLevelString): void {\n this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\n }\n\n /**\n * The main (internal) log handler for the Logger instance.\n * Can be set to a new function in internal package code but not by user.\n */\n private _logHandler: LogHandler = defaultLogHandler;\n get logHandler(): LogHandler {\n return this._logHandler;\n }\n set logHandler(val: LogHandler) {\n if (typeof val !== 'function') {\n throw new TypeError('Value assigned to `logHandler` must be a function');\n }\n this._logHandler = val;\n }\n\n /**\n * The optional, additional, user-defined log handler for the Logger instance.\n */\n private _userLogHandler: LogHandler | null = null;\n get userLogHandler(): LogHandler | null {\n return this._userLogHandler;\n }\n set userLogHandler(val: LogHandler | null) {\n this._userLogHandler = val;\n }\n\n /**\n * The functions below are all based on the `console` interface\n */\n\n debug(...args: unknown[]): void {\n this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\n this._logHandler(this, LogLevel.DEBUG, ...args);\n }\n log(...args: unknown[]): void {\n this._userLogHandler &&\n this._userLogHandler(this, LogLevel.VERBOSE, ...args);\n this._logHandler(this, LogLevel.VERBOSE, ...args);\n }\n info(...args: unknown[]): void {\n this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\n this._logHandler(this, LogLevel.INFO, ...args);\n }\n warn(...args: unknown[]): void {\n this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\n this._logHandler(this, LogLevel.WARN, ...args);\n }\n error(...args: unknown[]): void {\n this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\n this._logHandler(this, LogLevel.ERROR, ...args);\n }\n}\n\nexport function setLogLevel(level: LogLevelString | LogLevel): void {\n instances.forEach(inst => {\n inst.setLogLevel(level);\n });\n}\n\nexport function setUserLogHandler(\n logCallback: LogCallback | null,\n options?: LogOptions\n): void {\n for (const instance of instances) {\n let customLogLevel: LogLevel | null = null;\n if (options && options.level) {\n customLogLevel = levelStringToEnum[options.level];\n }\n if (logCallback === null) {\n instance.userLogHandler = null;\n } else {\n instance.userLogHandler = (\n instance: Logger,\n level: LogLevel,\n ...args: unknown[]\n ) => {\n const message = args\n .map(arg => {\n if (arg == null) {\n return null;\n } else if (typeof arg === 'string') {\n return arg;\n } else if (typeof arg === 'number' || typeof arg === 'boolean') {\n return arg.toString();\n } else if (arg instanceof Error) {\n return arg.message;\n } else {\n try {\n return JSON.stringify(arg);\n } catch (ignored) {\n return null;\n }\n }\n })\n .filter(arg => arg)\n .join(' ');\n if (level >= (customLogLevel ?? instance.logLevel)) {\n logCallback({\n level: LogLevel[level].toLowerCase() as LogLevelString,\n message,\n args,\n type: instance.name\n });\n }\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 { ErrorFactory, ErrorMap } from '@firebase/util';\n\nexport const enum AppError {\n NO_APP = 'no-app',\n BAD_APP_NAME = 'bad-app-name',\n DUPLICATE_APP = 'duplicate-app',\n APP_DELETED = 'app-deleted',\n INVALID_APP_ARGUMENT = 'invalid-app-argument',\n INVALID_LOG_ARGUMENT = 'invalid-log-argument'\n}\n\nconst ERRORS: ErrorMap = {\n [AppError.NO_APP]:\n \"No Firebase App '{$appName}' has been created - \" +\n 'call Firebase App.initializeApp()',\n [AppError.BAD_APP_NAME]: \"Illegal App name: '{$appName}\",\n [AppError.DUPLICATE_APP]: \"Firebase App named '{$appName}' already exists\",\n [AppError.APP_DELETED]: \"Firebase App named '{$appName}' already deleted\",\n [AppError.INVALID_APP_ARGUMENT]:\n 'firebase.{$appName}() takes either no argument or a ' +\n 'Firebase App instance.',\n [AppError.INVALID_LOG_ARGUMENT]:\n 'First argument to `onLog` must be null or a function.'\n};\n\ntype ErrorParams = { [key in AppError]: { appName: string } };\n\nexport const ERROR_FACTORY = new ErrorFactory(\n 'app',\n 'Firebase',\n ERRORS\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]';\nimport { name as appName } from '../package.json';\nimport { name as analyticsName } from '../../analytics/package.json';\nimport { name as authName } from '../../auth/package.json';\nimport { name as databaseName } from '../../database/package.json';\nimport { name as functionsName } from '../../functions/package.json';\nimport { name as installationsName } from '../../installations/package.json';\nimport { name as messagingName } from '../../messaging/package.json';\nimport { name as performanceName } from '../../performance/package.json';\nimport { name as remoteConfigName } from '../../remote-config/package.json';\nimport { name as storageName } from '../../storage/package.json';\nimport { name as firestoreName } from '../../firestore/package.json';\nimport { name as packageName } from '../../../package.json';\n\nexport const PLATFORM_LOG_STRING = {\n [appName]: 'fire-core',\n [analyticsName]: 'fire-analytics',\n [authName]: 'fire-auth',\n [databaseName]: 'fire-rtdb',\n [functionsName]: 'fire-fn',\n [installationsName]: 'fire-iid',\n [messagingName]: 'fire-fcm',\n [performanceName]: 'fire-perf',\n [remoteConfigName]: 'fire-rc',\n [storageName]: 'fire-gcs',\n [firestoreName]: 'fire-fst',\n 'fire-js': 'fire-js', // Platform identifier for JS SDK.\n [packageName]: 'fire-js-all'\n} as const;\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 FirebaseApp,\n FirebaseOptions,\n FirebaseAppConfig\n} from '@firebase/app-types';\nimport {\n _FirebaseApp,\n _FirebaseNamespace,\n FirebaseService\n} from '@firebase/app-types/private';\nimport { deepCopy } from '@firebase/util';\nimport { ERROR_FACTORY, AppError } from '../errors';\nimport { DEFAULT_ENTRY_NAME } from '../constants';\nimport {\n ComponentContainer,\n Component,\n ComponentType,\n Name\n} from '@firebase/component';\n\ninterface ServicesCache {\n [name: string]: {\n [serviceName: string]: FirebaseService;\n };\n}\n\n/**\n * Global context object for a collection of services using\n * a shared authentication state.\n */\nexport class FirebaseAppLiteImpl implements FirebaseApp {\n private readonly options_: FirebaseOptions;\n private readonly name_: string;\n private isDeleted_ = false;\n private automaticDataCollectionEnabled_: boolean;\n private container: ComponentContainer;\n\n // lite version has an empty INTERNAL namespace\n readonly INTERNAL = {};\n\n constructor(\n options: FirebaseOptions,\n config: FirebaseAppConfig,\n private readonly firebase_: _FirebaseNamespace\n ) {\n this.name_ = config.name!;\n this.automaticDataCollectionEnabled_ =\n config.automaticDataCollectionEnabled || false;\n this.options_ = deepCopy(options);\n this.container = new ComponentContainer(config.name!);\n\n // add itself to container\n this.container.addComponent(\n new Component('app', () => this, ComponentType.PUBLIC)\n );\n // populate ComponentContainer with existing components\n for (const component of this.firebase_.INTERNAL.components.values()) {\n this.container.addComponent(component);\n }\n }\n\n get automaticDataCollectionEnabled(): boolean {\n this.checkDestroyed_();\n return this.automaticDataCollectionEnabled_;\n }\n\n set automaticDataCollectionEnabled(val) {\n this.checkDestroyed_();\n this.automaticDataCollectionEnabled_ = val;\n }\n\n get name(): string {\n this.checkDestroyed_();\n return this.name_;\n }\n\n get options(): FirebaseOptions {\n this.checkDestroyed_();\n return this.options_;\n }\n\n delete(): Promise {\n return new Promise(resolve => {\n this.checkDestroyed_();\n resolve();\n })\n .then(() => {\n this.firebase_.INTERNAL.removeApp(this.name_);\n\n return Promise.all(\n this.container.getProviders().map(provider => provider.delete())\n );\n })\n .then((): void => {\n this.isDeleted_ = true;\n });\n }\n\n /**\n * Return a service instance associated with this app (creating it\n * on demand), identified by the passed instanceIdentifier.\n *\n * NOTE: Currently storage is the only one that is leveraging this\n * functionality. They invoke it by calling:\n *\n * ```javascript\n * firebase.app().storage('STORAGE BUCKET ID')\n * ```\n *\n * The service name is passed to this already\n * @internal\n */\n _getService(\n name: string,\n instanceIdentifier: string = DEFAULT_ENTRY_NAME\n ): FirebaseService {\n this.checkDestroyed_();\n\n // getImmediate will always succeed because _getService is only called for registered components.\n return (this.container.getProvider(name as Name).getImmediate({\n identifier: instanceIdentifier\n }) as unknown) as FirebaseService;\n }\n\n /**\n * This function will throw an Error if the App has already been deleted -\n * use before performing API actions on the App.\n */\n private checkDestroyed_(): void {\n if (this.isDeleted_) {\n throw ERROR_FACTORY.create(AppError.APP_DELETED, { appName: this.name_ });\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 { Logger } from '@firebase/logger';\n\nexport const logger = new Logger('@firebase/app');\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 FirebaseApp,\n FirebaseOptions,\n FirebaseNamespace,\n FirebaseAppConfig\n} from '@firebase/app-types';\nimport {\n _FirebaseApp,\n _FirebaseNamespace,\n FirebaseService,\n FirebaseServiceNamespace\n} from '@firebase/app-types/private';\nimport { deepExtend, contains } from '@firebase/util';\nimport { FirebaseAppImpl } from './firebaseApp';\nimport { ERROR_FACTORY, AppError } from './errors';\nimport { FirebaseAppLiteImpl } from './lite/firebaseAppLite';\nimport { DEFAULT_ENTRY_NAME, PLATFORM_LOG_STRING } from './constants';\nimport { version } from '../../firebase/package.json';\nimport { logger } from './logger';\nimport {\n setUserLogHandler,\n setLogLevel,\n LogCallback,\n LogOptions\n} from '@firebase/logger';\nimport { Component, ComponentType, Name } from '@firebase/component';\n\n/**\n * Because auth can't share code with other components, we attach the utility functions\n * in an internal namespace to share code.\n * This function return a firebase namespace object without\n * any utility functions, so it can be shared between the regular firebaseNamespace and\n * the lite version.\n */\nexport function createFirebaseNamespaceCore(\n firebaseAppImpl: typeof FirebaseAppImpl | typeof FirebaseAppLiteImpl\n): FirebaseNamespace {\n const apps: { [name: string]: FirebaseApp } = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const components = new Map>();\n\n // A namespace is a plain JavaScript Object.\n const namespace: FirebaseNamespace = {\n // Hack to prevent Babel from modifying the object returned\n // as the firebase namespace.\n // @ts-ignore\n __esModule: true,\n initializeApp,\n // @ts-ignore\n app,\n registerVersion,\n setLogLevel,\n onLog,\n // @ts-ignore\n apps: null,\n SDK_VERSION: version,\n INTERNAL: {\n registerComponent,\n removeApp,\n components,\n useAsService\n }\n };\n\n // Inject a circular default export to allow Babel users who were previously\n // using:\n //\n // import firebase from 'firebase';\n // which becomes: var firebase = require('firebase').default;\n //\n // instead of\n //\n // import * as firebase from 'firebase';\n // which becomes: var firebase = require('firebase');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (namespace as any)['default'] = namespace;\n\n // firebase.apps is a read-only getter.\n Object.defineProperty(namespace, 'apps', {\n get: getApps\n });\n\n /**\n * Called by App.delete() - but before any services associated with the App\n * are deleted.\n */\n function removeApp(name: string): void {\n delete apps[name];\n }\n\n /**\n * Get the App object for a given name (or DEFAULT).\n */\n function app(name?: string): FirebaseApp {\n name = name || DEFAULT_ENTRY_NAME;\n if (!contains(apps, name)) {\n throw ERROR_FACTORY.create(AppError.NO_APP, { appName: name });\n }\n return apps[name];\n }\n\n // @ts-ignore\n app['App'] = firebaseAppImpl;\n /**\n * Create a new App instance (name must be unique).\n */\n function initializeApp(\n options: FirebaseOptions,\n config?: FirebaseAppConfig\n ): FirebaseApp;\n function initializeApp(options: FirebaseOptions, name?: string): FirebaseApp;\n function initializeApp(\n options: FirebaseOptions,\n rawConfig = {}\n ): FirebaseApp {\n if (typeof rawConfig !== 'object' || rawConfig === null) {\n const name = rawConfig;\n rawConfig = { name };\n }\n\n const config = rawConfig as FirebaseAppConfig;\n\n if (config.name === undefined) {\n config.name = DEFAULT_ENTRY_NAME;\n }\n\n const { name } = config;\n\n if (typeof name !== 'string' || !name) {\n throw ERROR_FACTORY.create(AppError.BAD_APP_NAME, {\n appName: String(name)\n });\n }\n\n if (contains(apps, name)) {\n throw ERROR_FACTORY.create(AppError.DUPLICATE_APP, { appName: name });\n }\n\n const app = new firebaseAppImpl(\n options,\n config,\n namespace as _FirebaseNamespace\n );\n\n apps[name] = app;\n\n return app;\n }\n\n /*\n * Return an array of all the non-deleted FirebaseApps.\n */\n function getApps(): FirebaseApp[] {\n // Make a copy so caller cannot mutate the apps list.\n return Object.keys(apps).map(name => apps[name]);\n }\n\n function registerComponent(\n component: Component\n ): FirebaseServiceNamespace | null {\n const componentName = component.name;\n if (components.has(componentName)) {\n logger.debug(\n `There were multiple attempts to register component ${componentName}.`\n );\n\n return component.type === ComponentType.PUBLIC\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (namespace as any)[componentName]\n : null;\n }\n\n components.set(componentName, component);\n\n // create service namespace for public components\n if (component.type === ComponentType.PUBLIC) {\n // The Service namespace is an accessor function ...\n const serviceNamespace = (\n appArg: FirebaseApp = app()\n ): FirebaseService => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof (appArg as any)[componentName] !== 'function') {\n // Invalid argument.\n // This happens in the following case: firebase.storage('gs:/')\n throw ERROR_FACTORY.create(AppError.INVALID_APP_ARGUMENT, {\n appName: componentName\n });\n }\n\n // Forward service instance lookup to the FirebaseApp.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (appArg as any)[componentName]();\n };\n\n // ... and a container for service-level properties.\n if (component.serviceProps !== undefined) {\n deepExtend(serviceNamespace, component.serviceProps);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (namespace as any)[componentName] = serviceNamespace;\n\n // Patch the FirebaseAppImpl prototype\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (firebaseAppImpl.prototype as any)[componentName] =\n // TODO: The eslint disable can be removed and the 'ignoreRestArgs'\n // option added to the no-explicit-any rule when ESlint releases it.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function (...args: any) {\n const serviceFxn = this._getService.bind(this, componentName);\n return serviceFxn.apply(\n this,\n component.multipleInstances ? args : []\n );\n };\n }\n\n // add the component to existing app instances\n for (const appName of Object.keys(apps)) {\n (apps[appName] as _FirebaseApp)._addComponent(component);\n }\n\n return component.type === ComponentType.PUBLIC\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (namespace as any)[componentName]\n : null;\n }\n\n function registerVersion(\n libraryKeyOrName: string,\n version: string,\n variant?: string\n ): void {\n // TODO: We can use this check to whitelist strings when/if we set up\n // a good whitelist system.\n let library = PLATFORM_LOG_STRING[libraryKeyOrName] ?? libraryKeyOrName;\n if (variant) {\n library += `-${variant}`;\n }\n const libraryMismatch = library.match(/\\s|\\//);\n const versionMismatch = version.match(/\\s|\\//);\n if (libraryMismatch || versionMismatch) {\n const warning = [\n `Unable to register library \"${library}\" with version \"${version}\":`\n ];\n if (libraryMismatch) {\n warning.push(\n `library name \"${library}\" contains illegal characters (whitespace or \"/\")`\n );\n }\n if (libraryMismatch && versionMismatch) {\n warning.push('and');\n }\n if (versionMismatch) {\n warning.push(\n `version name \"${version}\" contains illegal characters (whitespace or \"/\")`\n );\n }\n logger.warn(warning.join(' '));\n return;\n }\n registerComponent(\n new Component(\n `${library}-version` as Name,\n () => ({ library, version }),\n ComponentType.VERSION\n )\n );\n }\n\n function onLog(logCallback: LogCallback | null, options?: LogOptions): void {\n if (logCallback !== null && typeof logCallback !== 'function') {\n throw ERROR_FACTORY.create(AppError.INVALID_LOG_ARGUMENT, {\n appName: name\n });\n }\n setUserLogHandler(logCallback, options);\n }\n\n // Map the requested service to a registered service name\n // (used to map auth to serverAuth service when needed).\n function useAsService(app: FirebaseApp, name: string): string | null {\n if (name === 'serverAuth') {\n return null;\n }\n\n const useService = name;\n\n return useService;\n }\n\n return namespace;\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 ComponentContainer,\n ComponentType,\n Provider,\n Name\n} from '@firebase/component';\n\nexport class PlatformLoggerService {\n constructor(private readonly container: ComponentContainer) {}\n // In initial implementation, this will be called by installations on\n // auth token refresh, and installations will send this string.\n getPlatformInfoString(): string {\n const providers = this.container.getProviders();\n // Loop through providers and get library/version pairs from any that are\n // version components.\n return providers\n .map(provider => {\n if (isVersionServiceProvider(provider)) {\n const service = provider.getImmediate();\n return `${service.library}/${service.version}`;\n } else {\n return null;\n }\n })\n .filter(logString => logString)\n .join(' ');\n }\n}\n/**\n *\n * @param provider check if this provider provides a VersionService\n *\n * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider\n * provides VersionService. The provider is not necessarily a 'app-version'\n * provider.\n */\nfunction isVersionServiceProvider(\n provider: Provider\n): provider is Provider<'app-version'> {\n const component = provider.getComponent();\n return component?.type === ComponentType.VERSION;\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 { FirebaseNamespace } from '@firebase/app-types';\nimport { _FirebaseNamespace } from '@firebase/app-types/private';\nimport { Component, ComponentType } from '@firebase/component';\nimport { PlatformLoggerService } from './platformLoggerService';\nimport { name, version } from '../package.json';\n\nexport function registerCoreComponents(\n firebase: FirebaseNamespace,\n variant?: string\n): void {\n (firebase as _FirebaseNamespace).INTERNAL.registerComponent(\n new Component(\n 'platform-logger',\n container => new PlatformLoggerService(container),\n ComponentType.PRIVATE\n )\n );\n // Register `app` package.\n firebase.registerVersion(name, version, variant);\n // Register platform SDK identifier (no version).\n firebase.registerVersion('fire-js', '');\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 { createFirebaseNamespaceLite } from './src/lite/firebaseNamespaceLite';\nimport { registerCoreComponents } from './src/registerCoreComponents';\n\nexport const firebase = createFirebaseNamespaceLite();\n\nregisterCoreComponents(firebase, 'lite');\n\n// eslint-disable-next-line import/no-default-export\nexport default firebase;\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 { FirebaseNamespace } from '@firebase/app-types';\nimport {\n _FirebaseApp,\n _FirebaseNamespace,\n FirebaseServiceNamespace,\n FirebaseService\n} from '@firebase/app-types/private';\nimport { FirebaseAppLiteImpl } from './firebaseAppLite';\nimport { createFirebaseNamespaceCore } from '../firebaseNamespaceCore';\nimport { Component, ComponentType } from '@firebase/component';\n\nexport function createFirebaseNamespaceLite(): FirebaseNamespace {\n const namespace = createFirebaseNamespaceCore(FirebaseAppLiteImpl);\n\n namespace.SDK_VERSION = `${namespace.SDK_VERSION}_LITE`;\n\n const registerComponent = (namespace as _FirebaseNamespace).INTERNAL\n .registerComponent;\n (namespace as _FirebaseNamespace).INTERNAL.registerComponent = registerComponentForLite;\n\n /**\n * This is a special implementation, so it only works with performance.\n * only allow performance SDK to register.\n */\n function registerComponentForLite(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: Component\n ): FirebaseServiceNamespace | null {\n // only allow performance to register with firebase lite\n if (\n component.type === ComponentType.PUBLIC &&\n component.name !== 'performance' &&\n component.name !== 'installations'\n ) {\n throw Error(`${name} cannot register with the standalone perf instance`);\n }\n\n return registerComponent(component);\n }\n\n return namespace;\n}\n","function toArray(arr) {\n return Array.prototype.slice.call(arr);\n}\n\nfunction promisifyRequest(request) {\n return new Promise(function(resolve, reject) {\n request.onsuccess = function() {\n resolve(request.result);\n };\n\n request.onerror = function() {\n reject(request.error);\n };\n });\n}\n\nfunction promisifyRequestCall(obj, method, args) {\n var request;\n var p = new Promise(function(resolve, reject) {\n request = obj[method].apply(obj, args);\n promisifyRequest(request).then(resolve, reject);\n });\n\n p.request = request;\n return p;\n}\n\nfunction promisifyCursorRequestCall(obj, method, args) {\n var p = promisifyRequestCall(obj, method, args);\n return p.then(function(value) {\n if (!value) return;\n return new Cursor(value, p.request);\n });\n}\n\nfunction proxyProperties(ProxyClass, targetProp, properties) {\n properties.forEach(function(prop) {\n Object.defineProperty(ProxyClass.prototype, prop, {\n get: function() {\n return this[targetProp][prop];\n },\n set: function(val) {\n this[targetProp][prop] = val;\n }\n });\n });\n}\n\nfunction proxyRequestMethods(ProxyClass, targetProp, Constructor, properties) {\n properties.forEach(function(prop) {\n if (!(prop in Constructor.prototype)) return;\n ProxyClass.prototype[prop] = function() {\n return promisifyRequestCall(this[targetProp], prop, arguments);\n };\n });\n}\n\nfunction proxyMethods(ProxyClass, targetProp, Constructor, properties) {\n properties.forEach(function(prop) {\n if (!(prop in Constructor.prototype)) return;\n ProxyClass.prototype[prop] = function() {\n return this[targetProp][prop].apply(this[targetProp], arguments);\n };\n });\n}\n\nfunction proxyCursorRequestMethods(ProxyClass, targetProp, Constructor, properties) {\n properties.forEach(function(prop) {\n if (!(prop in Constructor.prototype)) return;\n ProxyClass.prototype[prop] = function() {\n return promisifyCursorRequestCall(this[targetProp], prop, arguments);\n };\n });\n}\n\nfunction Index(index) {\n this._index = index;\n}\n\nproxyProperties(Index, '_index', [\n 'name',\n 'keyPath',\n 'multiEntry',\n 'unique'\n]);\n\nproxyRequestMethods(Index, '_index', IDBIndex, [\n 'get',\n 'getKey',\n 'getAll',\n 'getAllKeys',\n 'count'\n]);\n\nproxyCursorRequestMethods(Index, '_index', IDBIndex, [\n 'openCursor',\n 'openKeyCursor'\n]);\n\nfunction Cursor(cursor, request) {\n this._cursor = cursor;\n this._request = request;\n}\n\nproxyProperties(Cursor, '_cursor', [\n 'direction',\n 'key',\n 'primaryKey',\n 'value'\n]);\n\nproxyRequestMethods(Cursor, '_cursor', IDBCursor, [\n 'update',\n 'delete'\n]);\n\n// proxy 'next' methods\n['advance', 'continue', 'continuePrimaryKey'].forEach(function(methodName) {\n if (!(methodName in IDBCursor.prototype)) return;\n Cursor.prototype[methodName] = function() {\n var cursor = this;\n var args = arguments;\n return Promise.resolve().then(function() {\n cursor._cursor[methodName].apply(cursor._cursor, args);\n return promisifyRequest(cursor._request).then(function(value) {\n if (!value) return;\n return new Cursor(value, cursor._request);\n });\n });\n };\n});\n\nfunction ObjectStore(store) {\n this._store = store;\n}\n\nObjectStore.prototype.createIndex = function() {\n return new Index(this._store.createIndex.apply(this._store, arguments));\n};\n\nObjectStore.prototype.index = function() {\n return new Index(this._store.index.apply(this._store, arguments));\n};\n\nproxyProperties(ObjectStore, '_store', [\n 'name',\n 'keyPath',\n 'indexNames',\n 'autoIncrement'\n]);\n\nproxyRequestMethods(ObjectStore, '_store', IDBObjectStore, [\n 'put',\n 'add',\n 'delete',\n 'clear',\n 'get',\n 'getAll',\n 'getKey',\n 'getAllKeys',\n 'count'\n]);\n\nproxyCursorRequestMethods(ObjectStore, '_store', IDBObjectStore, [\n 'openCursor',\n 'openKeyCursor'\n]);\n\nproxyMethods(ObjectStore, '_store', IDBObjectStore, [\n 'deleteIndex'\n]);\n\nfunction Transaction(idbTransaction) {\n this._tx = idbTransaction;\n this.complete = new Promise(function(resolve, reject) {\n idbTransaction.oncomplete = function() {\n resolve();\n };\n idbTransaction.onerror = function() {\n reject(idbTransaction.error);\n };\n idbTransaction.onabort = function() {\n reject(idbTransaction.error);\n };\n });\n}\n\nTransaction.prototype.objectStore = function() {\n return new ObjectStore(this._tx.objectStore.apply(this._tx, arguments));\n};\n\nproxyProperties(Transaction, '_tx', [\n 'objectStoreNames',\n 'mode'\n]);\n\nproxyMethods(Transaction, '_tx', IDBTransaction, [\n 'abort'\n]);\n\nfunction UpgradeDB(db, oldVersion, transaction) {\n this._db = db;\n this.oldVersion = oldVersion;\n this.transaction = new Transaction(transaction);\n}\n\nUpgradeDB.prototype.createObjectStore = function() {\n return new ObjectStore(this._db.createObjectStore.apply(this._db, arguments));\n};\n\nproxyProperties(UpgradeDB, '_db', [\n 'name',\n 'version',\n 'objectStoreNames'\n]);\n\nproxyMethods(UpgradeDB, '_db', IDBDatabase, [\n 'deleteObjectStore',\n 'close'\n]);\n\nfunction DB(db) {\n this._db = db;\n}\n\nDB.prototype.transaction = function() {\n return new Transaction(this._db.transaction.apply(this._db, arguments));\n};\n\nproxyProperties(DB, '_db', [\n 'name',\n 'version',\n 'objectStoreNames'\n]);\n\nproxyMethods(DB, '_db', IDBDatabase, [\n 'close'\n]);\n\n// Add cursor iterators\n// TODO: remove this once browsers do the right thing with promises\n['openCursor', 'openKeyCursor'].forEach(function(funcName) {\n [ObjectStore, Index].forEach(function(Constructor) {\n // Don't create iterateKeyCursor if openKeyCursor doesn't exist.\n if (!(funcName in Constructor.prototype)) return;\n\n Constructor.prototype[funcName.replace('open', 'iterate')] = function() {\n var args = toArray(arguments);\n var callback = args[args.length - 1];\n var nativeObject = this._store || this._index;\n var request = nativeObject[funcName].apply(nativeObject, args.slice(0, -1));\n request.onsuccess = function() {\n callback(request.result);\n };\n };\n });\n});\n\n// polyfill getAll\n[Index, ObjectStore].forEach(function(Constructor) {\n if (Constructor.prototype.getAll) return;\n Constructor.prototype.getAll = function(query, count) {\n var instance = this;\n var items = [];\n\n return new Promise(function(resolve) {\n instance.iterateCursor(query, function(cursor) {\n if (!cursor) {\n resolve(items);\n return;\n }\n items.push(cursor.value);\n\n if (count !== undefined && items.length == count) {\n resolve(items);\n return;\n }\n cursor.continue();\n });\n });\n };\n});\n\nexport function openDb(name, version, upgradeCallback) {\n var p = promisifyRequestCall(indexedDB, 'open', [name, version]);\n var request = p.request;\n\n if (request) {\n request.onupgradeneeded = function(event) {\n if (upgradeCallback) {\n upgradeCallback(new UpgradeDB(request.result, event.oldVersion, request.transaction));\n }\n };\n }\n\n return p.then(function(db) {\n return new DB(db);\n });\n}\n\nexport function deleteDb(name) {\n return promisifyRequestCall(indexedDB, 'deleteDatabase', [name]);\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 { version } from '../../package.json';\n\nexport const PENDING_TIMEOUT_MS = 10000;\n\nexport const PACKAGE_VERSION = `w:${version}`;\nexport const INTERNAL_AUTH_VERSION = 'FIS_v2';\n\nexport const INSTALLATIONS_API_URL =\n 'https://firebaseinstallations.googleapis.com/v1';\n\nexport const TOKEN_EXPIRATION_BUFFER = 60 * 60 * 1000; // One hour\n\nexport const SERVICE = 'installations';\nexport const SERVICE_NAME = 'Installations';\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ErrorFactory, FirebaseError } from '@firebase/util';\nimport { SERVICE, SERVICE_NAME } from './constants';\n\nexport const enum ErrorCode {\n MISSING_APP_CONFIG_VALUES = 'missing-app-config-values',\n NOT_REGISTERED = 'not-registered',\n INSTALLATION_NOT_FOUND = 'installation-not-found',\n REQUEST_FAILED = 'request-failed',\n APP_OFFLINE = 'app-offline',\n DELETE_PENDING_REGISTRATION = 'delete-pending-registration'\n}\n\nconst ERROR_DESCRIPTION_MAP: { readonly [key in ErrorCode]: string } = {\n [ErrorCode.MISSING_APP_CONFIG_VALUES]:\n 'Missing App configuration value: \"{$valueName}\"',\n [ErrorCode.NOT_REGISTERED]: 'Firebase Installation is not registered.',\n [ErrorCode.INSTALLATION_NOT_FOUND]: 'Firebase Installation not found.',\n [ErrorCode.REQUEST_FAILED]:\n '{$requestName} request failed with error \"{$serverCode} {$serverStatus}: {$serverMessage}\"',\n [ErrorCode.APP_OFFLINE]: 'Could not process request. Application offline.',\n [ErrorCode.DELETE_PENDING_REGISTRATION]:\n \"Can't delete installation while there is a pending registration request.\"\n};\n\ninterface ErrorParams {\n [ErrorCode.MISSING_APP_CONFIG_VALUES]: {\n valueName: string;\n };\n [ErrorCode.REQUEST_FAILED]: {\n requestName: string;\n [index: string]: string | number; // to make Typescript 3.8 happy\n } & ServerErrorData;\n}\n\nexport const ERROR_FACTORY = new ErrorFactory(\n SERVICE,\n SERVICE_NAME,\n ERROR_DESCRIPTION_MAP\n);\n\nexport interface ServerErrorData {\n serverCode: number;\n serverMessage: string;\n serverStatus: string;\n}\n\nexport type ServerError = FirebaseError & ServerErrorData;\n\n/** Returns true if error is a FirebaseError that is based on an error from the server. */\nexport function isServerError(error: unknown): error is ServerError {\n return (\n error instanceof FirebaseError &&\n error.code.includes(ErrorCode.REQUEST_FAILED)\n );\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseError } from '@firebase/util';\nimport { GenerateAuthTokenResponse } from '../interfaces/api-response';\nimport { AppConfig } from '../interfaces/app-config';\nimport {\n CompletedAuthToken,\n RegisteredInstallationEntry,\n RequestStatus\n} from '../interfaces/installation-entry';\nimport {\n INSTALLATIONS_API_URL,\n INTERNAL_AUTH_VERSION\n} from '../util/constants';\nimport { ERROR_FACTORY, ErrorCode } from '../util/errors';\n\nexport function getInstallationsEndpoint({ projectId }: AppConfig): string {\n return `${INSTALLATIONS_API_URL}/projects/${projectId}/installations`;\n}\n\nexport function extractAuthTokenInfoFromResponse(\n response: GenerateAuthTokenResponse\n): CompletedAuthToken {\n return {\n token: response.token,\n requestStatus: RequestStatus.COMPLETED,\n expiresIn: getExpiresInFromResponseExpiresIn(response.expiresIn),\n creationTime: Date.now()\n };\n}\n\nexport async function getErrorFromResponse(\n requestName: string,\n response: Response\n): Promise {\n const responseJson: ErrorResponse = await response.json();\n const errorData = responseJson.error;\n return ERROR_FACTORY.create(ErrorCode.REQUEST_FAILED, {\n requestName,\n serverCode: errorData.code,\n serverMessage: errorData.message,\n serverStatus: errorData.status\n });\n}\n\nexport function getHeaders({ apiKey }: AppConfig): Headers {\n return new Headers({\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-goog-api-key': apiKey\n });\n}\n\nexport function getHeadersWithAuth(\n appConfig: AppConfig,\n { refreshToken }: RegisteredInstallationEntry\n): Headers {\n const headers = getHeaders(appConfig);\n headers.append('Authorization', getAuthorizationHeader(refreshToken));\n return headers;\n}\n\nexport interface ErrorResponse {\n error: {\n code: number;\n message: string;\n status: string;\n };\n}\n\n/**\n * Calls the passed in fetch wrapper and returns the response.\n * If the returned response has a status of 5xx, re-runs the function once and\n * returns the response.\n */\nexport async function retryIfServerError(\n fn: () => Promise\n): Promise {\n const result = await fn();\n\n if (result.status >= 500 && result.status < 600) {\n // Internal Server Error. Retry request.\n return fn();\n }\n\n return result;\n}\n\nfunction getExpiresInFromResponseExpiresIn(responseExpiresIn: string): number {\n // This works because the server will never respond with fractions of a second.\n return Number(responseExpiresIn.replace('s', '000'));\n}\n\nfunction getAuthorizationHeader(refreshToken: string): string {\n return `${INTERNAL_AUTH_VERSION} ${refreshToken}`;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** Returns a promise that resolves after given time passes. */\nexport function sleep(ms: number): Promise {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function bufferToBase64UrlSafe(array: Uint8Array): string {\n const b64 = btoa(String.fromCharCode(...array));\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bufferToBase64UrlSafe } from './buffer-to-base64-url-safe';\n\nexport const VALID_FID_PATTERN = /^[cdef][\\w-]{21}$/;\nexport const INVALID_FID = '';\n\n/**\n * Generates a new FID using random values from Web Crypto API.\n * Returns an empty string if FID generation fails for any reason.\n */\nexport function generateFid(): string {\n try {\n // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5\n // bytes. our implementation generates a 17 byte array instead.\n const fidByteArray = new Uint8Array(17);\n const crypto =\n self.crypto || ((self as unknown) as { msCrypto: Crypto }).msCrypto;\n crypto.getRandomValues(fidByteArray);\n\n // Replace the first 4 random bits with the constant FID header of 0b0111.\n fidByteArray[0] = 0b01110000 + (fidByteArray[0] % 0b00010000);\n\n const fid = encode(fidByteArray);\n\n return VALID_FID_PATTERN.test(fid) ? fid : INVALID_FID;\n } catch {\n // FID generation errored\n return INVALID_FID;\n }\n}\n\n/** Converts a FID Uint8Array to a base64 string representation. */\nfunction encode(fidByteArray: Uint8Array): string {\n const b64String = bufferToBase64UrlSafe(fidByteArray);\n\n // Remove the 23rd character that was added because of the extra 4 bits at the\n // end of our 17 byte array, and the '=' padding.\n return b64String.substr(0, 22);\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AppConfig } from '../interfaces/app-config';\n\n/** Returns a string key that can be used to identify the app. */\nexport function getKey(appConfig: AppConfig): string {\n return `${appConfig.appName}!${appConfig.appId}`;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getKey } from '../util/get-key';\nimport { AppConfig } from '../interfaces/app-config';\nimport { IdChangeCallbackFn } from '../functions';\n\nconst fidChangeCallbacks: Map> = new Map();\n\n/**\n * Calls the onIdChange callbacks with the new FID value, and broadcasts the\n * change to other tabs.\n */\nexport function fidChanged(appConfig: AppConfig, fid: string): void {\n const key = getKey(appConfig);\n\n callFidChangeCallbacks(key, fid);\n broadcastFidChange(key, fid);\n}\n\nexport function addCallback(\n appConfig: AppConfig,\n callback: IdChangeCallbackFn\n): void {\n // Open the broadcast channel if it's not already open,\n // to be able to listen to change events from other tabs.\n getBroadcastChannel();\n\n const key = getKey(appConfig);\n\n let callbackSet = fidChangeCallbacks.get(key);\n if (!callbackSet) {\n callbackSet = new Set();\n fidChangeCallbacks.set(key, callbackSet);\n }\n callbackSet.add(callback);\n}\n\nexport function removeCallback(\n appConfig: AppConfig,\n callback: IdChangeCallbackFn\n): void {\n const key = getKey(appConfig);\n\n const callbackSet = fidChangeCallbacks.get(key);\n\n if (!callbackSet) {\n return;\n }\n\n callbackSet.delete(callback);\n if (callbackSet.size === 0) {\n fidChangeCallbacks.delete(key);\n }\n\n // Close broadcast channel if there are no more callbacks.\n closeBroadcastChannel();\n}\n\nfunction callFidChangeCallbacks(key: string, fid: string): void {\n const callbacks = fidChangeCallbacks.get(key);\n if (!callbacks) {\n return;\n }\n\n for (const callback of callbacks) {\n callback(fid);\n }\n}\n\nfunction broadcastFidChange(key: string, fid: string): void {\n const channel = getBroadcastChannel();\n if (channel) {\n channel.postMessage({ key, fid });\n }\n closeBroadcastChannel();\n}\n\nlet broadcastChannel: BroadcastChannel | null = null;\n/** Opens and returns a BroadcastChannel if it is supported by the browser. */\nfunction getBroadcastChannel(): BroadcastChannel | null {\n if (!broadcastChannel && 'BroadcastChannel' in self) {\n broadcastChannel = new BroadcastChannel('[Firebase] FID Change');\n broadcastChannel.onmessage = e => {\n callFidChangeCallbacks(e.data.key, e.data.fid);\n };\n }\n return broadcastChannel;\n}\n\nfunction closeBroadcastChannel(): void {\n if (fidChangeCallbacks.size === 0 && broadcastChannel) {\n broadcastChannel.close();\n broadcastChannel = null;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DB, openDb } from 'idb';\nimport { AppConfig } from '../interfaces/app-config';\nimport { InstallationEntry } from '../interfaces/installation-entry';\nimport { getKey } from '../util/get-key';\nimport { fidChanged } from './fid-changed';\n\nconst DATABASE_NAME = 'firebase-installations-database';\nconst DATABASE_VERSION = 1;\nconst OBJECT_STORE_NAME = 'firebase-installations-store';\n\nlet dbPromise: Promise | null = null;\nfunction getDbPromise(): Promise {\n if (!dbPromise) {\n dbPromise = openDb(DATABASE_NAME, DATABASE_VERSION, upgradeDB => {\n // We don't use 'break' in this switch statement, the fall-through\n // behavior is what we want, because if there are multiple versions between\n // the old version and the current version, we want ALL the migrations\n // that correspond to those versions to run, not only the last one.\n // eslint-disable-next-line default-case\n switch (upgradeDB.oldVersion) {\n case 0:\n upgradeDB.createObjectStore(OBJECT_STORE_NAME);\n }\n });\n }\n return dbPromise;\n}\n\n/** Gets record(s) from the objectStore that match the given key. */\nexport async function get(\n appConfig: AppConfig\n): Promise {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n return db\n .transaction(OBJECT_STORE_NAME)\n .objectStore(OBJECT_STORE_NAME)\n .get(key);\n}\n\n/** Assigns or overwrites the record for the given key with the given value. */\nexport async function set(\n appConfig: AppConfig,\n value: ValueType\n): Promise {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n const objectStore = tx.objectStore(OBJECT_STORE_NAME);\n const oldValue = await objectStore.get(key);\n await objectStore.put(value, key);\n await tx.complete;\n\n if (!oldValue || oldValue.fid !== value.fid) {\n fidChanged(appConfig, value.fid);\n }\n\n return value;\n}\n\n/** Removes record(s) from the objectStore that match the given key. */\nexport async function remove(appConfig: AppConfig): Promise {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\n await tx.complete;\n}\n\n/**\n * Atomically updates a record with the result of updateFn, which gets\n * called with the current value. If newValue is undefined, the record is\n * deleted instead.\n * @return Updated value\n */\nexport async function update(\n appConfig: AppConfig,\n updateFn: (previousValue: InstallationEntry | undefined) => ValueType\n): Promise {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n const store = tx.objectStore(OBJECT_STORE_NAME);\n const oldValue: InstallationEntry | undefined = await store.get(key);\n const newValue = updateFn(oldValue);\n\n if (newValue === undefined) {\n await store.delete(key);\n } else {\n await store.put(newValue, key);\n }\n await tx.complete;\n\n if (newValue && (!oldValue || oldValue.fid !== newValue.fid)) {\n fidChanged(appConfig, newValue.fid);\n }\n\n return newValue;\n}\n\nexport async function clear(): Promise {\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n await tx.objectStore(OBJECT_STORE_NAME).clear();\n await tx.complete;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport firebase from '@firebase/app';\nimport {\n _FirebaseNamespace,\n FirebaseService\n} from '@firebase/app-types/private';\nimport { Component, ComponentType } from '@firebase/component';\nimport { FirebaseInstallations } from '@firebase/installations-types';\nimport {\n deleteInstallation,\n getId,\n getToken,\n IdChangeCallbackFn,\n IdChangeUnsubscribeFn,\n onIdChange\n} from './functions';\nimport { extractAppConfig } from './helpers/extract-app-config';\nimport { FirebaseDependencies } from './interfaces/firebase-dependencies';\n\nimport { name, version } from '../package.json';\n\nexport function registerInstallations(instance: _FirebaseNamespace): void {\n const installationsName = 'installations';\n\n instance.INTERNAL.registerComponent(\n new Component(\n installationsName,\n container => {\n const app = container.getProvider('app').getImmediate();\n\n // Throws if app isn't configured properly.\n const appConfig = extractAppConfig(app);\n const platformLoggerProvider = container.getProvider('platform-logger');\n const dependencies: FirebaseDependencies = {\n appConfig,\n platformLoggerProvider\n };\n\n const installations: FirebaseInstallations & FirebaseService = {\n app,\n getId: () => getId(dependencies),\n getToken: (forceRefresh?: boolean) =>\n getToken(dependencies, forceRefresh),\n delete: () => deleteInstallation(dependencies),\n onIdChange: (callback: IdChangeCallbackFn): IdChangeUnsubscribeFn =>\n onIdChange(dependencies, callback)\n };\n return installations;\n },\n ComponentType.PUBLIC\n )\n );\n\n instance.registerVersion(name, version);\n}\n\nregisterInstallations(firebase as _FirebaseNamespace);\n\n/**\n * Define extension behavior of `registerInstallations`\n */\ndeclare module '@firebase/app-types' {\n interface FirebaseNamespace {\n installations(app?: FirebaseApp): FirebaseInstallations;\n }\n interface FirebaseApp {\n installations(): FirebaseInstallations;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createInstallationRequest } from '../api/create-installation-request';\nimport { AppConfig } from '../interfaces/app-config';\nimport {\n InProgressInstallationEntry,\n InstallationEntry,\n RegisteredInstallationEntry,\n RequestStatus\n} from '../interfaces/installation-entry';\nimport { PENDING_TIMEOUT_MS } from '../util/constants';\nimport { ERROR_FACTORY, ErrorCode, isServerError } from '../util/errors';\nimport { sleep } from '../util/sleep';\nimport { generateFid, INVALID_FID } from './generate-fid';\nimport { remove, set, update } from './idb-manager';\n\nexport interface InstallationEntryWithRegistrationPromise {\n installationEntry: InstallationEntry;\n /** Exist iff the installationEntry is not registered. */\n registrationPromise?: Promise;\n}\n\n/**\n * Updates and returns the InstallationEntry from the database.\n * Also triggers a registration request if it is necessary and possible.\n */\nexport async function getInstallationEntry(\n appConfig: AppConfig\n): Promise {\n let registrationPromise: Promise | undefined;\n\n const installationEntry = await update(appConfig, oldEntry => {\n const installationEntry = updateOrCreateInstallationEntry(oldEntry);\n const entryWithPromise = triggerRegistrationIfNecessary(\n appConfig,\n installationEntry\n );\n registrationPromise = entryWithPromise.registrationPromise;\n return entryWithPromise.installationEntry;\n });\n\n if (installationEntry.fid === INVALID_FID) {\n // FID generation failed. Waiting for the FID from the server.\n return { installationEntry: await registrationPromise! };\n }\n\n return {\n installationEntry,\n registrationPromise\n };\n}\n\n/**\n * Creates a new Installation Entry if one does not exist.\n * Also clears timed out pending requests.\n */\nfunction updateOrCreateInstallationEntry(\n oldEntry: InstallationEntry | undefined\n): InstallationEntry {\n const entry: InstallationEntry = oldEntry || {\n fid: generateFid(),\n registrationStatus: RequestStatus.NOT_STARTED\n };\n\n return clearTimedOutRequest(entry);\n}\n\n/**\n * If the Firebase Installation is not registered yet, this will trigger the\n * registration and return an InProgressInstallationEntry.\n *\n * If registrationPromise does not exist, the installationEntry is guaranteed\n * to be registered.\n */\nfunction triggerRegistrationIfNecessary(\n appConfig: AppConfig,\n installationEntry: InstallationEntry\n): InstallationEntryWithRegistrationPromise {\n if (installationEntry.registrationStatus === RequestStatus.NOT_STARTED) {\n if (!navigator.onLine) {\n // Registration required but app is offline.\n const registrationPromiseWithError = Promise.reject(\n ERROR_FACTORY.create(ErrorCode.APP_OFFLINE)\n );\n return {\n installationEntry,\n registrationPromise: registrationPromiseWithError\n };\n }\n\n // Try registering. Change status to IN_PROGRESS.\n const inProgressEntry: InProgressInstallationEntry = {\n fid: installationEntry.fid,\n registrationStatus: RequestStatus.IN_PROGRESS,\n registrationTime: Date.now()\n };\n const registrationPromise = registerInstallation(\n appConfig,\n inProgressEntry\n );\n return { installationEntry: inProgressEntry, registrationPromise };\n } else if (\n installationEntry.registrationStatus === RequestStatus.IN_PROGRESS\n ) {\n return {\n installationEntry,\n registrationPromise: waitUntilFidRegistration(appConfig)\n };\n } else {\n return { installationEntry };\n }\n}\n\n/** This will be executed only once for each new Firebase Installation. */\nasync function registerInstallation(\n appConfig: AppConfig,\n installationEntry: InProgressInstallationEntry\n): Promise {\n try {\n const registeredInstallationEntry = await createInstallationRequest(\n appConfig,\n installationEntry\n );\n return set(appConfig, registeredInstallationEntry);\n } catch (e) {\n if (isServerError(e) && e.serverCode === 409) {\n // Server returned a \"FID can not be used\" error.\n // Generate a new ID next time.\n await remove(appConfig);\n } else {\n // Registration failed. Set FID as not registered.\n await set(appConfig, {\n fid: installationEntry.fid,\n registrationStatus: RequestStatus.NOT_STARTED\n });\n }\n throw e;\n }\n}\n\n/** Call if FID registration is pending in another request. */\nasync function waitUntilFidRegistration(\n appConfig: AppConfig\n): Promise {\n // Unfortunately, there is no way of reliably observing when a value in\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\n // so we need to poll.\n\n let entry: InstallationEntry = await updateInstallationRequest(appConfig);\n while (entry.registrationStatus === RequestStatus.IN_PROGRESS) {\n // createInstallation request still in progress.\n await sleep(100);\n\n entry = await updateInstallationRequest(appConfig);\n }\n\n if (entry.registrationStatus === RequestStatus.NOT_STARTED) {\n // The request timed out or failed in a different call. Try again.\n const {\n installationEntry,\n registrationPromise\n } = await getInstallationEntry(appConfig);\n\n if (registrationPromise) {\n return registrationPromise;\n } else {\n // if there is no registrationPromise, entry is registered.\n return installationEntry as RegisteredInstallationEntry;\n }\n }\n\n return entry;\n}\n\n/**\n * Called only if there is a CreateInstallation request in progress.\n *\n * Updates the InstallationEntry in the DB based on the status of the\n * CreateInstallation request.\n *\n * Returns the updated InstallationEntry.\n */\nfunction updateInstallationRequest(\n appConfig: AppConfig\n): Promise {\n return update(appConfig, oldEntry => {\n if (!oldEntry) {\n throw ERROR_FACTORY.create(ErrorCode.INSTALLATION_NOT_FOUND);\n }\n return clearTimedOutRequest(oldEntry);\n });\n}\n\nfunction clearTimedOutRequest(entry: InstallationEntry): InstallationEntry {\n if (hasInstallationRequestTimedOut(entry)) {\n return {\n fid: entry.fid,\n registrationStatus: RequestStatus.NOT_STARTED\n };\n }\n\n return entry;\n}\n\nfunction hasInstallationRequestTimedOut(\n installationEntry: InstallationEntry\n): boolean {\n return (\n installationEntry.registrationStatus === RequestStatus.IN_PROGRESS &&\n installationEntry.registrationTime + PENDING_TIMEOUT_MS < Date.now()\n );\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CreateInstallationResponse } from '../interfaces/api-response';\nimport { AppConfig } from '../interfaces/app-config';\nimport {\n InProgressInstallationEntry,\n RegisteredInstallationEntry,\n RequestStatus\n} from '../interfaces/installation-entry';\nimport { INTERNAL_AUTH_VERSION, PACKAGE_VERSION } from '../util/constants';\nimport {\n extractAuthTokenInfoFromResponse,\n getErrorFromResponse,\n getHeaders,\n getInstallationsEndpoint,\n retryIfServerError\n} from './common';\n\nexport async function createInstallationRequest(\n appConfig: AppConfig,\n { fid }: InProgressInstallationEntry\n): Promise {\n const endpoint = getInstallationsEndpoint(appConfig);\n\n const headers = getHeaders(appConfig);\n const body = {\n fid,\n authVersion: INTERNAL_AUTH_VERSION,\n appId: appConfig.appId,\n sdkVersion: PACKAGE_VERSION\n };\n\n const request: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n\n const response = await retryIfServerError(() => fetch(endpoint, request));\n if (response.ok) {\n const responseValue: CreateInstallationResponse = await response.json();\n const registeredInstallationEntry: RegisteredInstallationEntry = {\n fid: responseValue.fid || fid,\n registrationStatus: RequestStatus.COMPLETED,\n refreshToken: responseValue.refreshToken,\n authToken: extractAuthTokenInfoFromResponse(responseValue.authToken)\n };\n return registeredInstallationEntry;\n } else {\n throw await getErrorFromResponse('Create Installation', response);\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { GenerateAuthTokenResponse } from '../interfaces/api-response';\nimport { AppConfig } from '../interfaces/app-config';\nimport { FirebaseDependencies } from '../interfaces/firebase-dependencies';\nimport {\n CompletedAuthToken,\n RegisteredInstallationEntry\n} from '../interfaces/installation-entry';\nimport { PACKAGE_VERSION } from '../util/constants';\nimport {\n extractAuthTokenInfoFromResponse,\n getErrorFromResponse,\n getHeadersWithAuth,\n getInstallationsEndpoint,\n retryIfServerError\n} from './common';\n\nexport async function generateAuthTokenRequest(\n { appConfig, platformLoggerProvider }: FirebaseDependencies,\n installationEntry: RegisteredInstallationEntry\n): Promise {\n const endpoint = getGenerateAuthTokenEndpoint(appConfig, installationEntry);\n\n const headers = getHeadersWithAuth(appConfig, installationEntry);\n\n // If platform logger exists, add the platform info string to the header.\n const platformLogger = platformLoggerProvider.getImmediate({\n optional: true\n });\n if (platformLogger) {\n headers.append('x-firebase-client', platformLogger.getPlatformInfoString());\n }\n\n const body = {\n installation: {\n sdkVersion: PACKAGE_VERSION\n }\n };\n\n const request: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n\n const response = await retryIfServerError(() => fetch(endpoint, request));\n if (response.ok) {\n const responseValue: GenerateAuthTokenResponse = await response.json();\n const completedAuthToken: CompletedAuthToken = extractAuthTokenInfoFromResponse(\n responseValue\n );\n return completedAuthToken;\n } else {\n throw await getErrorFromResponse('Generate Auth Token', response);\n }\n}\n\nfunction getGenerateAuthTokenEndpoint(\n appConfig: AppConfig,\n { fid }: RegisteredInstallationEntry\n): string {\n return `${getInstallationsEndpoint(appConfig)}/${fid}/authTokens:generate`;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { generateAuthTokenRequest } from '../api/generate-auth-token-request';\nimport { AppConfig } from '../interfaces/app-config';\nimport { FirebaseDependencies } from '../interfaces/firebase-dependencies';\nimport {\n AuthToken,\n CompletedAuthToken,\n InProgressAuthToken,\n InstallationEntry,\n RegisteredInstallationEntry,\n RequestStatus\n} from '../interfaces/installation-entry';\nimport { PENDING_TIMEOUT_MS, TOKEN_EXPIRATION_BUFFER } from '../util/constants';\nimport { ERROR_FACTORY, ErrorCode, isServerError } from '../util/errors';\nimport { sleep } from '../util/sleep';\nimport { remove, set, update } from './idb-manager';\n\n/**\n * Returns a valid authentication token for the installation. Generates a new\n * token if one doesn't exist, is expired or about to expire.\n *\n * Should only be called if the Firebase Installation is registered.\n */\nexport async function refreshAuthToken(\n dependencies: FirebaseDependencies,\n forceRefresh = false\n): Promise {\n let tokenPromise: Promise | undefined;\n const entry = await update(dependencies.appConfig, oldEntry => {\n if (!isEntryRegistered(oldEntry)) {\n throw ERROR_FACTORY.create(ErrorCode.NOT_REGISTERED);\n }\n\n const oldAuthToken = oldEntry.authToken;\n if (!forceRefresh && isAuthTokenValid(oldAuthToken)) {\n // There is a valid token in the DB.\n return oldEntry;\n } else if (oldAuthToken.requestStatus === RequestStatus.IN_PROGRESS) {\n // There already is a token request in progress.\n tokenPromise = waitUntilAuthTokenRequest(dependencies, forceRefresh);\n return oldEntry;\n } else {\n // No token or token expired.\n if (!navigator.onLine) {\n throw ERROR_FACTORY.create(ErrorCode.APP_OFFLINE);\n }\n\n const inProgressEntry = makeAuthTokenRequestInProgressEntry(oldEntry);\n tokenPromise = fetchAuthTokenFromServer(dependencies, inProgressEntry);\n return inProgressEntry;\n }\n });\n\n const authToken = tokenPromise\n ? await tokenPromise\n : (entry.authToken as CompletedAuthToken);\n return authToken;\n}\n\n/**\n * Call only if FID is registered and Auth Token request is in progress.\n *\n * Waits until the current pending request finishes. If the request times out,\n * tries once in this thread as well.\n */\nasync function waitUntilAuthTokenRequest(\n dependencies: FirebaseDependencies,\n forceRefresh: boolean\n): Promise {\n // Unfortunately, there is no way of reliably observing when a value in\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\n // so we need to poll.\n\n let entry = await updateAuthTokenRequest(dependencies.appConfig);\n while (entry.authToken.requestStatus === RequestStatus.IN_PROGRESS) {\n // generateAuthToken still in progress.\n await sleep(100);\n\n entry = await updateAuthTokenRequest(dependencies.appConfig);\n }\n\n const authToken = entry.authToken;\n if (authToken.requestStatus === RequestStatus.NOT_STARTED) {\n // The request timed out or failed in a different call. Try again.\n return refreshAuthToken(dependencies, forceRefresh);\n } else {\n return authToken;\n }\n}\n\n/**\n * Called only if there is a GenerateAuthToken request in progress.\n *\n * Updates the InstallationEntry in the DB based on the status of the\n * GenerateAuthToken request.\n *\n * Returns the updated InstallationEntry.\n */\nfunction updateAuthTokenRequest(\n appConfig: AppConfig\n): Promise {\n return update(appConfig, oldEntry => {\n if (!isEntryRegistered(oldEntry)) {\n throw ERROR_FACTORY.create(ErrorCode.NOT_REGISTERED);\n }\n\n const oldAuthToken = oldEntry.authToken;\n if (hasAuthTokenRequestTimedOut(oldAuthToken)) {\n return {\n ...oldEntry,\n authToken: { requestStatus: RequestStatus.NOT_STARTED }\n };\n }\n\n return oldEntry;\n });\n}\n\nasync function fetchAuthTokenFromServer(\n dependencies: FirebaseDependencies,\n installationEntry: RegisteredInstallationEntry\n): Promise {\n try {\n const authToken = await generateAuthTokenRequest(\n dependencies,\n installationEntry\n );\n const updatedInstallationEntry: RegisteredInstallationEntry = {\n ...installationEntry,\n authToken\n };\n await set(dependencies.appConfig, updatedInstallationEntry);\n return authToken;\n } catch (e) {\n if (isServerError(e) && (e.serverCode === 401 || e.serverCode === 404)) {\n // Server returned a \"FID not found\" or a \"Invalid authentication\" error.\n // Generate a new ID next time.\n await remove(dependencies.appConfig);\n } else {\n const updatedInstallationEntry: RegisteredInstallationEntry = {\n ...installationEntry,\n authToken: { requestStatus: RequestStatus.NOT_STARTED }\n };\n await set(dependencies.appConfig, updatedInstallationEntry);\n }\n throw e;\n }\n}\n\nfunction isEntryRegistered(\n installationEntry: InstallationEntry | undefined\n): installationEntry is RegisteredInstallationEntry {\n return (\n installationEntry !== undefined &&\n installationEntry.registrationStatus === RequestStatus.COMPLETED\n );\n}\n\nfunction isAuthTokenValid(authToken: AuthToken): boolean {\n return (\n authToken.requestStatus === RequestStatus.COMPLETED &&\n !isAuthTokenExpired(authToken)\n );\n}\n\nfunction isAuthTokenExpired(authToken: CompletedAuthToken): boolean {\n const now = Date.now();\n return (\n now < authToken.creationTime ||\n authToken.creationTime + authToken.expiresIn < now + TOKEN_EXPIRATION_BUFFER\n );\n}\n\n/** Returns an updated InstallationEntry with an InProgressAuthToken. */\nfunction makeAuthTokenRequestInProgressEntry(\n oldEntry: RegisteredInstallationEntry\n): RegisteredInstallationEntry {\n const inProgressAuthToken: InProgressAuthToken = {\n requestStatus: RequestStatus.IN_PROGRESS,\n requestTime: Date.now()\n };\n return {\n ...oldEntry,\n authToken: inProgressAuthToken\n };\n}\n\nfunction hasAuthTokenRequestTimedOut(authToken: AuthToken): boolean {\n return (\n authToken.requestStatus === RequestStatus.IN_PROGRESS &&\n authToken.requestTime + PENDING_TIMEOUT_MS < Date.now()\n );\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getInstallationEntry } from '../helpers/get-installation-entry';\nimport { refreshAuthToken } from '../helpers/refresh-auth-token';\nimport { AppConfig } from '../interfaces/app-config';\nimport { FirebaseDependencies } from '../interfaces/firebase-dependencies';\n\nexport async function getToken(\n dependencies: FirebaseDependencies,\n forceRefresh = false\n): Promise {\n await completeInstallationRegistration(dependencies.appConfig);\n\n // At this point we either have a Registered Installation in the DB, or we've\n // already thrown an error.\n const authToken = await refreshAuthToken(dependencies, forceRefresh);\n return authToken.token;\n}\n\nasync function completeInstallationRegistration(\n appConfig: AppConfig\n): Promise {\n const { registrationPromise } = await getInstallationEntry(appConfig);\n\n if (registrationPromise) {\n // A createInstallation request is in progress. Wait until it finishes.\n await registrationPromise;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AppConfig } from '../interfaces/app-config';\nimport { RegisteredInstallationEntry } from '../interfaces/installation-entry';\nimport {\n getErrorFromResponse,\n getHeadersWithAuth,\n getInstallationsEndpoint,\n retryIfServerError\n} from './common';\n\nexport async function deleteInstallationRequest(\n appConfig: AppConfig,\n installationEntry: RegisteredInstallationEntry\n): Promise {\n const endpoint = getDeleteEndpoint(appConfig, installationEntry);\n\n const headers = getHeadersWithAuth(appConfig, installationEntry);\n const request: RequestInit = {\n method: 'DELETE',\n headers\n };\n\n const response = await retryIfServerError(() => fetch(endpoint, request));\n if (!response.ok) {\n throw await getErrorFromResponse('Delete Installation', response);\n }\n}\n\nfunction getDeleteEndpoint(\n appConfig: AppConfig,\n { fid }: RegisteredInstallationEntry\n): string {\n return `${getInstallationsEndpoint(appConfig)}/${fid}`;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { addCallback, removeCallback } from '../helpers/fid-changed';\nimport { FirebaseDependencies } from '../interfaces/firebase-dependencies';\n\nexport type IdChangeCallbackFn = (installationId: string) => void;\nexport type IdChangeUnsubscribeFn = () => void;\n\n/**\n * Sets a new callback that will get called when Installation ID changes.\n * Returns an unsubscribe function that will remove the callback when called.\n */\nexport function onIdChange(\n { appConfig }: FirebaseDependencies,\n callback: IdChangeCallbackFn\n): IdChangeUnsubscribeFn {\n addCallback(appConfig, callback);\n\n return () => {\n removeCallback(appConfig, callback);\n };\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseApp, FirebaseOptions } from '@firebase/app-types';\nimport { FirebaseError } from '@firebase/util';\nimport { AppConfig } from '../interfaces/app-config';\nimport { ERROR_FACTORY, ErrorCode } from '../util/errors';\n\nexport function extractAppConfig(app: FirebaseApp): AppConfig {\n if (!app || !app.options) {\n throw getMissingValueError('App Configuration');\n }\n\n if (!app.name) {\n throw getMissingValueError('App Name');\n }\n\n // Required app config keys\n const configKeys: Array = [\n 'projectId',\n 'apiKey',\n 'appId'\n ];\n\n for (const keyName of configKeys) {\n if (!app.options[keyName]) {\n throw getMissingValueError(keyName);\n }\n }\n\n return {\n appName: app.name,\n projectId: app.options.projectId!,\n apiKey: app.options.apiKey!,\n appId: app.options.appId!\n };\n}\n\nfunction getMissingValueError(valueName: string): FirebaseError {\n return ERROR_FACTORY.create(ErrorCode.MISSING_APP_CONFIG_VALUES, {\n valueName\n });\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getInstallationEntry } from '../helpers/get-installation-entry';\nimport { refreshAuthToken } from '../helpers/refresh-auth-token';\nimport { FirebaseDependencies } from '../interfaces/firebase-dependencies';\n\nexport async function getId(\n dependencies: FirebaseDependencies\n): Promise {\n const { installationEntry, registrationPromise } = await getInstallationEntry(\n dependencies.appConfig\n );\n\n if (registrationPromise) {\n registrationPromise.catch(console.error);\n } else {\n // If the installation is already registered, update the authentication\n // token if needed.\n refreshAuthToken(dependencies).catch(console.error);\n }\n\n return installationEntry.fid;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { deleteInstallationRequest } from '../api/delete-installation-request';\nimport { remove, update } from '../helpers/idb-manager';\nimport { FirebaseDependencies } from '../interfaces/firebase-dependencies';\nimport { RequestStatus } from '../interfaces/installation-entry';\nimport { ERROR_FACTORY, ErrorCode } from '../util/errors';\n\nexport async function deleteInstallation(\n dependencies: FirebaseDependencies\n): Promise {\n const { appConfig } = dependencies;\n\n const entry = await update(appConfig, oldEntry => {\n if (oldEntry && oldEntry.registrationStatus === RequestStatus.NOT_STARTED) {\n // Delete the unregistered entry without sending a deleteInstallation request.\n return undefined;\n }\n return oldEntry;\n });\n\n if (entry) {\n if (entry.registrationStatus === RequestStatus.IN_PROGRESS) {\n // Can't delete while trying to register.\n throw ERROR_FACTORY.create(ErrorCode.DELETE_PENDING_REGISTRATION);\n } else if (entry.registrationStatus === RequestStatus.COMPLETED) {\n if (!navigator.onLine) {\n throw ERROR_FACTORY.create(ErrorCode.APP_OFFLINE);\n } else {\n await deleteInstallationRequest(appConfig, entry);\n await remove(appConfig);\n }\n }\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ERROR_FACTORY, ErrorCode } from '../utils/errors';\n\ndeclare global {\n interface Window {\n PerformanceObserver: typeof PerformanceObserver;\n perfMetrics?: { onFirstInputDelay: Function };\n }\n}\n\nlet apiInstance: Api | undefined;\nlet windowInstance: Window | undefined;\n\nexport type EntryType =\n | 'mark'\n | 'measure'\n | 'paint'\n | 'resource'\n | 'frame'\n | 'navigation';\n\n/**\n * This class holds a reference to various browser related objects injected by\n * set methods.\n */\nexport class Api {\n private readonly performance: Performance;\n /** PreformanceObserver constructor function. */\n private readonly PerformanceObserver: typeof PerformanceObserver;\n private readonly windowLocation: Location;\n readonly onFirstInputDelay?: Function;\n readonly localStorage?: Storage;\n readonly document: Document;\n readonly navigator: Navigator;\n\n constructor(readonly window?: Window) {\n if (!window) {\n throw ERROR_FACTORY.create(ErrorCode.NO_WINDOW);\n }\n this.performance = window.performance;\n this.PerformanceObserver = window.PerformanceObserver;\n this.windowLocation = window.location;\n this.navigator = window.navigator;\n this.document = window.document;\n if (this.navigator && this.navigator.cookieEnabled) {\n // If user blocks cookies on the browser, accessing localStorage will\n // throw an exception.\n this.localStorage = window.localStorage;\n }\n if (window.perfMetrics && window.perfMetrics.onFirstInputDelay) {\n this.onFirstInputDelay = window.perfMetrics.onFirstInputDelay;\n }\n }\n\n getUrl(): string {\n // Do not capture the string query part of url.\n return this.windowLocation.href.split('?')[0];\n }\n\n mark(name: string): void {\n if (!this.performance || !this.performance.mark) {\n return;\n }\n this.performance.mark(name);\n }\n\n measure(measureName: string, mark1: string, mark2: string): void {\n if (!this.performance || !this.performance.measure) {\n return;\n }\n this.performance.measure(measureName, mark1, mark2);\n }\n\n getEntriesByType(type: EntryType): PerformanceEntry[] {\n if (!this.performance || !this.performance.getEntriesByType) {\n return [];\n }\n return this.performance.getEntriesByType(type);\n }\n\n getEntriesByName(name: string): PerformanceEntry[] {\n if (!this.performance || !this.performance.getEntriesByName) {\n return [];\n }\n return this.performance.getEntriesByName(name);\n }\n\n getTimeOrigin(): number {\n // Polyfill the time origin with performance.timing.navigationStart.\n return (\n this.performance &&\n (this.performance.timeOrigin || this.performance.timing.navigationStart)\n );\n }\n\n requiredApisAvailable(): boolean {\n if (fetch && Promise && this.navigator && this.navigator.cookieEnabled) {\n return true;\n }\n return false;\n }\n\n setupObserver(\n entryType: EntryType,\n callback: (entry: PerformanceEntry) => void\n ): void {\n if (!this.PerformanceObserver) {\n return;\n }\n const observer = new this.PerformanceObserver(list => {\n for (const entry of list.getEntries()) {\n // `entry` is a PerformanceEntry instance.\n callback(entry);\n }\n });\n\n // Start observing the entry types you care about.\n observer.observe({ entryTypes: [entryType] });\n }\n\n static getInstance(): Api {\n if (apiInstance === undefined) {\n apiInstance = new Api(windowInstance);\n }\n return apiInstance;\n }\n}\n\nexport function setupApi(window: Window): void {\n windowInstance = window;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseApp } from '@firebase/app-types';\nimport { ERROR_FACTORY, ErrorCode } from '../utils/errors';\nimport { FirebaseInstallations } from '@firebase/installations-types';\nimport { mergeStrings } from '../utils/string_merger';\n\nlet settingsServiceInstance: SettingsService | undefined;\n\nexport class SettingsService {\n // The variable which controls logging of automatic traces and HTTP/S network monitoring.\n instrumentationEnabled = true;\n\n // The variable which controls logging of custom traces.\n dataCollectionEnabled = true;\n\n // Configuration flags set through remote config.\n loggingEnabled = false;\n // Sampling rate between 0 and 1.\n tracesSamplingRate = 1;\n networkRequestsSamplingRate = 1;\n\n // Address of logging service.\n logEndPointUrl =\n 'https://firebaselogging.googleapis.com/v0cc/log?format=json_proto';\n // Performance event transport endpoint URL which should be compatible with proto3.\n // New Address for transport service, not configurable via Remote Config.\n flTransportEndpointUrl = mergeStrings(\n 'hts/frbslgigp.ogepscmv/ieo/eaylg',\n 'tp:/ieaeogn-agolai.o/1frlglgc/o'\n );\n\n transportKey = mergeStrings('AzSC8r6ReiGqFMyfvgow', 'Iayx0u-XT3vksVM-pIV');\n\n // Source type for performance event logs.\n logSource = 462;\n\n // Flags which control per session logging of traces and network requests.\n logTraceAfterSampling = false;\n logNetworkAfterSampling = false;\n\n // TTL of config retrieved from remote config in hours.\n configTimeToLive = 12;\n\n firebaseAppInstance!: FirebaseApp;\n\n installationsService!: FirebaseInstallations;\n\n getAppId(): string {\n const appId =\n this.firebaseAppInstance &&\n this.firebaseAppInstance.options &&\n this.firebaseAppInstance.options.appId;\n if (!appId) {\n throw ERROR_FACTORY.create(ErrorCode.NO_APP_ID);\n }\n return appId;\n }\n\n getProjectId(): string {\n const projectId =\n this.firebaseAppInstance &&\n this.firebaseAppInstance.options &&\n this.firebaseAppInstance.options.projectId;\n if (!projectId) {\n throw ERROR_FACTORY.create(ErrorCode.NO_PROJECT_ID);\n }\n return projectId;\n }\n\n getApiKey(): string {\n const apiKey =\n this.firebaseAppInstance &&\n this.firebaseAppInstance.options &&\n this.firebaseAppInstance.options.apiKey;\n if (!apiKey) {\n throw ERROR_FACTORY.create(ErrorCode.NO_API_KEY);\n }\n return apiKey;\n }\n\n getFlTransportFullUrl(): string {\n return this.flTransportEndpointUrl.concat('?key=', this.transportKey);\n }\n\n static getInstance(): SettingsService {\n if (settingsServiceInstance === undefined) {\n settingsServiceInstance = new SettingsService();\n }\n return settingsServiceInstance;\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 { version } from '../package.json';\n\nexport const SDK_VERSION = version;\n/** The prefix for start User Timing marks used for creating Traces. */\nexport const TRACE_START_MARK_PREFIX = 'FB-PERF-TRACE-START';\n/** The prefix for stop User Timing marks used for creating Traces. */\nexport const TRACE_STOP_MARK_PREFIX = 'FB-PERF-TRACE-STOP';\n/** The prefix for User Timing measure used for creating Traces. */\nexport const TRACE_MEASURE_PREFIX = 'FB-PERF-TRACE-MEASURE';\n/** The prefix for out of the box page load Trace name. */\nexport const OOB_TRACE_PAGE_LOAD_PREFIX = '_wt_';\n\nexport const FIRST_PAINT_COUNTER_NAME = '_fp';\n\nexport const FIRST_CONTENTFUL_PAINT_COUNTER_NAME = '_fcp';\n\nexport const FIRST_INPUT_DELAY_COUNTER_NAME = '_fid';\n\nexport const CONFIG_LOCAL_STORAGE_KEY = '@firebase/performance/config';\n\nexport const CONFIG_EXPIRY_LOCAL_STORAGE_KEY =\n '@firebase/performance/configexpire';\n\nexport const SERVICE = 'performance';\nexport const SERVICE_NAME = 'Performance';\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ErrorFactory } from '@firebase/util';\nimport { SERVICE, SERVICE_NAME } from '../constants';\n\nexport const enum ErrorCode {\n TRACE_STARTED_BEFORE = 'trace started',\n TRACE_STOPPED_BEFORE = 'trace stopped',\n NO_WINDOW = 'no window',\n NO_APP_ID = 'no app id',\n NO_PROJECT_ID = 'no project id',\n NO_API_KEY = 'no api key',\n INVALID_CC_LOG = 'invalid cc log',\n FB_NOT_DEFAULT = 'FB not default',\n RC_NOT_OK = 'RC response not ok',\n INVALID_ATTRIBUTE_NAME = 'invalid attribute name',\n INVALID_ATTRIBUTE_VALUE = 'invalid attribute value',\n INVALID_CUSTOM_METRIC_NAME = 'invalid custom metric name',\n INVALID_STRING_MERGER_PARAMETER = 'invalid String merger input'\n}\n\nconst ERROR_DESCRIPTION_MAP: { readonly [key in ErrorCode]: string } = {\n [ErrorCode.TRACE_STARTED_BEFORE]: 'Trace {$traceName} was started before.',\n [ErrorCode.TRACE_STOPPED_BEFORE]: 'Trace {$traceName} is not running.',\n [ErrorCode.NO_WINDOW]: 'Window is not available.',\n [ErrorCode.NO_APP_ID]: 'App id is not available.',\n [ErrorCode.NO_PROJECT_ID]: 'Project id is not available.',\n [ErrorCode.NO_API_KEY]: 'Api key is not available.',\n [ErrorCode.INVALID_CC_LOG]: 'Attempted to queue invalid cc event',\n [ErrorCode.FB_NOT_DEFAULT]:\n 'Performance can only start when Firebase app instance is the default one.',\n [ErrorCode.RC_NOT_OK]: 'RC response is not ok',\n [ErrorCode.INVALID_ATTRIBUTE_NAME]:\n 'Attribute name {$attributeName} is invalid.',\n [ErrorCode.INVALID_ATTRIBUTE_VALUE]:\n 'Attribute value {$attributeValue} is invalid.',\n [ErrorCode.INVALID_CUSTOM_METRIC_NAME]:\n 'Custom metric name {$customMetricName} is invalid',\n [ErrorCode.INVALID_STRING_MERGER_PARAMETER]:\n 'Input for String merger is invalid, contact support team to resolve.'\n};\n\ninterface ErrorParams {\n [ErrorCode.TRACE_STARTED_BEFORE]: { traceName: string };\n [ErrorCode.TRACE_STOPPED_BEFORE]: { traceName: string };\n [ErrorCode.INVALID_ATTRIBUTE_NAME]: { attributeName: string };\n [ErrorCode.INVALID_ATTRIBUTE_VALUE]: { attributeValue: string };\n [ErrorCode.INVALID_CUSTOM_METRIC_NAME]: { customMetricName: string };\n}\n\nexport const ERROR_FACTORY = new ErrorFactory(\n SERVICE,\n SERVICE_NAME,\n ERROR_DESCRIPTION_MAP\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 { ERROR_FACTORY, ErrorCode } from './errors';\n\nexport function mergeStrings(part1: string, part2: string): string {\n const sizeDiff = part1.length - part2.length;\n if (sizeDiff < 0 || sizeDiff > 1) {\n throw ERROR_FACTORY.create(ErrorCode.INVALID_STRING_MERGER_PARAMETER);\n }\n\n const resultArray = [];\n for (let i = 0; i < part1.length; i++) {\n resultArray.push(part1.charAt(i));\n if (part2.length > i) {\n resultArray.push(part2.charAt(i));\n }\n }\n\n return resultArray.join('');\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 */\nimport { SettingsService } from './settings_service';\n\nlet iid: string | undefined;\nlet authToken: string | undefined;\n\nexport function getIidPromise(): Promise {\n const iidPromise = SettingsService.getInstance().installationsService.getId();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n iidPromise.then((iidVal: string) => {\n iid = iidVal;\n });\n return iidPromise;\n}\n\n// This method should be used after the iid is retrieved by getIidPromise method.\nexport function getIid(): string | undefined {\n return iid;\n}\n\nexport function getAuthTokenPromise(): Promise {\n const authTokenPromise = SettingsService.getInstance().installationsService.getToken();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n authTokenPromise.then((authTokenVal: string) => {\n authToken = authTokenVal;\n });\n return authTokenPromise;\n}\n\nexport function getAuthenticationToken(): string | undefined {\n return authToken;\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 { Api } from '../services/api_service';\n\n// The values and orders of the following enums should not be changed.\nconst enum ServiceWorkerStatus {\n UNKNOWN = 0,\n UNSUPPORTED = 1,\n CONTROLLED = 2,\n UNCONTROLLED = 3\n}\n\nexport enum VisibilityState {\n UNKNOWN = 0,\n VISIBLE = 1,\n HIDDEN = 2\n}\n\nconst enum EffectiveConnectionType {\n UNKNOWN = 0,\n CONNECTION_SLOW_2G = 1,\n CONNECTION_2G = 2,\n CONNECTION_3G = 3,\n CONNECTION_4G = 4\n}\n\n/**\n * NetworkInformation\n *\n * ref: https://developer.mozilla.org/en-US/docs/Web/API/NetworkInformation\n */\ninterface NetworkInformation {\n readonly effectiveType?: 'slow-2g' | '2g' | '3g' | '4g';\n}\n\ninterface NavigatorWithConnection extends Navigator {\n readonly connection: NetworkInformation;\n}\n\nconst RESERVED_ATTRIBUTE_PREFIXES = ['firebase_', 'google_', 'ga_'];\nconst ATTRIBUTE_FORMAT_REGEX = new RegExp('^[a-zA-Z]\\\\w*$');\nconst MAX_ATTRIBUTE_NAME_LENGTH = 40;\nconst MAX_ATTRIBUTE_VALUE_LENGTH = 100;\n\nexport function getServiceWorkerStatus(): ServiceWorkerStatus {\n const navigator = Api.getInstance().navigator;\n if ('serviceWorker' in navigator) {\n if (navigator.serviceWorker.controller) {\n return ServiceWorkerStatus.CONTROLLED;\n } else {\n return ServiceWorkerStatus.UNCONTROLLED;\n }\n } else {\n return ServiceWorkerStatus.UNSUPPORTED;\n }\n}\n\nexport function getVisibilityState(): VisibilityState {\n const document = Api.getInstance().document;\n const visibilityState = document.visibilityState;\n switch (visibilityState) {\n case 'visible':\n return VisibilityState.VISIBLE;\n case 'hidden':\n return VisibilityState.HIDDEN;\n default:\n return VisibilityState.UNKNOWN;\n }\n}\n\nexport function getEffectiveConnectionType(): EffectiveConnectionType {\n const navigator = Api.getInstance().navigator;\n const navigatorConnection = (navigator as NavigatorWithConnection).connection;\n const effectiveType =\n navigatorConnection && navigatorConnection.effectiveType;\n switch (effectiveType) {\n case 'slow-2g':\n return EffectiveConnectionType.CONNECTION_SLOW_2G;\n case '2g':\n return EffectiveConnectionType.CONNECTION_2G;\n case '3g':\n return EffectiveConnectionType.CONNECTION_3G;\n case '4g':\n return EffectiveConnectionType.CONNECTION_4G;\n default:\n return EffectiveConnectionType.UNKNOWN;\n }\n}\n\nexport function isValidCustomAttributeName(name: string): boolean {\n if (name.length === 0 || name.length > MAX_ATTRIBUTE_NAME_LENGTH) {\n return false;\n }\n const matchesReservedPrefix = RESERVED_ATTRIBUTE_PREFIXES.some(prefix =>\n name.startsWith(prefix)\n );\n return !matchesReservedPrefix && !!name.match(ATTRIBUTE_FORMAT_REGEX);\n}\n\nexport function isValidCustomAttributeValue(value: string): boolean {\n return value.length !== 0 && value.length <= MAX_ATTRIBUTE_VALUE_LENGTH;\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 { Logger, LogLevel } from '@firebase/logger';\nimport { SERVICE_NAME } from '../constants';\n\nexport const consoleLogger = new Logger(SERVICE_NAME);\nconsoleLogger.logLevel = LogLevel.INFO;\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 CONFIG_EXPIRY_LOCAL_STORAGE_KEY,\n CONFIG_LOCAL_STORAGE_KEY,\n SDK_VERSION\n} from '../constants';\nimport { consoleLogger } from '../utils/console_logger';\nimport { ERROR_FACTORY, ErrorCode } from '../utils/errors';\n\nimport { Api } from './api_service';\nimport { getAuthTokenPromise } from './iid_service';\nimport { SettingsService } from './settings_service';\n\nconst REMOTE_CONFIG_SDK_VERSION = '0.0.1';\n\ninterface SecondaryConfig {\n loggingEnabled?: boolean;\n logSource?: number;\n logEndPointUrl?: string;\n transportKey?: string;\n tracesSamplingRate?: number;\n networkRequestsSamplingRate?: number;\n}\n\n// These values will be used if the remote config object is successfully\n// retrieved, but the template does not have these fields.\nconst DEFAULT_CONFIGS: SecondaryConfig = {\n loggingEnabled: true\n};\n\n/* eslint-disable camelcase */\ninterface RemoteConfigTemplate {\n fpr_enabled?: string;\n fpr_log_source?: string;\n fpr_log_endpoint_url?: string;\n fpr_log_transport_key?: string;\n fpr_log_transport_web_percent?: string;\n fpr_vc_network_request_sampling_rate?: string;\n fpr_vc_trace_sampling_rate?: string;\n fpr_vc_session_sampling_rate?: string;\n}\n/* eslint-enable camelcase */\n\ninterface RemoteConfigResponse {\n entries?: RemoteConfigTemplate;\n state?: string;\n}\n\nconst FIS_AUTH_PREFIX = 'FIREBASE_INSTALLATIONS_AUTH';\n\nexport function getConfig(iid: string): Promise {\n const config = getStoredConfig();\n if (config) {\n processConfig(config);\n return Promise.resolve();\n }\n\n return getRemoteConfig(iid)\n .then(processConfig)\n .then(\n config => storeConfig(config),\n /** Do nothing for error, use defaults set in settings service. */\n () => {}\n );\n}\n\nfunction getStoredConfig(): RemoteConfigResponse | undefined {\n const localStorage = Api.getInstance().localStorage;\n if (!localStorage) {\n return;\n }\n const expiryString = localStorage.getItem(CONFIG_EXPIRY_LOCAL_STORAGE_KEY);\n if (!expiryString || !configValid(expiryString)) {\n return;\n }\n\n const configStringified = localStorage.getItem(CONFIG_LOCAL_STORAGE_KEY);\n if (!configStringified) {\n return;\n }\n try {\n const configResponse: RemoteConfigResponse = JSON.parse(configStringified);\n return configResponse;\n } catch {\n return;\n }\n}\n\nfunction storeConfig(config: RemoteConfigResponse | undefined): void {\n const localStorage = Api.getInstance().localStorage;\n if (!config || !localStorage) {\n return;\n }\n\n localStorage.setItem(CONFIG_LOCAL_STORAGE_KEY, JSON.stringify(config));\n localStorage.setItem(\n CONFIG_EXPIRY_LOCAL_STORAGE_KEY,\n String(\n Date.now() +\n SettingsService.getInstance().configTimeToLive * 60 * 60 * 1000\n )\n );\n}\n\nconst COULD_NOT_GET_CONFIG_MSG =\n 'Could not fetch config, will use default configs';\n\nfunction getRemoteConfig(\n iid: string\n): Promise {\n // Perf needs auth token only to retrieve remote config.\n return getAuthTokenPromise()\n .then(authToken => {\n const projectId = SettingsService.getInstance().getProjectId();\n const configEndPoint = `https://firebaseremoteconfig.googleapis.com/v1/projects/${projectId}/namespaces/fireperf:fetch?key=${SettingsService.getInstance().getApiKey()}`;\n const request = new Request(configEndPoint, {\n method: 'POST',\n headers: { Authorization: `${FIS_AUTH_PREFIX} ${authToken}` },\n /* eslint-disable camelcase */\n body: JSON.stringify({\n app_instance_id: iid,\n app_instance_id_token: authToken,\n app_id: SettingsService.getInstance().getAppId(),\n app_version: SDK_VERSION,\n sdk_version: REMOTE_CONFIG_SDK_VERSION\n })\n /* eslint-enable camelcase */\n });\n return fetch(request).then(response => {\n if (response.ok) {\n return response.json() as RemoteConfigResponse;\n }\n // In case response is not ok. This will be caught by catch.\n throw ERROR_FACTORY.create(ErrorCode.RC_NOT_OK);\n });\n })\n .catch(() => {\n consoleLogger.info(COULD_NOT_GET_CONFIG_MSG);\n return undefined;\n });\n}\n\n/**\n * Processes config coming either from calling RC or from local storage.\n * This method only runs if call is successful or config in storage\n * is valid.\n */\nfunction processConfig(\n config?: RemoteConfigResponse\n): RemoteConfigResponse | undefined {\n if (!config) {\n return config;\n }\n const settingsServiceInstance = SettingsService.getInstance();\n const entries = config.entries || {};\n if (entries.fpr_enabled !== undefined) {\n // TODO: Change the assignment of loggingEnabled once the received type is\n // known.\n settingsServiceInstance.loggingEnabled =\n String(entries.fpr_enabled) === 'true';\n } else if (DEFAULT_CONFIGS.loggingEnabled !== undefined) {\n // Config retrieved successfully, but there is no fpr_enabled in template.\n // Use secondary configs value.\n settingsServiceInstance.loggingEnabled = DEFAULT_CONFIGS.loggingEnabled;\n }\n if (entries.fpr_log_source) {\n settingsServiceInstance.logSource = Number(entries.fpr_log_source);\n } else if (DEFAULT_CONFIGS.logSource) {\n settingsServiceInstance.logSource = DEFAULT_CONFIGS.logSource;\n }\n\n if (entries.fpr_log_endpoint_url) {\n settingsServiceInstance.logEndPointUrl = entries.fpr_log_endpoint_url;\n } else if (DEFAULT_CONFIGS.logEndPointUrl) {\n settingsServiceInstance.logEndPointUrl = DEFAULT_CONFIGS.logEndPointUrl;\n }\n\n // Key from Remote Config has to be non-empty string, otherwsie use local value.\n if (entries.fpr_log_transport_key) {\n settingsServiceInstance.transportKey = entries.fpr_log_transport_key;\n } else if (DEFAULT_CONFIGS.transportKey) {\n settingsServiceInstance.transportKey = DEFAULT_CONFIGS.transportKey;\n }\n\n if (entries.fpr_vc_network_request_sampling_rate !== undefined) {\n settingsServiceInstance.networkRequestsSamplingRate = Number(\n entries.fpr_vc_network_request_sampling_rate\n );\n } else if (DEFAULT_CONFIGS.networkRequestsSamplingRate !== undefined) {\n settingsServiceInstance.networkRequestsSamplingRate =\n DEFAULT_CONFIGS.networkRequestsSamplingRate;\n }\n if (entries.fpr_vc_trace_sampling_rate !== undefined) {\n settingsServiceInstance.tracesSamplingRate = Number(\n entries.fpr_vc_trace_sampling_rate\n );\n } else if (DEFAULT_CONFIGS.tracesSamplingRate !== undefined) {\n settingsServiceInstance.tracesSamplingRate =\n DEFAULT_CONFIGS.tracesSamplingRate;\n }\n // Set the per session trace and network logging flags.\n settingsServiceInstance.logTraceAfterSampling = shouldLogAfterSampling(\n settingsServiceInstance.tracesSamplingRate\n );\n settingsServiceInstance.logNetworkAfterSampling = shouldLogAfterSampling(\n settingsServiceInstance.networkRequestsSamplingRate\n );\n return config;\n}\n\nfunction configValid(expiry: string): boolean {\n return Number(expiry) > Date.now();\n}\n\nfunction shouldLogAfterSampling(samplingRate: number): boolean {\n return Math.random() <= samplingRate;\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 { getIidPromise } from './iid_service';\nimport { getConfig } from './remote_config_service';\nimport { Api } from './api_service';\n\nconst enum InitializationStatus {\n notInitialized = 1,\n initializationPending,\n initialized\n}\n\nlet initializationStatus = InitializationStatus.notInitialized;\n\nlet initializationPromise: Promise | undefined;\n\nexport function getInitializationPromise(): Promise {\n initializationStatus = InitializationStatus.initializationPending;\n\n initializationPromise = initializationPromise || initializePerf();\n\n return initializationPromise;\n}\n\nexport function isPerfInitialized(): boolean {\n return initializationStatus === InitializationStatus.initialized;\n}\n\nfunction initializePerf(): Promise {\n return getDocumentReadyComplete()\n .then(() => getIidPromise())\n .then(iid => getConfig(iid))\n .then(\n () => changeInitializationStatus(),\n () => changeInitializationStatus()\n );\n}\n\n/**\n * Returns a promise which resolves whenever the document readystate is complete or\n * immediately if it is called after page load complete.\n */\nfunction getDocumentReadyComplete(): Promise {\n const document = Api.getInstance().document;\n return new Promise(resolve => {\n if (document && document.readyState !== 'complete') {\n const handler = (): void => {\n if (document.readyState === 'complete') {\n document.removeEventListener('readystatechange', handler);\n resolve();\n }\n };\n document.addEventListener('readystatechange', handler);\n } else {\n resolve();\n }\n });\n}\n\nfunction changeInitializationStatus(): void {\n initializationStatus = InitializationStatus.initialized;\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 { SettingsService } from './settings_service';\nimport { ERROR_FACTORY, ErrorCode } from '../utils/errors';\nimport { consoleLogger } from '../utils/console_logger';\n\nconst DEFAULT_SEND_INTERVAL_MS = 10 * 1000;\nconst INITIAL_SEND_TIME_DELAY_MS = 5.5 * 1000;\n// If end point does not work, the call will be tried for these many times.\nconst DEFAULT_REMAINING_TRIES = 3;\nlet remainingTries = DEFAULT_REMAINING_TRIES;\n\ninterface LogResponseDetails {\n responseAction?: string;\n}\n\ninterface BatchEvent {\n message: string;\n eventTime: number;\n}\n\n/* eslint-disable camelcase */\n// CC/Fl accepted log format.\ninterface TransportBatchLogFormat {\n request_time_ms: string;\n client_info: ClientInfo;\n log_source: number;\n log_event: Log[];\n}\n\ninterface ClientInfo {\n client_type: number;\n js_client_info: {};\n}\n\ninterface Log {\n source_extension_json_proto3: string;\n event_time_ms: string;\n}\n/* eslint-enable camelcase */\n\nlet queue: BatchEvent[] = [];\n\nlet isTransportSetup: boolean = false;\n\nexport function setupTransportService(): void {\n if (!isTransportSetup) {\n processQueue(INITIAL_SEND_TIME_DELAY_MS);\n isTransportSetup = true;\n }\n}\n\n/**\n * Utilized by testing to clean up message queue and un-initialize transport service.\n */\nexport function resetTransportService(): void {\n isTransportSetup = false;\n queue = [];\n}\n\nfunction processQueue(timeOffset: number): void {\n setTimeout(() => {\n // If there is no remainingTries left, stop retrying.\n if (remainingTries === 0) {\n return;\n }\n\n // If there are no events to process, wait for DEFAULT_SEND_INTERVAL_MS and try again.\n if (!queue.length) {\n return processQueue(DEFAULT_SEND_INTERVAL_MS);\n }\n\n dispatchQueueEvents();\n }, timeOffset);\n}\n\nfunction dispatchQueueEvents(): void {\n // Capture a snapshot of the queue and empty the \"official queue\".\n const staged = [...queue];\n queue = [];\n\n /* eslint-disable camelcase */\n // We will pass the JSON serialized event to the backend.\n const log_event: Log[] = staged.map(evt => ({\n source_extension_json_proto3: evt.message,\n event_time_ms: String(evt.eventTime)\n }));\n\n const data: TransportBatchLogFormat = {\n request_time_ms: String(Date.now()),\n client_info: {\n client_type: 1, // 1 is JS\n js_client_info: {}\n },\n log_source: SettingsService.getInstance().logSource,\n log_event\n };\n /* eslint-enable camelcase */\n\n sendEventsToFl(data, staged).catch(() => {\n // If the request fails for some reason, add the events that were attempted\n // back to the primary queue to retry later.\n queue = [...staged, ...queue];\n remainingTries--;\n consoleLogger.info(`Tries left: ${remainingTries}.`);\n processQueue(DEFAULT_SEND_INTERVAL_MS);\n });\n}\n\nfunction sendEventsToFl(\n data: TransportBatchLogFormat,\n staged: BatchEvent[]\n): Promise {\n return postToFlEndpoint(data)\n .then(res => {\n if (!res.ok) {\n consoleLogger.info('Call to Firebase backend failed.');\n }\n return res.json();\n })\n .then(res => {\n // Find the next call wait time from the response.\n const transportWait = Number(res.nextRequestWaitMillis);\n let requestOffset = DEFAULT_SEND_INTERVAL_MS;\n if (!isNaN(transportWait)) {\n requestOffset = Math.max(transportWait, requestOffset);\n }\n\n // Delete request if response include RESPONSE_ACTION_UNKNOWN or DELETE_REQUEST action.\n // Otherwise, retry request using normal scheduling if response include RETRY_REQUEST_LATER.\n const logResponseDetails: LogResponseDetails[] = res.logResponseDetails;\n if (\n Array.isArray(logResponseDetails) &&\n logResponseDetails.length > 0 &&\n logResponseDetails[0].responseAction === 'RETRY_REQUEST_LATER'\n ) {\n queue = [...staged, ...queue];\n consoleLogger.info(`Retry transport request later.`);\n }\n\n remainingTries = DEFAULT_REMAINING_TRIES;\n // Schedule the next process.\n processQueue(requestOffset);\n });\n}\n\nfunction postToFlEndpoint(data: TransportBatchLogFormat): Promise {\n const flTransportFullUrl = SettingsService.getInstance().getFlTransportFullUrl();\n return fetch(flTransportFullUrl, {\n method: 'POST',\n body: JSON.stringify(data)\n });\n}\n\nfunction addToQueue(evt: BatchEvent): void {\n if (!evt.eventTime || !evt.message) {\n throw ERROR_FACTORY.create(ErrorCode.INVALID_CC_LOG);\n }\n // Add the new event to the queue.\n queue = [...queue, evt];\n}\n\n/** Log handler for cc service to send the performance logs to the server. */\nexport function transportHandler(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n serializer: (...args: any[]) => string\n): (...args: unknown[]) => void {\n return (...args) => {\n const message = serializer(...args);\n addToQueue({\n message,\n eventTime: Date.now()\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 { getIid } from './iid_service';\nimport { NetworkRequest } from '../resources/network_request';\nimport { Trace } from '../resources/trace';\nimport { Api } from './api_service';\nimport { SettingsService } from './settings_service';\nimport {\n getServiceWorkerStatus,\n getVisibilityState,\n VisibilityState,\n getEffectiveConnectionType\n} from '../utils/attributes_utils';\nimport {\n isPerfInitialized,\n getInitializationPromise\n} from './initialization_service';\nimport { transportHandler } from './transport_service';\nimport { SDK_VERSION } from '../constants';\n\nconst enum ResourceType {\n NetworkRequest,\n Trace\n}\n\n/* eslint-disable camelcase */\ninterface ApplicationInfo {\n google_app_id: string;\n app_instance_id?: string;\n web_app_info: WebAppInfo;\n application_process_state: number;\n}\n\ninterface WebAppInfo {\n sdk_version: string;\n page_url: string;\n service_worker_status: number;\n visibility_state: number;\n effective_connection_type: number;\n}\n\ninterface PerfNetworkLog {\n application_info: ApplicationInfo;\n network_request_metric: NetworkRequestMetric;\n}\n\ninterface PerfTraceLog {\n application_info: ApplicationInfo;\n trace_metric: TraceMetric;\n}\n\ninterface NetworkRequestMetric {\n url: string;\n http_method: number;\n http_response_code: number;\n response_payload_bytes?: number;\n client_start_time_us?: number;\n time_to_response_initiated_us?: number;\n time_to_response_completed_us?: number;\n}\n\ninterface TraceMetric {\n name: string;\n is_auto: boolean;\n client_start_time_us: number;\n duration_us: number;\n counters?: { [key: string]: number };\n custom_attributes?: { [key: string]: string };\n}\n\n/* eslint-enble camelcase */\n\nlet logger: (\n resource: NetworkRequest | Trace,\n resourceType: ResourceType\n) => void | undefined;\n// This method is not called before initialization.\nfunction sendLog(\n resource: NetworkRequest | Trace,\n resourceType: ResourceType\n): void {\n if (!logger) {\n logger = transportHandler(serializer);\n }\n logger(resource, resourceType);\n}\n\nexport function logTrace(trace: Trace): void {\n const settingsService = SettingsService.getInstance();\n // Do not log if trace is auto generated and instrumentation is disabled.\n if (!settingsService.instrumentationEnabled && trace.isAuto) {\n return;\n }\n // Do not log if trace is custom and data collection is disabled.\n if (!settingsService.dataCollectionEnabled && !trace.isAuto) {\n return;\n }\n // Do not log if required apis are not available.\n if (!Api.getInstance().requiredApisAvailable()) {\n return;\n }\n // Only log the page load auto traces if page is visible.\n if (trace.isAuto && getVisibilityState() !== VisibilityState.VISIBLE) {\n return;\n }\n\n if (\n !settingsService.loggingEnabled ||\n !settingsService.logTraceAfterSampling\n ) {\n return;\n }\n\n if (isPerfInitialized()) {\n sendTraceLog(trace);\n } else {\n // Custom traces can be used before the initialization but logging\n // should wait until after.\n getInitializationPromise().then(\n () => sendTraceLog(trace),\n () => sendTraceLog(trace)\n );\n }\n}\n\nfunction sendTraceLog(trace: Trace): void {\n if (getIid()) {\n setTimeout(() => sendLog(trace, ResourceType.Trace), 0);\n }\n}\n\nexport function logNetworkRequest(networkRequest: NetworkRequest): void {\n const settingsService = SettingsService.getInstance();\n // Do not log network requests if instrumentation is disabled.\n if (!settingsService.instrumentationEnabled) {\n return;\n }\n\n // Do not log the js sdk's call to transport service domain to avoid unnecessary cycle.\n // Need to blacklist both old and new endpoints to avoid migration gap.\n const networkRequestUrl = networkRequest.url;\n\n // Blacklist old log endpoint and new transport endpoint.\n // Because Performance SDK doesn't instrument requests sent from SDK itself.\n const logEndpointUrl = settingsService.logEndPointUrl.split('?')[0];\n const flEndpointUrl = settingsService.flTransportEndpointUrl.split('?')[0];\n if (\n networkRequestUrl === logEndpointUrl ||\n networkRequestUrl === flEndpointUrl\n ) {\n return;\n }\n\n if (\n !settingsService.loggingEnabled ||\n !settingsService.logNetworkAfterSampling\n ) {\n return;\n }\n\n setTimeout(() => sendLog(networkRequest, ResourceType.NetworkRequest), 0);\n}\n\nfunction serializer(\n resource: NetworkRequest | Trace,\n resourceType: ResourceType\n): string {\n if (resourceType === ResourceType.NetworkRequest) {\n return serializeNetworkRequest(resource as NetworkRequest);\n }\n return serializeTrace(resource as Trace);\n}\n\nfunction serializeNetworkRequest(networkRequest: NetworkRequest): string {\n const networkRequestMetric: NetworkRequestMetric = {\n url: networkRequest.url,\n http_method: networkRequest.httpMethod || 0,\n http_response_code: 200,\n response_payload_bytes: networkRequest.responsePayloadBytes,\n client_start_time_us: networkRequest.startTimeUs,\n time_to_response_initiated_us: networkRequest.timeToResponseInitiatedUs,\n time_to_response_completed_us: networkRequest.timeToResponseCompletedUs\n };\n const perfMetric: PerfNetworkLog = {\n application_info: getApplicationInfo(),\n network_request_metric: networkRequestMetric\n };\n return JSON.stringify(perfMetric);\n}\n\nfunction serializeTrace(trace: Trace): string {\n const traceMetric: TraceMetric = {\n name: trace.name,\n is_auto: trace.isAuto,\n client_start_time_us: trace.startTimeUs,\n duration_us: trace.durationUs\n };\n\n if (Object.keys(trace.counters).length !== 0) {\n traceMetric.counters = trace.counters;\n }\n const customAttributes = trace.getAttributes();\n if (Object.keys(customAttributes).length !== 0) {\n traceMetric.custom_attributes = customAttributes;\n }\n\n const perfMetric: PerfTraceLog = {\n application_info: getApplicationInfo(),\n trace_metric: traceMetric\n };\n return JSON.stringify(perfMetric);\n}\n\nfunction getApplicationInfo(): ApplicationInfo {\n return {\n google_app_id: SettingsService.getInstance().getAppId(),\n app_instance_id: getIid(),\n web_app_info: {\n sdk_version: SDK_VERSION,\n page_url: Api.getInstance().getUrl(),\n service_worker_status: getServiceWorkerStatus(),\n visibility_state: getVisibilityState(),\n effective_connection_type: getEffectiveConnectionType()\n },\n application_process_state: 0\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 FIRST_PAINT_COUNTER_NAME,\n FIRST_CONTENTFUL_PAINT_COUNTER_NAME,\n FIRST_INPUT_DELAY_COUNTER_NAME,\n OOB_TRACE_PAGE_LOAD_PREFIX\n} from '../constants';\n\nconst MAX_METRIC_NAME_LENGTH = 100;\nconst RESERVED_AUTO_PREFIX = '_';\nconst oobMetrics = [\n FIRST_PAINT_COUNTER_NAME,\n FIRST_CONTENTFUL_PAINT_COUNTER_NAME,\n FIRST_INPUT_DELAY_COUNTER_NAME\n];\n\n/**\n * Returns true if the metric is custom and does not start with reserved prefix, or if\n * the metric is one of out of the box page load trace metrics.\n */\nexport function isValidMetricName(name: string, traceName?: string): boolean {\n if (name.length === 0 || name.length > MAX_METRIC_NAME_LENGTH) {\n return false;\n }\n return (\n (traceName &&\n traceName.startsWith(OOB_TRACE_PAGE_LOAD_PREFIX) &&\n oobMetrics.indexOf(name) > -1) ||\n !name.startsWith(RESERVED_AUTO_PREFIX)\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 TRACE_START_MARK_PREFIX,\n TRACE_STOP_MARK_PREFIX,\n TRACE_MEASURE_PREFIX,\n OOB_TRACE_PAGE_LOAD_PREFIX,\n FIRST_PAINT_COUNTER_NAME,\n FIRST_CONTENTFUL_PAINT_COUNTER_NAME,\n FIRST_INPUT_DELAY_COUNTER_NAME\n} from '../constants';\nimport { Api } from '../services/api_service';\nimport { logTrace } from '../services/perf_logger';\nimport { ERROR_FACTORY, ErrorCode } from '../utils/errors';\nimport {\n isValidCustomAttributeName,\n isValidCustomAttributeValue\n} from '../utils/attributes_utils';\nimport { isValidMetricName } from '../utils/metric_utils';\nimport { PerformanceTrace } from '@firebase/performance-types';\n\nconst enum TraceState {\n UNINITIALIZED = 1,\n RUNNING,\n TERMINATED\n}\n\nexport class Trace implements PerformanceTrace {\n private state: TraceState = TraceState.UNINITIALIZED;\n startTimeUs!: number;\n durationUs!: number;\n private customAttributes: { [key: string]: string } = {};\n counters: { [counterName: string]: number } = {};\n private api = Api.getInstance();\n private randomId = Math.floor(Math.random() * 1000000);\n private traceStartMark!: string;\n private traceStopMark!: string;\n private traceMeasure!: string;\n\n /**\n * @param name The name of the trace.\n * @param isAuto If the trace is auto-instrumented.\n * @param traceMeasureName The name of the measure marker in user timing specification. This field\n * is only set when the trace is built for logging when the user directly uses the user timing\n * api (performance.mark and performance.measure).\n */\n constructor(\n readonly name: string,\n readonly isAuto = false,\n traceMeasureName?: string\n ) {\n if (!this.isAuto) {\n this.traceStartMark = `${TRACE_START_MARK_PREFIX}-${this.randomId}-${this.name}`;\n this.traceStopMark = `${TRACE_STOP_MARK_PREFIX}-${this.randomId}-${this.name}`;\n this.traceMeasure =\n traceMeasureName ||\n `${TRACE_MEASURE_PREFIX}-${this.randomId}-${this.name}`;\n\n if (traceMeasureName) {\n // For the case of direct user timing traces, no start stop will happen. The measure object\n // is already available.\n this.calculateTraceMetrics();\n }\n }\n }\n\n /**\n * Starts a trace. The measurement of the duration starts at this point.\n */\n start(): void {\n if (this.state !== TraceState.UNINITIALIZED) {\n throw ERROR_FACTORY.create(ErrorCode.TRACE_STARTED_BEFORE, {\n traceName: this.name\n });\n }\n this.api.mark(this.traceStartMark);\n this.state = TraceState.RUNNING;\n }\n\n /**\n * Stops the trace. The measurement of the duration of the trace stops at this point and trace\n * is logged.\n */\n stop(): void {\n if (this.state !== TraceState.RUNNING) {\n throw ERROR_FACTORY.create(ErrorCode.TRACE_STOPPED_BEFORE, {\n traceName: this.name\n });\n }\n this.state = TraceState.TERMINATED;\n this.api.mark(this.traceStopMark);\n this.api.measure(\n this.traceMeasure,\n this.traceStartMark,\n this.traceStopMark\n );\n this.calculateTraceMetrics();\n logTrace(this);\n }\n\n /**\n * Records a trace with predetermined values. If this method is used a trace is created and logged\n * directly. No need to use start and stop methods.\n * @param startTime Trace start time since epoch in millisec\n * @param duration The duraction of the trace in millisec\n * @param options An object which can optionally hold maps of custom metrics and custom attributes\n */\n record(\n startTime: number,\n duration: number,\n options?: {\n metrics?: { [key: string]: number };\n attributes?: { [key: string]: string };\n }\n ): void {\n this.durationUs = Math.floor(duration * 1000);\n this.startTimeUs = Math.floor(startTime * 1000);\n if (options && options.attributes) {\n this.customAttributes = { ...options.attributes };\n }\n if (options && options.metrics) {\n for (const metric of Object.keys(options.metrics)) {\n if (!isNaN(Number(options.metrics[metric]))) {\n this.counters[metric] = Number(Math.floor(options.metrics[metric]));\n }\n }\n }\n logTrace(this);\n }\n\n /**\n * Increments a custom metric by a certain number or 1 if number not specified. Will create a new\n * custom metric if one with the given name does not exist.\n * @param counter Name of the custom metric\n * @param num Increment by value\n */\n incrementMetric(counter: string, num = 1): void {\n if (this.counters[counter] === undefined) {\n this.putMetric(counter, 0);\n }\n this.counters[counter] += num;\n }\n\n /**\n * Sets a custom metric to a specified value. Will create a new custom metric if one with the\n * given name does not exist.\n * @param counter Name of the custom metric\n * @param num Set custom metric to this value\n */\n putMetric(counter: string, num: number): void {\n if (isValidMetricName(counter, this.name)) {\n this.counters[counter] = num;\n } else {\n throw ERROR_FACTORY.create(ErrorCode.INVALID_CUSTOM_METRIC_NAME, {\n customMetricName: counter\n });\n }\n }\n\n /**\n * Returns the value of the custom metric by that name. If a custom metric with that name does\n * not exist will return zero.\n * @param counter\n */\n getMetric(counter: string): number {\n return this.counters[counter] || 0;\n }\n\n /**\n * Sets a custom attribute of a trace to a certain value.\n * @param attr\n * @param value\n */\n putAttribute(attr: string, value: string): void {\n const isValidName = isValidCustomAttributeName(attr);\n const isValidValue = isValidCustomAttributeValue(value);\n if (isValidName && isValidValue) {\n this.customAttributes[attr] = value;\n return;\n }\n // Throw appropriate error when the attribute name or value is invalid.\n if (!isValidName) {\n throw ERROR_FACTORY.create(ErrorCode.INVALID_ATTRIBUTE_NAME, {\n attributeName: attr\n });\n }\n if (!isValidValue) {\n throw ERROR_FACTORY.create(ErrorCode.INVALID_ATTRIBUTE_VALUE, {\n attributeValue: value\n });\n }\n }\n\n /**\n * Retrieves the value a custom attribute of a trace is set to.\n * @param attr\n */\n getAttribute(attr: string): string | undefined {\n return this.customAttributes[attr];\n }\n\n removeAttribute(attr: string): void {\n if (this.customAttributes[attr] === undefined) {\n return;\n }\n delete this.customAttributes[attr];\n }\n\n getAttributes(): { [key: string]: string } {\n return { ...this.customAttributes };\n }\n\n private setStartTime(startTime: number): void {\n this.startTimeUs = startTime;\n }\n\n private setDuration(duration: number): void {\n this.durationUs = duration;\n }\n\n /**\n * Calculates and assigns the duration and start time of the trace using the measure performance\n * entry.\n */\n private calculateTraceMetrics(): void {\n const perfMeasureEntries = this.api.getEntriesByName(this.traceMeasure);\n const perfMeasureEntry = perfMeasureEntries && perfMeasureEntries[0];\n if (perfMeasureEntry) {\n this.durationUs = Math.floor(perfMeasureEntry.duration * 1000);\n this.startTimeUs = Math.floor(\n (perfMeasureEntry.startTime + this.api.getTimeOrigin()) * 1000\n );\n }\n }\n\n /**\n * @param navigationTimings A single element array which contains the navigationTIming object of\n * the page load\n * @param paintTimings A array which contains paintTiming object of the page load\n * @param firstInputDelay First input delay in millisec\n */\n static createOobTrace(\n navigationTimings: PerformanceNavigationTiming[],\n paintTimings: PerformanceEntry[],\n firstInputDelay?: number\n ): void {\n const route = Api.getInstance().getUrl();\n if (!route) {\n return;\n }\n const trace = new Trace(OOB_TRACE_PAGE_LOAD_PREFIX + route, true);\n const timeOriginUs = Math.floor(Api.getInstance().getTimeOrigin() * 1000);\n trace.setStartTime(timeOriginUs);\n\n // navigationTimings includes only one element.\n if (navigationTimings && navigationTimings[0]) {\n trace.setDuration(Math.floor(navigationTimings[0].duration * 1000));\n trace.putMetric(\n 'domInteractive',\n Math.floor(navigationTimings[0].domInteractive * 1000)\n );\n trace.putMetric(\n 'domContentLoadedEventEnd',\n Math.floor(navigationTimings[0].domContentLoadedEventEnd * 1000)\n );\n trace.putMetric(\n 'loadEventEnd',\n Math.floor(navigationTimings[0].loadEventEnd * 1000)\n );\n }\n\n const FIRST_PAINT = 'first-paint';\n const FIRST_CONTENTFUL_PAINT = 'first-contentful-paint';\n if (paintTimings) {\n const firstPaint = paintTimings.find(\n paintObject => paintObject.name === FIRST_PAINT\n );\n if (firstPaint && firstPaint.startTime) {\n trace.putMetric(\n FIRST_PAINT_COUNTER_NAME,\n Math.floor(firstPaint.startTime * 1000)\n );\n }\n const firstContentfulPaint = paintTimings.find(\n paintObject => paintObject.name === FIRST_CONTENTFUL_PAINT\n );\n if (firstContentfulPaint && firstContentfulPaint.startTime) {\n trace.putMetric(\n FIRST_CONTENTFUL_PAINT_COUNTER_NAME,\n Math.floor(firstContentfulPaint.startTime * 1000)\n );\n }\n\n if (firstInputDelay) {\n trace.putMetric(\n FIRST_INPUT_DELAY_COUNTER_NAME,\n Math.floor(firstInputDelay * 1000)\n );\n }\n }\n\n logTrace(trace);\n }\n\n static createUserTimingTrace(measureName: string): void {\n const trace = new Trace(measureName, false, measureName);\n logTrace(trace);\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 { Api } from '../services/api_service';\nimport { logNetworkRequest } from '../services/perf_logger';\n\n// The order of values of this enum should not be changed.\nexport const enum HttpMethod {\n HTTP_METHOD_UNKNOWN = 0,\n GET = 1,\n PUT = 2,\n POST = 3,\n DELETE = 4,\n HEAD = 5,\n PATCH = 6,\n OPTIONS = 7,\n TRACE = 8,\n CONNECT = 9\n}\n\n// Durations are in microseconds.\nexport interface NetworkRequest {\n url: string;\n httpMethod?: HttpMethod;\n requestPayloadBytes?: number;\n responsePayloadBytes?: number;\n httpResponseCode?: number;\n responseContentType?: string;\n startTimeUs?: number;\n timeToRequestCompletedUs?: number;\n timeToResponseInitiatedUs?: number;\n timeToResponseCompletedUs?: number;\n}\n\nexport function createNetworkRequestEntry(entry: PerformanceEntry): void {\n const performanceEntry = entry as PerformanceResourceTiming;\n if (!performanceEntry || performanceEntry.responseStart === undefined) {\n return;\n }\n const timeOrigin = Api.getInstance().getTimeOrigin();\n const startTimeUs = Math.floor(\n (performanceEntry.startTime + timeOrigin) * 1000\n );\n const timeToResponseInitiatedUs = performanceEntry.responseStart\n ? Math.floor(\n (performanceEntry.responseStart - performanceEntry.startTime) * 1000\n )\n : undefined;\n const timeToResponseCompletedUs = Math.floor(\n (performanceEntry.responseEnd - performanceEntry.startTime) * 1000\n );\n // Remove the query params from logged network request url.\n const url = performanceEntry.name && performanceEntry.name.split('?')[0];\n const networkRequest: NetworkRequest = {\n url,\n responsePayloadBytes: performanceEntry.transferSize,\n startTimeUs,\n timeToResponseInitiatedUs,\n timeToResponseCompletedUs\n };\n\n logNetworkRequest(networkRequest);\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 */\nimport { Api } from './api_service';\nimport { Trace } from '../resources/trace';\nimport { createNetworkRequestEntry } from '../resources/network_request';\nimport { TRACE_MEASURE_PREFIX } from '../constants';\nimport { getIid } from './iid_service';\n\nconst FID_WAIT_TIME_MS = 5000;\n\nexport function setupOobResources(): void {\n // Do not initialize unless iid is available.\n if (!getIid()) {\n return;\n }\n // The load event might not have fired yet, and that means performance navigation timing\n // object has a duration of 0. The setup should run after all current tasks in js queue.\n setTimeout(() => setupOobTraces(), 0);\n setTimeout(() => setupNetworkRequests(), 0);\n setTimeout(() => setupUserTimingTraces(), 0);\n}\n\nfunction setupNetworkRequests(): void {\n const api = Api.getInstance();\n const resources = api.getEntriesByType('resource');\n for (const resource of resources) {\n createNetworkRequestEntry(resource);\n }\n api.setupObserver('resource', createNetworkRequestEntry);\n}\n\nfunction setupOobTraces(): void {\n const api = Api.getInstance();\n const navigationTimings = api.getEntriesByType(\n 'navigation'\n ) as PerformanceNavigationTiming[];\n const paintTimings = api.getEntriesByType('paint');\n // If First Input Desly polyfill is added to the page, report the fid value.\n // https://github.com/GoogleChromeLabs/first-input-delay\n if (api.onFirstInputDelay) {\n // If the fid call back is not called for certain time, continue without it.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let timeoutId: any = setTimeout(() => {\n Trace.createOobTrace(navigationTimings, paintTimings);\n timeoutId = undefined;\n }, FID_WAIT_TIME_MS);\n api.onFirstInputDelay((fid: number) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n Trace.createOobTrace(navigationTimings, paintTimings, fid);\n }\n });\n } else {\n Trace.createOobTrace(navigationTimings, paintTimings);\n }\n}\n\nfunction setupUserTimingTraces(): void {\n const api = Api.getInstance();\n // Run through the measure performance entries collected up to this point.\n const measures = api.getEntriesByType('measure');\n for (const measure of measures) {\n createUserTimingTrace(measure);\n }\n // Setup an observer to capture the measures from this point on.\n api.setupObserver('measure', createUserTimingTrace);\n}\n\nfunction createUserTimingTrace(measure: PerformanceEntry): void {\n const measureName = measure.name;\n // Do not create a trace, if the user timing marks and measures are created by the sdk itself.\n if (\n measureName.substring(0, TRACE_MEASURE_PREFIX.length) ===\n TRACE_MEASURE_PREFIX\n ) {\n return;\n }\n Trace.createUserTimingTrace(measureName);\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 */\nimport { Trace } from '../resources/trace';\nimport { setupOobResources } from '../services/oob_resources_service';\nimport { SettingsService } from '../services/settings_service';\nimport { getInitializationPromise } from '../services/initialization_service';\nimport { Api } from '../services/api_service';\nimport { FirebaseApp } from '@firebase/app-types';\nimport { FirebasePerformance } from '@firebase/performance-types';\nimport { consoleLogger } from '../utils/console_logger';\nimport { setupTransportService } from '../services/transport_service';\n\nexport class PerformanceController implements FirebasePerformance {\n constructor(readonly app: FirebaseApp) {\n if (Api.getInstance().requiredApisAvailable()) {\n setupTransportService();\n getInitializationPromise().then(setupOobResources, setupOobResources);\n } else {\n consoleLogger.info(\n 'Firebase Performance cannot start if browser does not support fetch and Promise or cookie is disabled.'\n );\n }\n }\n\n trace(name: string): Trace {\n return new Trace(name);\n }\n\n set instrumentationEnabled(val: boolean) {\n SettingsService.getInstance().instrumentationEnabled = val;\n }\n get instrumentationEnabled(): boolean {\n return SettingsService.getInstance().instrumentationEnabled;\n }\n\n set dataCollectionEnabled(val: boolean) {\n SettingsService.getInstance().dataCollectionEnabled = val;\n }\n get dataCollectionEnabled(): boolean {\n return SettingsService.getInstance().dataCollectionEnabled;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport firebase from '@firebase/app';\nimport '@firebase/installations';\nimport { FirebaseApp, FirebaseNamespace } from '@firebase/app-types';\nimport { _FirebaseNamespace } from '@firebase/app-types/private';\nimport { PerformanceController } from './src/controllers/perf';\nimport { setupApi } from './src/services/api_service';\nimport { SettingsService } from './src/services/settings_service';\nimport { ERROR_FACTORY, ErrorCode } from './src/utils/errors';\nimport { FirebasePerformance } from '@firebase/performance-types';\nimport { Component, ComponentType } from '@firebase/component';\nimport { FirebaseInstallations } from '@firebase/installations-types';\n\nimport { name, version } from './package.json';\n\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\nexport function registerPerformance(instance: FirebaseNamespace): void {\n const factoryMethod = (\n app: FirebaseApp,\n installations: FirebaseInstallations\n ): PerformanceController => {\n if (app.name !== DEFAULT_ENTRY_NAME) {\n throw ERROR_FACTORY.create(ErrorCode.FB_NOT_DEFAULT);\n }\n if (typeof window === 'undefined') {\n throw ERROR_FACTORY.create(ErrorCode.NO_WINDOW);\n }\n setupApi(window);\n SettingsService.getInstance().firebaseAppInstance = app;\n SettingsService.getInstance().installationsService = installations;\n return new PerformanceController(app);\n };\n\n // Register performance with firebase-app.\n (instance as _FirebaseNamespace).INTERNAL.registerComponent(\n new Component(\n 'performance',\n container => {\n /* Dependencies */\n // getImmediate for FirebaseApp will always succeed\n const app = container.getProvider('app').getImmediate();\n // The following call will always succeed because perf has `import '@firebase/installations'`\n const installations = container\n .getProvider('installations')\n .getImmediate();\n\n return factoryMethod(app, installations);\n },\n ComponentType.PUBLIC\n )\n );\n\n instance.registerVersion(name, version);\n}\n\nregisterPerformance(firebase);\n\ndeclare module '@firebase/app-types' {\n interface FirebaseNamespace {\n performance?: {\n (app?: FirebaseApp): FirebasePerformance;\n };\n }\n interface FirebaseApp {\n performance?(): FirebasePerformance;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport firebase from '@firebase/app';\nimport '@firebase/performance';\nimport { name, version } from '../package.json';\n\nfirebase.registerVersion(name, version, 'lite');\n\nexport default firebase;\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__assign","assign","t","s","i","n","arguments","length","prototype","call","apply","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","TypeError","pop","push","__values","o","m","__read","r","ar","error","__spreadArrays","il","k","a","j","jl","deepExtend","target","source","constructor","Date","getTime","undefined","prop","Deferred","callback","_this","promise","catch","Error","create","__","code","message","_super","FirebaseError","captureStackTrace","ErrorFactory","_i","data","customData","fullCode","service","template","errors","replace","PATTERN","key","String","fullMessage","serviceName","_b","keys","_a","slice","console","warn","contains","obj","Component","mode","instantiationMode","multipleInstances","props","serviceProps","name","instanceFactory","type","DEFAULT_ENTRY_NAME","Provider","identifier","normalizedIdentifier","normalizeInstanceIdentifier","instancesDeferred","has","deferred","set","instance","getOrInitializeService","get","options","optional","component","entries","_d","instanceIdentifier","instanceDeferred","delete","instances","services","from","values","all","filter","map","INTERNAL","container","Map","ComponentContainer","provider","getProvider","isComponentSet","setComponent","providers","addComponent","LogLevel","defaultLogHandler","logType","args","logLevel","now","toISOString","method","ConsoleMethod","levelStringToEnum","debug","DEBUG","verbose","VERBOSE","info","INFO","WARN","ERROR","silent","SILENT","defaultLogLevel","Logger","_logLevel","val","_logHandler","_userLogHandler","setLogLevel","level","forEach","inst","ERRORS","ERROR_FACTORY","PLATFORM_LOG_STRING","appName","FirebaseAppLiteImpl","checkDestroyed_","automaticDataCollectionEnabled_","name_","options_","firebase_","removeApp","getProviders","isDeleted_","getImmediate","config","automaticDataCollectionEnabled","components","logger","createFirebaseNamespaceCore","firebaseAppImpl","apps","namespace","__esModule","initializeApp","rawConfig","app","registerVersion","libraryKeyOrName","version","variant","library","libraryMismatch","match","versionMismatch","warning","join","registerComponent","onLog","logCallback","customLogLevel","userLogHandler","arg","toString","JSON","stringify","ignored","toLowerCase","instances_1","setUserLogHandler","SDK_VERSION","useAsService","componentName","serviceNamespace","appArg","_getService","bind","_addComponent","defineProperty","PlatformLoggerService","getComponent","logString","firebase","createFirebaseNamespaceLite","promisifyRequest","request","onsuccess","onerror","promisifyRequestCall","proxyProperties","ProxyClass","targetProp","properties","proxyRequestMethods","Constructor","proxyMethods","proxyCursorRequestMethods","Cursor","Index","index","_index","cursor","_cursor","_request","ObjectStore","store","_store","Transaction","idbTransaction","_tx","complete","oncomplete","onabort","UpgradeDB","db","oldVersion","transaction","_db","DB","IDBIndex","IDBCursor","methodName","createIndex","IDBObjectStore","objectStore","IDBTransaction","createObjectStore","IDBDatabase","funcName","arr","nativeObject","getAll","query","count","items","iterateCursor","continue","PENDING_TIMEOUT_MS","PACKAGE_VERSION","INTERNAL_AUTH_VERSION","INSTALLATIONS_API_URL","TOKEN_EXPIRATION_BUFFER","ERROR_DESCRIPTION_MAP","isServerError","includes","getInstallationsEndpoint","projectId","extractAuthTokenInfoFromResponse","response","token","requestStatus","expiresIn","responseExpiresIn","Number","creationTime","getErrorFromResponse","requestName","json","responseJson","errorData","serverCode","serverMessage","serverStatus","status","getHeaders","apiKey","Headers","Content-Type","Accept","x-goog-api-key","getHeadersWithAuth","appConfig","refreshToken","headers","append","retryIfServerError","fn","sleep","ms","setTimeout","bufferToBase64UrlSafe","array","btoa","fromCharCode","concat","VALID_FID_PATTERN","INVALID_FID","generateFid","fidByteArray","Uint8Array","self","crypto","msCrypto","getRandomValues","fid","substr","test","getKey","appId","fidChangeCallbacks","fidChanged","callFidChangeCallbacks","channel","getBroadcastChannel","postMessage","closeBroadcastChannel","broadcastFidChange","callbacks","callbacks_1","broadcastChannel","BroadcastChannel","onmessage","size","close","DATABASE_NAME","DATABASE_VERSION","OBJECT_STORE_NAME","dbPromise","getDbPromise","upgradeCallback","upgradeDB","indexedDB","onupgradeneeded","event","tx","oldValue","put","remove","update","updateFn","newValue","getInstallationEntry","oldEntry","installationEntry","clearTimedOutRequest","registrationStatus","entryWithPromise","registrationPromise","updateInstallationRequest","entry","waitUntilFidRegistration","navigator","onLine","registrationPromiseWithError","inProgressEntry","registrationTime","endpoint","authVersion","sdkVersion","fetch","ok","responseValue","authToken","createInstallationRequest","registeredInstallationEntry","e_1","registerInstallation","triggerRegistrationIfNecessary","generateAuthTokenRequest","platformLoggerProvider","platformLogger","getPlatformInfoString","installation","refreshAuthToken","dependencies","forceRefresh","isEntryRegistered","inProgressAuthToken","oldAuthToken","isAuthTokenExpired","tokenPromise","updateAuthTokenRequest","waitUntilAuthTokenRequest","requestTime","updatedInstallationEntry","fetchAuthTokenFromServer","getToken","completeInstallationRegistration","deleteInstallationRequest","onIdChange","callbackSet","Set","add","addCallback","getMissingValueError","valueName","configKeys_1","keyName","extractAppConfig","getId","deleteInstallation","apiInstance","windowInstance","settingsServiceInstance","TRACE_MEASURE_PREFIX","CONFIG_LOCAL_STORAGE_KEY","CONFIG_EXPIRY_LOCAL_STORAGE_KEY","SERVICE_NAME","Api","windowLocation","href","split","performance","mark","measureName","mark1","mark2","measure","getEntriesByType","getEntriesByName","timeOrigin","timing","navigationStart","cookieEnabled","entryType","PerformanceObserver","list","getEntries","observe","entryTypes","window","location","document","localStorage","perfMetrics","onFirstInputDelay","mergeStrings","part1","part2","sizeDiff","resultArray","charAt","iid","VisibilityState","SettingsService","firebaseAppInstance","flTransportEndpointUrl","transportKey","getIid","RESERVED_ATTRIBUTE_PREFIXES","ATTRIBUTE_FORMAT_REGEX","RegExp","getVisibilityState","getInstance","visibilityState","VISIBLE","HIDDEN","UNKNOWN","consoleLogger","REMOTE_CONFIG_SDK_VERSION","DEFAULT_CONFIGS","loggingEnabled","FIS_AUTH_PREFIX","getConfig","expiryString","getItem","expiry","configValid","configStringified","parse","getStoredConfig","processConfig","authTokenPromise","installationsService","authTokenVal","getAuthTokenPromise","configEndPoint","getProjectId","getApiKey","Request","Authorization","app_instance_id","app_instance_id_token","app_id","getAppId","app_version","sdk_version","COULD_NOT_GET_CONFIG_MSG","setItem","configTimeToLive","storeConfig","fpr_enabled","fpr_log_source","logSource","fpr_log_endpoint_url","logEndPointUrl","fpr_log_transport_key","fpr_vc_network_request_sampling_rate","networkRequestsSamplingRate","fpr_vc_trace_sampling_rate","tracesSamplingRate","logTraceAfterSampling","shouldLogAfterSampling","logNetworkAfterSampling","samplingRate","Math","random","initializationPromise","initializationStatus","getInitializationPromise","readyState","handler_1","removeEventListener","addEventListener","getDocumentReadyComplete","iidPromise","iidVal","changeInitializationStatus","DEFAULT_SEND_INTERVAL_MS","INITIAL_SEND_TIME_DELAY_MS","DEFAULT_REMAINING_TRIES","remainingTries","queue","isTransportSetup","processQueue","timeOffset","staged","log_event","evt","source_extension_json_proto3","event_time_ms","eventTime","flTransportFullUrl","getFlTransportFullUrl","postToFlEndpoint","res","transportWait","nextRequestWaitMillis","requestOffset","isNaN","max","logResponseDetails","isArray","responseAction","sendEventsToFl","request_time_ms","client_info","client_type","js_client_info","log_source","dispatchQueueEvents","transportHandler","serializer","addToQueue","sendLog","resource","resourceType","logTrace","trace","settingsService","instrumentationEnabled","isAuto","dataCollectionEnabled","requiredApisAvailable","sendTraceLog","networkRequestMetric","url","networkRequest","http_method","httpMethod","http_response_code","response_payload_bytes","responsePayloadBytes","client_start_time_us","startTimeUs","time_to_response_initiated_us","timeToResponseInitiatedUs","time_to_response_completed_us","timeToResponseCompletedUs","perfMetric","application_info","getApplicationInfo","network_request_metric","traceMetric","is_auto","duration_us","durationUs","counters","customAttributes","getAttributes","custom_attributes","trace_metric","serializeTrace","google_app_id","web_app_info","page_url","getUrl","service_worker_status","serviceWorker","controller","visibility_state","effective_connection_type","navigatorConnection","connection","effectiveType","getEffectiveConnectionType","application_process_state","oobMetrics","Trace","state","traceName","api","traceStartMark","traceStopMark","traceMeasure","calculateTraceMetrics","startTime","duration","floor","attributes","metrics","metric","counter","num","putMetric","startsWith","indexOf","customMetricName","attr","isValidName","some","prefix","isValidValue","attributeName","attributeValue","perfMeasureEntries","perfMeasureEntry","getTimeOrigin","navigationTimings","paintTimings","firstInputDelay","route","timeOriginUs","setStartTime","setDuration","domInteractive","domContentLoadedEventEnd","loadEventEnd","firstPaint","find","paintObject","firstContentfulPaint","traceMeasureName","TRACE_START_MARK_PREFIX","randomId","TRACE_STOP_MARK_PREFIX","createNetworkRequestEntry","performanceEntry","responseStart","responseEnd","networkRequestUrl","logEndpointUrl","flEndpointUrl","logNetworkRequest","transferSize","FID_WAIT_TIME_MS","setupOobResources","timeoutId_1","createOobTrace","clearTimeout","setupOobTraces","resources","resources_1","setupObserver","setupNetworkRequests","measures","measures_1","createUserTimingTrace","setupUserTimingTraces","substring","PerformanceController","factoryMethod","installations"],"mappings":"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"}