Няма описание
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

firebase-performance-standalone-compat.js.map 357KB

1
  1. {"version":3,"file":"firebase-performance-standalone-compat.js","sources":["../../node_modules/tslib/tslib.es6.js","../util/src/crypt.ts","../util/src/deepCopy.ts","../util/src/defaults.ts","../util/src/global.ts","../util/src/deferred.ts","../util/src/environment.ts","../util/src/errors.ts","../util/src/obj.ts","../util/src/subscribe.ts","../component/src/component.ts","../component/src/constants.ts","../component/src/provider.ts","../component/src/component_container.ts","../logger/src/logger.ts","../../node_modules/idb/build/index.js","../../node_modules/idb/build/wrap-idb-value.js","../app/src/platformLoggerService.ts","../app/src/logger.ts","../app/src/constants.ts","../app/src/internal.ts","../app/src/errors.ts","../app/src/firebaseApp.ts","../app/src/api.ts","../app/src/indexeddb.ts","../app/src/heartbeatService.ts","../app/src/registerCoreComponents.ts","../app/src/index.ts","../app-compat/src/firebaseApp.ts","../app-compat/src/errors.ts","../app-compat/src/firebaseNamespaceCore.ts","../app-compat/src/firebaseNamespace.ts","../app-compat/src/logger.ts","../app-compat/src/index.ts","../app-compat/src/registerCoreComponents.ts","compat/app/index.ts","../installations/src/util/constants.ts","../installations/src/util/errors.ts","../installations/src/functions/common.ts","../installations/src/util/sleep.ts","../installations/src/helpers/generate-fid.ts","../installations/src/helpers/buffer-to-base64-url-safe.ts","../installations/src/util/get-key.ts","../installations/src/helpers/fid-changed.ts","../installations/src/helpers/idb-manager.ts","../installations/src/helpers/get-installation-entry.ts","../installations/src/functions/create-installation-request.ts","../installations/src/functions/generate-auth-token-request.ts","../installations/src/helpers/refresh-auth-token.ts","../installations/src/api/get-token.ts","../installations/src/helpers/extract-app-config.ts","../installations/src/functions/config.ts","../installations/src/api/get-id.ts","../installations/src/index.ts","../performance/src/services/api_service.ts","../performance/src/constants.ts","../performance/src/utils/errors.ts","../performance/src/utils/console_logger.ts","../performance/src/services/iid_service.ts","../performance/src/services/settings_service.ts","../performance/src/utils/string_merger.ts","../performance/src/utils/attributes_utils.ts","../performance/src/utils/app_utils.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/src/index.ts","../performance-compat/src/performance.ts","../util/src/compat.ts","../performance-compat/src/index.ts","compat/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 (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\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 var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(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, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, 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\n/** @deprecated */\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\n/** @deprecated */\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 __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\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\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\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 (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, 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, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), 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\nconst stringToByteArray = function (str: string): number[] {\n // TODO(user): Use native implementations if/when available\n const out: number[] = [];\n let p = 0;\n for (let i = 0; i < str.length; i++) {\n let c = str.charCodeAt(i);\n if (c < 128) {\n out[p++] = c;\n } else if (c < 2048) {\n out[p++] = (c >> 6) | 192;\n out[p++] = (c & 63) | 128;\n } else if (\n (c & 0xfc00) === 0xd800 &&\n i + 1 < str.length &&\n (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00\n ) {\n // Surrogate Pair\n c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);\n out[p++] = (c >> 18) | 240;\n out[p++] = ((c >> 12) & 63) | 128;\n out[p++] = ((c >> 6) & 63) | 128;\n out[p++] = (c & 63) | 128;\n } else {\n out[p++] = (c >> 12) | 224;\n out[p++] = ((c >> 6) & 63) | 128;\n out[p++] = (c & 63) | 128;\n }\n }\n return out;\n};\n\n/**\n * Turns an array of numbers into the string given by the concatenation of the\n * characters to which the numbers correspond.\n * @param bytes Array of numbers representing characters.\n * @return Stringification of the array.\n */\nconst byteArrayToString = function (bytes: number[]): string {\n // TODO(user): Use native implementations if/when available\n const out: string[] = [];\n let pos = 0,\n c = 0;\n while (pos < bytes.length) {\n const c1 = bytes[pos++];\n if (c1 < 128) {\n out[c++] = String.fromCharCode(c1);\n } else if (c1 > 191 && c1 < 224) {\n const c2 = bytes[pos++];\n out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\n } else if (c1 > 239 && c1 < 365) {\n // Surrogate Pair\n const c2 = bytes[pos++];\n const c3 = bytes[pos++];\n const c4 = bytes[pos++];\n const u =\n (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -\n 0x10000;\n out[c++] = String.fromCharCode(0xd800 + (u >> 10));\n out[c++] = String.fromCharCode(0xdc00 + (u & 1023));\n } else {\n const c2 = bytes[pos++];\n const c3 = bytes[pos++];\n out[c++] = String.fromCharCode(\n ((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)\n );\n }\n }\n return out.join('');\n};\n\ninterface Base64 {\n byteToCharMap_: { [key: number]: string } | null;\n charToByteMap_: { [key: string]: number } | null;\n byteToCharMapWebSafe_: { [key: number]: string } | null;\n charToByteMapWebSafe_: { [key: string]: number } | null;\n ENCODED_VALS_BASE: string;\n readonly ENCODED_VALS: string;\n readonly ENCODED_VALS_WEBSAFE: string;\n HAS_NATIVE_SUPPORT: boolean;\n encodeByteArray(input: number[] | Uint8Array, webSafe?: boolean): string;\n encodeString(input: string, webSafe?: boolean): string;\n decodeString(input: string, webSafe: boolean): string;\n decodeStringToByteArray(input: string, webSafe: boolean): number[];\n init_(): void;\n}\n\n// We define it as an object literal instead of a class because a class compiled down to es5 can't\n// be treeshaked. https://github.com/rollup/rollup/issues/1691\n// Static lookup maps, lazily populated by init_()\nexport const base64: Base64 = {\n /**\n * Maps bytes to characters.\n */\n byteToCharMap_: null,\n\n /**\n * Maps characters to bytes.\n */\n charToByteMap_: null,\n\n /**\n * Maps bytes to websafe characters.\n * @private\n */\n byteToCharMapWebSafe_: null,\n\n /**\n * Maps websafe characters to bytes.\n * @private\n */\n charToByteMapWebSafe_: null,\n\n /**\n * Our default alphabet, shared between\n * ENCODED_VALS and ENCODED_VALS_WEBSAFE\n */\n ENCODED_VALS_BASE:\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\n\n /**\n * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\n */\n get ENCODED_VALS() {\n return this.ENCODED_VALS_BASE + '+/=';\n },\n\n /**\n * Our websafe alphabet.\n */\n get ENCODED_VALS_WEBSAFE() {\n return this.ENCODED_VALS_BASE + '-_.';\n },\n\n /**\n * Whether this browser supports the atob and btoa functions. This extension\n * started at Mozilla but is now implemented by many browsers. We use the\n * ASSUME_* variables to avoid pulling in the full useragent detection library\n * but still allowing the standard per-browser compilations.\n *\n */\n HAS_NATIVE_SUPPORT: typeof atob === 'function',\n\n /**\n * Base64-encode an array of bytes.\n *\n * @param input An array of bytes (numbers with\n * value in [0, 255]) to encode.\n * @param webSafe Boolean indicating we should use the\n * alternative alphabet.\n * @return The base64 encoded string.\n */\n encodeByteArray(input: number[] | Uint8Array, webSafe?: boolean): string {\n if (!Array.isArray(input)) {\n throw Error('encodeByteArray takes an array as a parameter');\n }\n\n this.init_();\n\n const byteToCharMap = webSafe\n ? this.byteToCharMapWebSafe_!\n : this.byteToCharMap_!;\n\n const output = [];\n\n for (let i = 0; i < input.length; i += 3) {\n const byte1 = input[i];\n const haveByte2 = i + 1 < input.length;\n const byte2 = haveByte2 ? input[i + 1] : 0;\n const haveByte3 = i + 2 < input.length;\n const byte3 = haveByte3 ? input[i + 2] : 0;\n\n const outByte1 = byte1 >> 2;\n const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\n let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\n let outByte4 = byte3 & 0x3f;\n\n if (!haveByte3) {\n outByte4 = 64;\n\n if (!haveByte2) {\n outByte3 = 64;\n }\n }\n\n output.push(\n byteToCharMap[outByte1],\n byteToCharMap[outByte2],\n byteToCharMap[outByte3],\n byteToCharMap[outByte4]\n );\n }\n\n return output.join('');\n },\n\n /**\n * Base64-encode a string.\n *\n * @param input A string to encode.\n * @param webSafe If true, we should use the\n * alternative alphabet.\n * @return The base64 encoded string.\n */\n encodeString(input: string, webSafe?: boolean): string {\n // Shortcut for Mozilla browsers that implement\n // a native base64 encoder in the form of \"btoa/atob\"\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\n return btoa(input);\n }\n return this.encodeByteArray(stringToByteArray(input), webSafe);\n },\n\n /**\n * Base64-decode a string.\n *\n * @param input to decode.\n * @param webSafe True if we should use the\n * alternative alphabet.\n * @return string representing the decoded value.\n */\n decodeString(input: string, webSafe: boolean): string {\n // Shortcut for Mozilla browsers that implement\n // a native base64 encoder in the form of \"btoa/atob\"\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\n return atob(input);\n }\n return byteArrayToString(this.decodeStringToByteArray(input, webSafe));\n },\n\n /**\n * Base64-decode a string.\n *\n * In base-64 decoding, groups of four characters are converted into three\n * bytes. If the encoder did not apply padding, the input length may not\n * be a multiple of 4.\n *\n * In this case, the last group will have fewer than 4 characters, and\n * padding will be inferred. If the group has one or two characters, it decodes\n * to one byte. If the group has three characters, it decodes to two bytes.\n *\n * @param input Input to decode.\n * @param webSafe True if we should use the web-safe alphabet.\n * @return bytes representing the decoded value.\n */\n decodeStringToByteArray(input: string, webSafe: boolean): number[] {\n this.init_();\n\n const charToByteMap = webSafe\n ? this.charToByteMapWebSafe_!\n : this.charToByteMap_!;\n\n const output: number[] = [];\n\n for (let i = 0; i < input.length; ) {\n const byte1 = charToByteMap[input.charAt(i++)];\n\n const haveByte2 = i < input.length;\n const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\n ++i;\n\n const haveByte3 = i < input.length;\n const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\n ++i;\n\n const haveByte4 = i < input.length;\n const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\n ++i;\n\n if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\n throw Error();\n }\n\n const outByte1 = (byte1 << 2) | (byte2 >> 4);\n output.push(outByte1);\n\n if (byte3 !== 64) {\n const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\n output.push(outByte2);\n\n if (byte4 !== 64) {\n const outByte3 = ((byte3 << 6) & 0xc0) | byte4;\n output.push(outByte3);\n }\n }\n }\n\n return output;\n },\n\n /**\n * Lazy static initialization function. Called before\n * accessing any of the static map variables.\n * @private\n */\n init_() {\n if (!this.byteToCharMap_) {\n this.byteToCharMap_ = {};\n this.charToByteMap_ = {};\n this.byteToCharMapWebSafe_ = {};\n this.charToByteMapWebSafe_ = {};\n\n // We want quick mappings back and forth, so we precompute two maps.\n for (let i = 0; i < this.ENCODED_VALS.length; i++) {\n this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i);\n this.charToByteMap_[this.byteToCharMap_[i]] = i;\n this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i);\n this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i;\n\n // Be forgiving when decoding and correctly decode both encodings.\n if (i >= this.ENCODED_VALS_BASE.length) {\n this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i;\n this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i;\n }\n }\n }\n }\n};\n\n/**\n * URL-safe base64 encoding\n */\nexport const base64Encode = function (str: string): string {\n const utf8Bytes = stringToByteArray(str);\n return base64.encodeByteArray(utf8Bytes, true);\n};\n\n/**\n * URL-safe base64 encoding (without \".\" padding in the end).\n * e.g. Used in JSON Web Token (JWT) parts.\n */\nexport const base64urlEncodeWithoutPadding = function (str: string): string {\n // Use base64url encoding and remove padding in the end (dot characters).\n return base64Encode(str).replace(/\\./g, '');\n};\n\n/**\n * URL-safe base64 decoding\n *\n * NOTE: DO NOT use the global atob() function - it does NOT support the\n * base64Url variant encoding.\n *\n * @param str To be decoded\n * @return Decoded result, if possible\n */\nexport const base64Decode = function (str: string): string | null {\n try {\n return base64.decodeString(str, true);\n } catch (e) {\n console.error('base64Decode failed: ', e);\n }\n return null;\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/**\n * Do a deep-copy of basic JavaScript Objects or Arrays.\n */\nexport function deepCopy<T>(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 *\n * Note: we don't merge __proto__ to prevent prototype pollution\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 // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202\n if (!source.hasOwnProperty(prop) || !isValidKey(prop)) {\n continue;\n }\n (target as Record<string, unknown>)[prop] = deepExtend(\n (target as Record<string, unknown>)[prop],\n (source as Record<string, unknown>)[prop]\n );\n }\n\n return target;\n}\n\nfunction isValidKey(key: string): boolean {\n return key !== '__proto__';\n}\n","/**\n * @license\n * Copyright 2022 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 { base64Decode } from './crypt';\nimport { getGlobal } from './global';\n\n/**\n * Keys for experimental properties on the `FirebaseDefaults` object.\n * @public\n */\nexport type ExperimentalKey = 'authTokenSyncURL' | 'authIdTokenMaxAge';\n\n/**\n * An object that can be injected into the environment as __FIREBASE_DEFAULTS__,\n * either as a property of globalThis, a shell environment variable, or a\n * cookie.\n *\n * This object can be used to automatically configure and initialize\n * a Firebase app as well as any emulators.\n *\n * @public\n */\nexport interface FirebaseDefaults {\n config?: Record<string, string>;\n emulatorHosts?: Record<string, string>;\n _authTokenSyncURL?: string;\n _authIdTokenMaxAge?: number;\n /**\n * Override Firebase's runtime environment detection and\n * force the SDK to act as if it were in the specified environment.\n */\n forceEnvironment?: 'browser' | 'node';\n [key: string]: unknown;\n}\n\ndeclare global {\n // Need `var` for this to work.\n // eslint-disable-next-line no-var\n var __FIREBASE_DEFAULTS__: FirebaseDefaults | undefined;\n}\n\nconst getDefaultsFromGlobal = (): FirebaseDefaults | undefined =>\n getGlobal().__FIREBASE_DEFAULTS__;\n\n/**\n * Attempt to read defaults from a JSON string provided to\n * process(.)env(.)__FIREBASE_DEFAULTS__ or a JSON file whose path is in\n * process(.)env(.)__FIREBASE_DEFAULTS_PATH__\n * The dots are in parens because certain compilers (Vite?) cannot\n * handle seeing that variable in comments.\n * See https://github.com/firebase/firebase-js-sdk/issues/6838\n */\nconst getDefaultsFromEnvVariable = (): FirebaseDefaults | undefined => {\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\n return;\n }\n const defaultsJsonString = process.env.__FIREBASE_DEFAULTS__;\n if (defaultsJsonString) {\n return JSON.parse(defaultsJsonString);\n }\n};\n\nconst getDefaultsFromCookie = (): FirebaseDefaults | undefined => {\n if (typeof document === 'undefined') {\n return;\n }\n let match;\n try {\n match = document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/);\n } catch (e) {\n // Some environments such as Angular Universal SSR have a\n // `document` object but error on accessing `document.cookie`.\n return;\n }\n const decoded = match && base64Decode(match[1]);\n return decoded && JSON.parse(decoded);\n};\n\n/**\n * Get the __FIREBASE_DEFAULTS__ object. It checks in order:\n * (1) if such an object exists as a property of `globalThis`\n * (2) if such an object was provided on a shell environment variable\n * (3) if such an object exists in a cookie\n * @public\n */\nexport const getDefaults = (): FirebaseDefaults | undefined => {\n try {\n return (\n getDefaultsFromGlobal() ||\n getDefaultsFromEnvVariable() ||\n getDefaultsFromCookie()\n );\n } catch (e) {\n /**\n * Catch-all for being unable to get __FIREBASE_DEFAULTS__ due\n * to any environment case we have not accounted for. Log to\n * info instead of swallowing so we can find these unknown cases\n * and add paths for them if needed.\n */\n console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`);\n return;\n }\n};\n\n/**\n * Returns emulator host stored in the __FIREBASE_DEFAULTS__ object\n * for the given product.\n * @returns a URL host formatted like `127.0.0.1:9999` or `[::1]:4000` if available\n * @public\n */\nexport const getDefaultEmulatorHost = (\n productName: string\n): string | undefined => getDefaults()?.emulatorHosts?.[productName];\n\n/**\n * Returns emulator hostname and port stored in the __FIREBASE_DEFAULTS__ object\n * for the given product.\n * @returns a pair of hostname and port like `[\"::1\", 4000]` if available\n * @public\n */\nexport const getDefaultEmulatorHostnameAndPort = (\n productName: string\n): [hostname: string, port: number] | undefined => {\n const host = getDefaultEmulatorHost(productName);\n if (!host) {\n return undefined;\n }\n const separatorIndex = host.lastIndexOf(':'); // Finding the last since IPv6 addr also has colons.\n if (separatorIndex <= 0 || separatorIndex + 1 === host.length) {\n throw new Error(`Invalid host ${host} with no separate hostname and port!`);\n }\n // eslint-disable-next-line no-restricted-globals\n const port = parseInt(host.substring(separatorIndex + 1), 10);\n if (host[0] === '[') {\n // Bracket-quoted `[ipv6addr]:port` => return \"ipv6addr\" (without brackets).\n return [host.substring(1, separatorIndex - 1), port];\n } else {\n return [host.substring(0, separatorIndex), port];\n }\n};\n\n/**\n * Returns Firebase app config stored in the __FIREBASE_DEFAULTS__ object.\n * @public\n */\nexport const getDefaultAppConfig = (): Record<string, string> | undefined =>\n getDefaults()?.config;\n\n/**\n * Returns an experimental setting on the __FIREBASE_DEFAULTS__ object (properties\n * prefixed by \"_\")\n * @public\n */\nexport const getExperimentalSetting = <T extends ExperimentalKey>(\n name: T\n): FirebaseDefaults[`_${T}`] =>\n getDefaults()?.[`_${name}`] as FirebaseDefaults[`_${T}`];\n","/**\n * @license\n * Copyright 2022 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 * Polyfill for `globalThis` object.\n * @returns the `globalThis` object for the given environment.\n * @public\n */\nexport function getGlobal(): typeof globalThis {\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n throw new Error('Unable to locate global object.');\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<R> {\n promise: Promise<R>;\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\nimport { CONSTANTS } from './constants';\nimport { getDefaults } from './defaults';\n\n/**\n * Returns navigator.userAgent string or '' if it's not defined.\n * @return user agent string\n */\nexport function getUA(): string {\n if (\n typeof navigator !== 'undefined' &&\n typeof navigator['userAgent'] === 'string'\n ) {\n return navigator['userAgent'];\n } else {\n return '';\n }\n}\n\n/**\n * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device.\n *\n * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap\n * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally\n * wait for a callback.\n */\nexport function isMobileCordova(): boolean {\n return (\n typeof window !== 'undefined' &&\n // @ts-ignore Setting up an broadly applicable index signature for Window\n // just to deal with this case would probably be a bad idea.\n !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) &&\n /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA())\n );\n}\n\n/**\n * Detect Node.js.\n *\n * @return true if Node.js environment is detected or specified.\n */\n// Node detection logic from: https://github.com/iliakan/detect-node/\nexport function isNode(): boolean {\n const forceEnvironment = getDefaults()?.forceEnvironment;\n if (forceEnvironment === 'node') {\n return true;\n } else if (forceEnvironment === 'browser') {\n return false;\n }\n\n try {\n return (\n Object.prototype.toString.call(global.process) === '[object process]'\n );\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Detect Browser Environment\n */\nexport function isBrowser(): boolean {\n return typeof self === 'object' && self.self === self;\n}\n\n/**\n * Detect browser extensions (Chrome and Firefox at least).\n */\ninterface BrowserRuntime {\n id?: unknown;\n}\ndeclare const chrome: { runtime?: BrowserRuntime };\ndeclare const browser: { runtime?: BrowserRuntime };\nexport function isBrowserExtension(): boolean {\n const runtime =\n typeof chrome === 'object'\n ? chrome.runtime\n : typeof browser === 'object'\n ? browser.runtime\n : undefined;\n return typeof runtime === 'object' && runtime.id !== undefined;\n}\n\n/**\n * Detect React Native.\n *\n * @return true if ReactNative environment is detected.\n */\nexport function isReactNative(): boolean {\n return (\n typeof navigator === 'object' && navigator['product'] === 'ReactNative'\n );\n}\n\n/** Detects Electron apps. */\nexport function isElectron(): boolean {\n return getUA().indexOf('Electron/') >= 0;\n}\n\n/** Detects Internet Explorer. */\nexport function isIE(): boolean {\n const ua = getUA();\n return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;\n}\n\n/** Detects Universal Windows Platform apps. */\nexport function isUWP(): boolean {\n return getUA().indexOf('MSAppHost/') >= 0;\n}\n\n/**\n * Detect whether the current SDK build is the Node version.\n *\n * @return true if it's the Node SDK build.\n */\nexport function isNodeSdk(): boolean {\n return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\n}\n\n/** Returns true if we are running in Safari. */\nexport function isSafari(): boolean {\n return (\n !isNode() &&\n navigator.userAgent.includes('Safari') &&\n !navigator.userAgent.includes('Chrome')\n );\n}\n\n/**\n * This method checks if indexedDB is supported by current browser/service worker context\n * @return true if indexedDB is supported by current browser/service worker context\n */\nexport function isIndexedDBAvailable(): boolean {\n try {\n return typeof indexedDB === 'object';\n } catch (e) {\n return false;\n }\n}\n\n/**\n * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject\n * if errors occur during the database open operation.\n *\n * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox\n * private browsing)\n */\nexport function validateIndexedDBOpenable(): Promise<boolean> {\n return new Promise((resolve, reject) => {\n try {\n let preExist: boolean = true;\n const DB_CHECK_NAME =\n 'validate-browser-context-for-indexeddb-analytics-module';\n const request = self.indexedDB.open(DB_CHECK_NAME);\n request.onsuccess = () => {\n request.result.close();\n // delete database only when it doesn't pre-exist\n if (!preExist) {\n self.indexedDB.deleteDatabase(DB_CHECK_NAME);\n }\n resolve(true);\n };\n request.onupgradeneeded = () => {\n preExist = false;\n };\n\n request.onerror = () => {\n reject(request.error?.message || '');\n };\n } catch (error) {\n reject(error);\n }\n });\n}\n\n/**\n *\n * This method checks whether cookie is enabled within current browser\n * @return true if cookie is enabled within current browser\n */\nexport function areCookiesEnabled(): boolean {\n if (typeof navigator === 'undefined' || !navigator.cookieEnabled) {\n return false;\n }\n return true;\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<Err, string> = {\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<Err>('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 as FirebaseError)?.code === 'service/file-not-found') {\n * console.log(\"Could not read file: \" + e['file']);\n * }\n * }\n */\n\nexport type ErrorMap<ErrorCode extends string> = {\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\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 /** The custom name for all FirebaseErrors. */\n readonly name: string = ERROR_NAME;\n\n constructor(\n /** The error code for this error. */\n readonly code: string,\n message: string,\n /** Custom data for this error. */\n public customData?: Record<string, unknown>\n ) {\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<ErrorCode>\n ) {}\n\n create<K extends ErrorCode>(\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, customData);\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<T extends object>(obj: T, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexport function safeGet<T extends object, K extends keyof T>(\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<K extends string, V, U>(\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/**\n * Deep equal two objects. Support Arrays and Objects.\n */\nexport function deepEqual(a: object, b: object): boolean {\n if (a === b) {\n return true;\n }\n\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n for (const k of aKeys) {\n if (!bKeys.includes(k)) {\n return false;\n }\n\n const aProp = (a as Record<string, unknown>)[k];\n const bProp = (b as Record<string, unknown>)[k];\n if (isObject(aProp) && isObject(bProp)) {\n if (!deepEqual(aProp, bProp)) {\n return false;\n }\n } else if (aProp !== bProp) {\n return false;\n }\n }\n\n for (const k of bKeys) {\n if (!aKeys.includes(k)) {\n return false;\n }\n }\n return true;\n}\n\nfunction isObject(thing: unknown): thing is object {\n return thing !== null && typeof thing === 'object';\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 */\nexport type NextFn<T> = (value: T) => void;\nexport type ErrorFn = (error: Error) => void;\nexport type CompleteFn = () => void;\n\nexport interface Observer<T> {\n // Called once for each value in a stream of values.\n next: NextFn<T>;\n\n // A stream terminates by a single call to EITHER error() or complete().\n error: ErrorFn;\n\n // No events will be sent to next() once complete() is called.\n complete: CompleteFn;\n}\n\nexport type PartialObserver<T> = Partial<Observer<T>>;\n\n// TODO: Support also Unsubscribe.unsubscribe?\nexport type Unsubscribe = () => void;\n\n/**\n * The Subscribe interface has two forms - passing the inline function\n * callbacks, or a object interface with callback properties.\n */\nexport interface Subscribe<T> {\n (next?: NextFn<T>, error?: ErrorFn, complete?: CompleteFn): Unsubscribe;\n (observer: PartialObserver<T>): Unsubscribe;\n}\n\nexport interface Observable<T> {\n // Subscribe method\n subscribe: Subscribe<T>;\n}\n\nexport type Executor<T> = (observer: Observer<T>) => void;\n\n/**\n * Helper to make a Subscribe function (just like Promise helps make a\n * Thenable).\n *\n * @param executor Function which can make calls to a single Observer\n * as a proxy.\n * @param onNoObservers Callback when count of Observers goes to zero.\n */\nexport function createSubscribe<T>(\n executor: Executor<T>,\n onNoObservers?: Executor<T>\n): Subscribe<T> {\n const proxy = new ObserverProxy<T>(executor, onNoObservers);\n return proxy.subscribe.bind(proxy);\n}\n\n/**\n * Implement fan-out for any number of Observers attached via a subscribe\n * function.\n */\nclass ObserverProxy<T> implements Observer<T> {\n private observers: Array<Observer<T>> | undefined = [];\n private unsubscribes: Unsubscribe[] = [];\n private onNoObservers: Executor<T> | undefined;\n private observerCount = 0;\n // Micro-task scheduling by calling task.then().\n private task = Promise.resolve();\n private finalized = false;\n private finalError?: Error;\n\n /**\n * @param executor Function which can make calls to a single Observer\n * as a proxy.\n * @param onNoObservers Callback when count of Observers goes to zero.\n */\n constructor(executor: Executor<T>, onNoObservers?: Executor<T>) {\n this.onNoObservers = onNoObservers;\n // Call the executor asynchronously so subscribers that are called\n // synchronously after the creation of the subscribe function\n // can still receive the very first value generated in the executor.\n this.task\n .then(() => {\n executor(this);\n })\n .catch(e => {\n this.error(e);\n });\n }\n\n next(value: T): void {\n this.forEachObserver((observer: Observer<T>) => {\n observer.next(value);\n });\n }\n\n error(error: Error): void {\n this.forEachObserver((observer: Observer<T>) => {\n observer.error(error);\n });\n this.close(error);\n }\n\n complete(): void {\n this.forEachObserver((observer: Observer<T>) => {\n observer.complete();\n });\n this.close();\n }\n\n /**\n * Subscribe function that can be used to add an Observer to the fan-out list.\n *\n * - We require that no event is sent to a subscriber sychronously to their\n * call to subscribe().\n */\n subscribe(\n nextOrObserver?: NextFn<T> | PartialObserver<T>,\n error?: ErrorFn,\n complete?: CompleteFn\n ): Unsubscribe {\n let observer: Observer<T>;\n\n if (\n nextOrObserver === undefined &&\n error === undefined &&\n complete === undefined\n ) {\n throw new Error('Missing Observer.');\n }\n\n // Assemble an Observer object when passed as callback functions.\n if (\n implementsAnyMethods(nextOrObserver as { [key: string]: unknown }, [\n 'next',\n 'error',\n 'complete'\n ])\n ) {\n observer = nextOrObserver as Observer<T>;\n } else {\n observer = {\n next: nextOrObserver as NextFn<T>,\n error,\n complete\n } as Observer<T>;\n }\n\n if (observer.next === undefined) {\n observer.next = noop as NextFn<T>;\n }\n if (observer.error === undefined) {\n observer.error = noop as ErrorFn;\n }\n if (observer.complete === undefined) {\n observer.complete = noop as CompleteFn;\n }\n\n const unsub = this.unsubscribeOne.bind(this, this.observers!.length);\n\n // Attempt to subscribe to a terminated Observable - we\n // just respond to the Observer with the final error or complete\n // event.\n if (this.finalized) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.task.then(() => {\n try {\n if (this.finalError) {\n observer.error(this.finalError);\n } else {\n observer.complete();\n }\n } catch (e) {\n // nothing\n }\n return;\n });\n }\n\n this.observers!.push(observer as Observer<T>);\n\n return unsub;\n }\n\n // Unsubscribe is synchronous - we guarantee that no events are sent to\n // any unsubscribed Observer.\n private unsubscribeOne(i: number): void {\n if (this.observers === undefined || this.observers[i] === undefined) {\n return;\n }\n\n delete this.observers[i];\n\n this.observerCount -= 1;\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\n this.onNoObservers(this);\n }\n }\n\n private forEachObserver(fn: (observer: Observer<T>) => void): void {\n if (this.finalized) {\n // Already closed by previous event....just eat the additional values.\n return;\n }\n\n // Since sendOne calls asynchronously - there is no chance that\n // this.observers will become undefined.\n for (let i = 0; i < this.observers!.length; i++) {\n this.sendOne(i, fn);\n }\n }\n\n // Call the Observer via one of it's callback function. We are careful to\n // confirm that the observe has not been unsubscribed since this asynchronous\n // function had been queued.\n private sendOne(i: number, fn: (observer: Observer<T>) => void): void {\n // Execute the callback asynchronously\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.task.then(() => {\n if (this.observers !== undefined && this.observers[i] !== undefined) {\n try {\n fn(this.observers[i]);\n } catch (e) {\n // Ignore exceptions raised in Observers or missing methods of an\n // Observer.\n // Log error to console. b/31404806\n if (typeof console !== 'undefined' && console.error) {\n console.error(e);\n }\n }\n }\n });\n }\n\n private close(err?: Error): void {\n if (this.finalized) {\n return;\n }\n this.finalized = true;\n if (err !== undefined) {\n this.finalError = err;\n }\n // Proxy is no longer needed - garbage collect references\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.task.then(() => {\n this.observers = undefined;\n this.onNoObservers = undefined;\n });\n }\n}\n\n/** Turn synchronous function into one called asynchronously. */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function async(fn: Function, onError?: ErrorFn): Function {\n return (...args: unknown[]) => {\n Promise.resolve(true)\n .then(() => {\n fn(...args);\n })\n .catch((error: Error) => {\n if (onError) {\n onError(error);\n }\n });\n };\n}\n\n/**\n * Return true if the object passed in implements any of the named methods.\n */\nfunction implementsAnyMethods(\n obj: { [key: string]: unknown },\n methods: string[]\n): boolean {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n\n for (const method of methods) {\n if (method in obj && typeof obj[method] === 'function') {\n return true;\n }\n }\n\n return false;\n}\n\nfunction noop(): void {\n // do nothing\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 onInstanceCreatedCallback\n} from './types';\n\n/**\n * Component for service name T, e.g. `auth`, `auth-internal`\n */\nexport class Component<T extends Name = Name> {\n multipleInstances = false;\n /**\n * Properties to be added to the service namespace\n */\n serviceProps: Dictionary = {};\n\n instantiationMode = InstantiationMode.LAZY;\n\n onInstanceCreated: onInstanceCreatedCallback<T> | null = null;\n\n /**\n *\n * @param name The public service name, e.g. app, auth, firestore, database\n * @param instanceFactory Service factory responsible for creating the public interface\n * @param type whether the service provided by the component is public or private\n */\n constructor(\n readonly name: T,\n readonly instanceFactory: InstanceFactory<T>,\n readonly type: ComponentType\n ) {}\n\n setInstantiationMode(mode: InstantiationMode): this {\n this.instantiationMode = mode;\n return this;\n }\n\n setMultipleInstances(multipleInstances: boolean): this {\n this.multipleInstances = multipleInstances;\n return this;\n }\n\n setServiceProps(props: Dictionary): this {\n this.serviceProps = props;\n return this;\n }\n\n setInstanceCreatedCallback(callback: onInstanceCreatedCallback<T>): this {\n this.onInstanceCreated = callback;\n return this;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const DEFAULT_ENTRY_NAME = '[DEFAULT]';\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Deferred } from '@firebase/util';\nimport { ComponentContainer } from './component_container';\nimport { DEFAULT_ENTRY_NAME } from './constants';\nimport {\n InitializeOptions,\n InstantiationMode,\n Name,\n NameServiceMapping,\n OnInitCallBack\n} from './types';\nimport { Component } from './component';\n\n/**\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\n * NameServiceMapping[T] is an alias for the type of the instance\n */\nexport class Provider<T extends Name> {\n private component: Component<T> | null = null;\n private readonly instances: Map<string, NameServiceMapping[T]> = new Map();\n private readonly instancesDeferred: Map<\n string,\n Deferred<NameServiceMapping[T]>\n > = new Map();\n private readonly instancesOptions: Map<string, Record<string, unknown>> =\n new Map();\n private onInitCallbacks: Map<string, Set<OnInitCallBack<T>>> = new Map();\n\n constructor(\n private readonly name: T,\n private readonly container: ComponentContainer\n ) {}\n\n /**\n * @param identifier A provider can provide mulitple instances of a service\n * if this.component.multipleInstances is true.\n */\n get(identifier?: string): Promise<NameServiceMapping[T]> {\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<NameServiceMapping[T]>();\n this.instancesDeferred.set(normalizedIdentifier, deferred);\n\n if (\n this.isInitialized(normalizedIdentifier) ||\n this.shouldAutoInitialize()\n ) {\n // initialize the service if it can be auto-initialized\n try {\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n if (instance) {\n deferred.resolve(instance);\n }\n } catch (e) {\n // when the instance factory throws an exception during get(), it should not cause\n // a fatal error. We just return the unresolved promise in this case.\n }\n }\n }\n\n return this.instancesDeferred.get(normalizedIdentifier)!.promise;\n }\n\n /**\n *\n * @param options.identifier A provider can provide mulitple instances of a service\n * if this.component.multipleInstances is true.\n * @param options.optional If optional is false or not provided, the method throws an error when\n * the service is not immediately available.\n * If optional is true, the method returns null if the service is not immediately available.\n */\n getImmediate(options: {\n identifier?: string;\n optional: true;\n }): NameServiceMapping[T] | null;\n getImmediate(options?: {\n identifier?: string;\n optional?: false;\n }): NameServiceMapping[T];\n getImmediate(options?: {\n identifier?: string;\n optional?: boolean;\n }): NameServiceMapping[T] | null {\n // if multipleInstances is not supported, use the default name\n const normalizedIdentifier = this.normalizeInstanceIdentifier(\n options?.identifier\n );\n const optional = options?.optional ?? false;\n\n if (\n this.isInitialized(normalizedIdentifier) ||\n this.shouldAutoInitialize()\n ) {\n try {\n return this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n } catch (e) {\n if (optional) {\n return null;\n } else {\n throw e;\n }\n }\n } else {\n // In case a component is not initialized and should/can not be auto-initialized at the moment, return null if the optional flag is set, or throw\n if (optional) {\n return null;\n } else {\n throw Error(`Service ${this.name} is not available`);\n }\n }\n }\n\n getComponent(): Component<T> | null {\n return this.component;\n }\n\n setComponent(component: Component<T>): void {\n if (component.name !== this.name) {\n throw Error(\n `Mismatching Component ${component.name} for Provider ${this.name}.`\n );\n }\n\n if (this.component) {\n throw Error(`Component for ${this.name} has already been provided`);\n }\n\n this.component = component;\n\n // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\n if (!this.shouldAutoInitialize()) {\n return;\n }\n\n // if the service is eager, initialize the default instance\n if (isComponentEager(component)) {\n try {\n this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\n } catch (e) {\n // when the instance factory for an eager Component throws an exception during the eager\n // initialization, it should not cause a fatal error.\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\n // a fatal error in this case?\n }\n }\n\n // Create service instances for the pending promises and resolve them\n // NOTE: if this.multipleInstances is false, only the default instance will be created\n // and all promises with resolve with it regardless of the identifier.\n for (const [\n instanceIdentifier,\n instanceDeferred\n ] of this.instancesDeferred.entries()) {\n const normalizedIdentifier =\n this.normalizeInstanceIdentifier(instanceIdentifier);\n\n try {\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n })!;\n instanceDeferred.resolve(instance);\n } catch (e) {\n // when the instance factory throws an exception, it should not cause\n // a fatal error. We just leave the promise unresolved.\n }\n }\n }\n\n clearInstance(identifier: string = DEFAULT_ENTRY_NAME): void {\n this.instancesDeferred.delete(identifier);\n this.instancesOptions.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<void> {\n const services = Array.from(this.instances.values());\n\n await Promise.all([\n ...services\n .filter(service => 'INTERNAL' in service) // legacy services\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(service => (service as any).INTERNAL!.delete()),\n ...services\n .filter(service => '_delete' in service) // modularized services\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(service => (service as any)._delete())\n ]);\n }\n\n isComponentSet(): boolean {\n return this.component != null;\n }\n\n isInitialized(identifier: string = DEFAULT_ENTRY_NAME): boolean {\n return this.instances.has(identifier);\n }\n\n getOptions(identifier: string = DEFAULT_ENTRY_NAME): Record<string, unknown> {\n return this.instancesOptions.get(identifier) || {};\n }\n\n initialize(opts: InitializeOptions = {}): NameServiceMapping[T] {\n const { options = {} } = opts;\n const normalizedIdentifier = this.normalizeInstanceIdentifier(\n opts.instanceIdentifier\n );\n if (this.isInitialized(normalizedIdentifier)) {\n throw Error(\n `${this.name}(${normalizedIdentifier}) has already been initialized`\n );\n }\n\n if (!this.isComponentSet()) {\n throw Error(`Component ${this.name} has not been registered yet`);\n }\n\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier,\n options\n })!;\n\n // resolve any pending promise waiting for the service instance\n for (const [\n instanceIdentifier,\n instanceDeferred\n ] of this.instancesDeferred.entries()) {\n const normalizedDeferredIdentifier =\n this.normalizeInstanceIdentifier(instanceIdentifier);\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\n instanceDeferred.resolve(instance);\n }\n }\n\n return instance;\n }\n\n /**\n *\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\n *\n * @param identifier An optional instance identifier\n * @returns a function to unregister the callback\n */\n onInit(callback: OnInitCallBack<T>, identifier?: string): () => void {\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\n const existingCallbacks =\n this.onInitCallbacks.get(normalizedIdentifier) ??\n new Set<OnInitCallBack<T>>();\n existingCallbacks.add(callback);\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\n\n const existingInstance = this.instances.get(normalizedIdentifier);\n if (existingInstance) {\n callback(existingInstance, normalizedIdentifier);\n }\n\n return () => {\n existingCallbacks.delete(callback);\n };\n }\n\n /**\n * Invoke onInit callbacks synchronously\n * @param instance the service instance`\n */\n private invokeOnInitCallbacks(\n instance: NameServiceMapping[T],\n identifier: string\n ): void {\n const callbacks = this.onInitCallbacks.get(identifier);\n if (!callbacks) {\n return;\n }\n for (const callback of callbacks) {\n try {\n callback(instance, identifier);\n } catch {\n // ignore errors in the onInit callback\n }\n }\n }\n\n private getOrInitializeService({\n instanceIdentifier,\n options = {}\n }: {\n instanceIdentifier: string;\n options?: Record<string, unknown>;\n }): NameServiceMapping[T] | null {\n let instance = this.instances.get(instanceIdentifier);\n if (!instance && this.component) {\n instance = this.component.instanceFactory(this.container, {\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\n options\n });\n this.instances.set(instanceIdentifier, instance);\n this.instancesOptions.set(instanceIdentifier, options);\n\n /**\n * Invoke onInit listeners.\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\n * while onInit listeners are registered by consumers of the provider.\n */\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\n\n /**\n * Order is important\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\n * makes `isInitialized()` return true.\n */\n if (this.component.onInstanceCreated) {\n try {\n this.component.onInstanceCreated(\n this.container,\n instanceIdentifier,\n instance\n );\n } catch {\n // ignore errors in the onInstanceCreatedCallback\n }\n }\n }\n\n return instance || null;\n }\n\n private normalizeInstanceIdentifier(\n identifier: string = DEFAULT_ENTRY_NAME\n ): string {\n if (this.component) {\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\n } else {\n return identifier; // assume multiple instances are supported before the component is provided.\n }\n }\n\n private shouldAutoInitialize(): boolean {\n return (\n !!this.component &&\n this.component.instantiationMode !== InstantiationMode.EXPLICIT\n );\n }\n}\n\n// undefined should be passed to the service factory for the default instance\nfunction normalizeIdentifierForFactory(identifier: string): string | undefined {\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\n}\n\nfunction isComponentEager<T extends Name>(component: Component<T>): 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<string, Provider<Name>>();\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<T extends Name>(component: Component<T>): 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<T extends Name>(component: Component<T>): 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<T extends Name>(name: T): Provider<T> {\n if (this.providers.has(name)) {\n return this.providers.get(name) as unknown as Provider<T>;\n }\n\n // create a Provider for a service that hasn't registered with Firebase\n const provider = new Provider<T>(name, this);\n this.providers.set(name, provider as unknown as Provider<Name>);\n\n return provider as Provider<T>;\n }\n\n getProviders(): Array<Provider<Name>> {\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","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction));\n });\n }\n if (blocked)\n request.addEventListener('blocked', () => blocked());\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking)\n db.addEventListener('versionchange', () => blocking());\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked)\n request.addEventListener('blocked', () => blocked());\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\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';\nimport { PlatformLoggerService, VersionService } from './types';\n\nexport class PlatformLoggerServiceImpl implements 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() as VersionService;\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(provider: Provider<Name>): boolean {\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 { 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 { name as appName } from '../package.json';\nimport { name as appCompatName } from '../../app-compat/package.json';\nimport { name as analyticsCompatName } from '../../../packages/analytics-compat/package.json';\nimport { name as analyticsName } from '../../../packages/analytics/package.json';\nimport { name as appCheckCompatName } from '../../../packages/app-check-compat/package.json';\nimport { name as appCheckName } from '../../../packages/app-check/package.json';\nimport { name as authName } from '../../../packages/auth/package.json';\nimport { name as authCompatName } from '../../../packages/auth-compat/package.json';\nimport { name as databaseName } from '../../../packages/database/package.json';\nimport { name as databaseCompatName } from '../../../packages/database-compat/package.json';\nimport { name as functionsName } from '../../../packages/functions/package.json';\nimport { name as functionsCompatName } from '../../../packages/functions-compat/package.json';\nimport { name as installationsName } from '../../../packages/installations/package.json';\nimport { name as installationsCompatName } from '../../../packages/installations-compat/package.json';\nimport { name as messagingName } from '../../../packages/messaging/package.json';\nimport { name as messagingCompatName } from '../../../packages/messaging-compat/package.json';\nimport { name as performanceName } from '../../../packages/performance/package.json';\nimport { name as performanceCompatName } from '../../../packages/performance-compat/package.json';\nimport { name as remoteConfigName } from '../../../packages/remote-config/package.json';\nimport { name as remoteConfigCompatName } from '../../../packages/remote-config-compat/package.json';\nimport { name as storageName } from '../../../packages/storage/package.json';\nimport { name as storageCompatName } from '../../../packages/storage-compat/package.json';\nimport { name as firestoreName } from '../../../packages/firestore/package.json';\nimport { name as firestoreCompatName } from '../../../packages/firestore-compat/package.json';\nimport { name as packageName } from '../../../packages/firebase/package.json';\n\n/**\n * The default app name\n *\n * @internal\n */\nexport const DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\nexport const PLATFORM_LOG_STRING = {\n [appName]: 'fire-core',\n [appCompatName]: 'fire-core-compat',\n [analyticsName]: 'fire-analytics',\n [analyticsCompatName]: 'fire-analytics-compat',\n [appCheckName]: 'fire-app-check',\n [appCheckCompatName]: 'fire-app-check-compat',\n [authName]: 'fire-auth',\n [authCompatName]: 'fire-auth-compat',\n [databaseName]: 'fire-rtdb',\n [databaseCompatName]: 'fire-rtdb-compat',\n [functionsName]: 'fire-fn',\n [functionsCompatName]: 'fire-fn-compat',\n [installationsName]: 'fire-iid',\n [installationsCompatName]: 'fire-iid-compat',\n [messagingName]: 'fire-fcm',\n [messagingCompatName]: 'fire-fcm-compat',\n [performanceName]: 'fire-perf',\n [performanceCompatName]: 'fire-perf-compat',\n [remoteConfigName]: 'fire-rc',\n [remoteConfigCompatName]: 'fire-rc-compat',\n [storageName]: 'fire-gcs',\n [storageCompatName]: 'fire-gcs-compat',\n [firestoreName]: 'fire-fst',\n [firestoreCompatName]: 'fire-fst-compat',\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 { FirebaseApp } from './public-types';\nimport { Component, Provider, Name } from '@firebase/component';\nimport { logger } from './logger';\nimport { DEFAULT_ENTRY_NAME } from './constants';\nimport { FirebaseAppImpl } from './firebaseApp';\n\n/**\n * @internal\n */\nexport const _apps = new Map<string, FirebaseApp>();\n\n/**\n * Registered components.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const _components = new Map<string, Component<any>>();\n\n/**\n * @param component - the component being added to this app's container\n *\n * @internal\n */\nexport function _addComponent<T extends Name>(\n app: FirebaseApp,\n component: Component<T>\n): void {\n try {\n (app as FirebaseAppImpl).container.addComponent(component);\n } catch (e) {\n logger.debug(\n `Component ${component.name} failed to register with FirebaseApp ${app.name}`,\n e\n );\n }\n}\n\n/**\n *\n * @internal\n */\nexport function _addOrOverwriteComponent(\n app: FirebaseApp,\n component: Component\n): void {\n (app as FirebaseAppImpl).container.addOrOverwriteComponent(component);\n}\n\n/**\n *\n * @param component - the component to register\n * @returns whether or not the component is registered successfully\n *\n * @internal\n */\nexport function _registerComponent<T extends Name>(\n component: Component<T>\n): boolean {\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 false;\n }\n\n _components.set(componentName, component);\n\n // add the component to existing app instances\n for (const app of _apps.values()) {\n _addComponent(app as FirebaseAppImpl, component);\n }\n\n return true;\n}\n\n/**\n *\n * @param app - FirebaseApp instance\n * @param name - service name\n *\n * @returns the provider for the service with the matching name\n *\n * @internal\n */\nexport function _getProvider<T extends Name>(\n app: FirebaseApp,\n name: T\n): Provider<T> {\n const heartbeatController = (app as FirebaseAppImpl).container\n .getProvider('heartbeat')\n .getImmediate({ optional: true });\n if (heartbeatController) {\n void heartbeatController.triggerHeartbeat();\n }\n return (app as FirebaseAppImpl).container.getProvider(name);\n}\n\n/**\n *\n * @param app - FirebaseApp instance\n * @param name - service name\n * @param instanceIdentifier - service instance identifier in case the service supports multiple instances\n *\n * @internal\n */\nexport function _removeServiceInstance<T extends Name>(\n app: FirebaseApp,\n name: T,\n instanceIdentifier: string = DEFAULT_ENTRY_NAME\n): void {\n _getProvider(app, name).clearInstance(instanceIdentifier);\n}\n\n/**\n * Test only\n *\n * @internal\n */\nexport function _clearComponents(): void {\n _components.clear();\n}\n\n/**\n * Exported in order to be used in app-compat package\n */\nexport { DEFAULT_ENTRY_NAME as _DEFAULT_ENTRY_NAME };\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 NO_OPTIONS = 'no-options',\n INVALID_APP_ARGUMENT = 'invalid-app-argument',\n INVALID_LOG_ARGUMENT = 'invalid-log-argument',\n IDB_OPEN = 'idb-open',\n IDB_GET = 'idb-get',\n IDB_WRITE = 'idb-set',\n IDB_DELETE = 'idb-delete'\n}\n\nconst ERRORS: ErrorMap<AppError> = {\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]:\n \"Firebase App named '{$appName}' already exists with different options or config\",\n [AppError.APP_DELETED]: \"Firebase App named '{$appName}' already deleted\",\n [AppError.NO_OPTIONS]:\n 'Need to provide options, when not being deployed to hosting via source.',\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 [AppError.IDB_OPEN]:\n 'Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.',\n [AppError.IDB_GET]:\n 'Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.',\n [AppError.IDB_WRITE]:\n 'Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.',\n [AppError.IDB_DELETE]:\n 'Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.'\n};\n\ninterface ErrorParams {\n [AppError.NO_APP]: { appName: string };\n [AppError.BAD_APP_NAME]: { appName: string };\n [AppError.DUPLICATE_APP]: { appName: string };\n [AppError.APP_DELETED]: { appName: string };\n [AppError.INVALID_APP_ARGUMENT]: { appName: string };\n [AppError.IDB_OPEN]: { originalErrorMessage?: string };\n [AppError.IDB_GET]: { originalErrorMessage?: string };\n [AppError.IDB_WRITE]: { originalErrorMessage?: string };\n [AppError.IDB_DELETE]: { originalErrorMessage?: string };\n}\n\nexport const ERROR_FACTORY = new ErrorFactory<AppError, ErrorParams>(\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\nimport {\n FirebaseApp,\n FirebaseOptions,\n FirebaseAppSettings\n} from './public-types';\nimport {\n ComponentContainer,\n Component,\n ComponentType\n} from '@firebase/component';\nimport { ERROR_FACTORY, AppError } from './errors';\n\nexport class FirebaseAppImpl implements FirebaseApp {\n private readonly _options: FirebaseOptions;\n private readonly _name: string;\n /**\n * Original config values passed in as a constructor parameter.\n * It is only used to compare with another config object to support idempotent initializeApp().\n *\n * Updating automaticDataCollectionEnabled on the App instance will not change its value in _config.\n */\n private readonly _config: Required<FirebaseAppSettings>;\n private _automaticDataCollectionEnabled: boolean;\n private _isDeleted = false;\n private readonly _container: ComponentContainer;\n\n constructor(\n options: FirebaseOptions,\n config: Required<FirebaseAppSettings>,\n container: ComponentContainer\n ) {\n this._options = { ...options };\n this._config = { ...config };\n this._name = config.name;\n this._automaticDataCollectionEnabled =\n config.automaticDataCollectionEnabled;\n this._container = container;\n this.container.addComponent(\n new Component('app', () => this, ComponentType.PUBLIC)\n );\n }\n\n get automaticDataCollectionEnabled(): boolean {\n this.checkDestroyed();\n return this._automaticDataCollectionEnabled;\n }\n\n set automaticDataCollectionEnabled(val: boolean) {\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 get config(): Required<FirebaseAppSettings> {\n this.checkDestroyed();\n return this._config;\n }\n\n get container(): ComponentContainer {\n return this._container;\n }\n\n get isDeleted(): boolean {\n return this._isDeleted;\n }\n\n set isDeleted(val: boolean) {\n this._isDeleted = val;\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 {\n FirebaseApp,\n FirebaseOptions,\n FirebaseAppSettings\n} from './public-types';\nimport { DEFAULT_ENTRY_NAME, PLATFORM_LOG_STRING } from './constants';\nimport { ERROR_FACTORY, AppError } from './errors';\nimport {\n ComponentContainer,\n Component,\n Name,\n ComponentType\n} from '@firebase/component';\nimport { version } from '../../firebase/package.json';\nimport { FirebaseAppImpl } from './firebaseApp';\nimport { _apps, _components, _registerComponent } from './internal';\nimport { logger } from './logger';\nimport {\n LogLevelString,\n setLogLevel as setLogLevelImpl,\n LogCallback,\n LogOptions,\n setUserLogHandler\n} from '@firebase/logger';\nimport { deepEqual, getDefaultAppConfig } from '@firebase/util';\n\nexport { FirebaseError } from '@firebase/util';\n\n/**\n * The current SDK version.\n *\n * @public\n */\nexport const SDK_VERSION = version;\n\n/**\n * Creates and initializes a {@link @firebase/app#FirebaseApp} instance.\n *\n * See\n * {@link\n * https://firebase.google.com/docs/web/setup#add_firebase_to_your_app\n * | Add Firebase to your app} and\n * {@link\n * https://firebase.google.com/docs/web/setup#multiple-projects\n * | Initialize multiple projects} for detailed documentation.\n *\n * @example\n * ```javascript\n *\n * // Initialize default app\n * // Retrieve your own options values by adding a web app on\n * // https://console.firebase.google.com\n * initializeApp({\n * apiKey: \"AIza....\", // Auth / General Use\n * authDomain: \"YOUR_APP.firebaseapp.com\", // Auth with popup/redirect\n * databaseURL: \"https://YOUR_APP.firebaseio.com\", // Realtime Database\n * storageBucket: \"YOUR_APP.appspot.com\", // Storage\n * messagingSenderId: \"123456789\" // Cloud Messaging\n * });\n * ```\n *\n * @example\n * ```javascript\n *\n * // Initialize another app\n * const otherApp = initializeApp({\n * databaseURL: \"https://<OTHER_DATABASE_NAME>.firebaseio.com\",\n * storageBucket: \"<OTHER_STORAGE_BUCKET>.appspot.com\"\n * }, \"otherApp\");\n * ```\n *\n * @param options - Options to configure the app's services.\n * @param name - Optional name of the app to initialize. If no name\n * is provided, the default is `\"[DEFAULT]\"`.\n *\n * @returns The initialized app.\n *\n * @public\n */\nexport function initializeApp(\n options: FirebaseOptions,\n name?: string\n): FirebaseApp;\n/**\n * Creates and initializes a FirebaseApp instance.\n *\n * @param options - Options to configure the app's services.\n * @param config - FirebaseApp Configuration\n *\n * @public\n */\nexport function initializeApp(\n options: FirebaseOptions,\n config?: FirebaseAppSettings\n): FirebaseApp;\n/**\n * Creates and initializes a FirebaseApp instance.\n *\n * @public\n */\nexport function initializeApp(): FirebaseApp;\nexport function initializeApp(\n _options?: FirebaseOptions,\n rawConfig = {}\n): FirebaseApp {\n let options = _options;\n\n if (typeof rawConfig !== 'object') {\n const name = rawConfig;\n rawConfig = { name };\n }\n\n const config: Required<FirebaseAppSettings> = {\n name: DEFAULT_ENTRY_NAME,\n automaticDataCollectionEnabled: false,\n ...rawConfig\n };\n const name = config.name;\n\n if (typeof name !== 'string' || !name) {\n throw ERROR_FACTORY.create(AppError.BAD_APP_NAME, {\n appName: String(name)\n });\n }\n\n options ||= getDefaultAppConfig();\n\n if (!options) {\n throw ERROR_FACTORY.create(AppError.NO_OPTIONS);\n }\n\n const existingApp = _apps.get(name) as FirebaseAppImpl;\n if (existingApp) {\n // return the existing app if options and config deep equal the ones in the existing app.\n if (\n deepEqual(options, existingApp.options) &&\n deepEqual(config, existingApp.config)\n ) {\n return existingApp;\n } else {\n throw ERROR_FACTORY.create(AppError.DUPLICATE_APP, { appName: name });\n }\n }\n\n const container = new ComponentContainer(name);\n for (const component of _components.values()) {\n container.addComponent(component);\n }\n\n const newApp = new FirebaseAppImpl(options, config, container);\n\n _apps.set(name, newApp);\n\n return newApp;\n}\n\n/**\n * Retrieves a {@link @firebase/app#FirebaseApp} instance.\n *\n * When called with no arguments, the default app is returned. When an app name\n * is provided, the app corresponding to that name is returned.\n *\n * An exception is thrown if the app being retrieved has not yet been\n * initialized.\n *\n * @example\n * ```javascript\n * // Return the default app\n * const app = getApp();\n * ```\n *\n * @example\n * ```javascript\n * // Return a named app\n * const otherApp = getApp(\"otherApp\");\n * ```\n *\n * @param name - Optional name of the app to return. If no name is\n * provided, the default is `\"[DEFAULT]\"`.\n *\n * @returns The app corresponding to the provided app name.\n * If no app name is provided, the default app is returned.\n *\n * @public\n */\nexport function getApp(name: string = DEFAULT_ENTRY_NAME): FirebaseApp {\n const app = _apps.get(name);\n if (!app && name === DEFAULT_ENTRY_NAME) {\n return initializeApp();\n }\n if (!app) {\n throw ERROR_FACTORY.create(AppError.NO_APP, { appName: name });\n }\n\n return app;\n}\n\n/**\n * A (read-only) array of all initialized apps.\n * @public\n */\nexport function getApps(): FirebaseApp[] {\n return Array.from(_apps.values());\n}\n\n/**\n * Renders this app unusable and frees the resources of all associated\n * services.\n *\n * @example\n * ```javascript\n * deleteApp(app)\n * .then(function() {\n * console.log(\"App deleted successfully\");\n * })\n * .catch(function(error) {\n * console.log(\"Error deleting app:\", error);\n * });\n * ```\n *\n * @public\n */\nexport async function deleteApp(app: FirebaseApp): Promise<void> {\n const name = app.name;\n if (_apps.has(name)) {\n _apps.delete(name);\n await Promise.all(\n (app as FirebaseAppImpl).container\n .getProviders()\n .map(provider => provider.delete())\n );\n (app as FirebaseAppImpl).isDeleted = true;\n }\n}\n\n/**\n * Registers a library's name and version for platform logging purposes.\n * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)\n * @param version - Current version of that library.\n * @param variant - Bundle variant, e.g., node, rn, etc.\n *\n * @public\n */\nexport 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/**\n * Sets log handler for all Firebase SDKs.\n * @param logCallback - An optional custom log handler that executes user code whenever\n * the Firebase SDK makes a logging call.\n *\n * @public\n */\nexport function onLog(\n logCallback: LogCallback | null,\n options?: LogOptions\n): void {\n if (logCallback !== null && typeof logCallback !== 'function') {\n throw ERROR_FACTORY.create(AppError.INVALID_LOG_ARGUMENT);\n }\n setUserLogHandler(logCallback, options);\n}\n\n/**\n * Sets log level for all Firebase SDKs.\n *\n * All of the log types above the current log level are captured (i.e. if\n * you set the log level to `info`, errors are logged, but `debug` and\n * `verbose` logs are not).\n *\n * @public\n */\nexport function setLogLevel(logLevel: LogLevelString): void {\n setLogLevelImpl(logLevel);\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseError } from '@firebase/util';\nimport { DBSchema, openDB, IDBPDatabase } from 'idb';\nimport { AppError, ERROR_FACTORY } from './errors';\nimport { FirebaseApp } from './public-types';\nimport { HeartbeatsInIndexedDB } from './types';\nimport { logger } from './logger';\n\nconst DB_NAME = 'firebase-heartbeat-database';\nconst DB_VERSION = 1;\nconst STORE_NAME = 'firebase-heartbeat-store';\n\ninterface AppDB extends DBSchema {\n 'firebase-heartbeat-store': {\n key: string;\n value: HeartbeatsInIndexedDB;\n };\n}\n\nlet dbPromise: Promise<IDBPDatabase<AppDB>> | null = null;\nfunction getDbPromise(): Promise<IDBPDatabase<AppDB>> {\n if (!dbPromise) {\n dbPromise = openDB<AppDB>(DB_NAME, DB_VERSION, {\n upgrade: (db, oldVersion) => {\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 (oldVersion) {\n case 0:\n db.createObjectStore(STORE_NAME);\n }\n }\n }).catch(e => {\n throw ERROR_FACTORY.create(AppError.IDB_OPEN, {\n originalErrorMessage: e.message\n });\n });\n }\n return dbPromise;\n}\n\nexport async function readHeartbeatsFromIndexedDB(\n app: FirebaseApp\n): Promise<HeartbeatsInIndexedDB | undefined> {\n try {\n const db = await getDbPromise();\n return db\n .transaction(STORE_NAME)\n .objectStore(STORE_NAME)\n .get(computeKey(app)) as Promise<HeartbeatsInIndexedDB | undefined>;\n } catch (e) {\n if (e instanceof FirebaseError) {\n logger.warn(e.message);\n } else {\n const idbGetError = ERROR_FACTORY.create(AppError.IDB_GET, {\n originalErrorMessage: (e as Error)?.message\n });\n logger.warn(idbGetError.message);\n }\n }\n}\n\nexport async function writeHeartbeatsToIndexedDB(\n app: FirebaseApp,\n heartbeatObject: HeartbeatsInIndexedDB\n): Promise<void> {\n try {\n const db = await getDbPromise();\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const objectStore = tx.objectStore(STORE_NAME);\n await objectStore.put(heartbeatObject, computeKey(app));\n return tx.done;\n } catch (e) {\n if (e instanceof FirebaseError) {\n logger.warn(e.message);\n } else {\n const idbGetError = ERROR_FACTORY.create(AppError.IDB_WRITE, {\n originalErrorMessage: (e as Error)?.message\n });\n logger.warn(idbGetError.message);\n }\n }\n}\n\nfunction computeKey(app: FirebaseApp): string {\n return `${app.name}!${app.options.appId}`;\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ComponentContainer } from '@firebase/component';\nimport {\n base64urlEncodeWithoutPadding,\n isIndexedDBAvailable,\n validateIndexedDBOpenable\n} from '@firebase/util';\nimport {\n readHeartbeatsFromIndexedDB,\n writeHeartbeatsToIndexedDB\n} from './indexeddb';\nimport { FirebaseApp } from './public-types';\nimport {\n HeartbeatsByUserAgent,\n HeartbeatService,\n HeartbeatsInIndexedDB,\n HeartbeatStorage,\n SingleDateHeartbeat\n} from './types';\n\nconst MAX_HEADER_BYTES = 1024;\n// 30 days\nconst STORED_HEARTBEAT_RETENTION_MAX_MILLIS = 30 * 24 * 60 * 60 * 1000;\n\nexport class HeartbeatServiceImpl implements HeartbeatService {\n /**\n * The persistence layer for heartbeats\n * Leave public for easier testing.\n */\n _storage: HeartbeatStorageImpl;\n\n /**\n * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate\n * the header string.\n * Stores one record per date. This will be consolidated into the standard\n * format of one record per user agent string before being sent as a header.\n * Populated from indexedDB when the controller is instantiated and should\n * be kept in sync with indexedDB.\n * Leave public for easier testing.\n */\n _heartbeatsCache: HeartbeatsInIndexedDB | null = null;\n\n /**\n * the initialization promise for populating heartbeatCache.\n * If getHeartbeatsHeader() is called before the promise resolves\n * (hearbeatsCache == null), it should wait for this promise\n * Leave public for easier testing.\n */\n _heartbeatsCachePromise: Promise<HeartbeatsInIndexedDB>;\n constructor(private readonly container: ComponentContainer) {\n const app = this.container.getProvider('app').getImmediate();\n this._storage = new HeartbeatStorageImpl(app);\n this._heartbeatsCachePromise = this._storage.read().then(result => {\n this._heartbeatsCache = result;\n return result;\n });\n }\n\n /**\n * Called to report a heartbeat. The function will generate\n * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it\n * to IndexedDB.\n * Note that we only store one heartbeat per day. So if a heartbeat for today is\n * already logged, subsequent calls to this function in the same day will be ignored.\n */\n async triggerHeartbeat(): Promise<void> {\n const platformLogger = this.container\n .getProvider('platform-logger')\n .getImmediate();\n\n // This is the \"Firebase user agent\" string from the platform logger\n // service, not the browser user agent.\n const agent = platformLogger.getPlatformInfoString();\n const date = getUTCDateString();\n if (this._heartbeatsCache === null) {\n this._heartbeatsCache = await this._heartbeatsCachePromise;\n }\n // Do not store a heartbeat if one is already stored for this day\n // or if a header has already been sent today.\n if (\n this._heartbeatsCache.lastSentHeartbeatDate === date ||\n this._heartbeatsCache.heartbeats.some(\n singleDateHeartbeat => singleDateHeartbeat.date === date\n )\n ) {\n return;\n } else {\n // There is no entry for this date. Create one.\n this._heartbeatsCache.heartbeats.push({ date, agent });\n }\n // Remove entries older than 30 days.\n this._heartbeatsCache.heartbeats = this._heartbeatsCache.heartbeats.filter(\n singleDateHeartbeat => {\n const hbTimestamp = new Date(singleDateHeartbeat.date).valueOf();\n const now = Date.now();\n return now - hbTimestamp <= STORED_HEARTBEAT_RETENTION_MAX_MILLIS;\n }\n );\n return this._storage.overwrite(this._heartbeatsCache);\n }\n\n /**\n * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly.\n * It also clears all heartbeats from memory as well as in IndexedDB.\n *\n * NOTE: Consuming product SDKs should not send the header if this method\n * returns an empty string.\n */\n async getHeartbeatsHeader(): Promise<string> {\n if (this._heartbeatsCache === null) {\n await this._heartbeatsCachePromise;\n }\n // If it's still null or the array is empty, there is no data to send.\n if (\n this._heartbeatsCache === null ||\n this._heartbeatsCache.heartbeats.length === 0\n ) {\n return '';\n }\n const date = getUTCDateString();\n // Extract as many heartbeats from the cache as will fit under the size limit.\n const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(\n this._heartbeatsCache.heartbeats\n );\n const headerString = base64urlEncodeWithoutPadding(\n JSON.stringify({ version: 2, heartbeats: heartbeatsToSend })\n );\n // Store last sent date to prevent another being logged/sent for the same day.\n this._heartbeatsCache.lastSentHeartbeatDate = date;\n if (unsentEntries.length > 0) {\n // Store any unsent entries if they exist.\n this._heartbeatsCache.heartbeats = unsentEntries;\n // This seems more likely than emptying the array (below) to lead to some odd state\n // since the cache isn't empty and this will be called again on the next request,\n // and is probably safest if we await it.\n await this._storage.overwrite(this._heartbeatsCache);\n } else {\n this._heartbeatsCache.heartbeats = [];\n // Do not wait for this, to reduce latency.\n void this._storage.overwrite(this._heartbeatsCache);\n }\n return headerString;\n }\n}\n\nfunction getUTCDateString(): string {\n const today = new Date();\n // Returns date format 'YYYY-MM-DD'\n return today.toISOString().substring(0, 10);\n}\n\nexport function extractHeartbeatsForHeader(\n heartbeatsCache: SingleDateHeartbeat[],\n maxSize = MAX_HEADER_BYTES\n): {\n heartbeatsToSend: HeartbeatsByUserAgent[];\n unsentEntries: SingleDateHeartbeat[];\n} {\n // Heartbeats grouped by user agent in the standard format to be sent in\n // the header.\n const heartbeatsToSend: HeartbeatsByUserAgent[] = [];\n // Single date format heartbeats that are not sent.\n let unsentEntries = heartbeatsCache.slice();\n for (const singleDateHeartbeat of heartbeatsCache) {\n // Look for an existing entry with the same user agent.\n const heartbeatEntry = heartbeatsToSend.find(\n hb => hb.agent === singleDateHeartbeat.agent\n );\n if (!heartbeatEntry) {\n // If no entry for this user agent exists, create one.\n heartbeatsToSend.push({\n agent: singleDateHeartbeat.agent,\n dates: [singleDateHeartbeat.date]\n });\n if (countBytes(heartbeatsToSend) > maxSize) {\n // If the header would exceed max size, remove the added heartbeat\n // entry and stop adding to the header.\n heartbeatsToSend.pop();\n break;\n }\n } else {\n heartbeatEntry.dates.push(singleDateHeartbeat.date);\n // If the header would exceed max size, remove the added date\n // and stop adding to the header.\n if (countBytes(heartbeatsToSend) > maxSize) {\n heartbeatEntry.dates.pop();\n break;\n }\n }\n // Pop unsent entry from queue. (Skipped if adding the entry exceeded\n // quota and the loop breaks early.)\n unsentEntries = unsentEntries.slice(1);\n }\n return {\n heartbeatsToSend,\n unsentEntries\n };\n}\n\nexport class HeartbeatStorageImpl implements HeartbeatStorage {\n private _canUseIndexedDBPromise: Promise<boolean>;\n constructor(public app: FirebaseApp) {\n this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck();\n }\n async runIndexedDBEnvironmentCheck(): Promise<boolean> {\n if (!isIndexedDBAvailable()) {\n return false;\n } else {\n return validateIndexedDBOpenable()\n .then(() => true)\n .catch(() => false);\n }\n }\n /**\n * Read all heartbeats.\n */\n async read(): Promise<HeartbeatsInIndexedDB> {\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\n if (!canUseIndexedDB) {\n return { heartbeats: [] };\n } else {\n const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app);\n return idbHeartbeatObject || { heartbeats: [] };\n }\n }\n // overwrite the storage with the provided heartbeats\n async overwrite(heartbeatsObject: HeartbeatsInIndexedDB): Promise<void> {\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\n if (!canUseIndexedDB) {\n return;\n } else {\n const existingHeartbeatsObject = await this.read();\n return writeHeartbeatsToIndexedDB(this.app, {\n lastSentHeartbeatDate:\n heartbeatsObject.lastSentHeartbeatDate ??\n existingHeartbeatsObject.lastSentHeartbeatDate,\n heartbeats: heartbeatsObject.heartbeats\n });\n }\n }\n // add heartbeats\n async add(heartbeatsObject: HeartbeatsInIndexedDB): Promise<void> {\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\n if (!canUseIndexedDB) {\n return;\n } else {\n const existingHeartbeatsObject = await this.read();\n return writeHeartbeatsToIndexedDB(this.app, {\n lastSentHeartbeatDate:\n heartbeatsObject.lastSentHeartbeatDate ??\n existingHeartbeatsObject.lastSentHeartbeatDate,\n heartbeats: [\n ...existingHeartbeatsObject.heartbeats,\n ...heartbeatsObject.heartbeats\n ]\n });\n }\n }\n}\n\n/**\n * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped\n * in a platform logging header JSON object, stringified, and converted\n * to base 64.\n */\nexport function countBytes(heartbeatsCache: HeartbeatsByUserAgent[]): number {\n // base64 has a restricted set of characters, all of which should be 1 byte.\n return base64urlEncodeWithoutPadding(\n // heartbeatsCache wrapper properties\n JSON.stringify({ version: 2, heartbeats: heartbeatsCache })\n ).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 { Component, ComponentType } from '@firebase/component';\nimport { PlatformLoggerServiceImpl } from './platformLoggerService';\nimport { name, version } from '../package.json';\nimport { _registerComponent } from './internal';\nimport { registerVersion } from './api';\nimport { HeartbeatServiceImpl } from './heartbeatService';\n\nexport function registerCoreComponents(variant?: string): void {\n _registerComponent(\n new Component(\n 'platform-logger',\n container => new PlatformLoggerServiceImpl(container),\n ComponentType.PRIVATE\n )\n );\n _registerComponent(\n new Component(\n 'heartbeat',\n container => new HeartbeatServiceImpl(container),\n ComponentType.PRIVATE\n )\n );\n\n // Register `app` package.\n registerVersion(name, version, variant);\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\n registerVersion(name, version, '__BUILD_TARGET__');\n // Register platform SDK identifier (no version).\n registerVersion('fire-js', '');\n}\n","/**\n * Firebase App\n *\n * @remarks This package coordinates the communication between the different Firebase components\n * @packageDocumentation\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 { registerCoreComponents } from './registerCoreComponents';\n\nexport * from './api';\nexport * from './internal';\nexport * from './public-types';\n\nregisterCoreComponents('__RUNTIME_ENV__');\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseOptions } from './public-types';\nimport {\n Component,\n ComponentContainer,\n ComponentType,\n InstantiationMode,\n Name\n} from '@firebase/component';\nimport {\n deleteApp,\n _addComponent,\n _addOrOverwriteComponent,\n _DEFAULT_ENTRY_NAME,\n _FirebaseAppInternal as _FirebaseAppExp\n} from '@firebase/app';\nimport { _FirebaseService, _FirebaseNamespace } from './types';\nimport { Compat } from '@firebase/util';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport interface _FirebaseApp {\n /**\n * The (read-only) name (identifier) for this App. '[DEFAULT]' is the default\n * App.\n */\n name: string;\n\n /**\n * The (read-only) configuration options from the app initialization.\n */\n options: FirebaseOptions;\n\n /**\n * The settable config flag for GDPR opt-in/opt-out\n */\n automaticDataCollectionEnabled: boolean;\n\n /**\n * Make the given App unusable and free resources.\n */\n delete(): Promise<void>;\n}\n/**\n * Global context object for a collection of services using\n * a shared authentication state.\n *\n * marked as internal because it references internal types exported from @firebase/app\n * @internal\n */\nexport class FirebaseAppImpl implements Compat<_FirebaseAppExp>, _FirebaseApp {\n private container: ComponentContainer;\n\n constructor(\n readonly _delegate: _FirebaseAppExp,\n private readonly firebase: _FirebaseNamespace\n ) {\n // add itself to container\n _addComponent(\n _delegate,\n new Component('app-compat', () => this, ComponentType.PUBLIC)\n );\n\n this.container = _delegate.container;\n }\n\n get automaticDataCollectionEnabled(): boolean {\n return this._delegate.automaticDataCollectionEnabled;\n }\n\n set automaticDataCollectionEnabled(val) {\n this._delegate.automaticDataCollectionEnabled = val;\n }\n\n get name(): string {\n return this._delegate.name;\n }\n\n get options(): FirebaseOptions {\n return this._delegate.options;\n }\n\n delete(): Promise<void> {\n return new Promise<void>(resolve => {\n this._delegate.checkDestroyed();\n resolve();\n }).then(() => {\n this.firebase.INTERNAL.removeApp(this.name);\n return deleteApp(this._delegate);\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 and functions are the only ones that are 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._delegate.checkDestroyed();\n\n // Initialize instance if InstatiationMode is `EXPLICIT`.\n const provider = this._delegate.container.getProvider(name as Name);\n if (\n !provider.isInitialized() &&\n provider.getComponent()?.instantiationMode === InstantiationMode.EXPLICIT\n ) {\n provider.initialize();\n }\n\n // getImmediate will always succeed because _getService is only called for registered components.\n return provider.getImmediate({\n identifier: instanceIdentifier\n }) as unknown as _FirebaseService;\n }\n\n /**\n * Remove a service instance from the cache, so we will create a new instance for this service\n * when people try to get it again.\n *\n * NOTE: currently only firestore uses this functionality to support firestore shutdown.\n *\n * @param name The service name\n * @param instanceIdentifier instance identifier in case multiple instances are allowed\n * @internal\n */\n _removeServiceInstance(\n name: string,\n instanceIdentifier: string = _DEFAULT_ENTRY_NAME\n ): void {\n this._delegate.container\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .getProvider(name as any)\n .clearInstance(instanceIdentifier);\n }\n\n /**\n * @param component the component being added to this app's container\n * @internal\n */\n _addComponent(component: Component): void {\n _addComponent(this._delegate, component);\n }\n\n _addOrOverwriteComponent(component: Component): void {\n _addOrOverwriteComponent(this._delegate, component);\n }\n\n toJSON(): object {\n return {\n name: this.name,\n automaticDataCollectionEnabled: this.automaticDataCollectionEnabled,\n options: this.options\n };\n }\n}\n\n// TODO: investigate why the following needs to be commented out\n// Prevent dead-code elimination of these methods w/o invalid property\n// copying.\n// (FirebaseAppImpl.prototype.name && FirebaseAppImpl.prototype.options) ||\n// FirebaseAppImpl.prototype.delete ||\n// console.log('dc');\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 INVALID_APP_ARGUMENT = 'invalid-app-argument'\n}\n\nconst ERRORS: ErrorMap<AppError> = {\n [AppError.NO_APP]:\n \"No Firebase App '{$appName}' has been created - \" +\n 'call Firebase App.initializeApp()',\n [AppError.INVALID_APP_ARGUMENT]:\n 'firebase.{$appName}() takes either no argument or a ' +\n 'Firebase App instance.'\n};\n\ntype ErrorParams = { [key in AppError]: { appName: string } };\n\nexport const ERROR_FACTORY = new ErrorFactory<AppError, ErrorParams>(\n 'app-compat',\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\nimport { FirebaseApp, FirebaseOptions } from './public-types';\nimport {\n _FirebaseNamespace,\n _FirebaseService,\n FirebaseServiceNamespace\n} from './types';\nimport * as modularAPIs from '@firebase/app';\nimport { _FirebaseAppInternal as _FirebaseAppExp } from '@firebase/app';\nimport { Component, ComponentType, Name } from '@firebase/component';\n\nimport { deepExtend, contains } from '@firebase/util';\nimport { FirebaseAppImpl } from './firebaseApp';\nimport { ERROR_FACTORY, AppError } from './errors';\nimport { FirebaseAppLiteImpl } from './lite/firebaseAppLite';\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<string, Component<any>>();\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: initializeAppCompat,\n // @ts-ignore\n app,\n registerVersion: modularAPIs.registerVersion,\n setLogLevel: modularAPIs.setLogLevel,\n onLog: modularAPIs.onLog,\n // @ts-ignore\n apps: null,\n SDK_VERSION: modularAPIs.SDK_VERSION,\n INTERNAL: {\n registerComponent: registerComponentCompat,\n removeApp,\n useAsService,\n modularAPIs\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 || modularAPIs._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 /**\n * Create a new App instance (name must be unique).\n *\n * This function is idempotent. It can be called more than once and return the same instance using the same options and config.\n */\n function initializeAppCompat(\n options: FirebaseOptions,\n rawConfig = {}\n ): FirebaseApp {\n const app = modularAPIs.initializeApp(\n options,\n rawConfig\n ) as _FirebaseAppExp;\n\n if (contains(apps, app.name)) {\n return apps[app.name];\n }\n\n const appCompat = new firebaseAppImpl(app, namespace);\n apps[app.name] = appCompat;\n return appCompat;\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 registerComponentCompat<T extends Name>(\n component: Component<T>\n ): FirebaseServiceNamespace<_FirebaseService> | null {\n const componentName = component.name;\n const componentNameWithoutCompat = componentName.replace('-compat', '');\n if (\n modularAPIs._registerComponent(component) &&\n component.type === ComponentType.PUBLIC\n ) {\n // create service namespace for public components\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)[componentNameWithoutCompat] !== '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)[componentNameWithoutCompat]();\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)[componentNameWithoutCompat] = serviceNamespace;\n\n // Patch the FirebaseAppImpl prototype\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (firebaseAppImpl.prototype as any)[componentNameWithoutCompat] =\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 return component.type === ComponentType.PUBLIC\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (namespace as any)[componentNameWithoutCompat]\n : null;\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 { FirebaseNamespace } from './public-types';\nimport { createSubscribe, deepExtend, ErrorFactory } from '@firebase/util';\nimport { FirebaseAppImpl } from './firebaseApp';\nimport { createFirebaseNamespaceCore } from './firebaseNamespaceCore';\n\n/**\n * Return a firebase namespace object.\n *\n * In production, this will be called exactly once and the result\n * assigned to the 'firebase' global. It may be called multiple times\n * in unit tests.\n */\nexport function createFirebaseNamespace(): FirebaseNamespace {\n const namespace = createFirebaseNamespaceCore(FirebaseAppImpl);\n namespace.INTERNAL = {\n ...namespace.INTERNAL,\n createFirebaseNamespace,\n extendNamespace,\n createSubscribe,\n ErrorFactory,\n deepExtend\n };\n\n /**\n * Patch the top-level firebase namespace with additional properties.\n *\n * firebase.INTERNAL.extendNamespace()\n */\n function extendNamespace(props: { [prop: string]: unknown }): void {\n deepExtend(namespace, props);\n }\n\n return namespace;\n}\n\nexport const firebase = createFirebaseNamespace();\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-compat');\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseNamespace } from './public-types';\nimport { isBrowser } from '@firebase/util';\nimport { firebase as firebaseNamespace } from './firebaseNamespace';\nimport { logger } from './logger';\nimport { registerCoreComponents } from './registerCoreComponents';\n\n// Firebase Lite detection\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nif (isBrowser() && (self as any).firebase !== undefined) {\n logger.warn(`\n Warning: Firebase is already defined in the global scope. Please make sure\n Firebase library is only loaded once.\n `);\n\n // eslint-disable-next-line\n const sdkVersion = ((self as any).firebase as FirebaseNamespace).SDK_VERSION;\n if (sdkVersion && sdkVersion.indexOf('LITE') >= 0) {\n logger.warn(`\n Warning: You are trying to load Firebase while using Firebase Performance standalone script.\n You should load Firebase Performance with this instance of Firebase to avoid loading duplicate code.\n `);\n }\n}\n\nconst firebase = firebaseNamespace;\n\nregisterCoreComponents();\n\n// eslint-disable-next-line import/no-default-export\nexport default firebase;\n\nexport { _FirebaseNamespace, _FirebaseService } from './types';\nexport { FirebaseApp, FirebaseNamespace } from './public-types';\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 { registerVersion } from '@firebase/app';\n\nimport { name, version } from '../package.json';\n\nexport function registerCoreComponents(variant?: string): void {\n // Register `app` package.\n registerVersion(name, version, variant);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport firebase from '@firebase/app-compat';\nimport { name, version } from '../../package.json';\n\nfirebase.registerVersion(name, version, 'app-compat');\n\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 { 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<ErrorCode, ErrorParams>(\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 & { customData: 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 {\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';\nimport { AppConfig } from '../interfaces/installation-impl';\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<FirebaseError> {\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<Response>\n): Promise<Response> {\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<void> {\n return new Promise<void>(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\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\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 { AppConfig } from '../interfaces/installation-impl';\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/installation-impl';\nimport { IdChangeCallbackFn } from '../api';\n\nconst fidChangeCallbacks: Map<string, Set<IdChangeCallbackFn>> = 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 { DBSchema, IDBPDatabase, openDB } from 'idb';\nimport { AppConfig } from '../interfaces/installation-impl';\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\ninterface InstallationsDB extends DBSchema {\n 'firebase-installations-store': {\n key: string;\n value: InstallationEntry | undefined;\n };\n}\n\nlet dbPromise: Promise<IDBPDatabase<InstallationsDB>> | null = null;\nfunction getDbPromise(): Promise<IDBPDatabase<InstallationsDB>> {\n if (!dbPromise) {\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, {\n upgrade: (db, oldVersion) => {\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 (oldVersion) {\n case 0:\n db.createObjectStore(OBJECT_STORE_NAME);\n }\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<InstallationEntry | undefined> {\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) as Promise<InstallationEntry>;\n}\n\n/** Assigns or overwrites the record for the given key with the given value. */\nexport async function set<ValueType extends InstallationEntry>(\n appConfig: AppConfig,\n value: ValueType\n): Promise<ValueType> {\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)) as InstallationEntry;\n await objectStore.put(value, key);\n await tx.done;\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<void> {\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.done;\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<ValueType extends InstallationEntry | undefined>(\n appConfig: AppConfig,\n updateFn: (previousValue: InstallationEntry | undefined) => ValueType\n): Promise<ValueType> {\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(\n key\n )) as InstallationEntry;\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.done;\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<void> {\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.done;\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 '../functions/create-installation-request';\nimport {\n AppConfig,\n FirebaseInstallationsImpl\n} from '../interfaces/installation-impl';\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<RegisteredInstallationEntry>;\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 installations: FirebaseInstallationsImpl\n): Promise<InstallationEntryWithRegistrationPromise> {\n let registrationPromise: Promise<RegisteredInstallationEntry> | undefined;\n\n const installationEntry = await update(installations.appConfig, oldEntry => {\n const installationEntry = updateOrCreateInstallationEntry(oldEntry);\n const entryWithPromise = triggerRegistrationIfNecessary(\n installations,\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 installations: FirebaseInstallationsImpl,\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 installations,\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(installations)\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 installations: FirebaseInstallationsImpl,\n installationEntry: InProgressInstallationEntry\n): Promise<RegisteredInstallationEntry> {\n try {\n const registeredInstallationEntry = await createInstallationRequest(\n installations,\n installationEntry\n );\n return set(installations.appConfig, registeredInstallationEntry);\n } catch (e) {\n if (isServerError(e) && e.customData.serverCode === 409) {\n // Server returned a \"FID can not be used\" error.\n // Generate a new ID next time.\n await remove(installations.appConfig);\n } else {\n // Registration failed. Set FID as not registered.\n await set(installations.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 installations: FirebaseInstallationsImpl\n): Promise<RegisteredInstallationEntry> {\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(\n installations.appConfig\n );\n while (entry.registrationStatus === RequestStatus.IN_PROGRESS) {\n // createInstallation request still in progress.\n await sleep(100);\n\n entry = await updateInstallationRequest(installations.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 { installationEntry, registrationPromise } =\n await getInstallationEntry(installations);\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<InstallationEntry> {\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 {\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';\nimport { FirebaseInstallationsImpl } from '../interfaces/installation-impl';\n\nexport async function createInstallationRequest(\n { appConfig, heartbeatServiceProvider }: FirebaseInstallationsImpl,\n { fid }: InProgressInstallationEntry\n): Promise<RegisteredInstallationEntry> {\n const endpoint = getInstallationsEndpoint(appConfig);\n\n const headers = getHeaders(appConfig);\n\n // If heartbeat service exists, add the heartbeat string to the header.\n const heartbeatService = heartbeatServiceProvider.getImmediate({\n optional: true\n });\n if (heartbeatService) {\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\n if (heartbeatsHeader) {\n headers.append('x-firebase-client', heartbeatsHeader);\n }\n }\n\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 {\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';\nimport {\n FirebaseInstallationsImpl,\n AppConfig\n} from '../interfaces/installation-impl';\n\nexport async function generateAuthTokenRequest(\n { appConfig, heartbeatServiceProvider }: FirebaseInstallationsImpl,\n installationEntry: RegisteredInstallationEntry\n): Promise<CompletedAuthToken> {\n const endpoint = getGenerateAuthTokenEndpoint(appConfig, installationEntry);\n\n const headers = getHeadersWithAuth(appConfig, installationEntry);\n\n // If heartbeat service exists, add the heartbeat string to the header.\n const heartbeatService = heartbeatServiceProvider.getImmediate({\n optional: true\n });\n if (heartbeatService) {\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\n if (heartbeatsHeader) {\n headers.append('x-firebase-client', heartbeatsHeader);\n }\n }\n\n const body = {\n installation: {\n sdkVersion: PACKAGE_VERSION,\n appId: appConfig.appId\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 =\n extractAuthTokenInfoFromResponse(responseValue);\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 '../functions/generate-auth-token-request';\nimport {\n AppConfig,\n FirebaseInstallationsImpl\n} from '../interfaces/installation-impl';\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 installations: FirebaseInstallationsImpl,\n forceRefresh = false\n): Promise<CompletedAuthToken> {\n let tokenPromise: Promise<CompletedAuthToken> | undefined;\n const entry = await update(installations.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(installations, 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(installations, 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 installations: FirebaseInstallationsImpl,\n forceRefresh: boolean\n): Promise<CompletedAuthToken> {\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(installations.appConfig);\n while (entry.authToken.requestStatus === RequestStatus.IN_PROGRESS) {\n // generateAuthToken still in progress.\n await sleep(100);\n\n entry = await updateAuthTokenRequest(installations.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(installations, 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<RegisteredInstallationEntry> {\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 installations: FirebaseInstallationsImpl,\n installationEntry: RegisteredInstallationEntry\n): Promise<CompletedAuthToken> {\n try {\n const authToken = await generateAuthTokenRequest(\n installations,\n installationEntry\n );\n const updatedInstallationEntry: RegisteredInstallationEntry = {\n ...installationEntry,\n authToken\n };\n await set(installations.appConfig, updatedInstallationEntry);\n return authToken;\n } catch (e) {\n if (\n isServerError(e) &&\n (e.customData.serverCode === 401 || e.customData.serverCode === 404)\n ) {\n // Server returned a \"FID not found\" or a \"Invalid authentication\" error.\n // Generate a new ID next time.\n await remove(installations.appConfig);\n } else {\n const updatedInstallationEntry: RegisteredInstallationEntry = {\n ...installationEntry,\n authToken: { requestStatus: RequestStatus.NOT_STARTED }\n };\n await set(installations.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 { FirebaseInstallationsImpl } from '../interfaces/installation-impl';\nimport { Installations } from '../interfaces/public-types';\n\n/**\n * Returns a Firebase Installations auth token, identifying the current\n * Firebase Installation.\n * @param installations - The `Installations` instance.\n * @param forceRefresh - Force refresh regardless of token expiration.\n *\n * @public\n */\nexport async function getToken(\n installations: Installations,\n forceRefresh = false\n): Promise<string> {\n const installationsImpl = installations as FirebaseInstallationsImpl;\n await completeInstallationRegistration(installationsImpl);\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(installationsImpl, forceRefresh);\n return authToken.token;\n}\n\nasync function completeInstallationRegistration(\n installations: FirebaseInstallationsImpl\n): Promise<void> {\n const { registrationPromise } = await getInstallationEntry(installations);\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 { FirebaseApp, FirebaseOptions } from '@firebase/app';\nimport { FirebaseError } from '@firebase/util';\nimport { AppConfig } from '../interfaces/installation-impl';\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<keyof FirebaseOptions> = [\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 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _registerComponent, _getProvider } from '@firebase/app';\nimport {\n Component,\n ComponentType,\n InstanceFactory,\n ComponentContainer\n} from '@firebase/component';\nimport { getId, getToken } from '../api/index';\nimport { _FirebaseInstallationsInternal } from '../interfaces/public-types';\nimport { FirebaseInstallationsImpl } from '../interfaces/installation-impl';\nimport { extractAppConfig } from '../helpers/extract-app-config';\n\nconst INSTALLATIONS_NAME = 'installations';\nconst INSTALLATIONS_NAME_INTERNAL = 'installations-internal';\n\nconst publicFactory: InstanceFactory<'installations'> = (\n container: ComponentContainer\n) => {\n const app = container.getProvider('app').getImmediate();\n // Throws if app isn't configured properly.\n const appConfig = extractAppConfig(app);\n const heartbeatServiceProvider = _getProvider(app, 'heartbeat');\n\n const installationsImpl: FirebaseInstallationsImpl = {\n app,\n appConfig,\n heartbeatServiceProvider,\n _delete: () => Promise.resolve()\n };\n return installationsImpl;\n};\n\nconst internalFactory: InstanceFactory<'installations-internal'> = (\n container: ComponentContainer\n) => {\n const app = container.getProvider('app').getImmediate();\n // Internal FIS instance relies on public FIS instance.\n const installations = _getProvider(app, INSTALLATIONS_NAME).getImmediate();\n\n const installationsInternal: _FirebaseInstallationsInternal = {\n getId: () => getId(installations),\n getToken: (forceRefresh?: boolean) => getToken(installations, forceRefresh)\n };\n return installationsInternal;\n};\n\nexport function registerInstallations(): void {\n _registerComponent(\n new Component(INSTALLATIONS_NAME, publicFactory, ComponentType.PUBLIC)\n );\n _registerComponent(\n new Component(\n INSTALLATIONS_NAME_INTERNAL,\n internalFactory,\n ComponentType.PRIVATE\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 { getInstallationEntry } from '../helpers/get-installation-entry';\nimport { refreshAuthToken } from '../helpers/refresh-auth-token';\nimport { FirebaseInstallationsImpl } from '../interfaces/installation-impl';\nimport { Installations } from '../interfaces/public-types';\n\n/**\n * Creates a Firebase Installation if there isn't one for the app and\n * returns the Installation ID.\n * @param installations - The `Installations` instance.\n *\n * @public\n */\nexport async function getId(installations: Installations): Promise<string> {\n const installationsImpl = installations as FirebaseInstallationsImpl;\n const { installationEntry, registrationPromise } = await getInstallationEntry(\n installationsImpl\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(installationsImpl).catch(console.error);\n }\n\n return installationEntry.fid;\n}\n","/**\n * Firebase Installations\n *\n * @packageDocumentation\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 { registerInstallations } from './functions/config';\nimport { registerVersion } from '@firebase/app';\nimport { name, version } from '../package.json';\n\nexport * from './api';\nexport * from './interfaces/public-types';\n\nregisterInstallations();\nregisterVersion(name, version);\n// BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\nregisterVersion(name, version, '__BUILD_TARGET__');\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ERROR_FACTORY, ErrorCode } from '../utils/errors';\nimport { isIndexedDBAvailable, areCookiesEnabled } from '@firebase/util';\nimport { consoleLogger } from '../utils/console_logger';\n\ndeclare global {\n interface Window {\n PerformanceObserver: typeof PerformanceObserver;\n perfMetrics?: { onFirstInputDelay(fn: (fid: number) => void): void };\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?: (fn: (fid: number) => void) => void;\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 || !areCookiesEnabled()) {\n consoleLogger.info(\n 'Firebase Performance cannot start if browser does not support fetch and Promise or cookie is disabled.'\n );\n return false;\n }\n\n if (!isIndexedDBAvailable()) {\n consoleLogger.info('IndexedDB is not supported by current browswer');\n return false;\n }\n return true;\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 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { 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 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { 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 NONPOSITIVE_TRACE_START_TIME = 'nonpositive trace startTime',\n NONPOSITIVE_TRACE_DURATION = 'nonpositive trace duration',\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 ALREADY_INITIALIZED = 'already initialized'\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.NONPOSITIVE_TRACE_START_TIME]:\n 'Trace {$traceName} startTime should be positive.',\n [ErrorCode.NONPOSITIVE_TRACE_DURATION]:\n 'Trace {$traceName} duration should be positive.',\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 [ErrorCode.ALREADY_INITIALIZED]:\n 'initializePerformance() has already been called with ' +\n 'different options. To avoid this error, call initializePerformance() with the ' +\n 'same options as when it was originally called, or call getPerformance() to return the' +\n ' already initialized instance.'\n};\n\ninterface ErrorParams {\n [ErrorCode.TRACE_STARTED_BEFORE]: { traceName: string };\n [ErrorCode.TRACE_STOPPED_BEFORE]: { traceName: string };\n [ErrorCode.NONPOSITIVE_TRACE_START_TIME]: { traceName: string };\n [ErrorCode.NONPOSITIVE_TRACE_DURATION]: { 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<ErrorCode, ErrorParams>(\n SERVICE,\n SERVICE_NAME,\n ERROR_DESCRIPTION_MAP\n);\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { 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 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { _FirebaseInstallationsInternal } from '@firebase/installations';\n\nlet iid: string | undefined;\nlet authToken: string | undefined;\n\nexport function getIidPromise(\n installationsService: _FirebaseInstallationsInternal\n): Promise<string> {\n const iidPromise = 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(\n installationsService: _FirebaseInstallationsInternal\n): Promise<string> {\n const authTokenPromise = 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 { 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 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 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { 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 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { 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 NetworkInformationWithEffectiveType extends NetworkInformation {\n // `effectiveType` is an experimental property and not included in\n // TypeScript's typings for the native NetworkInformation interface\n readonly effectiveType?: 'slow-2g' | '2g' | '3g' | '4g';\n}\n\ninterface NavigatorWithConnection extends Navigator {\n readonly connection: NetworkInformationWithEffectiveType;\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 (navigator?.serviceWorker) {\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 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ERROR_FACTORY, ErrorCode } from './errors';\nimport { FirebaseApp } from '@firebase/app';\n\nexport function getAppId(firebaseApp: FirebaseApp): string {\n const appId = firebaseApp.options?.appId;\n if (!appId) {\n throw ERROR_FACTORY.create(ErrorCode.NO_APP_ID);\n }\n return appId;\n}\n\nexport function getProjectId(firebaseApp: FirebaseApp): string {\n const projectId = firebaseApp.options?.projectId;\n if (!projectId) {\n throw ERROR_FACTORY.create(ErrorCode.NO_PROJECT_ID);\n }\n return projectId;\n}\n\nexport function getApiKey(firebaseApp: FirebaseApp): string {\n const apiKey = firebaseApp.options?.apiKey;\n if (!apiKey) {\n throw ERROR_FACTORY.create(ErrorCode.NO_API_KEY);\n }\n return apiKey;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n 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';\nimport { PerformanceController } from '../controllers/perf';\nimport { getProjectId, getApiKey, getAppId } from '../utils/app_utils';\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(\n performanceController: PerformanceController,\n iid: string\n): Promise<void> {\n const config = getStoredConfig();\n if (config) {\n processConfig(config);\n return Promise.resolve();\n }\n\n return getRemoteConfig(performanceController, 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 performanceController: PerformanceController,\n iid: string\n): Promise<RemoteConfigResponse | undefined> {\n // Perf needs auth token only to retrieve remote config.\n return getAuthTokenPromise(performanceController.installations)\n .then(authToken => {\n const projectId = getProjectId(performanceController.app);\n const apiKey = getApiKey(performanceController.app);\n const configEndPoint = `https://firebaseremoteconfig.googleapis.com/v1/projects/${projectId}/namespaces/fireperf:fetch?key=${apiKey}`;\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: getAppId(performanceController.app),\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 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getIidPromise } from './iid_service';\nimport { getConfig } from './remote_config_service';\nimport { Api } from './api_service';\nimport { PerformanceController } from '../controllers/perf';\n\nconst enum InitializationStatus {\n notInitialized = 1,\n initializationPending,\n initialized\n}\n\nlet initializationStatus = InitializationStatus.notInitialized;\n\nlet initializationPromise: Promise<void> | undefined;\n\nexport function getInitializationPromise(\n performanceController: PerformanceController\n): Promise<void> {\n initializationStatus = InitializationStatus.initializationPending;\n\n initializationPromise =\n initializationPromise || initializePerf(performanceController);\n\n return initializationPromise;\n}\n\nexport function isPerfInitialized(): boolean {\n return initializationStatus === InitializationStatus.initialized;\n}\n\nfunction initializePerf(\n performanceController: PerformanceController\n): Promise<void> {\n return getDocumentReadyComplete()\n .then(() => getIidPromise(performanceController.installations))\n .then(iid => getConfig(performanceController, 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<void> {\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 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { 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;\nconst MAX_EVENT_COUNT_PER_REQUEST = 1000;\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 // Extract events up to the maximum cap of single logRequest from top of \"official queue\".\n // The staged events will be used for current logRequest attempt, remaining events will be kept\n // for next attempt.\n const staged = queue.splice(0, MAX_EVENT_COUNT_PER_REQUEST);\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<void> {\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<Response> {\n const flTransportFullUrl =\n 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 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { 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';\nimport { FirebaseApp } from '@firebase/app';\nimport { getAppId } from '../utils/app_utils';\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\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 (isPerfInitialized()) {\n sendTraceLog(trace);\n } else {\n // Custom traces can be used before the initialization but logging\n // should wait until after.\n getInitializationPromise(trace.performanceController).then(\n () => sendTraceLog(trace),\n () => sendTraceLog(trace)\n );\n }\n}\n\nfunction sendTraceLog(trace: Trace): void {\n if (!getIid()) {\n return;\n }\n\n const settingsService = SettingsService.getInstance();\n if (\n !settingsService.loggingEnabled ||\n !settingsService.logTraceAfterSampling\n ) {\n return;\n }\n\n setTimeout(() => sendLog(trace, ResourceType.Trace), 0);\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 networkRequest.performanceController.app\n ),\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(trace.performanceController.app),\n trace_metric: traceMetric\n };\n return JSON.stringify(perfMetric);\n}\n\nfunction getApplicationInfo(firebaseApp: FirebaseApp): ApplicationInfo {\n return {\n google_app_id: getAppId(firebaseApp),\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 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n 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';\nimport { consoleLogger } from '../utils/console_logger';\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/**\n * Converts the provided value to an integer value to be used in case of a metric.\n * @param providedValue Provided number value of the metric that needs to be converted to an integer.\n *\n * @returns Converted integer number to be set for the metric.\n */\nexport function convertMetricValueToInteger(providedValue: number): number {\n const valueAsInteger: number = Math.floor(providedValue);\n if (valueAsInteger < providedValue) {\n consoleLogger.info(\n `Metric value should be an Integer, setting the value as : ${valueAsInteger}.`\n );\n }\n return valueAsInteger;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n 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 {\n isValidMetricName,\n convertMetricValueToInteger\n} from '../utils/metric_utils';\nimport { PerformanceTrace } from '../public_types';\nimport { PerformanceController } from '../controllers/perf';\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 performanceController The performance controller running.\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 performanceController: PerformanceController,\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 if (startTime <= 0) {\n throw ERROR_FACTORY.create(ErrorCode.NONPOSITIVE_TRACE_START_TIME, {\n traceName: this.name\n });\n }\n if (duration <= 0) {\n throw ERROR_FACTORY.create(ErrorCode.NONPOSITIVE_TRACE_DURATION, {\n traceName: this.name\n });\n }\n\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 metricName of Object.keys(options.metrics)) {\n if (!isNaN(Number(options.metrics[metricName]))) {\n this.counters[metricName] = Math.floor(\n Number(options.metrics[metricName])\n );\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. The value will be floored down to an\n * integer.\n * @param counter Name of the custom metric\n * @param numAsInteger Increment by value\n */\n incrementMetric(counter: string, numAsInteger = 1): void {\n if (this.counters[counter] === undefined) {\n this.putMetric(counter, numAsInteger);\n } else {\n this.putMetric(counter, this.counters[counter] + numAsInteger);\n }\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. The value will be floored down to an integer.\n * @param counter Name of the custom metric\n * @param numAsInteger Set custom metric to this value\n */\n putMetric(counter: string, numAsInteger: number): void {\n if (isValidMetricName(counter, this.name)) {\n this.counters[counter] = convertMetricValueToInteger(numAsInteger ?? 0);\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 performanceController: PerformanceController,\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(\n performanceController,\n OOB_TRACE_PAGE_LOAD_PREFIX + route,\n true\n );\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(\n performanceController: PerformanceController,\n measureName: string\n ): void {\n const trace = new Trace(\n performanceController,\n measureName,\n false,\n measureName\n );\n logTrace(trace);\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Api } from '../services/api_service';\nimport { logNetworkRequest } from '../services/perf_logger';\nimport { PerformanceController } from '../controllers/perf';\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 performanceController: PerformanceController;\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(\n performanceController: PerformanceController,\n entry: PerformanceEntry\n): 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 performanceController,\n url,\n responsePayloadBytes: performanceEntry.transferSize,\n startTimeUs,\n timeToResponseInitiatedUs,\n timeToResponseCompletedUs\n };\n\n logNetworkRequest(networkRequest);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { 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';\nimport { PerformanceController } from '../controllers/perf';\n\nconst FID_WAIT_TIME_MS = 5000;\n\nexport function setupOobResources(\n performanceController: PerformanceController\n): 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(performanceController), 0);\n setTimeout(() => setupNetworkRequests(performanceController), 0);\n setTimeout(() => setupUserTimingTraces(performanceController), 0);\n}\n\nfunction setupNetworkRequests(\n performanceController: PerformanceController\n): void {\n const api = Api.getInstance();\n const resources = api.getEntriesByType('resource');\n for (const resource of resources) {\n createNetworkRequestEntry(performanceController, resource);\n }\n api.setupObserver('resource', entry =>\n createNetworkRequestEntry(performanceController, entry)\n );\n}\n\nfunction setupOobTraces(performanceController: PerformanceController): 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(\n performanceController,\n navigationTimings,\n paintTimings\n );\n timeoutId = undefined;\n }, FID_WAIT_TIME_MS);\n api.onFirstInputDelay((fid: number) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n Trace.createOobTrace(\n performanceController,\n navigationTimings,\n paintTimings,\n fid\n );\n }\n });\n } else {\n Trace.createOobTrace(\n performanceController,\n navigationTimings,\n paintTimings\n );\n }\n}\n\nfunction setupUserTimingTraces(\n performanceController: PerformanceController\n): 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(performanceController, measure);\n }\n // Setup an observer to capture the measures from this point on.\n api.setupObserver('measure', entry =>\n createUserTimingTrace(performanceController, entry)\n );\n}\n\nfunction createUserTimingTrace(\n performanceController: PerformanceController,\n measure: PerformanceEntry\n): 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(performanceController, measureName);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { 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';\nimport { _FirebaseInstallationsInternal } from '@firebase/installations';\nimport { PerformanceSettings, FirebasePerformance } from '../public_types';\nimport { validateIndexedDBOpenable } from '@firebase/util';\nimport { setupTransportService } from '../services/transport_service';\nimport { consoleLogger } from '../utils/console_logger';\n\nexport class PerformanceController implements FirebasePerformance {\n private initialized: boolean = false;\n\n constructor(\n readonly app: FirebaseApp,\n readonly installations: _FirebaseInstallationsInternal\n ) {}\n\n /**\n * This method *must* be called internally as part of creating a\n * PerformanceController instance.\n *\n * Currently it's not possible to pass the settings object through the\n * constructor using Components, so this method exists to be called with the\n * desired settings, to ensure nothing is collected without the user's\n * consent.\n */\n _init(settings?: PerformanceSettings): void {\n if (this.initialized) {\n return;\n }\n\n if (settings?.dataCollectionEnabled !== undefined) {\n this.dataCollectionEnabled = settings.dataCollectionEnabled;\n }\n if (settings?.instrumentationEnabled !== undefined) {\n this.instrumentationEnabled = settings.instrumentationEnabled;\n }\n\n if (Api.getInstance().requiredApisAvailable()) {\n validateIndexedDBOpenable()\n .then(isAvailable => {\n if (isAvailable) {\n setupTransportService();\n getInitializationPromise(this).then(\n () => setupOobResources(this),\n () => setupOobResources(this)\n );\n this.initialized = true;\n }\n })\n .catch(error => {\n consoleLogger.info(`Environment doesn't support IndexedDB: ${error}`);\n });\n } else {\n consoleLogger.info(\n 'Firebase Performance cannot start if the browser does not support ' +\n '\"Fetch\" and \"Promise\", or cookies are disabled.'\n );\n }\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 * Firebase Performance Monitoring\n *\n * @packageDocumentation\n */\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n FirebasePerformance,\n PerformanceSettings,\n PerformanceTrace\n} from './public_types';\nimport { ERROR_FACTORY, ErrorCode } from './utils/errors';\nimport { setupApi } from './services/api_service';\nimport { PerformanceController } from './controllers/perf';\nimport {\n _registerComponent,\n _getProvider,\n registerVersion,\n FirebaseApp,\n getApp\n} from '@firebase/app';\nimport {\n InstanceFactory,\n ComponentContainer,\n Component,\n ComponentType\n} from '@firebase/component';\nimport { name, version } from '../package.json';\nimport { Trace } from './resources/trace';\nimport '@firebase/installations';\nimport { deepEqual, getModularInstance } from '@firebase/util';\n\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\n/**\n * Returns a {@link FirebasePerformance} instance for the given app.\n * @param app - The {@link @firebase/app#FirebaseApp} to use.\n * @public\n */\nexport function getPerformance(\n app: FirebaseApp = getApp()\n): FirebasePerformance {\n app = getModularInstance(app);\n const provider = _getProvider(app, 'performance');\n const perfInstance = provider.getImmediate() as PerformanceController;\n return perfInstance;\n}\n\n/**\n * Returns a {@link FirebasePerformance} instance for the given app. Can only be called once.\n * @param app - The {@link @firebase/app#FirebaseApp} to use.\n * @param settings - Optional settings for the {@link FirebasePerformance} instance.\n * @public\n */\nexport function initializePerformance(\n app: FirebaseApp,\n settings?: PerformanceSettings\n): FirebasePerformance {\n app = getModularInstance(app);\n const provider = _getProvider(app, 'performance');\n\n // throw if an instance was already created.\n // It could happen if initializePerformance() is called more than once, or getPerformance() is called first.\n if (provider.isInitialized()) {\n const existingInstance = provider.getImmediate();\n const initialSettings = provider.getOptions() as PerformanceSettings;\n if (deepEqual(initialSettings, settings ?? {})) {\n return existingInstance;\n } else {\n throw ERROR_FACTORY.create(ErrorCode.ALREADY_INITIALIZED);\n }\n }\n\n const perfInstance = provider.initialize({\n options: settings\n }) as PerformanceController;\n return perfInstance;\n}\n\n/**\n * Returns a new `PerformanceTrace` instance.\n * @param performance - The {@link FirebasePerformance} instance to use.\n * @param name - The name of the trace.\n * @public\n */\nexport function trace(\n performance: FirebasePerformance,\n name: string\n): PerformanceTrace {\n performance = getModularInstance(performance);\n return new Trace(performance as PerformanceController, name);\n}\n\nconst factory: InstanceFactory<'performance'> = (\n container: ComponentContainer,\n { options: settings }: { options?: PerformanceSettings }\n) => {\n // Dependencies\n const app = container.getProvider('app').getImmediate();\n const installations = container\n .getProvider('installations-internal')\n .getImmediate();\n\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 const perfInstance = new PerformanceController(app, installations);\n perfInstance._init(settings);\n\n return perfInstance;\n};\n\nfunction registerPerformance(): void {\n _registerComponent(\n new Component('performance', factory, ComponentType.PUBLIC)\n );\n registerVersion(name, version);\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\n registerVersion(name, version, '__BUILD_TARGET__');\n}\n\nregisterPerformance();\n\nexport { FirebasePerformance, PerformanceSettings, PerformanceTrace };\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n trace,\n FirebasePerformance,\n // The PerformanceTrace type has not changed between modular and non-modular packages.\n PerformanceTrace\n} from '@firebase/performance';\nimport { FirebasePerformance as FirebasePerformanceCompat } from '@firebase/performance-types';\nimport { FirebaseApp, _FirebaseService } from '@firebase/app-compat';\n\nexport class PerformanceCompatImpl\n implements FirebasePerformanceCompat, _FirebaseService\n{\n constructor(\n public app: FirebaseApp,\n readonly _delegate: FirebasePerformance\n ) {}\n\n get instrumentationEnabled(): boolean {\n return this._delegate.instrumentationEnabled;\n }\n\n set instrumentationEnabled(val: boolean) {\n this._delegate.instrumentationEnabled = val;\n }\n\n get dataCollectionEnabled(): boolean {\n return this._delegate.dataCollectionEnabled;\n }\n\n set dataCollectionEnabled(val: boolean) {\n this._delegate.dataCollectionEnabled = val;\n }\n\n trace(traceName: string): PerformanceTrace {\n return trace(this._delegate, traceName);\n }\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport interface Compat<T> {\n _delegate: T;\n}\n\nexport function getModularInstance<ExpService>(\n service: Compat<ExpService> | ExpService\n): ExpService {\n if (service && (service as Compat<ExpService>)._delegate) {\n return (service as Compat<ExpService>)._delegate;\n } else {\n return service as ExpService;\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport firebase, { _FirebaseNamespace } from '@firebase/app-compat';\nimport {\n Component,\n ComponentContainer,\n ComponentType\n} from '@firebase/component';\nimport { PerformanceCompatImpl } from './performance';\nimport { name as packageName, version } from '../package.json';\nimport { FirebasePerformance as FirebasePerformanceCompat } from '@firebase/performance-types';\n\nfunction registerPerformanceCompat(firebaseInstance: _FirebaseNamespace): void {\n firebaseInstance.INTERNAL.registerComponent(\n new Component(\n 'performance-compat',\n performanceFactory,\n ComponentType.PUBLIC\n )\n );\n\n firebaseInstance.registerVersion(packageName, version);\n}\n\nfunction performanceFactory(\n container: ComponentContainer\n): PerformanceCompatImpl {\n const app = container.getProvider('app-compat').getImmediate();\n // The following call will always succeed.\n const performance = container.getProvider('performance').getImmediate();\n\n return new PerformanceCompatImpl(app, performance);\n}\n\nregisterPerformanceCompat(firebase as _FirebaseNamespace);\n\ndeclare module '@firebase/app-compat' {\n interface FirebaseNamespace {\n performance: {\n (app?: FirebaseApp): FirebasePerformanceCompat;\n };\n }\n interface FirebaseApp {\n performance(): FirebasePerformanceCompat;\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 './app';\nimport './performance';\nimport { name, version } from '../package.json';\n\nfirebase.registerVersion(name, version, 'compat-lite');\n\nexport default firebase;\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__assign","assign","t","s","i","n","arguments","length","apply","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","verb","throw","return","Symbol","iterator","v","op","TypeError","pop","push","__values","o","m","__read","r","ar","error","__spreadArray","to","from","pack","l","slice","concat","stringToByteArray","str","out","c","charCodeAt","base64","byteToCharMap_","charToByteMap_","byteToCharMapWebSafe_","charToByteMapWebSafe_","ENCODED_VALS_BASE","ENCODED_VALS","ENCODED_VALS_WEBSAFE","HAS_NATIVE_SUPPORT","atob","encodeByteArray","input","webSafe","isArray","Error","init_","byteToCharMap","output","byte1","haveByte2","byte2","haveByte3","byte3","outByte3","outByte4","join","encodeString","btoa","decodeString","bytes","pos","u","c2","c3","c1","String","fromCharCode","byteArrayToString","decodeStringToByteArray","charToByteMap","charAt","byte4","base64urlEncodeWithoutPadding","utf8Bytes","replace","deepExtend","target","source","constructor","Date","getTime","undefined","prop","getDefaultsFromGlobal","self","window","global","getGlobal","__FIREBASE_DEFAULTS__","getDefaultsFromCookie","document","match","cookie","decoded","console","base64Decode","JSON","parse","getDefaults","process","env","defaultsJsonString","getDefaultsFromEnvVariable","info","getDefaultAppConfig","_a","config","Deferred","wrapCallback","callback","_this","promise","catch","isIndexedDBAvailable","indexedDB","validateIndexedDBOpenable","preExist_1","DB_CHECK_NAME_1","request_1","open","onsuccess","close","deleteDatabase","onupgradeneeded","onerror","message","_super","FirebaseError","__","create","__extends","code","customData","name","captureStackTrace","ErrorFactory","data","_i","fullCode","service","template","errors","PATTERN","key","fullMessage","serviceName","contains","obj","deepEqual","a","aKeys","keys","bKeys","aKeys_1","k","includes","aProp","bProp","isObject","bKeys_1","thing","createSubscribe","executor","onNoObservers","proxy","ObserverProxy","subscribe","bind","forEachObserver","observer","complete","nextOrObserver","methods","methods_1","method","implementsAnyMethods","noop","unsub","unsubscribeOne","observers","finalized","task","finalError","observerCount","fn","sendOne","err","unsubscribes","Component","setInstantiationMode","mode","instantiationMode","setMultipleInstances","multipleInstances","setServiceProps","props","serviceProps","setInstanceCreatedCallback","onInstanceCreated","instanceFactory","type","DEFAULT_ENTRY_NAME","Provider","get","identifier","normalizedIdentifier","normalizeInstanceIdentifier","instancesDeferred","has","deferred","set","isInitialized","shouldAutoInitialize","instance","getOrInitializeService","instanceIdentifier","getImmediate","options","optional","getComponent","component","setComponent","_b","entries","_c","_d","instanceDeferred","clearInstance","delete","instancesOptions","instances","services","values","all","filter","map","INTERNAL","_delete","isComponentSet","getOptions","initialize","opts","_e","onInit","existingCallbacks","onInitCallbacks","Set","add","existingInstance","invokeOnInitCallbacks","callbacks","callbacks_1","callbacks_1_1","container","Map","ComponentContainer","addComponent","provider","getProvider","addOrOverwriteComponent","providers","getProviders","LogLevel","defaultLogHandler","logType","args","logLevel","now","toISOString","ConsoleMethod","levelStringToEnum","debug","DEBUG","verbose","VERBOSE","INFO","warn","WARN","ERROR","silent","SILENT","defaultLogLevel","Logger","defineProperty","_logLevel","val","setLogLevel","_logHandler","_userLogHandler","log","setUserLogHandler","logCallback","instances_1","customLogLevel","level","userLogHandler","arg","toString","stringify","ignored","toLowerCase","_loop_1","instanceOfAny","object","constructors","some","idbProxyableTypes","cursorAdvanceMethods","cursorRequestMap","WeakMap","transactionDoneMap","transactionStoreNamesMap","transformCache","reverseTransformCache","idbProxyTraps","receiver","IDBTransaction","objectStoreNames","objectStore","wrap","wrapFunction","func","IDBDatabase","transaction","IDBCursor","advance","continue","continuePrimaryKey","unwrap","storeNames","tx","sort","transformCachableValue","unlisten","removeEventListener","DOMException","addEventListener","IDBObjectStore","IDBIndex","Proxy","IDBRequest","request","success","promisifyRequest","newValue","openDB","version","blocked","upgrade","blocking","terminated","openPromise","event","oldVersion","newVersion","db","readMethods","writeMethods","cachedMethods","getMethod","targetFuncName","useIndex","isWrite","async","storeName","store","index","shift","oldTraps","PlatformLoggerServiceImpl","getPlatformInfoString","library","logString","logger","PLATFORM_LOG_STRING","appName","_apps","_components","_addComponent","app","_addOrOverwriteComponent","_registerComponent","componentName","_getProvider","heartbeatController","triggerHeartbeat","ERRORS","ERROR_FACTORY","FirebaseAppImpl","checkDestroyed","_automaticDataCollectionEnabled","_name","_options","_config","_container","_isDeleted","isDeleted","automaticDataCollectionEnabled","SDK_VERSION","initializeApp","rawConfig","existingApp","newApp","deleteApp","registerVersion","libraryKeyOrName","variant","libraryMismatch","versionMismatch","warning","onLog","forEach","inst","DB_NAME","DB_VERSION","STORE_NAME","dbPromise","getDbPromise","createObjectStore","originalErrorMessage","writeHeartbeatsToIndexedDB","heartbeatObject","put","computeKey","e_2","idbGetError","appId","HeartbeatServiceImpl","platformLogger","agent","date","getUTCDateString","_heartbeatsCache","_heartbeatsCachePromise","lastSentHeartbeatDate","heartbeats","singleDateHeartbeat","hbTimestamp","valueOf","_storage","overwrite","getHeartbeatsHeader","heartbeatsCache","maxSize","heartbeatsToSend","unsentEntries","heartbeatsCache_1","heartbeatsCache_1_1","heartbeatEntry","find","hb","dates","countBytes","extractHeartbeatsForHeader","headerString","HeartbeatStorageImpl","read","substring","runIndexedDBEnvironmentCheck","_canUseIndexedDBPromise","e_1","readHeartbeatsFromIndexedDB","heartbeatsObject","existingHeartbeatsObject","clear","_delegate","firebase","removeApp","_getService","_DEFAULT_ENTRY_NAME","_removeServiceInstance","toJSON","createFirebaseNamespaceCore","firebaseAppImpl","apps","namespace","__esModule","modularAPIs.initializeApp","appCompat","modularAPIs.registerVersion","modularAPIs.setLogLevel","modularAPIs.onLog","modularAPIs.SDK_VERSION","registerComponent","componentNameWithoutCompat","serviceNamespace","modularAPIs._registerComponent","appArg","useAsService","modularAPIs","modularAPIs._DEFAULT_ENTRY_NAME","createFirebaseNamespace","extendNamespace","sdkVersion","indexOf","firebaseNamespace","registerCoreComponents","PENDING_TIMEOUT_MS","PACKAGE_VERSION","INTERNAL_AUTH_VERSION","INSTALLATIONS_API_URL","TOKEN_EXPIRATION_BUFFER","ERROR_DESCRIPTION_MAP","isServerError","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","sleep","ms","setTimeout","VALID_FID_PATTERN","INVALID_FID","generateFid","fidByteArray","Uint8Array","crypto","msCrypto","getRandomValues","fid","array","bufferToBase64UrlSafe","substr","test","getKey","fidChangeCallbacks","fidChanged","callFidChangeCallbacks","channel","broadcastChannel","BroadcastChannel","onmessage","getBroadcastChannel","postMessage","size","broadcastFidChange","OBJECT_STORE_NAME","oldValue","remove","update","updateFn","getInstallationEntry","installations","oldEntry","installationEntry","clearTimedOutRequest","registrationStatus","entryWithPromise","registrationPromise","updateInstallationRequest","entry","waitUntilFidRegistration","navigator","onLine","registrationPromiseWithError","inProgressEntry","registrationTime","heartbeatServiceProvider","endpoint","heartbeatService","heartbeatsHeader","authVersion","fetch","ok","responseValue","authToken","createInstallationRequest","registeredInstallationEntry","registerInstallation","triggerRegistrationIfNecessary","generateAuthTokenRequest","installation","refreshAuthToken","forceRefresh","isEntryRegistered","oldAuthToken","isAuthTokenExpired","tokenPromise","updateAuthTokenRequest","waitUntilAuthTokenRequest","inProgressAuthToken","requestTime","updatedInstallationEntry","fetchAuthTokenFromServer","getToken","completeInstallationRegistration","installationsImpl","getMissingValueError","valueName","internalFactory","INSTALLATIONS_NAME","getId","configKeys_1","configKeys_1_1","keyName","extractAppConfig","apiInstance","windowInstance","TRACE_MEASURE_PREFIX","CONFIG_LOCAL_STORAGE_KEY","CONFIG_EXPIRY_LOCAL_STORAGE_KEY","SERVICE_NAME","consoleLogger","iid","settingsServiceInstance","Api","getUrl","windowLocation","href","split","mark","performance","measure","measureName","mark1","mark2","getEntriesByType","getEntriesByName","getTimeOrigin","timeOrigin","timing","navigationStart","requiredApisAvailable","cookieEnabled","setupObserver","entryType","PerformanceObserver","list","getEntries","observe","entryTypes","getInstance","location","localStorage","perfMetrics","onFirstInputDelay","mergeStrings","part1","part2","sizeDiff","resultArray","VisibilityState","SettingsService","getFlTransportFullUrl","flTransportEndpointUrl","transportKey","instrumentationEnabled","dataCollectionEnabled","loggingEnabled","tracesSamplingRate","networkRequestsSamplingRate","logEndPointUrl","logSource","logTraceAfterSampling","logNetworkAfterSampling","configTimeToLive","RESERVED_ATTRIBUTE_PREFIXES","ATTRIBUTE_FORMAT_REGEX","RegExp","getVisibilityState","visibilityState","VISIBLE","HIDDEN","UNKNOWN","getAppId","firebaseApp","REMOTE_CONFIG_SDK_VERSION","DEFAULT_CONFIGS","FIS_AUTH_PREFIX","getConfig","performanceController","expiryString","getItem","expiry","configValid","configStringified","getStoredConfig","processConfig","installationsService","authTokenPromise","authTokenVal","getAuthTokenPromise","getProjectId","getApiKey","configEndPoint","Request","Authorization","app_instance_id","app_instance_id_token","app_id","app_version","sdk_version","COULD_NOT_GET_CONFIG_MSG","setItem","fpr_enabled","fpr_log_source","fpr_log_endpoint_url","fpr_log_transport_key","fpr_vc_network_request_sampling_rate","fpr_vc_trace_sampling_rate","shouldLogAfterSampling","samplingRate","Math","random","initializationPromise","initializationStatus","getInitializationPromise","handler_1","readyState","getDocumentReadyComplete","iidPromise","iidVal","changeInitializationStatus","DEFAULT_SEND_INTERVAL_MS","DEFAULT_REMAINING_TRIES","MAX_EVENT_COUNT_PER_REQUEST","remainingTries","queue","isTransportSetup","processQueue","timeOffset","staged","log_event","splice","evt","source_extension_json_proto3","event_time_ms","eventTime","flTransportFullUrl","postToFlEndpoint","res","transportWait","nextRequestWaitMillis","requestOffset","isNaN","max","logResponseDetails","responseAction","sendEventsToFl","request_time_ms","client_info","client_type","js_client_info","log_source","transportHandler","serializer","addToQueue","sendLog","resource","resourceType","logTrace","trace","settingsService","isAuto","sendTraceLog","networkRequestMetric","url","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","service_worker_status","serviceWorker","controller","visibility_state","effective_connection_type","navigatorConnection","connection","effectiveType","getEffectiveConnectionType","application_process_state","oobMetrics","Trace","start","state","traceName","api","traceStartMark","stop","traceStopMark","traceMeasure","calculateTraceMetrics","record","startTime","duration","floor","attributes","metrics","metricName","incrementMetric","counter","numAsInteger","putMetric","startsWith","customMetricName","valueAsInteger","providedValue","getMetric","putAttribute","attr","isValidName","prefix","isValidValue","attributeName","attributeValue","getAttribute","removeAttribute","setStartTime","setDuration","perfMeasureEntries","perfMeasureEntry","createOobTrace","navigationTimings","paintTimings","firstInputDelay","route","timeOriginUs","domInteractive","domContentLoadedEventEnd","loadEventEnd","firstPaint","paintObject","firstContentfulPaint","createUserTimingTrace","traceMeasureName","randomId","createNetworkRequestEntry","networkRequest","networkRequestUrl","logEndpointUrl","performanceEntry","responseStart","responseEnd","transferSize","flEndpointUrl","FID_WAIT_TIME_MS","setupOobResources","timeoutId_1","clearTimeout","setupOobTraces","resources","resources_1","setupNetworkRequests","measures","measures_1","setupUserTimingTraces","PerformanceController","_init","settings","initialized","isAvailable","perfInstance","PerformanceCompatImpl","firebaseInstance","performanceFactory"],"mappings":"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"}