{"version":3,"file":"firebase-app-check-compat.js","sources":["../../node_modules/tslib/tslib.es6.js","../util/src/crypt.ts","../util/src/deferred.ts","../util/src/environment.ts","../util/src/errors.ts","../util/src/json.ts","../util/src/jwt.ts","../logger/src/logger.ts","../component/src/component.ts","../app-check/src/state.ts","../app-check/src/constants.ts","../app-check/src/proactive-refresh.ts","../app-check/src/errors.ts","../app-check/src/util.ts","../app-check/src/client.ts","../app-check/src/indexeddb.ts","../app-check/src/logger.ts","../app-check/src/storage.ts","../app-check/src/internal-api.ts","../app-check/src/debug.ts","../app-check/src/factory.ts","../app-check/src/recaptcha.ts","../app-check/src/providers.ts","../app-check/src/api.ts","../util/src/compat.ts","../app-check/src/index.ts","../app-check-compat/src/errors.ts","../app-check-compat/src/service.ts","../app-check-compat/src/index.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) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\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\nexport class Deferred {\n promise: Promise;\n reject: (value?: unknown) => void = () => {};\n resolve: (value?: unknown) => void = () => {};\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve as (value?: unknown) => void;\n this.reject = reject as (value?: unknown) => void;\n });\n }\n\n /**\n * Our API internals are not promiseified and cannot because our callback APIs have subtle expectations around\n * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\n * and returns a node-style callback which will resolve or reject the Deferred's promise.\n */\n wrapCallback(\n callback?: (error?: unknown, value?: unknown) => void\n ): (error: unknown, value?: unknown) => void {\n return (error, value?) => {\n if (error) {\n this.reject(error);\n } else {\n this.resolve(value);\n }\n if (typeof callback === 'function') {\n // Attaching noop handler just in case developer wasn't expecting\n // promises\n this.promise.catch(() => {});\n\n // Some of our callbacks don't expect a value and our own tests\n // assert that the parameter length is 1\n if (callback.length === 1) {\n callback(error);\n } else {\n callback(error, value);\n }\n }\n };\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CONSTANTS } from './constants';\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.\n */\n// Node detection logic from: https://github.com/iliakan/detect-node/\nexport function isNode(): boolean {\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 return 'indexedDB' in self && indexedDB != null;\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 {\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 (!navigator || !navigator.cookieEnabled) {\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill for `globalThis` object.\n * @returns the `globalThis` object for the given environment.\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/**\n * @fileoverview Standardized Firebase Error.\n *\n * Usage:\n *\n * // Typescript string literals for type-safe codes\n * type Err =\n * 'unknown' |\n * 'object-not-found'\n * ;\n *\n * // Closure enum for type-safe error codes\n * // at-enum {string}\n * var Err = {\n * UNKNOWN: 'unknown',\n * OBJECT_NOT_FOUND: 'object-not-found',\n * }\n *\n * let errors: Map = {\n * 'generic-error': \"Unknown error\",\n * 'file-not-found': \"Could not find file: {$file}\",\n * };\n *\n * // Type-safe function - must pass a valid error code as param.\n * let error = new ErrorFactory('service', 'Service', errors);\n *\n * ...\n * throw error.create(Err.GENERIC);\n * ...\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\n * ...\n * // Service: Could not file file: foo.txt (service/file-not-found).\n *\n * catch (e) {\n * assert(e.message === \"Could not find file: foo.txt.\");\n * if (e.code === 'service/file-not-found') {\n * console.log(\"Could not read file: \" + e['file']);\n * }\n * }\n */\n\nexport type ErrorMap = {\n readonly [K in ErrorCode]: string;\n};\n\nconst ERROR_NAME = 'FirebaseError';\n\nexport interface StringLike {\n toString(): string;\n}\n\nexport interface ErrorData {\n [key: string]: unknown;\n}\n\n// Based on code from:\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\nexport class FirebaseError extends Error {\n readonly name = ERROR_NAME;\n\n constructor(\n readonly code: string,\n message: string,\n public customData?: Record\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\n ) {}\n\n create(\n code: K,\n ...data: K extends keyof ErrorParams ? [ErrorParams[K]] : []\n ): FirebaseError {\n const customData = (data[0] as ErrorData) || {};\n const fullCode = `${this.service}/${code}`;\n const template = this.errors[code];\n\n const message = template ? replaceTemplate(template, customData) : 'Error';\n // Service Name: Error message (service/code).\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\n\n const error = new FirebaseError(fullCode, fullMessage, 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\n/**\n * Evaluates a JSON string into a javascript object.\n *\n * @param {string} str A string containing JSON.\n * @return {*} The javascript object representing the specified JSON.\n */\nexport function jsonEval(str: string): unknown {\n return JSON.parse(str);\n}\n\n/**\n * Returns JSON representing a javascript object.\n * @param {*} data Javascript object to be stringified.\n * @return {string} The JSON contents of the object.\n */\nexport function stringify(data: unknown): string {\n return JSON.stringify(data);\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 { base64Decode } from './crypt';\nimport { jsonEval } from './json';\n\ninterface Claims {\n [key: string]: {};\n}\n\ninterface DecodedToken {\n header: object;\n claims: Claims;\n data: object;\n signature: string;\n}\n\n/**\n * Decodes a Firebase auth. token into constituent parts.\n *\n * Notes:\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nexport const decode = function (token: string): DecodedToken {\n let header = {},\n claims: Claims = {},\n data = {},\n signature = '';\n\n try {\n const parts = token.split('.');\n header = jsonEval(base64Decode(parts[0]) || '') as object;\n claims = jsonEval(base64Decode(parts[1]) || '') as Claims;\n signature = parts[2];\n data = claims['d'] || {};\n delete claims['d'];\n } catch (e) {}\n\n return {\n header,\n claims,\n data,\n signature\n };\n};\n\ninterface DecodedToken {\n header: object;\n claims: Claims;\n data: object;\n signature: string;\n}\n\n/**\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\n *\n * Notes:\n * - May return a false negative if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nexport const isValidTimestamp = function (token: string): boolean {\n const claims: Claims = decode(token).claims;\n const now: number = Math.floor(new Date().getTime() / 1000);\n let validSince: number = 0,\n validUntil: number = 0;\n\n if (typeof claims === 'object') {\n if (claims.hasOwnProperty('nbf')) {\n validSince = claims['nbf'] as number;\n } else if (claims.hasOwnProperty('iat')) {\n validSince = claims['iat'] as number;\n }\n\n if (claims.hasOwnProperty('exp')) {\n validUntil = claims['exp'] as number;\n } else {\n // token will expire after 24h by default\n validUntil = validSince + 86400;\n }\n }\n\n return (\n !!now &&\n !!validSince &&\n !!validUntil &&\n now >= validSince &&\n now <= validUntil\n );\n};\n\n/**\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\n *\n * Notes:\n * - May return null if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nexport const issuedAtTime = function (token: string): number | null {\n const claims: Claims = decode(token).claims;\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\n return claims['iat'] as number;\n }\n return null;\n};\n\n/**\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time.\n *\n * Notes:\n * - May return a false negative if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nexport const isValidFormat = function (token: string): boolean {\n const decoded = decode(token),\n claims = decoded.claims;\n\n return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat');\n};\n\n/**\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\n *\n * Notes:\n * - May return a false negative if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nexport const isAdmin = function (token: string): boolean {\n const claims: Claims = decode(token).claims;\n return typeof claims === 'object' && claims['admin'] === 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\nexport type LogLevelString =\n | 'debug'\n | 'verbose'\n | 'info'\n | 'warn'\n | 'error'\n | 'silent';\n\nexport interface LogOptions {\n level: LogLevelString;\n}\n\nexport type LogCallback = (callbackParams: LogCallbackParams) => void;\n\nexport interface LogCallbackParams {\n level: LogLevelString;\n message: string;\n args: unknown[];\n type: string;\n}\n\n/**\n * A container for all of the Logger instances\n */\nexport const instances: Logger[] = [];\n\n/**\n * The JS SDK supports 5 log levels and also allows a user the ability to\n * silence the logs altogether.\n *\n * The order is a follows:\n * DEBUG < VERBOSE < INFO < WARN < ERROR\n *\n * All of the log types above the current log level will be captured (i.e. if\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\n * `VERBOSE` logs will not)\n */\nexport enum LogLevel {\n DEBUG,\n VERBOSE,\n INFO,\n WARN,\n ERROR,\n SILENT\n}\n\nconst levelStringToEnum: { [key in LogLevelString]: LogLevel } = {\n 'debug': LogLevel.DEBUG,\n 'verbose': LogLevel.VERBOSE,\n 'info': LogLevel.INFO,\n 'warn': LogLevel.WARN,\n 'error': LogLevel.ERROR,\n 'silent': LogLevel.SILENT\n};\n\n/**\n * The default log level\n */\nconst defaultLogLevel: LogLevel = LogLevel.INFO;\n\n/**\n * We allow users the ability to pass their own log handler. We will pass the\n * type of log, the current log level, and any other arguments passed (i.e. the\n * messages that the user wants to log) to this function.\n */\nexport type LogHandler = (\n loggerInstance: Logger,\n logType: LogLevel,\n ...args: unknown[]\n) => void;\n\n/**\n * By default, `console.debug` is not displayed in the developer console (in\n * chrome). To avoid forcing users to have to opt-in to these logs twice\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\n * logs to the `console.log` function.\n */\nconst ConsoleMethod = {\n [LogLevel.DEBUG]: 'log',\n [LogLevel.VERBOSE]: 'log',\n [LogLevel.INFO]: 'info',\n [LogLevel.WARN]: 'warn',\n [LogLevel.ERROR]: 'error'\n};\n\n/**\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\n * messages on to their corresponding console counterparts (if the log method\n * is supported by the current log level)\n */\nconst defaultLogHandler: LogHandler = (instance, logType, ...args): void => {\n if (logType < instance.logLevel) {\n return;\n }\n const now = new Date().toISOString();\n const method = ConsoleMethod[logType as keyof typeof ConsoleMethod];\n if (method) {\n console[method as 'log' | 'info' | 'warn' | 'error'](\n `[${now}] ${instance.name}:`,\n ...args\n );\n } else {\n throw new Error(\n `Attempted to log a message with an invalid logType (value: ${logType})`\n );\n }\n};\n\nexport class Logger {\n /**\n * Gives you an instance of a Logger to capture messages according to\n * Firebase's logging scheme.\n *\n * @param name The name that the logs will be associated with\n */\n constructor(public name: string) {\n /**\n * Capture the current instance for later use\n */\n instances.push(this);\n }\n\n /**\n * The log level of the given Logger instance.\n */\n private _logLevel = defaultLogLevel;\n\n get logLevel(): LogLevel {\n return this._logLevel;\n }\n\n set logLevel(val: LogLevel) {\n if (!(val in LogLevel)) {\n throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\n }\n this._logLevel = val;\n }\n\n // Workaround for setter/getter having to be the same type.\n setLogLevel(val: LogLevel | LogLevelString): void {\n this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\n }\n\n /**\n * The main (internal) log handler for the Logger instance.\n * Can be set to a new function in internal package code but not by user.\n */\n private _logHandler: LogHandler = defaultLogHandler;\n get logHandler(): LogHandler {\n return this._logHandler;\n }\n set logHandler(val: LogHandler) {\n if (typeof val !== 'function') {\n throw new TypeError('Value assigned to `logHandler` must be a function');\n }\n this._logHandler = val;\n }\n\n /**\n * The optional, additional, user-defined log handler for the Logger instance.\n */\n private _userLogHandler: LogHandler | null = null;\n get userLogHandler(): LogHandler | null {\n return this._userLogHandler;\n }\n set userLogHandler(val: LogHandler | null) {\n this._userLogHandler = val;\n }\n\n /**\n * The functions below are all based on the `console` interface\n */\n\n debug(...args: unknown[]): void {\n this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\n this._logHandler(this, LogLevel.DEBUG, ...args);\n }\n log(...args: unknown[]): void {\n this._userLogHandler &&\n this._userLogHandler(this, LogLevel.VERBOSE, ...args);\n this._logHandler(this, LogLevel.VERBOSE, ...args);\n }\n info(...args: unknown[]): void {\n this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\n this._logHandler(this, LogLevel.INFO, ...args);\n }\n warn(...args: unknown[]): void {\n this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\n this._logHandler(this, LogLevel.WARN, ...args);\n }\n error(...args: unknown[]): void {\n this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\n this._logHandler(this, LogLevel.ERROR, ...args);\n }\n}\n\nexport function setLogLevel(level: LogLevelString | LogLevel): void {\n instances.forEach(inst => {\n inst.setLogLevel(level);\n });\n}\n\nexport function setUserLogHandler(\n logCallback: LogCallback | null,\n options?: LogOptions\n): void {\n for (const instance of instances) {\n let customLogLevel: LogLevel | null = null;\n if (options && options.level) {\n customLogLevel = levelStringToEnum[options.level];\n }\n if (logCallback === null) {\n instance.userLogHandler = null;\n } else {\n instance.userLogHandler = (\n instance: Logger,\n level: LogLevel,\n ...args: unknown[]\n ) => {\n const message = args\n .map(arg => {\n if (arg == null) {\n return null;\n } else if (typeof arg === 'string') {\n return arg;\n } else if (typeof arg === 'number' || typeof arg === 'boolean') {\n return arg.toString();\n } else if (arg instanceof Error) {\n return arg.message;\n } else {\n try {\n return JSON.stringify(arg);\n } catch (ignored) {\n return null;\n }\n }\n })\n .filter(arg => arg)\n .join(' ');\n if (level >= (customLogLevel ?? instance.logLevel)) {\n logCallback({\n level: LogLevel[level].toLowerCase() as LogLevelString,\n message,\n args,\n type: instance.name\n });\n }\n };\n }\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n InstantiationMode,\n InstanceFactory,\n ComponentType,\n Dictionary,\n Name,\n onInstanceCreatedCallback\n} from './types';\n\n/**\n * Component for service name T, e.g. `auth`, `auth-internal`\n */\nexport class Component {\n multipleInstances = false;\n /**\n * Properties to be added to the service namespace\n */\n serviceProps: Dictionary = {};\n\n instantiationMode = InstantiationMode.LAZY;\n\n onInstanceCreated: onInstanceCreatedCallback | null = null;\n\n /**\n *\n * @param name The public service name, e.g. app, auth, firestore, database\n * @param instanceFactory Service factory responsible for creating the public interface\n * @param type whether the service provided by the component is public or private\n */\n constructor(\n readonly name: T,\n readonly instanceFactory: InstanceFactory,\n readonly type: ComponentType\n ) {}\n\n setInstantiationMode(mode: InstantiationMode): this {\n this.instantiationMode = mode;\n return this;\n }\n\n setMultipleInstances(multipleInstances: boolean): this {\n this.multipleInstances = multipleInstances;\n return this;\n }\n\n setServiceProps(props: Dictionary): this {\n this.serviceProps = props;\n return this;\n }\n\n setInstanceCreatedCallback(callback: onInstanceCreatedCallback): this {\n this.onInstanceCreated = callback;\n return this;\n }\n}\n","/**\n * @license\n * Copyright 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 { FirebaseApp } from '@firebase/app';\nimport {\n AppCheckProvider,\n AppCheckTokenInternal,\n AppCheckTokenObserver\n} from './types';\nimport { Refresher } from './proactive-refresh';\nimport { Deferred } from '@firebase/util';\nimport { GreCAPTCHA } from './recaptcha';\nexport interface AppCheckState {\n activated: boolean;\n tokenObservers: AppCheckTokenObserver[];\n provider?: AppCheckProvider;\n token?: AppCheckTokenInternal;\n cachedTokenPromise?: Promise;\n tokenRefresher?: Refresher;\n reCAPTCHAState?: ReCAPTCHAState;\n isTokenAutoRefreshEnabled?: boolean;\n}\n\nexport interface ReCAPTCHAState {\n initialized: Deferred;\n widgetId?: string;\n}\n\nexport interface DebugState {\n enabled: boolean;\n token?: Deferred;\n}\n\nconst APP_CHECK_STATES = new Map();\nexport const DEFAULT_STATE: AppCheckState = {\n activated: false,\n tokenObservers: []\n};\n\nconst DEBUG_STATE: DebugState = {\n enabled: false\n};\n\nexport function getState(app: FirebaseApp): AppCheckState {\n return APP_CHECK_STATES.get(app) || DEFAULT_STATE;\n}\n\nexport function setState(app: FirebaseApp, state: AppCheckState): void {\n APP_CHECK_STATES.set(app, state);\n}\n\n// for testing only\nexport function clearState(): void {\n APP_CHECK_STATES.clear();\n DEBUG_STATE.enabled = false;\n DEBUG_STATE.token = undefined;\n}\n\nexport function getDebugState(): DebugState {\n return DEBUG_STATE;\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 */\nexport const BASE_ENDPOINT =\n 'https://content-firebaseappcheck.googleapis.com/v1beta';\n\nexport const EXCHANGE_RECAPTCHA_TOKEN_METHOD = 'exchangeRecaptchaToken';\nexport const EXCHANGE_DEBUG_TOKEN_METHOD = 'exchangeDebugToken';\n\nexport const TOKEN_REFRESH_TIME = {\n /**\n * The offset time before token natural expiration to run the refresh.\n * This is currently 5 minutes.\n */\n OFFSET_DURATION: 5 * 60 * 1000,\n /**\n * This is the first retrial wait after an error. This is currently\n * 30 seconds.\n */\n RETRIAL_MIN_WAIT: 30 * 1000,\n /**\n * This is the maximum retrial wait, currently 16 minutes.\n */\n RETRIAL_MAX_WAIT: 16 * 60 * 1000\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 { Deferred } from '@firebase/util';\n\n/**\n * Port from auth proactiverefresh.js\n *\n */\n// TODO: move it to @firebase/util?\n// TODO: allow to config whether refresh should happen in the background\nexport class Refresher {\n private pending: Deferred | null = null;\n private nextErrorWaitInterval: number;\n constructor(\n private readonly operation: () => Promise,\n private readonly retryPolicy: (error: unknown) => boolean,\n private readonly getWaitDuration: () => number,\n private readonly lowerBound: number,\n private readonly upperBound: number\n ) {\n this.nextErrorWaitInterval = lowerBound;\n\n if (lowerBound > upperBound) {\n throw new Error(\n 'Proactive refresh lower bound greater than upper bound!'\n );\n }\n }\n\n start(): void {\n this.nextErrorWaitInterval = this.lowerBound;\n this.process(true).catch(() => {\n /* we don't care about the result */\n });\n }\n\n stop(): void {\n if (this.pending) {\n this.pending.reject('cancelled');\n this.pending = null;\n }\n }\n\n isRunning(): boolean {\n return !!this.pending;\n }\n\n private async process(hasSucceeded: boolean): Promise {\n this.stop();\n try {\n this.pending = new Deferred();\n await sleep(this.getNextRun(hasSucceeded));\n\n // Why do we resolve a promise, then immediate wait for it?\n // We do it to make the promise chain cancellable.\n // We can call stop() which rejects the promise before the following line execute, which makes\n // the code jump to the catch block.\n // TODO: unit test this\n this.pending.resolve();\n await this.pending.promise;\n this.pending = new Deferred();\n await this.operation();\n\n this.pending.resolve();\n await this.pending.promise;\n\n this.process(true).catch(() => {\n /* we don't care about the result */\n });\n } catch (error) {\n if (this.retryPolicy(error)) {\n this.process(false).catch(() => {\n /* we don't care about the result */\n });\n } else {\n this.stop();\n }\n }\n }\n\n private getNextRun(hasSucceeded: boolean): number {\n if (hasSucceeded) {\n // If last operation succeeded, reset next error wait interval and return\n // the default wait duration.\n this.nextErrorWaitInterval = this.lowerBound;\n // Return typical wait duration interval after a successful operation.\n return this.getWaitDuration();\n } else {\n // Get next error wait interval.\n const currentErrorWaitInterval = this.nextErrorWaitInterval;\n // Double interval for next consecutive error.\n this.nextErrorWaitInterval *= 2;\n // Make sure next wait interval does not exceed the maximum upper bound.\n if (this.nextErrorWaitInterval > this.upperBound) {\n this.nextErrorWaitInterval = this.upperBound;\n }\n return currentErrorWaitInterval;\n }\n }\n}\n\nfunction sleep(ms: number): Promise {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\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 { ErrorFactory, ErrorMap } from '@firebase/util';\n\nexport const enum AppCheckError {\n ALREADY_INITIALIZED = 'already-initialized',\n USE_BEFORE_ACTIVATION = 'use-before-activation',\n FETCH_NETWORK_ERROR = 'fetch-network-error',\n FETCH_PARSE_ERROR = 'fetch-parse-error',\n FETCH_STATUS_ERROR = 'fetch-status-error',\n STORAGE_OPEN = 'storage-open',\n STORAGE_GET = 'storage-get',\n STORAGE_WRITE = 'storage-set',\n RECAPTCHA_ERROR = 'recaptcha-error'\n}\n\nconst ERRORS: ErrorMap = {\n [AppCheckError.ALREADY_INITIALIZED]:\n 'You have already called initializeAppCheck() for FirebaseApp {$appName} with ' +\n 'different options. To avoid this error, call initializeAppCheck() with the ' +\n 'same options as when it was originally called. This will return the ' +\n 'already initialized instance.',\n [AppCheckError.USE_BEFORE_ACTIVATION]:\n 'App Check is being used before initializeAppCheck() is called for FirebaseApp {$appName}. ' +\n 'Call initializeAppCheck() before instantiating other Firebase services.',\n [AppCheckError.FETCH_NETWORK_ERROR]:\n 'Fetch failed to connect to a network. Check Internet connection. ' +\n 'Original error: {$originalErrorMessage}.',\n [AppCheckError.FETCH_PARSE_ERROR]:\n 'Fetch client could not parse response.' +\n ' Original error: {$originalErrorMessage}.',\n [AppCheckError.FETCH_STATUS_ERROR]:\n 'Fetch server returned an HTTP error status. HTTP status: {$httpStatus}.',\n [AppCheckError.STORAGE_OPEN]:\n 'Error thrown when opening storage. Original error: {$originalErrorMessage}.',\n [AppCheckError.STORAGE_GET]:\n 'Error thrown when reading from storage. Original error: {$originalErrorMessage}.',\n [AppCheckError.STORAGE_WRITE]:\n 'Error thrown when writing to storage. Original error: {$originalErrorMessage}.',\n [AppCheckError.RECAPTCHA_ERROR]: 'ReCAPTCHA error.'\n};\n\ninterface ErrorParams {\n [AppCheckError.ALREADY_INITIALIZED]: { appName: string };\n [AppCheckError.USE_BEFORE_ACTIVATION]: { appName: string };\n [AppCheckError.FETCH_NETWORK_ERROR]: { originalErrorMessage: string };\n [AppCheckError.FETCH_PARSE_ERROR]: { originalErrorMessage: string };\n [AppCheckError.FETCH_STATUS_ERROR]: { httpStatus: number };\n [AppCheckError.STORAGE_OPEN]: { originalErrorMessage?: string };\n [AppCheckError.STORAGE_GET]: { originalErrorMessage?: string };\n [AppCheckError.STORAGE_WRITE]: { originalErrorMessage?: string };\n}\n\nexport const ERROR_FACTORY = new ErrorFactory(\n 'appCheck',\n 'AppCheck',\n ERRORS\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 { GreCAPTCHA } from './recaptcha';\nimport { getState } from './state';\nimport { ERROR_FACTORY, AppCheckError } from './errors';\nimport { FirebaseApp } from '@firebase/app';\n\nexport function getRecaptcha(): GreCAPTCHA | undefined {\n return self.grecaptcha;\n}\n\nexport function ensureActivated(app: FirebaseApp): void {\n if (!getState(app).activated) {\n throw ERROR_FACTORY.create(AppCheckError.USE_BEFORE_ACTIVATION, {\n appName: app.name\n });\n }\n}\n\n/**\n * Copied from https://stackoverflow.com/a/2117523\n */\nexport function uuidv4(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\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 BASE_ENDPOINT,\n EXCHANGE_DEBUG_TOKEN_METHOD,\n EXCHANGE_RECAPTCHA_TOKEN_METHOD\n} from './constants';\nimport { FirebaseApp } from '@firebase/app';\nimport { ERROR_FACTORY, AppCheckError } from './errors';\nimport { Provider } from '@firebase/component';\nimport { AppCheckTokenInternal } from './types';\n\n/**\n * Response JSON returned from AppCheck server endpoint.\n */\ninterface AppCheckResponse {\n attestationToken: string;\n // timeToLive\n ttl: string;\n}\n\ninterface AppCheckRequest {\n url: string;\n body: { [key: string]: string };\n}\n\nexport async function exchangeToken(\n { url, body }: AppCheckRequest,\n platformLoggerProvider: Provider<'platform-logger'>\n): Promise {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json'\n };\n // If platform logger exists, add the platform info string to the header.\n const platformLogger = platformLoggerProvider.getImmediate({\n optional: true\n });\n if (platformLogger) {\n headers['X-Firebase-Client'] = platformLogger.getPlatformInfoString();\n }\n const options: RequestInit = {\n method: 'POST',\n body: JSON.stringify(body),\n headers\n };\n let response;\n try {\n response = await fetch(url, options);\n } catch (originalError) {\n throw ERROR_FACTORY.create(AppCheckError.FETCH_NETWORK_ERROR, {\n originalErrorMessage: originalError.message\n });\n }\n\n if (response.status !== 200) {\n throw ERROR_FACTORY.create(AppCheckError.FETCH_STATUS_ERROR, {\n httpStatus: response.status\n });\n }\n\n let responseBody: AppCheckResponse;\n try {\n // JSON parsing throws SyntaxError if the response body isn't a JSON string.\n responseBody = await response.json();\n } catch (originalError) {\n throw ERROR_FACTORY.create(AppCheckError.FETCH_PARSE_ERROR, {\n originalErrorMessage: originalError.message\n });\n }\n\n // Protobuf duration format.\n // https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/Duration\n const match = responseBody.ttl.match(/^([\\d.]+)(s)$/);\n if (!match || !match[2] || isNaN(Number(match[1]))) {\n throw ERROR_FACTORY.create(AppCheckError.FETCH_PARSE_ERROR, {\n originalErrorMessage:\n `ttl field (timeToLive) is not in standard Protobuf Duration ` +\n `format: ${responseBody.ttl}`\n });\n }\n const timeToLiveAsNumber = Number(match[1]) * 1000;\n\n const now = Date.now();\n return {\n token: responseBody.attestationToken,\n expireTimeMillis: now + timeToLiveAsNumber,\n issuedAtTimeMillis: now\n };\n}\n\nexport function getExchangeRecaptchaTokenRequest(\n app: FirebaseApp,\n reCAPTCHAToken: string\n): AppCheckRequest {\n const { projectId, appId, apiKey } = app.options;\n\n return {\n url: `${BASE_ENDPOINT}/projects/${projectId}/apps/${appId}:${EXCHANGE_RECAPTCHA_TOKEN_METHOD}?key=${apiKey}`,\n body: {\n // eslint-disable-next-line\n recaptcha_token: reCAPTCHAToken\n }\n };\n}\n\nexport function getExchangeDebugTokenRequest(\n app: FirebaseApp,\n debugToken: string\n): AppCheckRequest {\n const { projectId, appId, apiKey } = app.options;\n\n return {\n url: `${BASE_ENDPOINT}/projects/${projectId}/apps/${appId}:${EXCHANGE_DEBUG_TOKEN_METHOD}?key=${apiKey}`,\n body: {\n // eslint-disable-next-line\n debug_token: debugToken\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 { FirebaseApp } from '@firebase/app';\nimport { ERROR_FACTORY, AppCheckError } from './errors';\nimport { AppCheckTokenInternal } from './types';\nconst DB_NAME = 'firebase-app-check-database';\nconst DB_VERSION = 1;\nconst STORE_NAME = 'firebase-app-check-store';\nconst DEBUG_TOKEN_KEY = 'debug-token';\n\nlet dbPromise: Promise | null = null;\nfunction getDBPromise(): Promise {\n if (dbPromise) {\n return dbPromise;\n }\n\n dbPromise = new Promise((resolve, reject) => {\n try {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onsuccess = event => {\n resolve((event.target as IDBOpenDBRequest).result);\n };\n\n request.onerror = event => {\n reject(\n ERROR_FACTORY.create(AppCheckError.STORAGE_OPEN, {\n originalErrorMessage: (event.target as IDBRequest).error?.message\n })\n );\n };\n\n request.onupgradeneeded = event => {\n const db = (event.target as IDBOpenDBRequest).result;\n\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 (event.oldVersion) {\n case 0:\n db.createObjectStore(STORE_NAME, {\n keyPath: 'compositeKey'\n });\n }\n };\n } catch (e) {\n reject(\n ERROR_FACTORY.create(AppCheckError.STORAGE_OPEN, {\n originalErrorMessage: e.message\n })\n );\n }\n });\n\n return dbPromise;\n}\n\nexport function readTokenFromIndexedDB(\n app: FirebaseApp\n): Promise {\n return read(computeKey(app)) as Promise;\n}\n\nexport function writeTokenToIndexedDB(\n app: FirebaseApp,\n token: AppCheckTokenInternal\n): Promise {\n return write(computeKey(app), token);\n}\n\nexport function writeDebugTokenToIndexedDB(token: string): Promise {\n return write(DEBUG_TOKEN_KEY, token);\n}\n\nexport function readDebugTokenFromIndexedDB(): Promise {\n return read(DEBUG_TOKEN_KEY) as Promise;\n}\n\nasync function write(key: string, value: unknown): Promise {\n const db = await getDBPromise();\n\n const transaction = db.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.put({\n compositeKey: key,\n value\n });\n\n return new Promise((resolve, reject) => {\n request.onsuccess = _event => {\n resolve();\n };\n\n transaction.onerror = event => {\n reject(\n ERROR_FACTORY.create(AppCheckError.STORAGE_WRITE, {\n originalErrorMessage: (event.target as IDBRequest).error?.message\n })\n );\n };\n });\n}\n\nasync function read(key: string): Promise {\n const db = await getDBPromise();\n\n const transaction = db.transaction(STORE_NAME, 'readonly');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.get(key);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = event => {\n const result = (event.target as IDBRequest).result;\n\n if (result) {\n resolve(result.value);\n } else {\n resolve(undefined);\n }\n };\n\n transaction.onerror = event => {\n reject(\n ERROR_FACTORY.create(AppCheckError.STORAGE_GET, {\n originalErrorMessage: (event.target as IDBRequest).error?.message\n })\n );\n };\n });\n}\n\nfunction computeKey(app: FirebaseApp): string {\n return `${app.options.appId}-${app.name}`;\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 } from '@firebase/logger';\n\nexport const logger = new Logger('@firebase/app-check');\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 { uuidv4 } from './util';\nimport { FirebaseApp } from '@firebase/app';\nimport { isIndexedDBAvailable } from '@firebase/util';\nimport {\n readDebugTokenFromIndexedDB,\n readTokenFromIndexedDB,\n writeDebugTokenToIndexedDB,\n writeTokenToIndexedDB\n} from './indexeddb';\nimport { logger } from './logger';\nimport { AppCheckTokenInternal } from './types';\n\n/**\n * Always resolves. In case of an error reading from indexeddb, resolve with undefined\n */\nexport async function readTokenFromStorage(\n app: FirebaseApp\n): Promise {\n if (isIndexedDBAvailable()) {\n let token = undefined;\n try {\n token = await readTokenFromIndexedDB(app);\n } catch (e) {\n // swallow the error and return undefined\n logger.warn(`Failed to read token from IndexedDB. Error: ${e}`);\n }\n return token;\n }\n\n return undefined;\n}\n\n/**\n * Always resolves. In case of an error writing to indexeddb, print a warning and resolve the promise\n */\nexport function writeTokenToStorage(\n app: FirebaseApp,\n token: AppCheckTokenInternal\n): Promise {\n if (isIndexedDBAvailable()) {\n return writeTokenToIndexedDB(app, token).catch(e => {\n // swallow the error and resolve the promise\n logger.warn(`Failed to write token to IndexedDB. Error: ${e}`);\n });\n }\n\n return Promise.resolve();\n}\n\nexport async function readOrCreateDebugTokenFromStorage(): Promise {\n /**\n * Theoretically race condition can happen if we read, then write in 2 separate transactions.\n * But it won't happen here, because this function will be called exactly once.\n */\n let existingDebugToken: string | undefined = undefined;\n try {\n existingDebugToken = await readDebugTokenFromIndexedDB();\n } catch (_e) {\n // failed to read from indexeddb. We assume there is no existing debug token, and generate a new one.\n }\n\n if (!existingDebugToken) {\n // create a new debug token\n const newToken = uuidv4();\n // We don't need to block on writing to indexeddb\n // In case persistence failed, a new debug token will be generated everytime the page is refreshed.\n // It renders the debug token useless because you have to manually register(whitelist) the new token in the firebase console again and again.\n // If you see this error trying to use debug token, it probably means you are using a browser that doesn't support indexeddb.\n // You should switch to a different browser that supports indexeddb\n writeDebugTokenToIndexedDB(newToken).catch(e =>\n logger.warn(`Failed to persist debug token to IndexedDB. Error: ${e}`)\n );\n // Not using logger because I don't think we ever want this accidentally hidden?\n console.log(\n `App Check debug token: ${newToken}. You will need to add it to your app's App Check settings in the Firebase console for it to work`\n );\n return newToken;\n } else {\n return existingDebugToken;\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 { FirebaseApp } from '@firebase/app';\nimport {\n AppCheckTokenResult,\n AppCheckTokenInternal,\n AppCheckTokenObserver,\n ListenerType\n} from './types';\nimport { AppCheckTokenListener } from './public-types';\nimport { getState, setState } from './state';\nimport { TOKEN_REFRESH_TIME } from './constants';\nimport { Refresher } from './proactive-refresh';\nimport { ensureActivated } from './util';\nimport { exchangeToken, getExchangeDebugTokenRequest } from './client';\nimport { writeTokenToStorage } from './storage';\nimport { getDebugToken, isDebugMode } from './debug';\nimport { base64 } from '@firebase/util';\nimport { logger } from './logger';\nimport { AppCheckService } from './factory';\n\n// Initial hardcoded value agreed upon across platforms for initial launch.\n// Format left open for possible dynamic error values and other fields in the future.\nexport const defaultTokenErrorData = { error: 'UNKNOWN_ERROR' };\n\n/**\n * Stringify and base64 encode token error data.\n *\n * @param tokenError Error data, currently hardcoded.\n */\nexport function formatDummyToken(\n tokenErrorData: Record\n): string {\n return base64.encodeString(\n JSON.stringify(tokenErrorData),\n /* webSafe= */ false\n );\n}\n\n/**\n * This function always resolves.\n * The result will contain an error field if there is any error.\n * In case there is an error, the token field in the result will be populated with a dummy value\n */\nexport async function getToken(\n appCheck: AppCheckService,\n forceRefresh = false\n): Promise {\n const app = appCheck.app;\n ensureActivated(app);\n\n const state = getState(app);\n\n /**\n * First check if there is a token in memory from a previous `getToken()` call.\n */\n let token: AppCheckTokenInternal | undefined = state.token;\n let error: Error | undefined = undefined;\n\n /**\n * If there is no token in memory, try to load token from indexedDB.\n */\n if (!token) {\n // cachedTokenPromise contains the token found in IndexedDB or undefined if not found.\n const cachedToken = await state.cachedTokenPromise;\n if (cachedToken && isValid(cachedToken)) {\n token = cachedToken;\n\n setState(app, { ...state, token });\n // notify all listeners with the cached token\n notifyTokenListeners(app, { token: token.token });\n }\n }\n\n // Return the cached token (from either memory or indexedDB) if it's valid\n if (!forceRefresh && token && isValid(token)) {\n return {\n token: token.token\n };\n }\n\n /**\n * DEBUG MODE\n * If debug mode is set, and there is no cached token, fetch a new App\n * Check token using the debug token, and return it directly.\n */\n if (isDebugMode()) {\n const tokenFromDebugExchange: AppCheckTokenInternal = await exchangeToken(\n getExchangeDebugTokenRequest(app, await getDebugToken()),\n appCheck.platformLoggerProvider\n );\n // Write debug token to indexedDB.\n await writeTokenToStorage(app, tokenFromDebugExchange);\n // Write debug token to state.\n setState(app, { ...state, token: tokenFromDebugExchange });\n return { token: tokenFromDebugExchange.token };\n }\n\n /**\n * request a new token\n */\n try {\n // state.provider is populated in initializeAppCheck()\n // ensureActivated() at the top of this function checks that\n // initializeAppCheck() has been called.\n token = await state.provider!.getToken();\n } catch (e) {\n // `getToken()` should never throw, but logging error text to console will aid debugging.\n logger.error(e);\n error = e;\n }\n\n let interopTokenResult: AppCheckTokenResult | undefined;\n if (!token) {\n // if token is undefined, there must be an error.\n // we return a dummy token along with the error\n interopTokenResult = makeDummyTokenResult(error!);\n } else {\n interopTokenResult = {\n token: token.token\n };\n // write the new token to the memory state as well as the persistent storage.\n // Only do it if we got a valid new token\n setState(app, { ...state, token });\n await writeTokenToStorage(app, token);\n }\n\n notifyTokenListeners(app, interopTokenResult);\n return interopTokenResult;\n}\n\nexport function addTokenListener(\n appCheck: AppCheckService,\n type: ListenerType,\n listener: AppCheckTokenListener,\n onError?: (error: Error) => void\n): void {\n const { app } = appCheck;\n const state = getState(app);\n const tokenObserver: AppCheckTokenObserver = {\n next: listener,\n error: onError,\n type\n };\n const newState = {\n ...state,\n tokenObservers: [...state.tokenObservers, tokenObserver]\n };\n /**\n * Invoke the listener with the valid token, then start the token refresher\n */\n if (!newState.tokenRefresher) {\n const tokenRefresher = createTokenRefresher(appCheck);\n newState.tokenRefresher = tokenRefresher;\n }\n\n // Create the refresher but don't start it if `isTokenAutoRefreshEnabled`\n // is not true.\n if (!newState.tokenRefresher.isRunning() && state.isTokenAutoRefreshEnabled) {\n newState.tokenRefresher.start();\n }\n\n // Invoke the listener async immediately if there is a valid token\n // in memory.\n if (state.token && isValid(state.token)) {\n const validToken = state.token;\n Promise.resolve()\n .then(() => listener({ token: validToken.token }))\n .catch(() => {\n /* we don't care about exceptions thrown in listeners */\n });\n } else if (state.token == null) {\n // Only check cache if there was no token. If the token was invalid,\n // skip this and rely on exchange endpoint.\n void state\n .cachedTokenPromise! // Storage token promise. Always populated in `activate()`.\n .then(cachedToken => {\n if (cachedToken && isValid(cachedToken)) {\n listener({ token: cachedToken.token });\n }\n })\n .catch(() => {\n /** Ignore errors in listeners. */\n });\n }\n\n setState(app, newState);\n}\n\nexport function removeTokenListener(\n app: FirebaseApp,\n listener: AppCheckTokenListener\n): void {\n const state = getState(app);\n\n const newObservers = state.tokenObservers.filter(\n tokenObserver => tokenObserver.next !== listener\n );\n if (\n newObservers.length === 0 &&\n state.tokenRefresher &&\n state.tokenRefresher.isRunning()\n ) {\n state.tokenRefresher.stop();\n }\n\n setState(app, {\n ...state,\n tokenObservers: newObservers\n });\n}\n\nfunction createTokenRefresher(appCheck: AppCheckService): Refresher {\n const { app } = appCheck;\n return new Refresher(\n // Keep in mind when this fails for any reason other than the ones\n // for which we should retry, it will effectively stop the proactive refresh.\n async () => {\n const state = getState(app);\n // If there is no token, we will try to load it from storage and use it\n // If there is a token, we force refresh it because we know it's going to expire soon\n let result;\n if (!state.token) {\n result = await getToken(appCheck);\n } else {\n result = await getToken(appCheck, true);\n }\n\n // getToken() always resolves. In case the result has an error field defined, it means the operation failed, and we should retry.\n if (result.error) {\n throw result.error;\n }\n },\n () => {\n // TODO: when should we retry?\n return true;\n },\n () => {\n const state = getState(app);\n\n if (state.token) {\n // issuedAtTime + (50% * total TTL) + 5 minutes\n let nextRefreshTimeMillis =\n state.token.issuedAtTimeMillis +\n (state.token.expireTimeMillis - state.token.issuedAtTimeMillis) *\n 0.5 +\n 5 * 60 * 1000;\n // Do not allow refresh time to be past (expireTime - 5 minutes)\n const latestAllowableRefresh =\n state.token.expireTimeMillis - 5 * 60 * 1000;\n nextRefreshTimeMillis = Math.min(\n nextRefreshTimeMillis,\n latestAllowableRefresh\n );\n return Math.max(0, nextRefreshTimeMillis - Date.now());\n } else {\n return 0;\n }\n },\n TOKEN_REFRESH_TIME.RETRIAL_MIN_WAIT,\n TOKEN_REFRESH_TIME.RETRIAL_MAX_WAIT\n );\n}\n\nfunction notifyTokenListeners(\n app: FirebaseApp,\n token: AppCheckTokenResult\n): void {\n const observers = getState(app).tokenObservers;\n\n for (const observer of observers) {\n try {\n if (observer.type === ListenerType.EXTERNAL && token.error != null) {\n // If this listener was added by a 3P call, send any token error to\n // the supplied error handler. A 3P observer always has an error\n // handler.\n observer.error!(token.error);\n } else {\n // If the token has no error field, always return the token.\n // If this is a 2P listener, return the token, whether or not it\n // has an error field.\n observer.next(token);\n }\n } catch (e) {\n // Errors in the listener function itself are always ignored.\n }\n }\n}\n\nexport function isValid(token: AppCheckTokenInternal): boolean {\n return token.expireTimeMillis - Date.now() > 0;\n}\n\nfunction makeDummyTokenResult(error: Error): AppCheckTokenResult {\n return {\n token: formatDummyToken(defaultTokenErrorData),\n error\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 { getDebugState } from './state';\nimport { readOrCreateDebugTokenFromStorage } from './storage';\nimport { Deferred, getGlobal } from '@firebase/util';\n\ndeclare global {\n // var must be used for global scopes\n // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#type-checking-for-globalthis\n // eslint-disable-next-line no-var\n var FIREBASE_APPCHECK_DEBUG_TOKEN: boolean | string | undefined;\n}\n\nexport function isDebugMode(): boolean {\n const debugState = getDebugState();\n return debugState.enabled;\n}\n\nexport async function getDebugToken(): Promise {\n const state = getDebugState();\n\n if (state.enabled && state.token) {\n return state.token.promise;\n } else {\n // should not happen!\n throw Error(`\n Can't get debug token in production mode.\n `);\n }\n}\n\nexport function initializeDebugMode(): void {\n const globals = getGlobal();\n if (\n typeof globals.FIREBASE_APPCHECK_DEBUG_TOKEN !== 'string' &&\n globals.FIREBASE_APPCHECK_DEBUG_TOKEN !== true\n ) {\n return;\n }\n\n const debugState = getDebugState();\n debugState.enabled = true;\n const deferredToken = new Deferred();\n debugState.token = deferredToken;\n\n if (typeof globals.FIREBASE_APPCHECK_DEBUG_TOKEN === 'string') {\n deferredToken.resolve(globals.FIREBASE_APPCHECK_DEBUG_TOKEN);\n } else {\n deferredToken.resolve(readOrCreateDebugTokenFromStorage());\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 { AppCheck } from './public-types';\nimport { FirebaseApp, _FirebaseService } from '@firebase/app';\nimport { FirebaseAppCheckInternal, ListenerType } from './types';\nimport {\n getToken,\n addTokenListener,\n removeTokenListener\n} from './internal-api';\nimport { Provider } from '@firebase/component';\nimport { getState } from './state';\n\n/**\n * AppCheck Service class.\n */\nexport class AppCheckService implements AppCheck, _FirebaseService {\n constructor(\n public app: FirebaseApp,\n public platformLoggerProvider: Provider<'platform-logger'>\n ) {}\n _delete(): Promise {\n const { tokenObservers } = getState(this.app);\n for (const tokenObserver of tokenObservers) {\n removeTokenListener(this.app, tokenObserver.next);\n }\n return Promise.resolve();\n }\n}\n\nexport function factory(\n app: FirebaseApp,\n platformLoggerProvider: Provider<'platform-logger'>\n): AppCheckService {\n return new AppCheckService(app, platformLoggerProvider);\n}\n\nexport function internalFactory(\n appCheck: AppCheckService\n): FirebaseAppCheckInternal {\n return {\n getToken: forceRefresh => getToken(appCheck, forceRefresh),\n addTokenListener: listener =>\n addTokenListener(appCheck, ListenerType.INTERNAL, listener),\n removeTokenListener: listener => removeTokenListener(appCheck.app, listener)\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 { FirebaseApp } from '@firebase/app';\nimport { getState, setState } from './state';\nimport { Deferred } from '@firebase/util';\nimport { getRecaptcha, ensureActivated } from './util';\n\nexport const RECAPTCHA_URL = 'https://www.google.com/recaptcha/api.js';\n\nexport function initialize(\n app: FirebaseApp,\n siteKey: string\n): Promise {\n const state = getState(app);\n const initialized = new Deferred();\n\n setState(app, { ...state, reCAPTCHAState: { initialized } });\n\n const divId = `fire_app_check_${app.name}`;\n const invisibleDiv = document.createElement('div');\n invisibleDiv.id = divId;\n invisibleDiv.style.display = 'none';\n\n document.body.appendChild(invisibleDiv);\n\n const grecaptcha = getRecaptcha();\n if (!grecaptcha) {\n loadReCAPTCHAScript(() => {\n const grecaptcha = getRecaptcha();\n\n if (!grecaptcha) {\n // it shouldn't happen.\n throw new Error('no recaptcha');\n }\n grecaptcha.ready(() => {\n // Invisible widgets allow us to set a different siteKey for each widget, so we use them to support multiple apps\n renderInvisibleWidget(app, siteKey, grecaptcha, divId);\n initialized.resolve(grecaptcha);\n });\n });\n } else {\n grecaptcha.ready(() => {\n renderInvisibleWidget(app, siteKey, grecaptcha, divId);\n initialized.resolve(grecaptcha);\n });\n }\n\n return initialized.promise;\n}\n\nexport async function getToken(app: FirebaseApp): Promise {\n ensureActivated(app);\n\n // ensureActivated() guarantees that reCAPTCHAState is set\n const reCAPTCHAState = getState(app).reCAPTCHAState!;\n const recaptcha = await reCAPTCHAState.initialized.promise;\n\n return new Promise((resolve, _reject) => {\n // Updated after initialization is complete.\n const reCAPTCHAState = getState(app).reCAPTCHAState!;\n recaptcha.ready(() => {\n resolve(\n // widgetId is guaranteed to be available if reCAPTCHAState.initialized.promise resolved.\n recaptcha.execute(reCAPTCHAState.widgetId!, {\n action: 'fire_app_check'\n })\n );\n });\n });\n}\n\n/**\n *\n * @param app\n * @param container - Id of a HTML element.\n */\nfunction renderInvisibleWidget(\n app: FirebaseApp,\n siteKey: string,\n grecaptcha: GreCAPTCHA,\n container: string\n): void {\n const widgetId = grecaptcha.render(container, {\n sitekey: siteKey,\n size: 'invisible'\n });\n\n const state = getState(app);\n\n setState(app, {\n ...state,\n reCAPTCHAState: {\n ...state.reCAPTCHAState!, // state.reCAPTCHAState is set in the initialize()\n widgetId\n }\n });\n}\n\nfunction loadReCAPTCHAScript(onload: () => void): void {\n const script = document.createElement('script');\n script.src = `${RECAPTCHA_URL}`;\n script.onload = onload;\n document.head.appendChild(script);\n}\n\ndeclare global {\n interface Window {\n grecaptcha: GreCAPTCHA | undefined;\n }\n}\n\nexport interface GreCAPTCHA {\n ready: (callback: () => void) => void;\n execute: (siteKey: string, options: { action: string }) => Promise;\n render: (\n container: string | HTMLElement,\n parameters: GreCAPTCHARenderOption\n ) => string;\n}\n\nexport interface GreCAPTCHARenderOption {\n sitekey: string;\n size: 'invisible';\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 { FirebaseApp, _getProvider } from '@firebase/app';\nimport { Provider } from '@firebase/component';\nimport { issuedAtTime } from '@firebase/util';\nimport { exchangeToken, getExchangeRecaptchaTokenRequest } from './client';\nimport { AppCheckError, ERROR_FACTORY } from './errors';\nimport { CustomProviderOptions } from './public-types';\nimport {\n getToken as getReCAPTCHAToken,\n initialize as initializeRecaptcha\n} from './recaptcha';\nimport { AppCheckProvider, AppCheckTokenInternal } from './types';\n\n/**\n * App Check provider that can obtain a reCAPTCHA V3 token and exchange it\n * for an App Check token.\n *\n * @public\n */\nexport class ReCaptchaV3Provider implements AppCheckProvider {\n private _app?: FirebaseApp;\n private _platformLoggerProvider?: Provider<'platform-logger'>;\n /**\n * Create a ReCaptchaV3Provider instance.\n * @param siteKey - ReCAPTCHA V3 siteKey.\n */\n constructor(private _siteKey: string) {}\n\n /**\n * Returns an App Check token.\n * @internal\n */\n async getToken(): Promise {\n if (!this._app || !this._platformLoggerProvider) {\n // This should only occur if user has not called initializeAppCheck().\n // We don't have an appName to provide if so.\n // This should already be caught in the top level `getToken()` function.\n throw ERROR_FACTORY.create(AppCheckError.USE_BEFORE_ACTIVATION, {\n appName: ''\n });\n }\n const attestedClaimsToken = await getReCAPTCHAToken(this._app).catch(_e => {\n // reCaptcha.execute() throws null which is not very descriptive.\n throw ERROR_FACTORY.create(AppCheckError.RECAPTCHA_ERROR);\n });\n return exchangeToken(\n getExchangeRecaptchaTokenRequest(this._app, attestedClaimsToken),\n this._platformLoggerProvider\n );\n }\n\n /**\n * @internal\n */\n initialize(app: FirebaseApp): void {\n this._app = app;\n this._platformLoggerProvider = _getProvider(app, 'platform-logger');\n initializeRecaptcha(app, this._siteKey).catch(() => {\n /* we don't care about the initialization result */\n });\n }\n\n /**\n * @internal\n */\n isEqual(otherProvider: unknown): boolean {\n if (otherProvider instanceof ReCaptchaV3Provider) {\n return this._siteKey === otherProvider._siteKey;\n } else {\n return false;\n }\n }\n}\n\n/**\n * Custom provider class.\n * @public\n */\nexport class CustomProvider implements AppCheckProvider {\n private _app?: FirebaseApp;\n\n constructor(private _customProviderOptions: CustomProviderOptions) {}\n\n /**\n * @internal\n */\n async getToken(): Promise {\n if (!this._app) {\n // This should only occur if user has not called initializeAppCheck().\n // We don't have an appName to provide if so.\n // This should already be caught in the top level `getToken()` function.\n throw ERROR_FACTORY.create(AppCheckError.USE_BEFORE_ACTIVATION, {\n appName: ''\n });\n }\n // custom provider\n const customToken = await this._customProviderOptions.getToken();\n // Try to extract IAT from custom token, in case this token is not\n // being newly issued. JWT timestamps are in seconds since epoch.\n const issuedAtTimeSeconds = issuedAtTime(customToken.token);\n // Very basic validation, use current timestamp as IAT if JWT\n // has no `iat` field or value is out of bounds.\n const issuedAtTimeMillis =\n issuedAtTimeSeconds !== null &&\n issuedAtTimeSeconds < Date.now() &&\n issuedAtTimeSeconds > 0\n ? issuedAtTimeSeconds * 1000\n : Date.now();\n\n return { ...customToken, issuedAtTimeMillis };\n }\n\n /**\n * @internal\n */\n initialize(app: FirebaseApp): void {\n this._app = app;\n }\n\n /**\n * @internal\n */\n isEqual(otherProvider: unknown): boolean {\n if (otherProvider instanceof CustomProvider) {\n return (\n this._customProviderOptions.getToken.toString() ===\n otherProvider._customProviderOptions.getToken.toString()\n );\n } else {\n return false;\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 {\n AppCheck,\n AppCheckOptions,\n AppCheckTokenResult,\n Unsubscribe,\n PartialObserver\n} from './public-types';\nimport { ERROR_FACTORY, AppCheckError } from './errors';\nimport { getState, setState, AppCheckState } from './state';\nimport { FirebaseApp, getApp, _getProvider } from '@firebase/app';\nimport { getModularInstance, ErrorFn, NextFn } from '@firebase/util';\nimport { AppCheckService } from './factory';\nimport { AppCheckProvider, ListenerType } from './types';\nimport {\n getToken as getTokenInternal,\n addTokenListener,\n removeTokenListener,\n isValid\n} from './internal-api';\nimport { readTokenFromStorage } from './storage';\n\ndeclare module '@firebase/component' {\n interface NameServiceMapping {\n 'app-check': AppCheckService;\n }\n}\n\nexport { ReCaptchaV3Provider, CustomProvider } from './providers';\n\n/**\n * Activate App Check for the given app. Can be called only once per app.\n * @param app - the {@link @firebase/app#FirebaseApp} to activate App Check for\n * @param options - App Check initialization options\n * @public\n */\nexport function initializeAppCheck(\n app: FirebaseApp = getApp(),\n options: AppCheckOptions\n): AppCheck {\n app = getModularInstance(app);\n const provider = _getProvider(app, 'app-check');\n\n if (provider.isInitialized()) {\n const existingInstance = provider.getImmediate();\n const initialOptions = provider.getOptions() as unknown as AppCheckOptions;\n if (\n initialOptions.isTokenAutoRefreshEnabled ===\n options.isTokenAutoRefreshEnabled &&\n initialOptions.provider.isEqual(options.provider)\n ) {\n return existingInstance;\n } else {\n throw ERROR_FACTORY.create(AppCheckError.ALREADY_INITIALIZED, {\n appName: app.name\n });\n }\n }\n\n const appCheck = provider.initialize({ options });\n _activate(app, options.provider, options.isTokenAutoRefreshEnabled);\n\n return appCheck;\n}\n\n/**\n * Activate App Check\n * @param app - Firebase app to activate App Check for.\n * @param provider - reCAPTCHA v3 provider or\n * custom token provider.\n * @param isTokenAutoRefreshEnabled - If true, the SDK automatically\n * refreshes App Check tokens as needed. If undefined, defaults to the\n * value of `app.automaticDataCollectionEnabled`, which defaults to\n * false and can be set in the app config.\n */\nfunction _activate(\n app: FirebaseApp,\n provider: AppCheckProvider,\n isTokenAutoRefreshEnabled?: boolean\n): void {\n const state = getState(app);\n\n const newState: AppCheckState = { ...state, activated: true };\n newState.provider = provider; // Read cached token from storage if it exists and store it in memory.\n newState.cachedTokenPromise = readTokenFromStorage(app).then(cachedToken => {\n if (cachedToken && isValid(cachedToken)) {\n setState(app, { ...getState(app), token: cachedToken });\n }\n return cachedToken;\n });\n\n // Use value of global `automaticDataCollectionEnabled` (which\n // itself defaults to false if not specified in config) if\n // `isTokenAutoRefreshEnabled` param was not provided by user.\n newState.isTokenAutoRefreshEnabled =\n isTokenAutoRefreshEnabled === undefined\n ? app.automaticDataCollectionEnabled\n : isTokenAutoRefreshEnabled;\n\n setState(app, newState);\n\n newState.provider.initialize(app);\n}\n\n/**\n * Set whether App Check will automatically refresh tokens as needed.\n *\n * @param appCheckInstance - The App Check service instance.\n * @param isTokenAutoRefreshEnabled - If true, the SDK automatically\n * refreshes App Check tokens as needed. This overrides any value set\n * during `initializeAppCheck()`.\n * @public\n */\nexport function setTokenAutoRefreshEnabled(\n appCheckInstance: AppCheck,\n isTokenAutoRefreshEnabled: boolean\n): void {\n const app = appCheckInstance.app;\n const state = getState(app);\n // This will exist if any product libraries have called\n // `addTokenListener()`\n if (state.tokenRefresher) {\n if (isTokenAutoRefreshEnabled === true) {\n state.tokenRefresher.start();\n } else {\n state.tokenRefresher.stop();\n }\n }\n setState(app, { ...state, isTokenAutoRefreshEnabled });\n}\n/**\n * Get the current App Check token. Attaches to the most recent\n * in-flight request if one is present. Returns null if no token\n * is present and no token requests are in-flight.\n *\n * @param appCheckInstance - The App Check service instance.\n * @param forceRefresh - If true, will always try to fetch a fresh token.\n * If false, will use a cached token if found in storage.\n * @public\n */\nexport async function getToken(\n appCheckInstance: AppCheck,\n forceRefresh?: boolean\n): Promise {\n const result = await getTokenInternal(\n appCheckInstance as AppCheckService,\n forceRefresh\n );\n if (result.error) {\n throw result.error;\n }\n return { token: result.token };\n}\n\n/**\n * Registers a listener to changes in the token state. There can be more\n * than one listener registered at the same time for one or more\n * App Check instances. The listeners call back on the UI thread whenever\n * the current token associated with this App Check instance changes.\n *\n * @param appCheckInstance - The App Check service instance.\n * @param observer - An object with `next`, `error`, and `complete`\n * properties. `next` is called with an\n * {@link AppCheckTokenResult}\n * whenever the token changes. `error` is optional and is called if an\n * error is thrown by the listener (the `next` function). `complete`\n * is unused, as the token stream is unending.\n *\n * @returns A function that unsubscribes this listener.\n * @public\n */\nexport function onTokenChanged(\n appCheckInstance: AppCheck,\n observer: PartialObserver\n): Unsubscribe;\n/**\n * Registers a listener to changes in the token state. There can be more\n * than one listener registered at the same time for one or more\n * App Check instances. The listeners call back on the UI thread whenever\n * the current token associated with this App Check instance changes.\n *\n * @param appCheckInstance - The App Check service instance.\n * @param onNext - When the token changes, this function is called with aa\n * {@link AppCheckTokenResult}.\n * @param onError - Optional. Called if there is an error thrown by the\n * listener (the `onNext` function).\n * @param onCompletion - Currently unused, as the token stream is unending.\n * @returns A function that unsubscribes this listener.\n * @public\n */\nexport function onTokenChanged(\n appCheckInstance: AppCheck,\n onNext: (tokenResult: AppCheckTokenResult) => void,\n onError?: (error: Error) => void,\n onCompletion?: () => void\n): Unsubscribe;\n/**\n * Wraps `addTokenListener`/`removeTokenListener` methods in an `Observer`\n * pattern for public use.\n */\nexport function onTokenChanged(\n appCheckInstance: AppCheck,\n onNextOrObserver:\n | ((tokenResult: AppCheckTokenResult) => void)\n | PartialObserver,\n onError?: (error: Error) => void,\n /**\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the token stream is never-ending.\n * It is added only for API consistency with the observer pattern, which\n * we follow in JS APIs.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onCompletion?: () => void\n): Unsubscribe {\n let nextFn: NextFn = () => {};\n let errorFn: ErrorFn = () => {};\n if ((onNextOrObserver as PartialObserver).next != null) {\n nextFn = (\n onNextOrObserver as PartialObserver\n ).next!.bind(onNextOrObserver);\n } else {\n nextFn = onNextOrObserver as NextFn;\n }\n if (\n (onNextOrObserver as PartialObserver).error != null\n ) {\n errorFn = (\n onNextOrObserver as PartialObserver\n ).error!.bind(onNextOrObserver);\n } else if (onError) {\n errorFn = onError;\n }\n addTokenListener(\n appCheckInstance as AppCheckService,\n ListenerType.EXTERNAL,\n nextFn,\n errorFn\n );\n return () => removeTokenListener(appCheckInstance.app, nextFn);\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 {\n _delegate: T;\n}\n\nexport function getModularInstance(\n service: Compat | ExpService\n): ExpService {\n if (service && (service as Compat)._delegate) {\n return (service as Compat)._delegate;\n } else {\n return service as ExpService;\n }\n}\n","/**\n * Firebase App Check\n *\n * @packageDocumentation\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 */\nimport { registerVersion, _registerComponent } from '@firebase/app';\nimport {\n Component,\n ComponentType,\n InstantiationMode\n} from '@firebase/component';\nimport { _AppCheckComponentName } from './public-types';\nimport { factory, internalFactory } from './factory';\nimport { initializeDebugMode } from './debug';\nimport { _AppCheckInternalComponentName } from './types';\nimport { name, version } from '../package.json';\n\n// Used by other Firebase packages.\nexport { _AppCheckInternalComponentName };\n\nexport * from './api';\nexport * from './public-types';\n\nconst APP_CHECK_NAME: _AppCheckComponentName = 'app-check';\nconst APP_CHECK_NAME_INTERNAL: _AppCheckInternalComponentName =\n 'app-check-internal';\nfunction registerAppCheck(): void {\n // The public interface\n _registerComponent(\n new Component(\n APP_CHECK_NAME,\n container => {\n // getImmediate for FirebaseApp will always succeed\n const app = container.getProvider('app').getImmediate();\n const platformLoggerProvider = container.getProvider('platform-logger');\n return factory(app, platformLoggerProvider);\n },\n ComponentType.PUBLIC\n )\n .setInstantiationMode(InstantiationMode.EXPLICIT)\n /**\n * Initialize app-check-internal after app-check is initialized to make AppCheck available to\n * other Firebase SDKs\n */\n .setInstanceCreatedCallback(\n (container, _identifier, _appcheckService) => {\n container.getProvider(APP_CHECK_NAME_INTERNAL).initialize();\n }\n )\n );\n\n // The internal interface used by other Firebase products\n _registerComponent(\n new Component(\n APP_CHECK_NAME_INTERNAL,\n container => {\n const appCheck = container.getProvider('app-check').getImmediate();\n return internalFactory(appCheck);\n },\n ComponentType.PUBLIC\n ).setInstantiationMode(InstantiationMode.EXPLICIT)\n );\n\n registerVersion(name, version);\n}\n\nregisterAppCheck();\ninitializeDebugMode();\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 { ErrorFactory, ErrorMap } from '@firebase/util';\n\nexport const enum AppCheckError {\n USE_BEFORE_ACTIVATION = 'use-before-activation'\n}\n\nconst ERRORS: ErrorMap = {\n [AppCheckError.USE_BEFORE_ACTIVATION]:\n 'App Check is being used before activate() is called for FirebaseApp {$appName}. ' +\n 'Call activate() before instantiating other Firebase services.'\n};\n\ninterface ErrorParams {\n [AppCheckError.USE_BEFORE_ACTIVATION]: { appName: string };\n}\n\nexport const ERROR_FACTORY = new ErrorFactory(\n 'appCheck',\n 'AppCheck',\n ERRORS\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 {\n AppCheckProvider,\n AppCheckTokenResult,\n FirebaseAppCheck\n} from '@firebase/app-check-types';\nimport { _FirebaseService, FirebaseApp } from '@firebase/app-compat';\nimport {\n AppCheck as AppCheckServiceExp,\n CustomProvider,\n initializeAppCheck,\n ReCaptchaV3Provider,\n setTokenAutoRefreshEnabled as setTokenAutoRefreshEnabledExp,\n getToken as getTokenExp,\n onTokenChanged as onTokenChangedExp\n} from '@firebase/app-check';\nimport { PartialObserver, Unsubscribe } from '@firebase/util';\nimport { ERROR_FACTORY, AppCheckError } from './errors';\n\nexport class AppCheckService\n implements FirebaseAppCheck, Omit<_FirebaseService, '_delegate'>\n{\n _delegate?: AppCheckServiceExp;\n constructor(public app: FirebaseApp) {}\n\n activate(\n siteKeyOrProvider: string | AppCheckProvider,\n isTokenAutoRefreshEnabled?: boolean\n ): void {\n let provider: ReCaptchaV3Provider | CustomProvider;\n if (typeof siteKeyOrProvider === 'string') {\n provider = new ReCaptchaV3Provider(siteKeyOrProvider);\n } else {\n provider = new CustomProvider({ getToken: siteKeyOrProvider.getToken });\n }\n this._delegate = initializeAppCheck(this.app, {\n provider,\n isTokenAutoRefreshEnabled\n });\n }\n\n setTokenAutoRefreshEnabled(isTokenAutoRefreshEnabled: boolean): void {\n if (!this._delegate) {\n throw ERROR_FACTORY.create(AppCheckError.USE_BEFORE_ACTIVATION, {\n appName: this.app.name\n });\n }\n setTokenAutoRefreshEnabledExp(this._delegate, isTokenAutoRefreshEnabled);\n }\n\n getToken(forceRefresh?: boolean): Promise {\n if (!this._delegate) {\n throw ERROR_FACTORY.create(AppCheckError.USE_BEFORE_ACTIVATION, {\n appName: this.app.name\n });\n }\n return getTokenExp(this._delegate, forceRefresh);\n }\n\n onTokenChanged(\n onNextOrObserver:\n | PartialObserver\n | ((tokenResult: AppCheckTokenResult) => void),\n onError?: (error: Error) => void,\n onCompletion?: () => void\n ): Unsubscribe {\n if (!this._delegate) {\n throw ERROR_FACTORY.create(AppCheckError.USE_BEFORE_ACTIVATION, {\n appName: this.app.name\n });\n }\n return onTokenChangedExp(\n this._delegate,\n /**\n * Exp onTokenChanged() will handle both overloads but we need\n * to specify one to not confuse Typescript.\n */\n onNextOrObserver as (tokenResult: AppCheckTokenResult) => void,\n onError,\n onCompletion\n );\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\nimport firebase, {\n _FirebaseNamespace,\n FirebaseApp\n} from '@firebase/app-compat';\nimport { name, version } from '../package.json';\nimport {\n Component,\n ComponentContainer,\n ComponentType,\n InstanceFactory\n} from '@firebase/component';\nimport { AppCheckService } from './service';\nimport { FirebaseAppCheck } from '@firebase/app-check-types';\n\nconst factory: InstanceFactory<'appCheck-compat'> = (\n container: ComponentContainer\n) => {\n // Dependencies\n const app = container.getProvider('app-compat').getImmediate();\n\n return new AppCheckService(app as FirebaseApp);\n};\n\nexport function registerAppCheck(): void {\n (firebase as _FirebaseNamespace).INTERNAL.registerComponent(\n new Component('appCheck-compat', factory, ComponentType.PUBLIC)\n );\n}\n\nregisterAppCheck();\nfirebase.registerVersion(name, version);\n\n/**\n * Define extension behavior of `registerAppCheck`\n */\ndeclare module '@firebase/app-compat' {\n interface FirebaseNamespace {\n appCheck(app?: FirebaseApp): FirebaseAppCheck;\n }\n interface FirebaseApp {\n appCheck(): FirebaseAppCheck;\n }\n}\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__spreadArray","to","from","i","il","length","j","base64Decode","str","base64","decodeString","e","console","error","byteToCharMap_","charToByteMap_","byteToCharMapWebSafe_","charToByteMapWebSafe_","ENCODED_VALS_BASE","ENCODED_VALS","this","ENCODED_VALS_WEBSAFE","HAS_NATIVE_SUPPORT","atob","encodeByteArray","input","webSafe","isArray","Error","init_","byteToCharMap","output","byte1","haveByte2","byte2","haveByte3","byte3","outByte3","outByte4","push","join","encodeString","btoa","out","c","charCodeAt","stringToByteArray","bytes","pos","u","c2","c3","c1","String","fromCharCode","byteArrayToString","decodeStringToByteArray","charToByteMap","charAt","byte4","Deferred","callback","value","_this","reject","resolve","promise","catch","Promise","isIndexedDBAvailable","self","indexedDB","ERROR_NAME","TypeError","__","constructor","create","__extends","code","message","customData","_super","FirebaseError","captureStackTrace","ErrorFactory","_i","data","fullCode","service","template","errors","replace","PATTERN","_","key","fullMessage","serviceName","jsonEval","JSON","parse","issuedAtTime","token","claims","header","signature","parts","split","decode","LogLevel","Component","mode","instantiationMode","multipleInstances","props","serviceProps","onInstanceCreated","name","instanceFactory","type","defaultLogHandler","instance","logType","args","logLevel","now","Date","toISOString","method","ConsoleMethod","levelStringToEnum","debug","DEBUG","verbose","VERBOSE","info","INFO","warn","WARN","ERROR","silent","SILENT","defaultLogLevel","_a","Logger","_logLevel","val","_logHandler","_userLogHandler","APP_CHECK_STATES","Map","DEFAULT_STATE","activated","tokenObservers","DEBUG_STATE","enabled","getState","app","get","setState","state","set","BASE_ENDPOINT","EXCHANGE_DEBUG_TOKEN_METHOD","TOKEN_REFRESH_TIME","OFFSET_DURATION","RETRIAL_MIN_WAIT","RETRIAL_MAX_WAIT","Refresher","operation","retryPolicy","getWaitDuration","lowerBound","upperBound","nextErrorWaitInterval","process","pending","hasSucceeded","stop","ms","getNextRun","setTimeout","currentErrorWaitInterval","ERROR_FACTORY","already-initialized","use-before-activation","fetch-network-error","fetch-parse-error","fetch-status-error","storage-open","storage-get","storage-set","recaptcha-error","getRecaptcha","grecaptcha","ensureActivated","appName","async","exchangeToken","url","body","platformLoggerProvider","headers","Content-Type","platformLogger","getImmediate","optional","getPlatformInfoString","options","stringify","response","fetch","originalError","originalErrorMessage","status","httpStatus","responseBody","json","match","ttl","isNaN","Number","timeToLiveAsNumber","attestationToken","expireTimeMillis","issuedAtTimeMillis","DB_NAME","DB_VERSION","STORE_NAME","DEBUG_TOKEN_KEY","dbPromise","getDBPromise","request","open","onsuccess","event","target","result","onerror","onupgradeneeded","db","oldVersion","createObjectStore","keyPath","write","transaction","store","objectStore","put","compositeKey","_event","read","undefined","computeKey","appId","logger","readTokenFromStorage","writeTokenToStorage","readOrCreateDebugTokenFromStorage","existingDebugToken","_e","newToken","r","Math","random","v","toString","log","defaultTokenErrorData","getToken","appCheck","forceRefresh","cachedToken","cachedTokenPromise","isValid","notifyTokenListeners","tokenFromDebugExchange","debugToken","projectId","apiKey","debug_token","getExchangeDebugTokenRequest","getDebugToken","provider","interopTokenResult","tokenErrorData","formatDummyToken","addTokenListener","listener","onError","tokenObserver","next","newState","tokenRefresher","nextRefreshTimeMillis","latestAllowableRefresh","min","max","createTokenRefresher","isRunning","isTokenAutoRefreshEnabled","start","validToken","then","removeTokenListener","newObservers","filter","observer","AppCheckService","RECAPTCHA_URL","initialize","siteKey","initialized","reCAPTCHAState","divId","invisibleDiv","document","createElement","id","style","display","appendChild","ready","renderInvisibleWidget","onload","script","src","head","loadReCAPTCHAScript","container","widgetId","render","sitekey","size","ReCaptchaV3Provider","_siteKey","_app","_platformLoggerProvider","attestedClaimsToken","recaptcha","_reject","execute","action","getReCAPTCHAToken","reCAPTCHAToken","recaptcha_token","getExchangeRecaptchaTokenRequest","_getProvider","initializeRecaptcha","otherProvider","CustomProvider","_customProviderOptions","customToken","issuedAtTimeSeconds","initializeAppCheck","getApp","_delegate","isInitialized","existingInstance","initialOptions","getOptions","isEqual","automaticDataCollectionEnabled","_activate","APP_CHECK_NAME_INTERNAL","_registerComponent","getProvider","setInstantiationMode","setInstanceCreatedCallback","_identifier","_appcheckService","registerVersion","globals","window","global","getGlobal","FIREBASE_APPCHECK_DEBUG_TOKEN","debugState","deferredToken","initializeDebugMode","siteKeyOrProvider","appCheckInstance","setTokenAutoRefreshEnabledExp","getTokenInternal","getTokenExp","onNextOrObserver","onCompletion","nextFn","errorFn","bind","onTokenChangedExp","firebase","INTERNAL","registerComponent"],"mappings":"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"}