{"version":3,"file":"static/chunks/d91e9ae9-5f306a88e9f5ad42.js","mappings":"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","sources":["webpack://_N_E/./node_modules/@firebase/database/dist/index.esm.js"],"sourcesContent":["import firebase from '@firebase/app';\nimport { Provider, ComponentContainer, Component } from '@firebase/component';\nimport { stringify, jsonEval, contains, assert, isNodeSdk, base64, stringToByteArray, Sha1, deepCopy, base64Encode, isMobileCordova, stringLength, Deferred, safeGet, isAdmin, isValidFormat, isEmpty, isReactNative, assertionError, map, querystring, errorPrefix, getModularInstance, createMockUserToken, validateArgCount, validateCallback, validateContextObject } from '@firebase/util';\nimport { __spreadArray, __read, __values, __extends, __awaiter, __generator, __assign } from 'tslib';\nimport { Logger, LogLevel } from '@firebase/logger';\n\nvar name = \"@firebase/database\";\nvar version = \"0.11.0\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** The semver (www.semver.org) version of the SDK. */\r\nvar SDK_VERSION = '';\r\n// SDK_VERSION should be set before any database instance is created\r\nfunction setSDKVersion(version) {\r\n SDK_VERSION = version;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Wraps a DOM Storage object and:\r\n * - automatically encode objects as JSON strings before storing them to allow us to store arbitrary types.\r\n * - prefixes names with \"firebase:\" to avoid collisions with app data.\r\n *\r\n * We automatically (see storage.js) create two such wrappers, one for sessionStorage,\r\n * and one for localStorage.\r\n *\r\n */\r\nvar DOMStorageWrapper = /** @class */ (function () {\r\n /**\r\n * @param domStorage_ - The underlying storage object (e.g. localStorage or sessionStorage)\r\n */\r\n function DOMStorageWrapper(domStorage_) {\r\n this.domStorage_ = domStorage_;\r\n // Use a prefix to avoid collisions with other stuff saved by the app.\r\n this.prefix_ = 'firebase:';\r\n }\r\n /**\r\n * @param key - The key to save the value under\r\n * @param value - The value being stored, or null to remove the key.\r\n */\r\n DOMStorageWrapper.prototype.set = function (key, value) {\r\n if (value == null) {\r\n this.domStorage_.removeItem(this.prefixedName_(key));\r\n }\r\n else {\r\n this.domStorage_.setItem(this.prefixedName_(key), stringify(value));\r\n }\r\n };\r\n /**\r\n * @returns The value that was stored under this key, or null\r\n */\r\n DOMStorageWrapper.prototype.get = function (key) {\r\n var storedVal = this.domStorage_.getItem(this.prefixedName_(key));\r\n if (storedVal == null) {\r\n return null;\r\n }\r\n else {\r\n return jsonEval(storedVal);\r\n }\r\n };\r\n DOMStorageWrapper.prototype.remove = function (key) {\r\n this.domStorage_.removeItem(this.prefixedName_(key));\r\n };\r\n DOMStorageWrapper.prototype.prefixedName_ = function (name) {\r\n return this.prefix_ + name;\r\n };\r\n DOMStorageWrapper.prototype.toString = function () {\r\n return this.domStorage_.toString();\r\n };\r\n return DOMStorageWrapper;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An in-memory storage implementation that matches the API of DOMStorageWrapper\r\n * (TODO: create interface for both to implement).\r\n */\r\nvar MemoryStorage = /** @class */ (function () {\r\n function MemoryStorage() {\r\n this.cache_ = {};\r\n this.isInMemoryStorage = true;\r\n }\r\n MemoryStorage.prototype.set = function (key, value) {\r\n if (value == null) {\r\n delete this.cache_[key];\r\n }\r\n else {\r\n this.cache_[key] = value;\r\n }\r\n };\r\n MemoryStorage.prototype.get = function (key) {\r\n if (contains(this.cache_, key)) {\r\n return this.cache_[key];\r\n }\r\n return null;\r\n };\r\n MemoryStorage.prototype.remove = function (key) {\r\n delete this.cache_[key];\r\n };\r\n return MemoryStorage;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Helper to create a DOMStorageWrapper or else fall back to MemoryStorage.\r\n * TODO: Once MemoryStorage and DOMStorageWrapper have a shared interface this method annotation should change\r\n * to reflect this type\r\n *\r\n * @param domStorageName - Name of the underlying storage object\r\n * (e.g. 'localStorage' or 'sessionStorage').\r\n * @returns Turning off type information until a common interface is defined.\r\n */\r\nvar createStoragefor = function (domStorageName) {\r\n try {\r\n // NOTE: just accessing \"localStorage\" or \"window['localStorage']\" may throw a security exception,\r\n // so it must be inside the try/catch.\r\n if (typeof window !== 'undefined' &&\r\n typeof window[domStorageName] !== 'undefined') {\r\n // Need to test cache. Just because it's here doesn't mean it works\r\n var domStorage = window[domStorageName];\r\n domStorage.setItem('firebase:sentinel', 'cache');\r\n domStorage.removeItem('firebase:sentinel');\r\n return new DOMStorageWrapper(domStorage);\r\n }\r\n }\r\n catch (e) { }\r\n // Failed to create wrapper. Just return in-memory storage.\r\n // TODO: log?\r\n return new MemoryStorage();\r\n};\r\n/** A storage object that lasts across sessions */\r\nvar PersistentStorage = createStoragefor('localStorage');\r\n/** A storage object that only lasts one session */\r\nvar SessionStorage = createStoragefor('sessionStorage');\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar logClient = new Logger('@firebase/database');\r\n/**\r\n * Returns a locally-unique ID (generated by just incrementing up from 0 each time its called).\r\n */\r\nvar LUIDGenerator = (function () {\r\n var id = 1;\r\n return function () {\r\n return id++;\r\n };\r\n})();\r\n/**\r\n * Sha1 hash of the input string\r\n * @param str - The string to hash\r\n * @returns {!string} The resulting hash\r\n */\r\nvar sha1 = function (str) {\r\n var utf8Bytes = stringToByteArray(str);\r\n var sha1 = new Sha1();\r\n sha1.update(utf8Bytes);\r\n var sha1Bytes = sha1.digest();\r\n return base64.encodeByteArray(sha1Bytes);\r\n};\r\nvar buildLogMessage_ = function () {\r\n var varArgs = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n varArgs[_i] = arguments[_i];\r\n }\r\n var message = '';\r\n for (var i = 0; i < varArgs.length; i++) {\r\n var arg = varArgs[i];\r\n if (Array.isArray(arg) ||\r\n (arg &&\r\n typeof arg === 'object' &&\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n typeof arg.length === 'number')) {\r\n message += buildLogMessage_.apply(null, arg);\r\n }\r\n else if (typeof arg === 'object') {\r\n message += stringify(arg);\r\n }\r\n else {\r\n message += arg;\r\n }\r\n message += ' ';\r\n }\r\n return message;\r\n};\r\n/**\r\n * Use this for all debug messages in Firebase.\r\n */\r\nvar logger = null;\r\n/**\r\n * Flag to check for log availability on first log message\r\n */\r\nvar firstLog_ = true;\r\n/**\r\n * The implementation of Firebase.enableLogging (defined here to break dependencies)\r\n * @param logger_ - A flag to turn on logging, or a custom logger\r\n * @param persistent - Whether or not to persist logging settings across refreshes\r\n */\r\nvar enableLogging = function (logger_, persistent) {\r\n assert(!persistent || logger_ === true || logger_ === false, \"Can't turn on custom loggers persistently.\");\r\n if (logger_ === true) {\r\n logClient.logLevel = LogLevel.VERBOSE;\r\n logger = logClient.log.bind(logClient);\r\n if (persistent) {\r\n SessionStorage.set('logging_enabled', true);\r\n }\r\n }\r\n else if (typeof logger_ === 'function') {\r\n logger = logger_;\r\n }\r\n else {\r\n logger = null;\r\n SessionStorage.remove('logging_enabled');\r\n }\r\n};\r\nvar log = function () {\r\n var varArgs = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n varArgs[_i] = arguments[_i];\r\n }\r\n if (firstLog_ === true) {\r\n firstLog_ = false;\r\n if (logger === null && SessionStorage.get('logging_enabled') === true) {\r\n enableLogging(true);\r\n }\r\n }\r\n if (logger) {\r\n var message = buildLogMessage_.apply(null, varArgs);\r\n logger(message);\r\n }\r\n};\r\nvar logWrapper = function (prefix) {\r\n return function () {\r\n var varArgs = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n varArgs[_i] = arguments[_i];\r\n }\r\n log.apply(void 0, __spreadArray([prefix], __read(varArgs)));\r\n };\r\n};\r\nvar error = function () {\r\n var varArgs = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n varArgs[_i] = arguments[_i];\r\n }\r\n var message = 'FIREBASE INTERNAL ERROR: ' + buildLogMessage_.apply(void 0, __spreadArray([], __read(varArgs)));\r\n logClient.error(message);\r\n};\r\nvar fatal = function () {\r\n var varArgs = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n varArgs[_i] = arguments[_i];\r\n }\r\n var message = \"FIREBASE FATAL ERROR: \" + buildLogMessage_.apply(void 0, __spreadArray([], __read(varArgs)));\r\n logClient.error(message);\r\n throw new Error(message);\r\n};\r\nvar warn = function () {\r\n var varArgs = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n varArgs[_i] = arguments[_i];\r\n }\r\n var message = 'FIREBASE WARNING: ' + buildLogMessage_.apply(void 0, __spreadArray([], __read(varArgs)));\r\n logClient.warn(message);\r\n};\r\n/**\r\n * Logs a warning if the containing page uses https. Called when a call to new Firebase\r\n * does not use https.\r\n */\r\nvar warnIfPageIsSecure = function () {\r\n // Be very careful accessing browser globals. Who knows what may or may not exist.\r\n if (typeof window !== 'undefined' &&\r\n window.location &&\r\n window.location.protocol &&\r\n window.location.protocol.indexOf('https:') !== -1) {\r\n warn('Insecure Firebase access from a secure page. ' +\r\n 'Please use https in calls to new Firebase().');\r\n }\r\n};\r\n/**\r\n * Returns true if data is NaN, or +/- Infinity.\r\n */\r\nvar isInvalidJSONNumber = function (data) {\r\n return (typeof data === 'number' &&\r\n (data !== data || // NaN\r\n data === Number.POSITIVE_INFINITY ||\r\n data === Number.NEGATIVE_INFINITY));\r\n};\r\nvar executeWhenDOMReady = function (fn) {\r\n if (isNodeSdk() || document.readyState === 'complete') {\r\n fn();\r\n }\r\n else {\r\n // Modeled after jQuery. Try DOMContentLoaded and onreadystatechange (which\r\n // fire before onload), but fall back to onload.\r\n var called_1 = false;\r\n var wrappedFn_1 = function () {\r\n if (!document.body) {\r\n setTimeout(wrappedFn_1, Math.floor(10));\r\n return;\r\n }\r\n if (!called_1) {\r\n called_1 = true;\r\n fn();\r\n }\r\n };\r\n if (document.addEventListener) {\r\n document.addEventListener('DOMContentLoaded', wrappedFn_1, false);\r\n // fallback to onload.\r\n window.addEventListener('load', wrappedFn_1, false);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n }\r\n else if (document.attachEvent) {\r\n // IE.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n document.attachEvent('onreadystatechange', function () {\r\n if (document.readyState === 'complete') {\r\n wrappedFn_1();\r\n }\r\n });\r\n // fallback to onload.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n window.attachEvent('onload', wrappedFn_1);\r\n // jQuery has an extra hack for IE that we could employ (based on\r\n // http://javascript.nwbox.com/IEContentLoaded/) But it looks really old.\r\n // I'm hoping we don't need it.\r\n }\r\n }\r\n};\r\n/**\r\n * Minimum key name. Invalid for actual data, used as a marker to sort before any valid names\r\n */\r\nvar MIN_NAME = '[MIN_NAME]';\r\n/**\r\n * Maximum key name. Invalid for actual data, used as a marker to sort above any valid names\r\n */\r\nvar MAX_NAME = '[MAX_NAME]';\r\n/**\r\n * Compares valid Firebase key names, plus min and max name\r\n */\r\nvar nameCompare = function (a, b) {\r\n if (a === b) {\r\n return 0;\r\n }\r\n else if (a === MIN_NAME || b === MAX_NAME) {\r\n return -1;\r\n }\r\n else if (b === MIN_NAME || a === MAX_NAME) {\r\n return 1;\r\n }\r\n else {\r\n var aAsInt = tryParseInt(a), bAsInt = tryParseInt(b);\r\n if (aAsInt !== null) {\r\n if (bAsInt !== null) {\r\n return aAsInt - bAsInt === 0 ? a.length - b.length : aAsInt - bAsInt;\r\n }\r\n else {\r\n return -1;\r\n }\r\n }\r\n else if (bAsInt !== null) {\r\n return 1;\r\n }\r\n else {\r\n return a < b ? -1 : 1;\r\n }\r\n }\r\n};\r\n/**\r\n * @returns {!number} comparison result.\r\n */\r\nvar stringCompare = function (a, b) {\r\n if (a === b) {\r\n return 0;\r\n }\r\n else if (a < b) {\r\n return -1;\r\n }\r\n else {\r\n return 1;\r\n }\r\n};\r\nvar requireKey = function (key, obj) {\r\n if (obj && key in obj) {\r\n return obj[key];\r\n }\r\n else {\r\n throw new Error('Missing required key (' + key + ') in object: ' + stringify(obj));\r\n }\r\n};\r\nvar ObjectToUniqueKey = function (obj) {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return stringify(obj);\r\n }\r\n var keys = [];\r\n // eslint-disable-next-line guard-for-in\r\n for (var k in obj) {\r\n keys.push(k);\r\n }\r\n // Export as json, but with the keys sorted.\r\n keys.sort();\r\n var key = '{';\r\n for (var i = 0; i < keys.length; i++) {\r\n if (i !== 0) {\r\n key += ',';\r\n }\r\n key += stringify(keys[i]);\r\n key += ':';\r\n key += ObjectToUniqueKey(obj[keys[i]]);\r\n }\r\n key += '}';\r\n return key;\r\n};\r\n/**\r\n * Splits a string into a number of smaller segments of maximum size\r\n * @param str - The string\r\n * @param segsize - The maximum number of chars in the string.\r\n * @returns The string, split into appropriately-sized chunks\r\n */\r\nvar splitStringBySize = function (str, segsize) {\r\n var len = str.length;\r\n if (len <= segsize) {\r\n return [str];\r\n }\r\n var dataSegs = [];\r\n for (var c = 0; c < len; c += segsize) {\r\n if (c + segsize > len) {\r\n dataSegs.push(str.substring(c, len));\r\n }\r\n else {\r\n dataSegs.push(str.substring(c, c + segsize));\r\n }\r\n }\r\n return dataSegs;\r\n};\r\n/**\r\n * Apply a function to each (key, value) pair in an object or\r\n * apply a function to each (index, value) pair in an array\r\n * @param obj - The object or array to iterate over\r\n * @param fn - The function to apply\r\n */\r\nfunction each(obj, fn) {\r\n for (var key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n fn(key, obj[key]);\r\n }\r\n }\r\n}\r\n/**\r\n * Borrowed from http://hg.secondlife.com/llsd/src/tip/js/typedarray.js (MIT License)\r\n * I made one modification at the end and removed the NaN / Infinity\r\n * handling (since it seemed broken [caused an overflow] and we don't need it). See MJL comments.\r\n * @param v - A double\r\n *\r\n */\r\nvar doubleToIEEE754String = function (v) {\r\n assert(!isInvalidJSONNumber(v), 'Invalid JSON number'); // MJL\r\n var ebits = 11, fbits = 52;\r\n var bias = (1 << (ebits - 1)) - 1;\r\n var s, e, f, ln, i;\r\n // Compute sign, exponent, fraction\r\n // Skip NaN / Infinity handling --MJL.\r\n if (v === 0) {\r\n e = 0;\r\n f = 0;\r\n s = 1 / v === -Infinity ? 1 : 0;\r\n }\r\n else {\r\n s = v < 0;\r\n v = Math.abs(v);\r\n if (v >= Math.pow(2, 1 - bias)) {\r\n // Normalized\r\n ln = Math.min(Math.floor(Math.log(v) / Math.LN2), bias);\r\n e = ln + bias;\r\n f = Math.round(v * Math.pow(2, fbits - ln) - Math.pow(2, fbits));\r\n }\r\n else {\r\n // Denormalized\r\n e = 0;\r\n f = Math.round(v / Math.pow(2, 1 - bias - fbits));\r\n }\r\n }\r\n // Pack sign, exponent, fraction\r\n var bits = [];\r\n for (i = fbits; i; i -= 1) {\r\n bits.push(f % 2 ? 1 : 0);\r\n f = Math.floor(f / 2);\r\n }\r\n for (i = ebits; i; i -= 1) {\r\n bits.push(e % 2 ? 1 : 0);\r\n e = Math.floor(e / 2);\r\n }\r\n bits.push(s ? 1 : 0);\r\n bits.reverse();\r\n var str = bits.join('');\r\n // Return the data as a hex string. --MJL\r\n var hexByteString = '';\r\n for (i = 0; i < 64; i += 8) {\r\n var hexByte = parseInt(str.substr(i, 8), 2).toString(16);\r\n if (hexByte.length === 1) {\r\n hexByte = '0' + hexByte;\r\n }\r\n hexByteString = hexByteString + hexByte;\r\n }\r\n return hexByteString.toLowerCase();\r\n};\r\n/**\r\n * Used to detect if we're in a Chrome content script (which executes in an\r\n * isolated environment where long-polling doesn't work).\r\n */\r\nvar isChromeExtensionContentScript = function () {\r\n return !!(typeof window === 'object' &&\r\n window['chrome'] &&\r\n window['chrome']['extension'] &&\r\n !/^chrome/.test(window.location.href));\r\n};\r\n/**\r\n * Used to detect if we're in a Windows 8 Store app.\r\n */\r\nvar isWindowsStoreApp = function () {\r\n // Check for the presence of a couple WinRT globals\r\n return typeof Windows === 'object' && typeof Windows.UI === 'object';\r\n};\r\n/**\r\n * Converts a server error code to a Javascript Error\r\n */\r\nfunction errorForServerCode(code, query) {\r\n var reason = 'Unknown Error';\r\n if (code === 'too_big') {\r\n reason =\r\n 'The data requested exceeds the maximum size ' +\r\n 'that can be accessed with a single request.';\r\n }\r\n else if (code === 'permission_denied') {\r\n reason = \"Client doesn't have permission to access the desired data.\";\r\n }\r\n else if (code === 'unavailable') {\r\n reason = 'The service is unavailable';\r\n }\r\n var error = new Error(code + ' at ' + query._path.toString() + ': ' + reason);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error.code = code.toUpperCase();\r\n return error;\r\n}\r\n/**\r\n * Used to test for integer-looking strings\r\n */\r\nvar INTEGER_REGEXP_ = new RegExp('^-?(0*)\\\\d{1,10}$');\r\n/**\r\n * For use in keys, the minimum possible 32-bit integer.\r\n */\r\nvar INTEGER_32_MIN = -2147483648;\r\n/**\r\n * For use in kyes, the maximum possible 32-bit integer.\r\n */\r\nvar INTEGER_32_MAX = 2147483647;\r\n/**\r\n * If the string contains a 32-bit integer, return it. Else return null.\r\n */\r\nvar tryParseInt = function (str) {\r\n if (INTEGER_REGEXP_.test(str)) {\r\n var intVal = Number(str);\r\n if (intVal >= INTEGER_32_MIN && intVal <= INTEGER_32_MAX) {\r\n return intVal;\r\n }\r\n }\r\n return null;\r\n};\r\n/**\r\n * Helper to run some code but catch any exceptions and re-throw them later.\r\n * Useful for preventing user callbacks from breaking internal code.\r\n *\r\n * Re-throwing the exception from a setTimeout is a little evil, but it's very\r\n * convenient (we don't have to try to figure out when is a safe point to\r\n * re-throw it), and the behavior seems reasonable:\r\n *\r\n * * If you aren't pausing on exceptions, you get an error in the console with\r\n * the correct stack trace.\r\n * * If you're pausing on all exceptions, the debugger will pause on your\r\n * exception and then again when we rethrow it.\r\n * * If you're only pausing on uncaught exceptions, the debugger will only pause\r\n * on us re-throwing it.\r\n *\r\n * @param fn - The code to guard.\r\n */\r\nvar exceptionGuard = function (fn) {\r\n try {\r\n fn();\r\n }\r\n catch (e) {\r\n // Re-throw exception when it's safe.\r\n setTimeout(function () {\r\n // It used to be that \"throw e\" would result in a good console error with\r\n // relevant context, but as of Chrome 39, you just get the firebase.js\r\n // file/line number where we re-throw it, which is useless. So we log\r\n // e.stack explicitly.\r\n var stack = e.stack || '';\r\n warn('Exception was thrown by user callback.', stack);\r\n throw e;\r\n }, Math.floor(0));\r\n }\r\n};\r\n/**\r\n * @returns {boolean} true if we think we're currently being crawled.\r\n */\r\nvar beingCrawled = function () {\r\n var userAgent = (typeof window === 'object' &&\r\n window['navigator'] &&\r\n window['navigator']['userAgent']) ||\r\n '';\r\n // For now we whitelist the most popular crawlers. We should refine this to be the set of crawlers we\r\n // believe to support JavaScript/AJAX rendering.\r\n // NOTE: Google Webmaster Tools doesn't really belong, but their \"This is how a visitor to your website\r\n // would have seen the page\" is flaky if we don't treat it as a crawler.\r\n return (userAgent.search(/googlebot|google webmaster tools|bingbot|yahoo! slurp|baiduspider|yandexbot|duckduckbot/i) >= 0);\r\n};\r\n/**\r\n * Same as setTimeout() except on Node.JS it will /not/ prevent the process from exiting.\r\n *\r\n * It is removed with clearTimeout() as normal.\r\n *\r\n * @param fn - Function to run.\r\n * @param time - Milliseconds to wait before running.\r\n * @returns The setTimeout() return value.\r\n */\r\nvar setTimeoutNonBlocking = function (fn, time) {\r\n var timeout = setTimeout(fn, time);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n if (typeof timeout === 'object' && timeout['unref']) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n timeout['unref']();\r\n }\r\n return timeout;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Abstraction around AppCheck's token fetching capabilities.\r\n */\r\nvar AppCheckTokenProvider = /** @class */ (function () {\r\n function AppCheckTokenProvider(appName_, appCheckProvider) {\r\n var _this = this;\r\n this.appName_ = appName_;\r\n this.appCheckProvider = appCheckProvider;\r\n this.appCheck = appCheckProvider === null || appCheckProvider === void 0 ? void 0 : appCheckProvider.getImmediate({ optional: true });\r\n if (!this.appCheck) {\r\n appCheckProvider === null || appCheckProvider === void 0 ? void 0 : appCheckProvider.get().then(function (appCheck) { return (_this.appCheck = appCheck); });\r\n }\r\n }\r\n AppCheckTokenProvider.prototype.getToken = function (forceRefresh) {\r\n var _this = this;\r\n if (!this.appCheck) {\r\n return new Promise(function (resolve, reject) {\r\n // Support delayed initialization of FirebaseAppCheck. This allows our\r\n // customers to initialize the RTDB SDK before initializing Firebase\r\n // AppCheck and ensures that all requests are authenticated if a token\r\n // becomes available before the timoeout below expires.\r\n setTimeout(function () {\r\n if (_this.appCheck) {\r\n _this.getToken(forceRefresh).then(resolve, reject);\r\n }\r\n else {\r\n resolve(null);\r\n }\r\n }, 0);\r\n });\r\n }\r\n return this.appCheck.getToken(forceRefresh);\r\n };\r\n AppCheckTokenProvider.prototype.addTokenChangeListener = function (listener) {\r\n var _a;\r\n (_a = this.appCheckProvider) === null || _a === void 0 ? void 0 : _a.get().then(function (appCheck) { return appCheck.addTokenListener(listener); });\r\n };\r\n AppCheckTokenProvider.prototype.notifyForInvalidToken = function () {\r\n warn(\"Provided AppCheck credentials for the app named \\\"\" + this.appName_ + \"\\\" \" +\r\n 'are invalid. This usually indicates your app was not initialized correctly.');\r\n };\r\n return AppCheckTokenProvider;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Abstraction around FirebaseApp's token fetching capabilities.\r\n */\r\nvar FirebaseAuthTokenProvider = /** @class */ (function () {\r\n function FirebaseAuthTokenProvider(appName_, firebaseOptions_, authProvider_) {\r\n var _this = this;\r\n this.appName_ = appName_;\r\n this.firebaseOptions_ = firebaseOptions_;\r\n this.authProvider_ = authProvider_;\r\n this.auth_ = null;\r\n this.auth_ = authProvider_.getImmediate({ optional: true });\r\n if (!this.auth_) {\r\n authProvider_.onInit(function (auth) { return (_this.auth_ = auth); });\r\n }\r\n }\r\n FirebaseAuthTokenProvider.prototype.getToken = function (forceRefresh) {\r\n var _this = this;\r\n if (!this.auth_) {\r\n return new Promise(function (resolve, reject) {\r\n // Support delayed initialization of FirebaseAuth. This allows our\r\n // customers to initialize the RTDB SDK before initializing Firebase\r\n // Auth and ensures that all requests are authenticated if a token\r\n // becomes available before the timoeout below expires.\r\n setTimeout(function () {\r\n if (_this.auth_) {\r\n _this.getToken(forceRefresh).then(resolve, reject);\r\n }\r\n else {\r\n resolve(null);\r\n }\r\n }, 0);\r\n });\r\n }\r\n return this.auth_.getToken(forceRefresh).catch(function (error) {\r\n // TODO: Need to figure out all the cases this is raised and whether\r\n // this makes sense.\r\n if (error && error.code === 'auth/token-not-initialized') {\r\n log('Got auth/token-not-initialized error. Treating as null token.');\r\n return null;\r\n }\r\n else {\r\n return Promise.reject(error);\r\n }\r\n });\r\n };\r\n FirebaseAuthTokenProvider.prototype.addTokenChangeListener = function (listener) {\r\n // TODO: We might want to wrap the listener and call it with no args to\r\n // avoid a leaky abstraction, but that makes removing the listener harder.\r\n if (this.auth_) {\r\n this.auth_.addAuthTokenListener(listener);\r\n }\r\n else {\r\n this.authProvider_\r\n .get()\r\n .then(function (auth) { return auth.addAuthTokenListener(listener); });\r\n }\r\n };\r\n FirebaseAuthTokenProvider.prototype.removeTokenChangeListener = function (listener) {\r\n this.authProvider_\r\n .get()\r\n .then(function (auth) { return auth.removeAuthTokenListener(listener); });\r\n };\r\n FirebaseAuthTokenProvider.prototype.notifyForInvalidToken = function () {\r\n var errorMessage = 'Provided authentication credentials for the app named \"' +\r\n this.appName_ +\r\n '\" are invalid. This usually indicates your app was not ' +\r\n 'initialized correctly. ';\r\n if ('credential' in this.firebaseOptions_) {\r\n errorMessage +=\r\n 'Make sure the \"credential\" property provided to initializeApp() ' +\r\n 'is authorized to access the specified \"databaseURL\" and is from the correct ' +\r\n 'project.';\r\n }\r\n else if ('serviceAccount' in this.firebaseOptions_) {\r\n errorMessage +=\r\n 'Make sure the \"serviceAccount\" property provided to initializeApp() ' +\r\n 'is authorized to access the specified \"databaseURL\" and is from the correct ' +\r\n 'project.';\r\n }\r\n else {\r\n errorMessage +=\r\n 'Make sure the \"apiKey\" and \"databaseURL\" properties provided to ' +\r\n 'initializeApp() match the values provided for your app at ' +\r\n 'https://console.firebase.google.com/.';\r\n }\r\n warn(errorMessage);\r\n };\r\n return FirebaseAuthTokenProvider;\r\n}());\r\n/* AuthTokenProvider that supplies a constant token. Used by Admin SDK or mockUserToken with emulators. */\r\nvar EmulatorTokenProvider = /** @class */ (function () {\r\n function EmulatorTokenProvider(accessToken) {\r\n this.accessToken = accessToken;\r\n }\r\n EmulatorTokenProvider.prototype.getToken = function (forceRefresh) {\r\n return Promise.resolve({\r\n accessToken: this.accessToken\r\n });\r\n };\r\n EmulatorTokenProvider.prototype.addTokenChangeListener = function (listener) {\r\n // Invoke the listener immediately to match the behavior in Firebase Auth\r\n // (see packages/auth/src/auth.js#L1807)\r\n listener(this.accessToken);\r\n };\r\n EmulatorTokenProvider.prototype.removeTokenChangeListener = function (listener) { };\r\n EmulatorTokenProvider.prototype.notifyForInvalidToken = function () { };\r\n /** A string that is treated as an admin access token by the RTDB emulator. Used by Admin SDK. */\r\n EmulatorTokenProvider.OWNER = 'owner';\r\n return EmulatorTokenProvider;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar PROTOCOL_VERSION = '5';\r\nvar VERSION_PARAM = 'v';\r\nvar TRANSPORT_SESSION_PARAM = 's';\r\nvar REFERER_PARAM = 'r';\r\nvar FORGE_REF = 'f';\r\n// Matches console.firebase.google.com, firebase-console-*.corp.google.com and\r\n// firebase.corp.google.com\r\nvar FORGE_DOMAIN_RE = /(console\\.firebase|firebase-console-\\w+\\.corp|firebase\\.corp)\\.google\\.com/;\r\nvar LAST_SESSION_PARAM = 'ls';\r\nvar APPLICATION_ID_PARAM = 'p';\r\nvar APP_CHECK_TOKEN_PARAM = 'ac';\r\nvar WEBSOCKET = 'websocket';\r\nvar LONG_POLLING = 'long_polling';\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A class that holds metadata about a Repo object\r\n */\r\nvar RepoInfo = /** @class */ (function () {\r\n /**\r\n * @param host - Hostname portion of the url for the repo\r\n * @param secure - Whether or not this repo is accessed over ssl\r\n * @param namespace - The namespace represented by the repo\r\n * @param webSocketOnly - Whether to prefer websockets over all other transports (used by Nest).\r\n * @param nodeAdmin - Whether this instance uses Admin SDK credentials\r\n * @param persistenceKey - Override the default session persistence storage key\r\n */\r\n function RepoInfo(host, secure, namespace, webSocketOnly, nodeAdmin, persistenceKey, includeNamespaceInQueryParams) {\r\n if (nodeAdmin === void 0) { nodeAdmin = false; }\r\n if (persistenceKey === void 0) { persistenceKey = ''; }\r\n if (includeNamespaceInQueryParams === void 0) { includeNamespaceInQueryParams = false; }\r\n this.secure = secure;\r\n this.namespace = namespace;\r\n this.webSocketOnly = webSocketOnly;\r\n this.nodeAdmin = nodeAdmin;\r\n this.persistenceKey = persistenceKey;\r\n this.includeNamespaceInQueryParams = includeNamespaceInQueryParams;\r\n this._host = host.toLowerCase();\r\n this._domain = this._host.substr(this._host.indexOf('.') + 1);\r\n this.internalHost =\r\n PersistentStorage.get('host:' + host) || this._host;\r\n }\r\n RepoInfo.prototype.isCacheableHost = function () {\r\n return this.internalHost.substr(0, 2) === 's-';\r\n };\r\n RepoInfo.prototype.isCustomHost = function () {\r\n return (this._domain !== 'firebaseio.com' &&\r\n this._domain !== 'firebaseio-demo.com');\r\n };\r\n Object.defineProperty(RepoInfo.prototype, \"host\", {\r\n get: function () {\r\n return this._host;\r\n },\r\n set: function (newHost) {\r\n if (newHost !== this.internalHost) {\r\n this.internalHost = newHost;\r\n if (this.isCacheableHost()) {\r\n PersistentStorage.set('host:' + this._host, this.internalHost);\r\n }\r\n }\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n RepoInfo.prototype.toString = function () {\r\n var str = this.toURLString();\r\n if (this.persistenceKey) {\r\n str += '<' + this.persistenceKey + '>';\r\n }\r\n return str;\r\n };\r\n RepoInfo.prototype.toURLString = function () {\r\n var protocol = this.secure ? 'https://' : 'http://';\r\n var query = this.includeNamespaceInQueryParams\r\n ? \"?ns=\" + this.namespace\r\n : '';\r\n return \"\" + protocol + this.host + \"/\" + query;\r\n };\r\n return RepoInfo;\r\n}());\r\nfunction repoInfoNeedsQueryParam(repoInfo) {\r\n return (repoInfo.host !== repoInfo.internalHost ||\r\n repoInfo.isCustomHost() ||\r\n repoInfo.includeNamespaceInQueryParams);\r\n}\r\n/**\r\n * Returns the websocket URL for this repo\r\n * @param repoInfo - RepoInfo object\r\n * @param type - of connection\r\n * @param params - list\r\n * @returns The URL for this repo\r\n */\r\nfunction repoInfoConnectionURL(repoInfo, type, params) {\r\n assert(typeof type === 'string', 'typeof type must == string');\r\n assert(typeof params === 'object', 'typeof params must == object');\r\n var connURL;\r\n if (type === WEBSOCKET) {\r\n connURL =\r\n (repoInfo.secure ? 'wss://' : 'ws://') + repoInfo.internalHost + '/.ws?';\r\n }\r\n else if (type === LONG_POLLING) {\r\n connURL =\r\n (repoInfo.secure ? 'https://' : 'http://') +\r\n repoInfo.internalHost +\r\n '/.lp?';\r\n }\r\n else {\r\n throw new Error('Unknown connection type: ' + type);\r\n }\r\n if (repoInfoNeedsQueryParam(repoInfo)) {\r\n params['ns'] = repoInfo.namespace;\r\n }\r\n var pairs = [];\r\n each(params, function (key, value) {\r\n pairs.push(key + '=' + value);\r\n });\r\n return connURL + pairs.join('&');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Tracks a collection of stats.\r\n */\r\nvar StatsCollection = /** @class */ (function () {\r\n function StatsCollection() {\r\n this.counters_ = {};\r\n }\r\n StatsCollection.prototype.incrementCounter = function (name, amount) {\r\n if (amount === void 0) { amount = 1; }\r\n if (!contains(this.counters_, name)) {\r\n this.counters_[name] = 0;\r\n }\r\n this.counters_[name] += amount;\r\n };\r\n StatsCollection.prototype.get = function () {\r\n return deepCopy(this.counters_);\r\n };\r\n return StatsCollection;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar collections = {};\r\nvar reporters = {};\r\nfunction statsManagerGetCollection(repoInfo) {\r\n var hashString = repoInfo.toString();\r\n if (!collections[hashString]) {\r\n collections[hashString] = new StatsCollection();\r\n }\r\n return collections[hashString];\r\n}\r\nfunction statsManagerGetOrCreateReporter(repoInfo, creatorFunction) {\r\n var hashString = repoInfo.toString();\r\n if (!reporters[hashString]) {\r\n reporters[hashString] = creatorFunction();\r\n }\r\n return reporters[hashString];\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * This class ensures the packets from the server arrive in order\r\n * This class takes data from the server and ensures it gets passed into the callbacks in order.\r\n */\r\nvar PacketReceiver = /** @class */ (function () {\r\n /**\r\n * @param onMessage_\r\n */\r\n function PacketReceiver(onMessage_) {\r\n this.onMessage_ = onMessage_;\r\n this.pendingResponses = [];\r\n this.currentResponseNum = 0;\r\n this.closeAfterResponse = -1;\r\n this.onClose = null;\r\n }\r\n PacketReceiver.prototype.closeAfter = function (responseNum, callback) {\r\n this.closeAfterResponse = responseNum;\r\n this.onClose = callback;\r\n if (this.closeAfterResponse < this.currentResponseNum) {\r\n this.onClose();\r\n this.onClose = null;\r\n }\r\n };\r\n /**\r\n * Each message from the server comes with a response number, and an array of data. The responseNumber\r\n * allows us to ensure that we process them in the right order, since we can't be guaranteed that all\r\n * browsers will respond in the same order as the requests we sent\r\n */\r\n PacketReceiver.prototype.handleResponse = function (requestNum, data) {\r\n var _this = this;\r\n this.pendingResponses[requestNum] = data;\r\n var _loop_1 = function () {\r\n var toProcess = this_1.pendingResponses[this_1.currentResponseNum];\r\n delete this_1.pendingResponses[this_1.currentResponseNum];\r\n var _loop_2 = function (i) {\r\n if (toProcess[i]) {\r\n exceptionGuard(function () {\r\n _this.onMessage_(toProcess[i]);\r\n });\r\n }\r\n };\r\n for (var i = 0; i < toProcess.length; ++i) {\r\n _loop_2(i);\r\n }\r\n if (this_1.currentResponseNum === this_1.closeAfterResponse) {\r\n if (this_1.onClose) {\r\n this_1.onClose();\r\n this_1.onClose = null;\r\n }\r\n return \"break\";\r\n }\r\n this_1.currentResponseNum++;\r\n };\r\n var this_1 = this;\r\n while (this.pendingResponses[this.currentResponseNum]) {\r\n var state_1 = _loop_1();\r\n if (state_1 === \"break\")\r\n break;\r\n }\r\n };\r\n return PacketReceiver;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// URL query parameters associated with longpolling\r\nvar FIREBASE_LONGPOLL_START_PARAM = 'start';\r\nvar FIREBASE_LONGPOLL_CLOSE_COMMAND = 'close';\r\nvar FIREBASE_LONGPOLL_COMMAND_CB_NAME = 'pLPCommand';\r\nvar FIREBASE_LONGPOLL_DATA_CB_NAME = 'pRTLPCB';\r\nvar FIREBASE_LONGPOLL_ID_PARAM = 'id';\r\nvar FIREBASE_LONGPOLL_PW_PARAM = 'pw';\r\nvar FIREBASE_LONGPOLL_SERIAL_PARAM = 'ser';\r\nvar FIREBASE_LONGPOLL_CALLBACK_ID_PARAM = 'cb';\r\nvar FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM = 'seg';\r\nvar FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET = 'ts';\r\nvar FIREBASE_LONGPOLL_DATA_PARAM = 'd';\r\nvar FIREBASE_LONGPOLL_DISCONN_FRAME_REQUEST_PARAM = 'dframe';\r\n//Data size constants.\r\n//TODO: Perf: the maximum length actually differs from browser to browser.\r\n// We should check what browser we're on and set accordingly.\r\nvar MAX_URL_DATA_SIZE = 1870;\r\nvar SEG_HEADER_SIZE = 30; //ie: &seg=8299234&ts=982389123&d=\r\nvar MAX_PAYLOAD_SIZE = MAX_URL_DATA_SIZE - SEG_HEADER_SIZE;\r\n/**\r\n * Keepalive period\r\n * send a fresh request at minimum every 25 seconds. Opera has a maximum request\r\n * length of 30 seconds that we can't exceed.\r\n */\r\nvar KEEPALIVE_REQUEST_INTERVAL = 25000;\r\n/**\r\n * How long to wait before aborting a long-polling connection attempt.\r\n */\r\nvar LP_CONNECT_TIMEOUT = 30000;\r\n/**\r\n * This class manages a single long-polling connection.\r\n */\r\nvar BrowserPollConnection = /** @class */ (function () {\r\n /**\r\n * @param connId An identifier for this connection, used for logging\r\n * @param repoInfo The info for the endpoint to send data to.\r\n * @param applicationId The Firebase App ID for this project.\r\n * @param appCheckToken The AppCheck token for this client.\r\n * @param authToken The AuthToken to use for this connection.\r\n * @param transportSessionId Optional transportSessionid if we are\r\n * reconnecting for an existing transport session\r\n * @param lastSessionId Optional lastSessionId if the PersistentConnection has\r\n * already created a connection previously\r\n */\r\n function BrowserPollConnection(connId, repoInfo, applicationId, appCheckToken, authToken, transportSessionId, lastSessionId) {\r\n var _this = this;\r\n this.connId = connId;\r\n this.repoInfo = repoInfo;\r\n this.applicationId = applicationId;\r\n this.appCheckToken = appCheckToken;\r\n this.authToken = authToken;\r\n this.transportSessionId = transportSessionId;\r\n this.lastSessionId = lastSessionId;\r\n this.bytesSent = 0;\r\n this.bytesReceived = 0;\r\n this.everConnected_ = false;\r\n this.log_ = logWrapper(connId);\r\n this.stats_ = statsManagerGetCollection(repoInfo);\r\n this.urlFn = function (params) {\r\n // Always add the token if we have one.\r\n if (_this.appCheckToken) {\r\n params[APP_CHECK_TOKEN_PARAM] = _this.appCheckToken;\r\n }\r\n return repoInfoConnectionURL(repoInfo, LONG_POLLING, params);\r\n };\r\n }\r\n /**\r\n * @param onMessage - Callback when messages arrive\r\n * @param onDisconnect - Callback with connection lost.\r\n */\r\n BrowserPollConnection.prototype.open = function (onMessage, onDisconnect) {\r\n var _this = this;\r\n this.curSegmentNum = 0;\r\n this.onDisconnect_ = onDisconnect;\r\n this.myPacketOrderer = new PacketReceiver(onMessage);\r\n this.isClosed_ = false;\r\n this.connectTimeoutTimer_ = setTimeout(function () {\r\n _this.log_('Timed out trying to connect.');\r\n // Make sure we clear the host cache\r\n _this.onClosed_();\r\n _this.connectTimeoutTimer_ = null;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n }, Math.floor(LP_CONNECT_TIMEOUT));\r\n // Ensure we delay the creation of the iframe until the DOM is loaded.\r\n executeWhenDOMReady(function () {\r\n if (_this.isClosed_) {\r\n return;\r\n }\r\n //Set up a callback that gets triggered once a connection is set up.\r\n _this.scriptTagHolder = new FirebaseIFrameScriptHolder(function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var _a = __read(args, 5), command = _a[0], arg1 = _a[1], arg2 = _a[2]; _a[3]; _a[4];\r\n _this.incrementIncomingBytes_(args);\r\n if (!_this.scriptTagHolder) {\r\n return; // we closed the connection.\r\n }\r\n if (_this.connectTimeoutTimer_) {\r\n clearTimeout(_this.connectTimeoutTimer_);\r\n _this.connectTimeoutTimer_ = null;\r\n }\r\n _this.everConnected_ = true;\r\n if (command === FIREBASE_LONGPOLL_START_PARAM) {\r\n _this.id = arg1;\r\n _this.password = arg2;\r\n }\r\n else if (command === FIREBASE_LONGPOLL_CLOSE_COMMAND) {\r\n // Don't clear the host cache. We got a response from the server, so we know it's reachable\r\n if (arg1) {\r\n // We aren't expecting any more data (other than what the server's already in the process of sending us\r\n // through our already open polls), so don't send any more.\r\n _this.scriptTagHolder.sendNewPolls = false;\r\n // arg1 in this case is the last response number sent by the server. We should try to receive\r\n // all of the responses up to this one before closing\r\n _this.myPacketOrderer.closeAfter(arg1, function () {\r\n _this.onClosed_();\r\n });\r\n }\r\n else {\r\n _this.onClosed_();\r\n }\r\n }\r\n else {\r\n throw new Error('Unrecognized command received: ' + command);\r\n }\r\n }, function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var _a = __read(args, 2), pN = _a[0], data = _a[1];\r\n _this.incrementIncomingBytes_(args);\r\n _this.myPacketOrderer.handleResponse(pN, data);\r\n }, function () {\r\n _this.onClosed_();\r\n }, _this.urlFn);\r\n //Send the initial request to connect. The serial number is simply to keep the browser from pulling previous results\r\n //from cache.\r\n var urlParams = {};\r\n urlParams[FIREBASE_LONGPOLL_START_PARAM] = 't';\r\n urlParams[FIREBASE_LONGPOLL_SERIAL_PARAM] = Math.floor(Math.random() * 100000000);\r\n if (_this.scriptTagHolder.uniqueCallbackIdentifier) {\r\n urlParams[FIREBASE_LONGPOLL_CALLBACK_ID_PARAM] = _this.scriptTagHolder.uniqueCallbackIdentifier;\r\n }\r\n urlParams[VERSION_PARAM] = PROTOCOL_VERSION;\r\n if (_this.transportSessionId) {\r\n urlParams[TRANSPORT_SESSION_PARAM] = _this.transportSessionId;\r\n }\r\n if (_this.lastSessionId) {\r\n urlParams[LAST_SESSION_PARAM] = _this.lastSessionId;\r\n }\r\n if (_this.applicationId) {\r\n urlParams[APPLICATION_ID_PARAM] = _this.applicationId;\r\n }\r\n if (_this.appCheckToken) {\r\n urlParams[APP_CHECK_TOKEN_PARAM] = _this.appCheckToken;\r\n }\r\n if (typeof location !== 'undefined' &&\r\n location.hostname &&\r\n FORGE_DOMAIN_RE.test(location.hostname)) {\r\n urlParams[REFERER_PARAM] = FORGE_REF;\r\n }\r\n var connectURL = _this.urlFn(urlParams);\r\n _this.log_('Connecting via long-poll to ' + connectURL);\r\n _this.scriptTagHolder.addTag(connectURL, function () {\r\n /* do nothing */\r\n });\r\n });\r\n };\r\n /**\r\n * Call this when a handshake has completed successfully and we want to consider the connection established\r\n */\r\n BrowserPollConnection.prototype.start = function () {\r\n this.scriptTagHolder.startLongPoll(this.id, this.password);\r\n this.addDisconnectPingFrame(this.id, this.password);\r\n };\r\n /**\r\n * Forces long polling to be considered as a potential transport\r\n */\r\n BrowserPollConnection.forceAllow = function () {\r\n BrowserPollConnection.forceAllow_ = true;\r\n };\r\n /**\r\n * Forces longpolling to not be considered as a potential transport\r\n */\r\n BrowserPollConnection.forceDisallow = function () {\r\n BrowserPollConnection.forceDisallow_ = true;\r\n };\r\n // Static method, use string literal so it can be accessed in a generic way\r\n BrowserPollConnection.isAvailable = function () {\r\n if (isNodeSdk()) {\r\n return false;\r\n }\r\n else if (BrowserPollConnection.forceAllow_) {\r\n return true;\r\n }\r\n else {\r\n // NOTE: In React-Native there's normally no 'document', but if you debug a React-Native app in\r\n // the Chrome debugger, 'document' is defined, but document.createElement is null (2015/06/08).\r\n return (!BrowserPollConnection.forceDisallow_ &&\r\n typeof document !== 'undefined' &&\r\n document.createElement != null &&\r\n !isChromeExtensionContentScript() &&\r\n !isWindowsStoreApp());\r\n }\r\n };\r\n /**\r\n * No-op for polling\r\n */\r\n BrowserPollConnection.prototype.markConnectionHealthy = function () { };\r\n /**\r\n * Stops polling and cleans up the iframe\r\n */\r\n BrowserPollConnection.prototype.shutdown_ = function () {\r\n this.isClosed_ = true;\r\n if (this.scriptTagHolder) {\r\n this.scriptTagHolder.close();\r\n this.scriptTagHolder = null;\r\n }\r\n //remove the disconnect frame, which will trigger an XHR call to the server to tell it we're leaving.\r\n if (this.myDisconnFrame) {\r\n document.body.removeChild(this.myDisconnFrame);\r\n this.myDisconnFrame = null;\r\n }\r\n if (this.connectTimeoutTimer_) {\r\n clearTimeout(this.connectTimeoutTimer_);\r\n this.connectTimeoutTimer_ = null;\r\n }\r\n };\r\n /**\r\n * Triggered when this transport is closed\r\n */\r\n BrowserPollConnection.prototype.onClosed_ = function () {\r\n if (!this.isClosed_) {\r\n this.log_('Longpoll is closing itself');\r\n this.shutdown_();\r\n if (this.onDisconnect_) {\r\n this.onDisconnect_(this.everConnected_);\r\n this.onDisconnect_ = null;\r\n }\r\n }\r\n };\r\n /**\r\n * External-facing close handler. RealTime has requested we shut down. Kill our connection and tell the server\r\n * that we've left.\r\n */\r\n BrowserPollConnection.prototype.close = function () {\r\n if (!this.isClosed_) {\r\n this.log_('Longpoll is being closed.');\r\n this.shutdown_();\r\n }\r\n };\r\n /**\r\n * Send the JSON object down to the server. It will need to be stringified, base64 encoded, and then\r\n * broken into chunks (since URLs have a small maximum length).\r\n * @param data - The JSON data to transmit.\r\n */\r\n BrowserPollConnection.prototype.send = function (data) {\r\n var dataStr = stringify(data);\r\n this.bytesSent += dataStr.length;\r\n this.stats_.incrementCounter('bytes_sent', dataStr.length);\r\n //first, lets get the base64-encoded data\r\n var base64data = base64Encode(dataStr);\r\n //We can only fit a certain amount in each URL, so we need to split this request\r\n //up into multiple pieces if it doesn't fit in one request.\r\n var dataSegs = splitStringBySize(base64data, MAX_PAYLOAD_SIZE);\r\n //Enqueue each segment for transmission. We assign each chunk a sequential ID and a total number\r\n //of segments so that we can reassemble the packet on the server.\r\n for (var i = 0; i < dataSegs.length; i++) {\r\n this.scriptTagHolder.enqueueSegment(this.curSegmentNum, dataSegs.length, dataSegs[i]);\r\n this.curSegmentNum++;\r\n }\r\n };\r\n /**\r\n * This is how we notify the server that we're leaving.\r\n * We aren't able to send requests with DHTML on a window close event, but we can\r\n * trigger XHR requests in some browsers (everything but Opera basically).\r\n */\r\n BrowserPollConnection.prototype.addDisconnectPingFrame = function (id, pw) {\r\n if (isNodeSdk()) {\r\n return;\r\n }\r\n this.myDisconnFrame = document.createElement('iframe');\r\n var urlParams = {};\r\n urlParams[FIREBASE_LONGPOLL_DISCONN_FRAME_REQUEST_PARAM] = 't';\r\n urlParams[FIREBASE_LONGPOLL_ID_PARAM] = id;\r\n urlParams[FIREBASE_LONGPOLL_PW_PARAM] = pw;\r\n this.myDisconnFrame.src = this.urlFn(urlParams);\r\n this.myDisconnFrame.style.display = 'none';\r\n document.body.appendChild(this.myDisconnFrame);\r\n };\r\n /**\r\n * Used to track the bytes received by this client\r\n */\r\n BrowserPollConnection.prototype.incrementIncomingBytes_ = function (args) {\r\n // TODO: This is an annoying perf hit just to track the number of incoming bytes. Maybe it should be opt-in.\r\n var bytesReceived = stringify(args).length;\r\n this.bytesReceived += bytesReceived;\r\n this.stats_.incrementCounter('bytes_received', bytesReceived);\r\n };\r\n return BrowserPollConnection;\r\n}());\r\n/*********************************************************************************************\r\n * A wrapper around an iframe that is used as a long-polling script holder.\r\n *********************************************************************************************/\r\nvar FirebaseIFrameScriptHolder = /** @class */ (function () {\r\n /**\r\n * @param commandCB - The callback to be called when control commands are recevied from the server.\r\n * @param onMessageCB - The callback to be triggered when responses arrive from the server.\r\n * @param onDisconnect - The callback to be triggered when this tag holder is closed\r\n * @param urlFn - A function that provides the URL of the endpoint to send data to.\r\n */\r\n function FirebaseIFrameScriptHolder(commandCB, onMessageCB, onDisconnect, urlFn) {\r\n this.onDisconnect = onDisconnect;\r\n this.urlFn = urlFn;\r\n //We maintain a count of all of the outstanding requests, because if we have too many active at once it can cause\r\n //problems in some browsers.\r\n this.outstandingRequests = new Set();\r\n //A queue of the pending segments waiting for transmission to the server.\r\n this.pendingSegs = [];\r\n //A serial number. We use this for two things:\r\n // 1) A way to ensure the browser doesn't cache responses to polls\r\n // 2) A way to make the server aware when long-polls arrive in a different order than we started them. The\r\n // server needs to release both polls in this case or it will cause problems in Opera since Opera can only execute\r\n // JSONP code in the order it was added to the iframe.\r\n this.currentSerial = Math.floor(Math.random() * 100000000);\r\n // This gets set to false when we're \"closing down\" the connection (e.g. we're switching transports but there's still\r\n // incoming data from the server that we're waiting for).\r\n this.sendNewPolls = true;\r\n if (!isNodeSdk()) {\r\n //Each script holder registers a couple of uniquely named callbacks with the window. These are called from the\r\n //iframes where we put the long-polling script tags. We have two callbacks:\r\n // 1) Command Callback - Triggered for control issues, like starting a connection.\r\n // 2) Message Callback - Triggered when new data arrives.\r\n this.uniqueCallbackIdentifier = LUIDGenerator();\r\n window[FIREBASE_LONGPOLL_COMMAND_CB_NAME + this.uniqueCallbackIdentifier] = commandCB;\r\n window[FIREBASE_LONGPOLL_DATA_CB_NAME + this.uniqueCallbackIdentifier] = onMessageCB;\r\n //Create an iframe for us to add script tags to.\r\n this.myIFrame = FirebaseIFrameScriptHolder.createIFrame_();\r\n // Set the iframe's contents.\r\n var script = '';\r\n // if we set a javascript url, it's IE and we need to set the document domain. The javascript url is sufficient\r\n // for ie9, but ie8 needs to do it again in the document itself.\r\n if (this.myIFrame.src &&\r\n this.myIFrame.src.substr(0, 'javascript:'.length) === 'javascript:') {\r\n var currentDomain = document.domain;\r\n script = '';\r\n }\r\n var iframeContents = '' + script + '';\r\n try {\r\n this.myIFrame.doc.open();\r\n this.myIFrame.doc.write(iframeContents);\r\n this.myIFrame.doc.close();\r\n }\r\n catch (e) {\r\n log('frame writing exception');\r\n if (e.stack) {\r\n log(e.stack);\r\n }\r\n log(e);\r\n }\r\n }\r\n else {\r\n this.commandCB = commandCB;\r\n this.onMessageCB = onMessageCB;\r\n }\r\n }\r\n /**\r\n * Each browser has its own funny way to handle iframes. Here we mush them all together into one object that I can\r\n * actually use.\r\n */\r\n FirebaseIFrameScriptHolder.createIFrame_ = function () {\r\n var iframe = document.createElement('iframe');\r\n iframe.style.display = 'none';\r\n // This is necessary in order to initialize the document inside the iframe\r\n if (document.body) {\r\n document.body.appendChild(iframe);\r\n try {\r\n // If document.domain has been modified in IE, this will throw an error, and we need to set the\r\n // domain of the iframe's document manually. We can do this via a javascript: url as the src attribute\r\n // Also note that we must do this *after* the iframe has been appended to the page. Otherwise it doesn't work.\r\n var a = iframe.contentWindow.document;\r\n if (!a) {\r\n // Apologies for the log-spam, I need to do something to keep closure from optimizing out the assignment above.\r\n log('No IE domain setting required');\r\n }\r\n }\r\n catch (e) {\r\n var domain = document.domain;\r\n iframe.src =\r\n \"javascript:void((function(){document.open();document.domain='\" +\r\n domain +\r\n \"';document.close();})())\";\r\n }\r\n }\r\n else {\r\n // LongPollConnection attempts to delay initialization until the document is ready, so hopefully this\r\n // never gets hit.\r\n throw 'Document body has not initialized. Wait to initialize Firebase until after the document is ready.';\r\n }\r\n // Get the document of the iframe in a browser-specific way.\r\n if (iframe.contentDocument) {\r\n iframe.doc = iframe.contentDocument; // Firefox, Opera, Safari\r\n }\r\n else if (iframe.contentWindow) {\r\n iframe.doc = iframe.contentWindow.document; // Internet Explorer\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n }\r\n else if (iframe.document) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n iframe.doc = iframe.document; //others?\r\n }\r\n return iframe;\r\n };\r\n /**\r\n * Cancel all outstanding queries and remove the frame.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.close = function () {\r\n var _this = this;\r\n //Mark this iframe as dead, so no new requests are sent.\r\n this.alive = false;\r\n if (this.myIFrame) {\r\n //We have to actually remove all of the html inside this iframe before removing it from the\r\n //window, or IE will continue loading and executing the script tags we've already added, which\r\n //can lead to some errors being thrown. Setting innerHTML seems to be the easiest way to do this.\r\n this.myIFrame.doc.body.innerHTML = '';\r\n setTimeout(function () {\r\n if (_this.myIFrame !== null) {\r\n document.body.removeChild(_this.myIFrame);\r\n _this.myIFrame = null;\r\n }\r\n }, Math.floor(0));\r\n }\r\n // Protect from being called recursively.\r\n var onDisconnect = this.onDisconnect;\r\n if (onDisconnect) {\r\n this.onDisconnect = null;\r\n onDisconnect();\r\n }\r\n };\r\n /**\r\n * Actually start the long-polling session by adding the first script tag(s) to the iframe.\r\n * @param id - The ID of this connection\r\n * @param pw - The password for this connection\r\n */\r\n FirebaseIFrameScriptHolder.prototype.startLongPoll = function (id, pw) {\r\n this.myID = id;\r\n this.myPW = pw;\r\n this.alive = true;\r\n //send the initial request. If there are requests queued, make sure that we transmit as many as we are currently able to.\r\n while (this.newRequest_()) { }\r\n };\r\n /**\r\n * This is called any time someone might want a script tag to be added. It adds a script tag when there aren't\r\n * too many outstanding requests and we are still alive.\r\n *\r\n * If there are outstanding packet segments to send, it sends one. If there aren't, it sends a long-poll anyways if\r\n * needed.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.newRequest_ = function () {\r\n // We keep one outstanding request open all the time to receive data, but if we need to send data\r\n // (pendingSegs.length > 0) then we create a new request to send the data. The server will automatically\r\n // close the old request.\r\n if (this.alive &&\r\n this.sendNewPolls &&\r\n this.outstandingRequests.size < (this.pendingSegs.length > 0 ? 2 : 1)) {\r\n //construct our url\r\n this.currentSerial++;\r\n var urlParams = {};\r\n urlParams[FIREBASE_LONGPOLL_ID_PARAM] = this.myID;\r\n urlParams[FIREBASE_LONGPOLL_PW_PARAM] = this.myPW;\r\n urlParams[FIREBASE_LONGPOLL_SERIAL_PARAM] = this.currentSerial;\r\n var theURL = this.urlFn(urlParams);\r\n //Now add as much data as we can.\r\n var curDataString = '';\r\n var i = 0;\r\n while (this.pendingSegs.length > 0) {\r\n //first, lets see if the next segment will fit.\r\n var nextSeg = this.pendingSegs[0];\r\n if (nextSeg.d.length +\r\n SEG_HEADER_SIZE +\r\n curDataString.length <=\r\n MAX_URL_DATA_SIZE) {\r\n //great, the segment will fit. Lets append it.\r\n var theSeg = this.pendingSegs.shift();\r\n curDataString =\r\n curDataString +\r\n '&' +\r\n FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM +\r\n i +\r\n '=' +\r\n theSeg.seg +\r\n '&' +\r\n FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET +\r\n i +\r\n '=' +\r\n theSeg.ts +\r\n '&' +\r\n FIREBASE_LONGPOLL_DATA_PARAM +\r\n i +\r\n '=' +\r\n theSeg.d;\r\n i++;\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n theURL = theURL + curDataString;\r\n this.addLongPollTag_(theURL, this.currentSerial);\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n /**\r\n * Queue a packet for transmission to the server.\r\n * @param segnum - A sequential id for this packet segment used for reassembly\r\n * @param totalsegs - The total number of segments in this packet\r\n * @param data - The data for this segment.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.enqueueSegment = function (segnum, totalsegs, data) {\r\n //add this to the queue of segments to send.\r\n this.pendingSegs.push({ seg: segnum, ts: totalsegs, d: data });\r\n //send the data immediately if there isn't already data being transmitted, unless\r\n //startLongPoll hasn't been called yet.\r\n if (this.alive) {\r\n this.newRequest_();\r\n }\r\n };\r\n /**\r\n * Add a script tag for a regular long-poll request.\r\n * @param url - The URL of the script tag.\r\n * @param serial - The serial number of the request.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.addLongPollTag_ = function (url, serial) {\r\n var _this = this;\r\n //remember that we sent this request.\r\n this.outstandingRequests.add(serial);\r\n var doNewRequest = function () {\r\n _this.outstandingRequests.delete(serial);\r\n _this.newRequest_();\r\n };\r\n // If this request doesn't return on its own accord (by the server sending us some data), we'll\r\n // create a new one after the KEEPALIVE interval to make sure we always keep a fresh request open.\r\n var keepaliveTimeout = setTimeout(doNewRequest, Math.floor(KEEPALIVE_REQUEST_INTERVAL));\r\n var readyStateCB = function () {\r\n // Request completed. Cancel the keepalive.\r\n clearTimeout(keepaliveTimeout);\r\n // Trigger a new request so we can continue receiving data.\r\n doNewRequest();\r\n };\r\n this.addTag(url, readyStateCB);\r\n };\r\n /**\r\n * Add an arbitrary script tag to the iframe.\r\n * @param url - The URL for the script tag source.\r\n * @param loadCB - A callback to be triggered once the script has loaded.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.addTag = function (url, loadCB) {\r\n var _this = this;\r\n if (isNodeSdk()) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.doNodeLongPoll(url, loadCB);\r\n }\r\n else {\r\n setTimeout(function () {\r\n try {\r\n // if we're already closed, don't add this poll\r\n if (!_this.sendNewPolls) {\r\n return;\r\n }\r\n var newScript_1 = _this.myIFrame.doc.createElement('script');\r\n newScript_1.type = 'text/javascript';\r\n newScript_1.async = true;\r\n newScript_1.src = url;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n newScript_1.onload = newScript_1.onreadystatechange = function () {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n var rstate = newScript_1.readyState;\r\n if (!rstate || rstate === 'loaded' || rstate === 'complete') {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n newScript_1.onload = newScript_1.onreadystatechange = null;\r\n if (newScript_1.parentNode) {\r\n newScript_1.parentNode.removeChild(newScript_1);\r\n }\r\n loadCB();\r\n }\r\n };\r\n newScript_1.onerror = function () {\r\n log('Long-poll script failed to load: ' + url);\r\n _this.sendNewPolls = false;\r\n _this.close();\r\n };\r\n _this.myIFrame.doc.body.appendChild(newScript_1);\r\n }\r\n catch (e) {\r\n // TODO: we should make this error visible somehow\r\n }\r\n }, Math.floor(1));\r\n }\r\n };\r\n return FirebaseIFrameScriptHolder;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar WEBSOCKET_MAX_FRAME_SIZE = 16384;\r\nvar WEBSOCKET_KEEPALIVE_INTERVAL = 45000;\r\nvar WebSocketImpl = null;\r\nif (typeof MozWebSocket !== 'undefined') {\r\n WebSocketImpl = MozWebSocket;\r\n}\r\nelse if (typeof WebSocket !== 'undefined') {\r\n WebSocketImpl = WebSocket;\r\n}\r\n/**\r\n * Create a new websocket connection with the given callbacks.\r\n */\r\nvar WebSocketConnection = /** @class */ (function () {\r\n /**\r\n * @param connId identifier for this transport\r\n * @param repoInfo The info for the websocket endpoint.\r\n * @param applicationId The Firebase App ID for this project.\r\n * @param appCheckToken The App Check Token for this client.\r\n * @param authToken The Auth Token for this client.\r\n * @param transportSessionId Optional transportSessionId if this is connecting\r\n * to an existing transport session\r\n * @param lastSessionId Optional lastSessionId if there was a previous\r\n * connection\r\n */\r\n function WebSocketConnection(connId, repoInfo, applicationId, appCheckToken, authToken, transportSessionId, lastSessionId) {\r\n this.connId = connId;\r\n this.applicationId = applicationId;\r\n this.appCheckToken = appCheckToken;\r\n this.authToken = authToken;\r\n this.keepaliveTimer = null;\r\n this.frames = null;\r\n this.totalFrames = 0;\r\n this.bytesSent = 0;\r\n this.bytesReceived = 0;\r\n this.log_ = logWrapper(this.connId);\r\n this.stats_ = statsManagerGetCollection(repoInfo);\r\n this.connURL = WebSocketConnection.connectionURL_(repoInfo, transportSessionId, lastSessionId, appCheckToken);\r\n this.nodeAdmin = repoInfo.nodeAdmin;\r\n }\r\n /**\r\n * @param repoInfo - The info for the websocket endpoint.\r\n * @param transportSessionId - Optional transportSessionId if this is connecting to an existing transport\r\n * session\r\n * @param lastSessionId - Optional lastSessionId if there was a previous connection\r\n * @returns connection url\r\n */\r\n WebSocketConnection.connectionURL_ = function (repoInfo, transportSessionId, lastSessionId, appCheckToken) {\r\n var urlParams = {};\r\n urlParams[VERSION_PARAM] = PROTOCOL_VERSION;\r\n if (!isNodeSdk() &&\r\n typeof location !== 'undefined' &&\r\n location.hostname &&\r\n FORGE_DOMAIN_RE.test(location.hostname)) {\r\n urlParams[REFERER_PARAM] = FORGE_REF;\r\n }\r\n if (transportSessionId) {\r\n urlParams[TRANSPORT_SESSION_PARAM] = transportSessionId;\r\n }\r\n if (lastSessionId) {\r\n urlParams[LAST_SESSION_PARAM] = lastSessionId;\r\n }\r\n if (appCheckToken) {\r\n urlParams[APP_CHECK_TOKEN_PARAM] = appCheckToken;\r\n }\r\n return repoInfoConnectionURL(repoInfo, WEBSOCKET, urlParams);\r\n };\r\n /**\r\n * @param onMessage - Callback when messages arrive\r\n * @param onDisconnect - Callback with connection lost.\r\n */\r\n WebSocketConnection.prototype.open = function (onMessage, onDisconnect) {\r\n var _this = this;\r\n this.onDisconnect = onDisconnect;\r\n this.onMessage = onMessage;\r\n this.log_('Websocket connecting to ' + this.connURL);\r\n this.everConnected_ = false;\r\n // Assume failure until proven otherwise.\r\n PersistentStorage.set('previous_websocket_failure', true);\r\n try {\r\n if (isNodeSdk()) {\r\n var device = this.nodeAdmin ? 'AdminNode' : 'Node';\r\n // UA Format: Firebase////\r\n var options = {\r\n headers: {\r\n 'User-Agent': \"Firebase/\" + PROTOCOL_VERSION + \"/\" + SDK_VERSION + \"/\" + process.platform + \"/\" + device,\r\n 'X-Firebase-GMPID': this.applicationId || ''\r\n }\r\n };\r\n // If using Node with admin creds, AppCheck-related checks are unnecessary.\r\n // Note that we send the credentials here even if they aren't admin credentials, which is\r\n // not a problem.\r\n // Note that this header is just used to bypass appcheck, and the token should still be sent\r\n // through the websocket connection once it is established.\r\n if (this.authToken) {\r\n options.headers['Authorization'] = \"Bearer \" + this.authToken;\r\n }\r\n if (this.appCheckToken) {\r\n options.headers['X-Firebase-AppCheck'] = this.appCheckToken;\r\n }\r\n // Plumb appropriate http_proxy environment variable into faye-websocket if it exists.\r\n var env = process['env'];\r\n var proxy = this.connURL.indexOf('wss://') === 0\r\n ? env['HTTPS_PROXY'] || env['https_proxy']\r\n : env['HTTP_PROXY'] || env['http_proxy'];\r\n if (proxy) {\r\n options['proxy'] = { origin: proxy };\r\n }\r\n this.mySock = new WebSocketImpl(this.connURL, [], options);\r\n }\r\n else {\r\n var options = {\r\n headers: {\r\n 'X-Firebase-GMPID': this.applicationId || '',\r\n 'X-Firebase-AppCheck': this.appCheckToken || ''\r\n }\r\n };\r\n this.mySock = new WebSocketImpl(this.connURL, [], options);\r\n }\r\n }\r\n catch (e) {\r\n this.log_('Error instantiating WebSocket.');\r\n var error = e.message || e.data;\r\n if (error) {\r\n this.log_(error);\r\n }\r\n this.onClosed_();\r\n return;\r\n }\r\n this.mySock.onopen = function () {\r\n _this.log_('Websocket connected.');\r\n _this.everConnected_ = true;\r\n };\r\n this.mySock.onclose = function () {\r\n _this.log_('Websocket connection was disconnected.');\r\n _this.mySock = null;\r\n _this.onClosed_();\r\n };\r\n this.mySock.onmessage = function (m) {\r\n _this.handleIncomingFrame(m);\r\n };\r\n this.mySock.onerror = function (e) {\r\n _this.log_('WebSocket error. Closing connection.');\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n var error = e.message || e.data;\r\n if (error) {\r\n _this.log_(error);\r\n }\r\n _this.onClosed_();\r\n };\r\n };\r\n /**\r\n * No-op for websockets, we don't need to do anything once the connection is confirmed as open\r\n */\r\n WebSocketConnection.prototype.start = function () { };\r\n WebSocketConnection.forceDisallow = function () {\r\n WebSocketConnection.forceDisallow_ = true;\r\n };\r\n WebSocketConnection.isAvailable = function () {\r\n var isOldAndroid = false;\r\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\r\n var oldAndroidRegex = /Android ([0-9]{0,}\\.[0-9]{0,})/;\r\n var oldAndroidMatch = navigator.userAgent.match(oldAndroidRegex);\r\n if (oldAndroidMatch && oldAndroidMatch.length > 1) {\r\n if (parseFloat(oldAndroidMatch[1]) < 4.4) {\r\n isOldAndroid = true;\r\n }\r\n }\r\n }\r\n return (!isOldAndroid &&\r\n WebSocketImpl !== null &&\r\n !WebSocketConnection.forceDisallow_);\r\n };\r\n /**\r\n * Returns true if we previously failed to connect with this transport.\r\n */\r\n WebSocketConnection.previouslyFailed = function () {\r\n // If our persistent storage is actually only in-memory storage,\r\n // we default to assuming that it previously failed to be safe.\r\n return (PersistentStorage.isInMemoryStorage ||\r\n PersistentStorage.get('previous_websocket_failure') === true);\r\n };\r\n WebSocketConnection.prototype.markConnectionHealthy = function () {\r\n PersistentStorage.remove('previous_websocket_failure');\r\n };\r\n WebSocketConnection.prototype.appendFrame_ = function (data) {\r\n this.frames.push(data);\r\n if (this.frames.length === this.totalFrames) {\r\n var fullMess = this.frames.join('');\r\n this.frames = null;\r\n var jsonMess = jsonEval(fullMess);\r\n //handle the message\r\n this.onMessage(jsonMess);\r\n }\r\n };\r\n /**\r\n * @param frameCount - The number of frames we are expecting from the server\r\n */\r\n WebSocketConnection.prototype.handleNewFrameCount_ = function (frameCount) {\r\n this.totalFrames = frameCount;\r\n this.frames = [];\r\n };\r\n /**\r\n * Attempts to parse a frame count out of some text. If it can't, assumes a value of 1\r\n * @returns Any remaining data to be process, or null if there is none\r\n */\r\n WebSocketConnection.prototype.extractFrameCount_ = function (data) {\r\n assert(this.frames === null, 'We already have a frame buffer');\r\n // TODO: The server is only supposed to send up to 9999 frames (i.e. length <= 4), but that isn't being enforced\r\n // currently. So allowing larger frame counts (length <= 6). See https://app.asana.com/0/search/8688598998380/8237608042508\r\n if (data.length <= 6) {\r\n var frameCount = Number(data);\r\n if (!isNaN(frameCount)) {\r\n this.handleNewFrameCount_(frameCount);\r\n return null;\r\n }\r\n }\r\n this.handleNewFrameCount_(1);\r\n return data;\r\n };\r\n /**\r\n * Process a websocket frame that has arrived from the server.\r\n * @param mess - The frame data\r\n */\r\n WebSocketConnection.prototype.handleIncomingFrame = function (mess) {\r\n if (this.mySock === null) {\r\n return; // Chrome apparently delivers incoming packets even after we .close() the connection sometimes.\r\n }\r\n var data = mess['data'];\r\n this.bytesReceived += data.length;\r\n this.stats_.incrementCounter('bytes_received', data.length);\r\n this.resetKeepAlive();\r\n if (this.frames !== null) {\r\n // we're buffering\r\n this.appendFrame_(data);\r\n }\r\n else {\r\n // try to parse out a frame count, otherwise, assume 1 and process it\r\n var remainingData = this.extractFrameCount_(data);\r\n if (remainingData !== null) {\r\n this.appendFrame_(remainingData);\r\n }\r\n }\r\n };\r\n /**\r\n * Send a message to the server\r\n * @param data - The JSON object to transmit\r\n */\r\n WebSocketConnection.prototype.send = function (data) {\r\n this.resetKeepAlive();\r\n var dataStr = stringify(data);\r\n this.bytesSent += dataStr.length;\r\n this.stats_.incrementCounter('bytes_sent', dataStr.length);\r\n //We can only fit a certain amount in each websocket frame, so we need to split this request\r\n //up into multiple pieces if it doesn't fit in one request.\r\n var dataSegs = splitStringBySize(dataStr, WEBSOCKET_MAX_FRAME_SIZE);\r\n //Send the length header\r\n if (dataSegs.length > 1) {\r\n this.sendString_(String(dataSegs.length));\r\n }\r\n //Send the actual data in segments.\r\n for (var i = 0; i < dataSegs.length; i++) {\r\n this.sendString_(dataSegs[i]);\r\n }\r\n };\r\n WebSocketConnection.prototype.shutdown_ = function () {\r\n this.isClosed_ = true;\r\n if (this.keepaliveTimer) {\r\n clearInterval(this.keepaliveTimer);\r\n this.keepaliveTimer = null;\r\n }\r\n if (this.mySock) {\r\n this.mySock.close();\r\n this.mySock = null;\r\n }\r\n };\r\n WebSocketConnection.prototype.onClosed_ = function () {\r\n if (!this.isClosed_) {\r\n this.log_('WebSocket is closing itself');\r\n this.shutdown_();\r\n // since this is an internal close, trigger the close listener\r\n if (this.onDisconnect) {\r\n this.onDisconnect(this.everConnected_);\r\n this.onDisconnect = null;\r\n }\r\n }\r\n };\r\n /**\r\n * External-facing close handler.\r\n * Close the websocket and kill the connection.\r\n */\r\n WebSocketConnection.prototype.close = function () {\r\n if (!this.isClosed_) {\r\n this.log_('WebSocket is being closed');\r\n this.shutdown_();\r\n }\r\n };\r\n /**\r\n * Kill the current keepalive timer and start a new one, to ensure that it always fires N seconds after\r\n * the last activity.\r\n */\r\n WebSocketConnection.prototype.resetKeepAlive = function () {\r\n var _this = this;\r\n clearInterval(this.keepaliveTimer);\r\n this.keepaliveTimer = setInterval(function () {\r\n //If there has been no websocket activity for a while, send a no-op\r\n if (_this.mySock) {\r\n _this.sendString_('0');\r\n }\r\n _this.resetKeepAlive();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n }, Math.floor(WEBSOCKET_KEEPALIVE_INTERVAL));\r\n };\r\n /**\r\n * Send a string over the websocket.\r\n *\r\n * @param str - String to send.\r\n */\r\n WebSocketConnection.prototype.sendString_ = function (str) {\r\n // Firefox seems to sometimes throw exceptions (NS_ERROR_UNEXPECTED) from websocket .send()\r\n // calls for some unknown reason. We treat these as an error and disconnect.\r\n // See https://app.asana.com/0/58926111402292/68021340250410\r\n try {\r\n this.mySock.send(str);\r\n }\r\n catch (e) {\r\n this.log_('Exception thrown from WebSocket.send():', e.message || e.data, 'Closing connection.');\r\n setTimeout(this.onClosed_.bind(this), 0);\r\n }\r\n };\r\n /**\r\n * Number of response before we consider the connection \"healthy.\"\r\n */\r\n WebSocketConnection.responsesRequiredToBeHealthy = 2;\r\n /**\r\n * Time to wait for the connection te become healthy before giving up.\r\n */\r\n WebSocketConnection.healthyTimeout = 30000;\r\n return WebSocketConnection;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Currently simplistic, this class manages what transport a Connection should use at various stages of its\r\n * lifecycle.\r\n *\r\n * It starts with longpolling in a browser, and httppolling on node. It then upgrades to websockets if\r\n * they are available.\r\n */\r\nvar TransportManager = /** @class */ (function () {\r\n /**\r\n * @param repoInfo - Metadata around the namespace we're connecting to\r\n */\r\n function TransportManager(repoInfo) {\r\n this.initTransports_(repoInfo);\r\n }\r\n Object.defineProperty(TransportManager, \"ALL_TRANSPORTS\", {\r\n get: function () {\r\n return [BrowserPollConnection, WebSocketConnection];\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n TransportManager.prototype.initTransports_ = function (repoInfo) {\r\n var e_1, _a;\r\n var isWebSocketsAvailable = WebSocketConnection && WebSocketConnection['isAvailable']();\r\n var isSkipPollConnection = isWebSocketsAvailable && !WebSocketConnection.previouslyFailed();\r\n if (repoInfo.webSocketOnly) {\r\n if (!isWebSocketsAvailable) {\r\n warn(\"wss:// URL used, but browser isn't known to support websockets. Trying anyway.\");\r\n }\r\n isSkipPollConnection = true;\r\n }\r\n if (isSkipPollConnection) {\r\n this.transports_ = [WebSocketConnection];\r\n }\r\n else {\r\n var transports = (this.transports_ = []);\r\n try {\r\n for (var _b = __values(TransportManager.ALL_TRANSPORTS), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var transport = _c.value;\r\n if (transport && transport['isAvailable']()) {\r\n transports.push(transport);\r\n }\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n }\r\n };\r\n /**\r\n * @returns The constructor for the initial transport to use\r\n */\r\n TransportManager.prototype.initialTransport = function () {\r\n if (this.transports_.length > 0) {\r\n return this.transports_[0];\r\n }\r\n else {\r\n throw new Error('No transports available');\r\n }\r\n };\r\n /**\r\n * @returns The constructor for the next transport, or null\r\n */\r\n TransportManager.prototype.upgradeTransport = function () {\r\n if (this.transports_.length > 1) {\r\n return this.transports_[1];\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n return TransportManager;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Abort upgrade attempt if it takes longer than 60s.\r\nvar UPGRADE_TIMEOUT = 60000;\r\n// For some transports (WebSockets), we need to \"validate\" the transport by exchanging a few requests and responses.\r\n// If we haven't sent enough requests within 5s, we'll start sending noop ping requests.\r\nvar DELAY_BEFORE_SENDING_EXTRA_REQUESTS = 5000;\r\n// If the initial data sent triggers a lot of bandwidth (i.e. it's a large put or a listen for a large amount of data)\r\n// then we may not be able to exchange our ping/pong requests within the healthy timeout. So if we reach the timeout\r\n// but we've sent/received enough bytes, we don't cancel the connection.\r\nvar BYTES_SENT_HEALTHY_OVERRIDE = 10 * 1024;\r\nvar BYTES_RECEIVED_HEALTHY_OVERRIDE = 100 * 1024;\r\nvar MESSAGE_TYPE = 't';\r\nvar MESSAGE_DATA = 'd';\r\nvar CONTROL_SHUTDOWN = 's';\r\nvar CONTROL_RESET = 'r';\r\nvar CONTROL_ERROR = 'e';\r\nvar CONTROL_PONG = 'o';\r\nvar SWITCH_ACK = 'a';\r\nvar END_TRANSMISSION = 'n';\r\nvar PING = 'p';\r\nvar SERVER_HELLO = 'h';\r\n/**\r\n * Creates a new real-time connection to the server using whichever method works\r\n * best in the current browser.\r\n */\r\nvar Connection = /** @class */ (function () {\r\n /**\r\n * @param id - an id for this connection\r\n * @param repoInfo_ - the info for the endpoint to connect to\r\n * @param applicationId_ - the Firebase App ID for this project\r\n * @param appCheckToken_ - The App Check Token for this device.\r\n * @param authToken_ - The auth token for this session.\r\n * @param onMessage_ - the callback to be triggered when a server-push message arrives\r\n * @param onReady_ - the callback to be triggered when this connection is ready to send messages.\r\n * @param onDisconnect_ - the callback to be triggered when a connection was lost\r\n * @param onKill_ - the callback to be triggered when this connection has permanently shut down.\r\n * @param lastSessionId - last session id in persistent connection. is used to clean up old session in real-time server\r\n */\r\n function Connection(id, repoInfo_, applicationId_, appCheckToken_, authToken_, onMessage_, onReady_, onDisconnect_, onKill_, lastSessionId) {\r\n this.id = id;\r\n this.repoInfo_ = repoInfo_;\r\n this.applicationId_ = applicationId_;\r\n this.appCheckToken_ = appCheckToken_;\r\n this.authToken_ = authToken_;\r\n this.onMessage_ = onMessage_;\r\n this.onReady_ = onReady_;\r\n this.onDisconnect_ = onDisconnect_;\r\n this.onKill_ = onKill_;\r\n this.lastSessionId = lastSessionId;\r\n this.connectionCount = 0;\r\n this.pendingDataMessages = [];\r\n this.state_ = 0 /* CONNECTING */;\r\n this.log_ = logWrapper('c:' + this.id + ':');\r\n this.transportManager_ = new TransportManager(repoInfo_);\r\n this.log_('Connection created');\r\n this.start_();\r\n }\r\n /**\r\n * Starts a connection attempt\r\n */\r\n Connection.prototype.start_ = function () {\r\n var _this = this;\r\n var conn = this.transportManager_.initialTransport();\r\n this.conn_ = new conn(this.nextTransportId_(), this.repoInfo_, this.applicationId_, this.appCheckToken_, this.authToken_, null, this.lastSessionId);\r\n // For certain transports (WebSockets), we need to send and receive several messages back and forth before we\r\n // can consider the transport healthy.\r\n this.primaryResponsesRequired_ = conn['responsesRequiredToBeHealthy'] || 0;\r\n var onMessageReceived = this.connReceiver_(this.conn_);\r\n var onConnectionLost = this.disconnReceiver_(this.conn_);\r\n this.tx_ = this.conn_;\r\n this.rx_ = this.conn_;\r\n this.secondaryConn_ = null;\r\n this.isHealthy_ = false;\r\n /*\r\n * Firefox doesn't like when code from one iframe tries to create another iframe by way of the parent frame.\r\n * This can occur in the case of a redirect, i.e. we guessed wrong on what server to connect to and received a reset.\r\n * Somehow, setTimeout seems to make this ok. That doesn't make sense from a security perspective, since you should\r\n * still have the context of your originating frame.\r\n */\r\n setTimeout(function () {\r\n // this.conn_ gets set to null in some of the tests. Check to make sure it still exists before using it\r\n _this.conn_ && _this.conn_.open(onMessageReceived, onConnectionLost);\r\n }, Math.floor(0));\r\n var healthyTimeoutMS = conn['healthyTimeout'] || 0;\r\n if (healthyTimeoutMS > 0) {\r\n this.healthyTimeout_ = setTimeoutNonBlocking(function () {\r\n _this.healthyTimeout_ = null;\r\n if (!_this.isHealthy_) {\r\n if (_this.conn_ &&\r\n _this.conn_.bytesReceived > BYTES_RECEIVED_HEALTHY_OVERRIDE) {\r\n _this.log_('Connection exceeded healthy timeout but has received ' +\r\n _this.conn_.bytesReceived +\r\n ' bytes. Marking connection healthy.');\r\n _this.isHealthy_ = true;\r\n _this.conn_.markConnectionHealthy();\r\n }\r\n else if (_this.conn_ &&\r\n _this.conn_.bytesSent > BYTES_SENT_HEALTHY_OVERRIDE) {\r\n _this.log_('Connection exceeded healthy timeout but has sent ' +\r\n _this.conn_.bytesSent +\r\n ' bytes. Leaving connection alive.');\r\n // NOTE: We don't want to mark it healthy, since we have no guarantee that the bytes have made it to\r\n // the server.\r\n }\r\n else {\r\n _this.log_('Closing unhealthy connection after timeout.');\r\n _this.close();\r\n }\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n }, Math.floor(healthyTimeoutMS));\r\n }\r\n };\r\n Connection.prototype.nextTransportId_ = function () {\r\n return 'c:' + this.id + ':' + this.connectionCount++;\r\n };\r\n Connection.prototype.disconnReceiver_ = function (conn) {\r\n var _this = this;\r\n return function (everConnected) {\r\n if (conn === _this.conn_) {\r\n _this.onConnectionLost_(everConnected);\r\n }\r\n else if (conn === _this.secondaryConn_) {\r\n _this.log_('Secondary connection lost.');\r\n _this.onSecondaryConnectionLost_();\r\n }\r\n else {\r\n _this.log_('closing an old connection');\r\n }\r\n };\r\n };\r\n Connection.prototype.connReceiver_ = function (conn) {\r\n var _this = this;\r\n return function (message) {\r\n if (_this.state_ !== 2 /* DISCONNECTED */) {\r\n if (conn === _this.rx_) {\r\n _this.onPrimaryMessageReceived_(message);\r\n }\r\n else if (conn === _this.secondaryConn_) {\r\n _this.onSecondaryMessageReceived_(message);\r\n }\r\n else {\r\n _this.log_('message on old connection');\r\n }\r\n }\r\n };\r\n };\r\n /**\r\n * @param dataMsg - An arbitrary data message to be sent to the server\r\n */\r\n Connection.prototype.sendRequest = function (dataMsg) {\r\n // wrap in a data message envelope and send it on\r\n var msg = { t: 'd', d: dataMsg };\r\n this.sendData_(msg);\r\n };\r\n Connection.prototype.tryCleanupConnection = function () {\r\n if (this.tx_ === this.secondaryConn_ && this.rx_ === this.secondaryConn_) {\r\n this.log_('cleaning up and promoting a connection: ' + this.secondaryConn_.connId);\r\n this.conn_ = this.secondaryConn_;\r\n this.secondaryConn_ = null;\r\n // the server will shutdown the old connection\r\n }\r\n };\r\n Connection.prototype.onSecondaryControl_ = function (controlData) {\r\n if (MESSAGE_TYPE in controlData) {\r\n var cmd = controlData[MESSAGE_TYPE];\r\n if (cmd === SWITCH_ACK) {\r\n this.upgradeIfSecondaryHealthy_();\r\n }\r\n else if (cmd === CONTROL_RESET) {\r\n // Most likely the session wasn't valid. Abandon the switch attempt\r\n this.log_('Got a reset on secondary, closing it');\r\n this.secondaryConn_.close();\r\n // If we were already using this connection for something, than we need to fully close\r\n if (this.tx_ === this.secondaryConn_ ||\r\n this.rx_ === this.secondaryConn_) {\r\n this.close();\r\n }\r\n }\r\n else if (cmd === CONTROL_PONG) {\r\n this.log_('got pong on secondary.');\r\n this.secondaryResponsesRequired_--;\r\n this.upgradeIfSecondaryHealthy_();\r\n }\r\n }\r\n };\r\n Connection.prototype.onSecondaryMessageReceived_ = function (parsedData) {\r\n var layer = requireKey('t', parsedData);\r\n var data = requireKey('d', parsedData);\r\n if (layer === 'c') {\r\n this.onSecondaryControl_(data);\r\n }\r\n else if (layer === 'd') {\r\n // got a data message, but we're still second connection. Need to buffer it up\r\n this.pendingDataMessages.push(data);\r\n }\r\n else {\r\n throw new Error('Unknown protocol layer: ' + layer);\r\n }\r\n };\r\n Connection.prototype.upgradeIfSecondaryHealthy_ = function () {\r\n if (this.secondaryResponsesRequired_ <= 0) {\r\n this.log_('Secondary connection is healthy.');\r\n this.isHealthy_ = true;\r\n this.secondaryConn_.markConnectionHealthy();\r\n this.proceedWithUpgrade_();\r\n }\r\n else {\r\n // Send a ping to make sure the connection is healthy.\r\n this.log_('sending ping on secondary.');\r\n this.secondaryConn_.send({ t: 'c', d: { t: PING, d: {} } });\r\n }\r\n };\r\n Connection.prototype.proceedWithUpgrade_ = function () {\r\n // tell this connection to consider itself open\r\n this.secondaryConn_.start();\r\n // send ack\r\n this.log_('sending client ack on secondary');\r\n this.secondaryConn_.send({ t: 'c', d: { t: SWITCH_ACK, d: {} } });\r\n // send end packet on primary transport, switch to sending on this one\r\n // can receive on this one, buffer responses until end received on primary transport\r\n this.log_('Ending transmission on primary');\r\n this.conn_.send({ t: 'c', d: { t: END_TRANSMISSION, d: {} } });\r\n this.tx_ = this.secondaryConn_;\r\n this.tryCleanupConnection();\r\n };\r\n Connection.prototype.onPrimaryMessageReceived_ = function (parsedData) {\r\n // Must refer to parsedData properties in quotes, so closure doesn't touch them.\r\n var layer = requireKey('t', parsedData);\r\n var data = requireKey('d', parsedData);\r\n if (layer === 'c') {\r\n this.onControl_(data);\r\n }\r\n else if (layer === 'd') {\r\n this.onDataMessage_(data);\r\n }\r\n };\r\n Connection.prototype.onDataMessage_ = function (message) {\r\n this.onPrimaryResponse_();\r\n // We don't do anything with data messages, just kick them up a level\r\n this.onMessage_(message);\r\n };\r\n Connection.prototype.onPrimaryResponse_ = function () {\r\n if (!this.isHealthy_) {\r\n this.primaryResponsesRequired_--;\r\n if (this.primaryResponsesRequired_ <= 0) {\r\n this.log_('Primary connection is healthy.');\r\n this.isHealthy_ = true;\r\n this.conn_.markConnectionHealthy();\r\n }\r\n }\r\n };\r\n Connection.prototype.onControl_ = function (controlData) {\r\n var cmd = requireKey(MESSAGE_TYPE, controlData);\r\n if (MESSAGE_DATA in controlData) {\r\n var payload = controlData[MESSAGE_DATA];\r\n if (cmd === SERVER_HELLO) {\r\n this.onHandshake_(payload);\r\n }\r\n else if (cmd === END_TRANSMISSION) {\r\n this.log_('recvd end transmission on primary');\r\n this.rx_ = this.secondaryConn_;\r\n for (var i = 0; i < this.pendingDataMessages.length; ++i) {\r\n this.onDataMessage_(this.pendingDataMessages[i]);\r\n }\r\n this.pendingDataMessages = [];\r\n this.tryCleanupConnection();\r\n }\r\n else if (cmd === CONTROL_SHUTDOWN) {\r\n // This was previously the 'onKill' callback passed to the lower-level connection\r\n // payload in this case is the reason for the shutdown. Generally a human-readable error\r\n this.onConnectionShutdown_(payload);\r\n }\r\n else if (cmd === CONTROL_RESET) {\r\n // payload in this case is the host we should contact\r\n this.onReset_(payload);\r\n }\r\n else if (cmd === CONTROL_ERROR) {\r\n error('Server Error: ' + payload);\r\n }\r\n else if (cmd === CONTROL_PONG) {\r\n this.log_('got pong on primary.');\r\n this.onPrimaryResponse_();\r\n this.sendPingOnPrimaryIfNecessary_();\r\n }\r\n else {\r\n error('Unknown control packet command: ' + cmd);\r\n }\r\n }\r\n };\r\n /**\r\n * @param handshake - The handshake data returned from the server\r\n */\r\n Connection.prototype.onHandshake_ = function (handshake) {\r\n var timestamp = handshake.ts;\r\n var version = handshake.v;\r\n var host = handshake.h;\r\n this.sessionId = handshake.s;\r\n this.repoInfo_.host = host;\r\n // if we've already closed the connection, then don't bother trying to progress further\r\n if (this.state_ === 0 /* CONNECTING */) {\r\n this.conn_.start();\r\n this.onConnectionEstablished_(this.conn_, timestamp);\r\n if (PROTOCOL_VERSION !== version) {\r\n warn('Protocol version mismatch detected');\r\n }\r\n // TODO: do we want to upgrade? when? maybe a delay?\r\n this.tryStartUpgrade_();\r\n }\r\n };\r\n Connection.prototype.tryStartUpgrade_ = function () {\r\n var conn = this.transportManager_.upgradeTransport();\r\n if (conn) {\r\n this.startUpgrade_(conn);\r\n }\r\n };\r\n Connection.prototype.startUpgrade_ = function (conn) {\r\n var _this = this;\r\n this.secondaryConn_ = new conn(this.nextTransportId_(), this.repoInfo_, this.applicationId_, this.appCheckToken_, this.authToken_, this.sessionId);\r\n // For certain transports (WebSockets), we need to send and receive several messages back and forth before we\r\n // can consider the transport healthy.\r\n this.secondaryResponsesRequired_ =\r\n conn['responsesRequiredToBeHealthy'] || 0;\r\n var onMessage = this.connReceiver_(this.secondaryConn_);\r\n var onDisconnect = this.disconnReceiver_(this.secondaryConn_);\r\n this.secondaryConn_.open(onMessage, onDisconnect);\r\n // If we haven't successfully upgraded after UPGRADE_TIMEOUT, give up and kill the secondary.\r\n setTimeoutNonBlocking(function () {\r\n if (_this.secondaryConn_) {\r\n _this.log_('Timed out trying to upgrade.');\r\n _this.secondaryConn_.close();\r\n }\r\n }, Math.floor(UPGRADE_TIMEOUT));\r\n };\r\n Connection.prototype.onReset_ = function (host) {\r\n this.log_('Reset packet received. New host: ' + host);\r\n this.repoInfo_.host = host;\r\n // TODO: if we're already \"connected\", we need to trigger a disconnect at the next layer up.\r\n // We don't currently support resets after the connection has already been established\r\n if (this.state_ === 1 /* CONNECTED */) {\r\n this.close();\r\n }\r\n else {\r\n // Close whatever connections we have open and start again.\r\n this.closeConnections_();\r\n this.start_();\r\n }\r\n };\r\n Connection.prototype.onConnectionEstablished_ = function (conn, timestamp) {\r\n var _this = this;\r\n this.log_('Realtime connection established.');\r\n this.conn_ = conn;\r\n this.state_ = 1 /* CONNECTED */;\r\n if (this.onReady_) {\r\n this.onReady_(timestamp, this.sessionId);\r\n this.onReady_ = null;\r\n }\r\n // If after 5 seconds we haven't sent enough requests to the server to get the connection healthy,\r\n // send some pings.\r\n if (this.primaryResponsesRequired_ === 0) {\r\n this.log_('Primary connection is healthy.');\r\n this.isHealthy_ = true;\r\n }\r\n else {\r\n setTimeoutNonBlocking(function () {\r\n _this.sendPingOnPrimaryIfNecessary_();\r\n }, Math.floor(DELAY_BEFORE_SENDING_EXTRA_REQUESTS));\r\n }\r\n };\r\n Connection.prototype.sendPingOnPrimaryIfNecessary_ = function () {\r\n // If the connection isn't considered healthy yet, we'll send a noop ping packet request.\r\n if (!this.isHealthy_ && this.state_ === 1 /* CONNECTED */) {\r\n this.log_('sending ping on primary.');\r\n this.sendData_({ t: 'c', d: { t: PING, d: {} } });\r\n }\r\n };\r\n Connection.prototype.onSecondaryConnectionLost_ = function () {\r\n var conn = this.secondaryConn_;\r\n this.secondaryConn_ = null;\r\n if (this.tx_ === conn || this.rx_ === conn) {\r\n // we are relying on this connection already in some capacity. Therefore, a failure is real\r\n this.close();\r\n }\r\n };\r\n /**\r\n * @param everConnected - Whether or not the connection ever reached a server. Used to determine if\r\n * we should flush the host cache\r\n */\r\n Connection.prototype.onConnectionLost_ = function (everConnected) {\r\n this.conn_ = null;\r\n // NOTE: IF you're seeing a Firefox error for this line, I think it might be because it's getting\r\n // called on window close and RealtimeState.CONNECTING is no longer defined. Just a guess.\r\n if (!everConnected && this.state_ === 0 /* CONNECTING */) {\r\n this.log_('Realtime connection failed.');\r\n // Since we failed to connect at all, clear any cached entry for this namespace in case the machine went away\r\n if (this.repoInfo_.isCacheableHost()) {\r\n PersistentStorage.remove('host:' + this.repoInfo_.host);\r\n // reset the internal host to what we would show the user, i.e. .firebaseio.com\r\n this.repoInfo_.internalHost = this.repoInfo_.host;\r\n }\r\n }\r\n else if (this.state_ === 1 /* CONNECTED */) {\r\n this.log_('Realtime connection lost.');\r\n }\r\n this.close();\r\n };\r\n Connection.prototype.onConnectionShutdown_ = function (reason) {\r\n this.log_('Connection shutdown command received. Shutting down...');\r\n if (this.onKill_) {\r\n this.onKill_(reason);\r\n this.onKill_ = null;\r\n }\r\n // We intentionally don't want to fire onDisconnect (kill is a different case),\r\n // so clear the callback.\r\n this.onDisconnect_ = null;\r\n this.close();\r\n };\r\n Connection.prototype.sendData_ = function (data) {\r\n if (this.state_ !== 1 /* CONNECTED */) {\r\n throw 'Connection is not connected';\r\n }\r\n else {\r\n this.tx_.send(data);\r\n }\r\n };\r\n /**\r\n * Cleans up this connection, calling the appropriate callbacks\r\n */\r\n Connection.prototype.close = function () {\r\n if (this.state_ !== 2 /* DISCONNECTED */) {\r\n this.log_('Closing realtime connection.');\r\n this.state_ = 2 /* DISCONNECTED */;\r\n this.closeConnections_();\r\n if (this.onDisconnect_) {\r\n this.onDisconnect_();\r\n this.onDisconnect_ = null;\r\n }\r\n }\r\n };\r\n Connection.prototype.closeConnections_ = function () {\r\n this.log_('Shutting down all connections');\r\n if (this.conn_) {\r\n this.conn_.close();\r\n this.conn_ = null;\r\n }\r\n if (this.secondaryConn_) {\r\n this.secondaryConn_.close();\r\n this.secondaryConn_ = null;\r\n }\r\n if (this.healthyTimeout_) {\r\n clearTimeout(this.healthyTimeout_);\r\n this.healthyTimeout_ = null;\r\n }\r\n };\r\n return Connection;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Interface defining the set of actions that can be performed against the Firebase server\r\n * (basically corresponds to our wire protocol).\r\n *\r\n * @interface\r\n */\r\nvar ServerActions = /** @class */ (function () {\r\n function ServerActions() {\r\n }\r\n ServerActions.prototype.put = function (pathString, data, onComplete, hash) { };\r\n ServerActions.prototype.merge = function (pathString, data, onComplete, hash) { };\r\n /**\r\n * Refreshes the auth token for the current connection.\r\n * @param token - The authentication token\r\n */\r\n ServerActions.prototype.refreshAuthToken = function (token) { };\r\n /**\r\n * Refreshes the app check token for the current connection.\r\n * @param token The app check token\r\n */\r\n ServerActions.prototype.refreshAppCheckToken = function (token) { };\r\n ServerActions.prototype.onDisconnectPut = function (pathString, data, onComplete) { };\r\n ServerActions.prototype.onDisconnectMerge = function (pathString, data, onComplete) { };\r\n ServerActions.prototype.onDisconnectCancel = function (pathString, onComplete) { };\r\n ServerActions.prototype.reportStats = function (stats) { };\r\n return ServerActions;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Base class to be used if you want to emit events. Call the constructor with\r\n * the set of allowed event names.\r\n */\r\nvar EventEmitter = /** @class */ (function () {\r\n function EventEmitter(allowedEvents_) {\r\n this.allowedEvents_ = allowedEvents_;\r\n this.listeners_ = {};\r\n assert(Array.isArray(allowedEvents_) && allowedEvents_.length > 0, 'Requires a non-empty array');\r\n }\r\n /**\r\n * To be called by derived classes to trigger events.\r\n */\r\n EventEmitter.prototype.trigger = function (eventType) {\r\n var varArgs = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n varArgs[_i - 1] = arguments[_i];\r\n }\r\n if (Array.isArray(this.listeners_[eventType])) {\r\n // Clone the list, since callbacks could add/remove listeners.\r\n var listeners = __spreadArray([], __read(this.listeners_[eventType]));\r\n for (var i = 0; i < listeners.length; i++) {\r\n listeners[i].callback.apply(listeners[i].context, varArgs);\r\n }\r\n }\r\n };\r\n EventEmitter.prototype.on = function (eventType, callback, context) {\r\n this.validateEventType_(eventType);\r\n this.listeners_[eventType] = this.listeners_[eventType] || [];\r\n this.listeners_[eventType].push({ callback: callback, context: context });\r\n var eventData = this.getInitialEvent(eventType);\r\n if (eventData) {\r\n callback.apply(context, eventData);\r\n }\r\n };\r\n EventEmitter.prototype.off = function (eventType, callback, context) {\r\n this.validateEventType_(eventType);\r\n var listeners = this.listeners_[eventType] || [];\r\n for (var i = 0; i < listeners.length; i++) {\r\n if (listeners[i].callback === callback &&\r\n (!context || context === listeners[i].context)) {\r\n listeners.splice(i, 1);\r\n return;\r\n }\r\n }\r\n };\r\n EventEmitter.prototype.validateEventType_ = function (eventType) {\r\n assert(this.allowedEvents_.find(function (et) {\r\n return et === eventType;\r\n }), 'Unknown event: ' + eventType);\r\n };\r\n return EventEmitter;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Monitors online state (as reported by window.online/offline events).\r\n *\r\n * The expectation is that this could have many false positives (thinks we are online\r\n * when we're not), but no false negatives. So we can safely use it to determine when\r\n * we definitely cannot reach the internet.\r\n */\r\nvar OnlineMonitor = /** @class */ (function (_super) {\r\n __extends(OnlineMonitor, _super);\r\n function OnlineMonitor() {\r\n var _this = _super.call(this, ['online']) || this;\r\n _this.online_ = true;\r\n // We've had repeated complaints that Cordova apps can get stuck \"offline\", e.g.\r\n // https://forum.ionicframework.com/t/firebase-connection-is-lost-and-never-come-back/43810\r\n // It would seem that the 'online' event does not always fire consistently. So we disable it\r\n // for Cordova.\r\n if (typeof window !== 'undefined' &&\r\n typeof window.addEventListener !== 'undefined' &&\r\n !isMobileCordova()) {\r\n window.addEventListener('online', function () {\r\n if (!_this.online_) {\r\n _this.online_ = true;\r\n _this.trigger('online', true);\r\n }\r\n }, false);\r\n window.addEventListener('offline', function () {\r\n if (_this.online_) {\r\n _this.online_ = false;\r\n _this.trigger('online', false);\r\n }\r\n }, false);\r\n }\r\n return _this;\r\n }\r\n OnlineMonitor.getInstance = function () {\r\n return new OnlineMonitor();\r\n };\r\n OnlineMonitor.prototype.getInitialEvent = function (eventType) {\r\n assert(eventType === 'online', 'Unknown event type: ' + eventType);\r\n return [this.online_];\r\n };\r\n OnlineMonitor.prototype.currentlyOnline = function () {\r\n return this.online_;\r\n };\r\n return OnlineMonitor;\r\n}(EventEmitter));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** Maximum key depth. */\r\nvar MAX_PATH_DEPTH = 32;\r\n/** Maximum number of (UTF8) bytes in a Firebase path. */\r\nvar MAX_PATH_LENGTH_BYTES = 768;\r\n/**\r\n * An immutable object representing a parsed path. It's immutable so that you\r\n * can pass them around to other functions without worrying about them changing\r\n * it.\r\n */\r\nvar Path = /** @class */ (function () {\r\n /**\r\n * @param pathOrString - Path string to parse, or another path, or the raw\r\n * tokens array\r\n */\r\n function Path(pathOrString, pieceNum) {\r\n if (pieceNum === void 0) {\r\n this.pieces_ = pathOrString.split('/');\r\n // Remove empty pieces.\r\n var copyTo = 0;\r\n for (var i = 0; i < this.pieces_.length; i++) {\r\n if (this.pieces_[i].length > 0) {\r\n this.pieces_[copyTo] = this.pieces_[i];\r\n copyTo++;\r\n }\r\n }\r\n this.pieces_.length = copyTo;\r\n this.pieceNum_ = 0;\r\n }\r\n else {\r\n this.pieces_ = pathOrString;\r\n this.pieceNum_ = pieceNum;\r\n }\r\n }\r\n Path.prototype.toString = function () {\r\n var pathString = '';\r\n for (var i = this.pieceNum_; i < this.pieces_.length; i++) {\r\n if (this.pieces_[i] !== '') {\r\n pathString += '/' + this.pieces_[i];\r\n }\r\n }\r\n return pathString || '/';\r\n };\r\n return Path;\r\n}());\r\nfunction newEmptyPath() {\r\n return new Path('');\r\n}\r\nfunction pathGetFront(path) {\r\n if (path.pieceNum_ >= path.pieces_.length) {\r\n return null;\r\n }\r\n return path.pieces_[path.pieceNum_];\r\n}\r\n/**\r\n * @returns The number of segments in this path\r\n */\r\nfunction pathGetLength(path) {\r\n return path.pieces_.length - path.pieceNum_;\r\n}\r\nfunction pathPopFront(path) {\r\n var pieceNum = path.pieceNum_;\r\n if (pieceNum < path.pieces_.length) {\r\n pieceNum++;\r\n }\r\n return new Path(path.pieces_, pieceNum);\r\n}\r\nfunction pathGetBack(path) {\r\n if (path.pieceNum_ < path.pieces_.length) {\r\n return path.pieces_[path.pieces_.length - 1];\r\n }\r\n return null;\r\n}\r\nfunction pathToUrlEncodedString(path) {\r\n var pathString = '';\r\n for (var i = path.pieceNum_; i < path.pieces_.length; i++) {\r\n if (path.pieces_[i] !== '') {\r\n pathString += '/' + encodeURIComponent(String(path.pieces_[i]));\r\n }\r\n }\r\n return pathString || '/';\r\n}\r\n/**\r\n * Shallow copy of the parts of the path.\r\n *\r\n */\r\nfunction pathSlice(path, begin) {\r\n if (begin === void 0) { begin = 0; }\r\n return path.pieces_.slice(path.pieceNum_ + begin);\r\n}\r\nfunction pathParent(path) {\r\n if (path.pieceNum_ >= path.pieces_.length) {\r\n return null;\r\n }\r\n var pieces = [];\r\n for (var i = path.pieceNum_; i < path.pieces_.length - 1; i++) {\r\n pieces.push(path.pieces_[i]);\r\n }\r\n return new Path(pieces, 0);\r\n}\r\nfunction pathChild(path, childPathObj) {\r\n var pieces = [];\r\n for (var i = path.pieceNum_; i < path.pieces_.length; i++) {\r\n pieces.push(path.pieces_[i]);\r\n }\r\n if (childPathObj instanceof Path) {\r\n for (var i = childPathObj.pieceNum_; i < childPathObj.pieces_.length; i++) {\r\n pieces.push(childPathObj.pieces_[i]);\r\n }\r\n }\r\n else {\r\n var childPieces = childPathObj.split('/');\r\n for (var i = 0; i < childPieces.length; i++) {\r\n if (childPieces[i].length > 0) {\r\n pieces.push(childPieces[i]);\r\n }\r\n }\r\n }\r\n return new Path(pieces, 0);\r\n}\r\n/**\r\n * @returns True if there are no segments in this path\r\n */\r\nfunction pathIsEmpty(path) {\r\n return path.pieceNum_ >= path.pieces_.length;\r\n}\r\n/**\r\n * @returns The path from outerPath to innerPath\r\n */\r\nfunction newRelativePath(outerPath, innerPath) {\r\n var outer = pathGetFront(outerPath), inner = pathGetFront(innerPath);\r\n if (outer === null) {\r\n return innerPath;\r\n }\r\n else if (outer === inner) {\r\n return newRelativePath(pathPopFront(outerPath), pathPopFront(innerPath));\r\n }\r\n else {\r\n throw new Error('INTERNAL ERROR: innerPath (' +\r\n innerPath +\r\n ') is not within ' +\r\n 'outerPath (' +\r\n outerPath +\r\n ')');\r\n }\r\n}\r\n/**\r\n * @returns -1, 0, 1 if left is less, equal, or greater than the right.\r\n */\r\nfunction pathCompare(left, right) {\r\n var leftKeys = pathSlice(left, 0);\r\n var rightKeys = pathSlice(right, 0);\r\n for (var i = 0; i < leftKeys.length && i < rightKeys.length; i++) {\r\n var cmp = nameCompare(leftKeys[i], rightKeys[i]);\r\n if (cmp !== 0) {\r\n return cmp;\r\n }\r\n }\r\n if (leftKeys.length === rightKeys.length) {\r\n return 0;\r\n }\r\n return leftKeys.length < rightKeys.length ? -1 : 1;\r\n}\r\n/**\r\n * @returns true if paths are the same.\r\n */\r\nfunction pathEquals(path, other) {\r\n if (pathGetLength(path) !== pathGetLength(other)) {\r\n return false;\r\n }\r\n for (var i = path.pieceNum_, j = other.pieceNum_; i <= path.pieces_.length; i++, j++) {\r\n if (path.pieces_[i] !== other.pieces_[j]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n/**\r\n * @returns True if this path is a parent (or the same as) other\r\n */\r\nfunction pathContains(path, other) {\r\n var i = path.pieceNum_;\r\n var j = other.pieceNum_;\r\n if (pathGetLength(path) > pathGetLength(other)) {\r\n return false;\r\n }\r\n while (i < path.pieces_.length) {\r\n if (path.pieces_[i] !== other.pieces_[j]) {\r\n return false;\r\n }\r\n ++i;\r\n ++j;\r\n }\r\n return true;\r\n}\r\n/**\r\n * Dynamic (mutable) path used to count path lengths.\r\n *\r\n * This class is used to efficiently check paths for valid\r\n * length (in UTF8 bytes) and depth (used in path validation).\r\n *\r\n * Throws Error exception if path is ever invalid.\r\n *\r\n * The definition of a path always begins with '/'.\r\n */\r\nvar ValidationPath = /** @class */ (function () {\r\n /**\r\n * @param path - Initial Path.\r\n * @param errorPrefix_ - Prefix for any error messages.\r\n */\r\n function ValidationPath(path, errorPrefix_) {\r\n this.errorPrefix_ = errorPrefix_;\r\n this.parts_ = pathSlice(path, 0);\r\n /** Initialize to number of '/' chars needed in path. */\r\n this.byteLength_ = Math.max(1, this.parts_.length);\r\n for (var i = 0; i < this.parts_.length; i++) {\r\n this.byteLength_ += stringLength(this.parts_[i]);\r\n }\r\n validationPathCheckValid(this);\r\n }\r\n return ValidationPath;\r\n}());\r\nfunction validationPathPush(validationPath, child) {\r\n // Count the needed '/'\r\n if (validationPath.parts_.length > 0) {\r\n validationPath.byteLength_ += 1;\r\n }\r\n validationPath.parts_.push(child);\r\n validationPath.byteLength_ += stringLength(child);\r\n validationPathCheckValid(validationPath);\r\n}\r\nfunction validationPathPop(validationPath) {\r\n var last = validationPath.parts_.pop();\r\n validationPath.byteLength_ -= stringLength(last);\r\n // Un-count the previous '/'\r\n if (validationPath.parts_.length > 0) {\r\n validationPath.byteLength_ -= 1;\r\n }\r\n}\r\nfunction validationPathCheckValid(validationPath) {\r\n if (validationPath.byteLength_ > MAX_PATH_LENGTH_BYTES) {\r\n throw new Error(validationPath.errorPrefix_ +\r\n 'has a key path longer than ' +\r\n MAX_PATH_LENGTH_BYTES +\r\n ' bytes (' +\r\n validationPath.byteLength_ +\r\n ').');\r\n }\r\n if (validationPath.parts_.length > MAX_PATH_DEPTH) {\r\n throw new Error(validationPath.errorPrefix_ +\r\n 'path specified exceeds the maximum depth that can be written (' +\r\n MAX_PATH_DEPTH +\r\n ') or object contains a cycle ' +\r\n validationPathToErrorString(validationPath));\r\n }\r\n}\r\n/**\r\n * String for use in error messages - uses '.' notation for path.\r\n */\r\nfunction validationPathToErrorString(validationPath) {\r\n if (validationPath.parts_.length === 0) {\r\n return '';\r\n }\r\n return \"in property '\" + validationPath.parts_.join('.') + \"'\";\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar VisibilityMonitor = /** @class */ (function (_super) {\r\n __extends(VisibilityMonitor, _super);\r\n function VisibilityMonitor() {\r\n var _this = _super.call(this, ['visible']) || this;\r\n var hidden;\r\n var visibilityChange;\r\n if (typeof document !== 'undefined' &&\r\n typeof document.addEventListener !== 'undefined') {\r\n if (typeof document['hidden'] !== 'undefined') {\r\n // Opera 12.10 and Firefox 18 and later support\r\n visibilityChange = 'visibilitychange';\r\n hidden = 'hidden';\r\n }\r\n else if (typeof document['mozHidden'] !== 'undefined') {\r\n visibilityChange = 'mozvisibilitychange';\r\n hidden = 'mozHidden';\r\n }\r\n else if (typeof document['msHidden'] !== 'undefined') {\r\n visibilityChange = 'msvisibilitychange';\r\n hidden = 'msHidden';\r\n }\r\n else if (typeof document['webkitHidden'] !== 'undefined') {\r\n visibilityChange = 'webkitvisibilitychange';\r\n hidden = 'webkitHidden';\r\n }\r\n }\r\n // Initially, we always assume we are visible. This ensures that in browsers\r\n // without page visibility support or in cases where we are never visible\r\n // (e.g. chrome extension), we act as if we are visible, i.e. don't delay\r\n // reconnects\r\n _this.visible_ = true;\r\n if (visibilityChange) {\r\n document.addEventListener(visibilityChange, function () {\r\n var visible = !document[hidden];\r\n if (visible !== _this.visible_) {\r\n _this.visible_ = visible;\r\n _this.trigger('visible', visible);\r\n }\r\n }, false);\r\n }\r\n return _this;\r\n }\r\n VisibilityMonitor.getInstance = function () {\r\n return new VisibilityMonitor();\r\n };\r\n VisibilityMonitor.prototype.getInitialEvent = function (eventType) {\r\n assert(eventType === 'visible', 'Unknown event type: ' + eventType);\r\n return [this.visible_];\r\n };\r\n return VisibilityMonitor;\r\n}(EventEmitter));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar RECONNECT_MIN_DELAY = 1000;\r\nvar RECONNECT_MAX_DELAY_DEFAULT = 60 * 5 * 1000; // 5 minutes in milliseconds (Case: 1858)\r\nvar GET_CONNECT_TIMEOUT = 3 * 1000;\r\nvar RECONNECT_MAX_DELAY_FOR_ADMINS = 30 * 1000; // 30 seconds for admin clients (likely to be a backend server)\r\nvar RECONNECT_DELAY_MULTIPLIER = 1.3;\r\nvar RECONNECT_DELAY_RESET_TIMEOUT = 30000; // Reset delay back to MIN_DELAY after being connected for 30sec.\r\nvar SERVER_KILL_INTERRUPT_REASON = 'server_kill';\r\n// If auth fails repeatedly, we'll assume something is wrong and log a warning / back off.\r\nvar INVALID_TOKEN_THRESHOLD = 3;\r\n/**\r\n * Firebase connection. Abstracts wire protocol and handles reconnecting.\r\n *\r\n * NOTE: All JSON objects sent to the realtime connection must have property names enclosed\r\n * in quotes to make sure the closure compiler does not minify them.\r\n */\r\nvar PersistentConnection = /** @class */ (function (_super) {\r\n __extends(PersistentConnection, _super);\r\n /**\r\n * @param repoInfo_ - Data about the namespace we are connecting to\r\n * @param applicationId_ - The Firebase App ID for this project\r\n * @param onDataUpdate_ - A callback for new data from the server\r\n */\r\n function PersistentConnection(repoInfo_, applicationId_, onDataUpdate_, onConnectStatus_, onServerInfoUpdate_, authTokenProvider_, appCheckTokenProvider_, authOverride_) {\r\n var _this = _super.call(this) || this;\r\n _this.repoInfo_ = repoInfo_;\r\n _this.applicationId_ = applicationId_;\r\n _this.onDataUpdate_ = onDataUpdate_;\r\n _this.onConnectStatus_ = onConnectStatus_;\r\n _this.onServerInfoUpdate_ = onServerInfoUpdate_;\r\n _this.authTokenProvider_ = authTokenProvider_;\r\n _this.appCheckTokenProvider_ = appCheckTokenProvider_;\r\n _this.authOverride_ = authOverride_;\r\n // Used for diagnostic logging.\r\n _this.id = PersistentConnection.nextPersistentConnectionId_++;\r\n _this.log_ = logWrapper('p:' + _this.id + ':');\r\n _this.interruptReasons_ = {};\r\n _this.listens = new Map();\r\n _this.outstandingPuts_ = [];\r\n _this.outstandingGets_ = [];\r\n _this.outstandingPutCount_ = 0;\r\n _this.outstandingGetCount_ = 0;\r\n _this.onDisconnectRequestQueue_ = [];\r\n _this.connected_ = false;\r\n _this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n _this.maxReconnectDelay_ = RECONNECT_MAX_DELAY_DEFAULT;\r\n _this.securityDebugCallback_ = null;\r\n _this.lastSessionId = null;\r\n _this.establishConnectionTimer_ = null;\r\n _this.visible_ = false;\r\n // Before we get connected, we keep a queue of pending messages to send.\r\n _this.requestCBHash_ = {};\r\n _this.requestNumber_ = 0;\r\n _this.realtime_ = null;\r\n _this.authToken_ = null;\r\n _this.appCheckToken_ = null;\r\n _this.forceTokenRefresh_ = false;\r\n _this.invalidAuthTokenCount_ = 0;\r\n _this.invalidAppCheckTokenCount_ = 0;\r\n _this.firstConnection_ = true;\r\n _this.lastConnectionAttemptTime_ = null;\r\n _this.lastConnectionEstablishedTime_ = null;\r\n if (authOverride_ && !isNodeSdk()) {\r\n throw new Error('Auth override specified in options, but not supported on non Node.js platforms');\r\n }\r\n VisibilityMonitor.getInstance().on('visible', _this.onVisible_, _this);\r\n if (repoInfo_.host.indexOf('fblocal') === -1) {\r\n OnlineMonitor.getInstance().on('online', _this.onOnline_, _this);\r\n }\r\n return _this;\r\n }\r\n PersistentConnection.prototype.sendRequest = function (action, body, onResponse) {\r\n var curReqNum = ++this.requestNumber_;\r\n var msg = { r: curReqNum, a: action, b: body };\r\n this.log_(stringify(msg));\r\n assert(this.connected_, \"sendRequest call when we're not connected not allowed.\");\r\n this.realtime_.sendRequest(msg);\r\n if (onResponse) {\r\n this.requestCBHash_[curReqNum] = onResponse;\r\n }\r\n };\r\n PersistentConnection.prototype.get = function (query) {\r\n var _this = this;\r\n this.initConnection_();\r\n var deferred = new Deferred();\r\n var request = {\r\n p: query._path.toString(),\r\n q: query._queryObject\r\n };\r\n var outstandingGet = {\r\n action: 'g',\r\n request: request,\r\n onComplete: function (message) {\r\n var payload = message['d'];\r\n if (message['s'] === 'ok') {\r\n _this.onDataUpdate_(request['p'], payload, \r\n /*isMerge*/ false, \r\n /*tag*/ null);\r\n deferred.resolve(payload);\r\n }\r\n else {\r\n deferred.reject(payload);\r\n }\r\n }\r\n };\r\n this.outstandingGets_.push(outstandingGet);\r\n this.outstandingGetCount_++;\r\n var index = this.outstandingGets_.length - 1;\r\n if (!this.connected_) {\r\n setTimeout(function () {\r\n var get = _this.outstandingGets_[index];\r\n if (get === undefined || outstandingGet !== get) {\r\n return;\r\n }\r\n delete _this.outstandingGets_[index];\r\n _this.outstandingGetCount_--;\r\n if (_this.outstandingGetCount_ === 0) {\r\n _this.outstandingGets_ = [];\r\n }\r\n _this.log_('get ' + index + ' timed out on connection');\r\n deferred.reject(new Error('Client is offline.'));\r\n }, GET_CONNECT_TIMEOUT);\r\n }\r\n if (this.connected_) {\r\n this.sendGet_(index);\r\n }\r\n return deferred.promise;\r\n };\r\n PersistentConnection.prototype.listen = function (query, currentHashFn, tag, onComplete) {\r\n this.initConnection_();\r\n var queryId = query._queryIdentifier;\r\n var pathString = query._path.toString();\r\n this.log_('Listen called for ' + pathString + ' ' + queryId);\r\n if (!this.listens.has(pathString)) {\r\n this.listens.set(pathString, new Map());\r\n }\r\n assert(query._queryParams.isDefault() || !query._queryParams.loadsAllData(), 'listen() called for non-default but complete query');\r\n assert(!this.listens.get(pathString).has(queryId), 'listen() called twice for same path/queryId.');\r\n var listenSpec = {\r\n onComplete: onComplete,\r\n hashFn: currentHashFn,\r\n query: query,\r\n tag: tag\r\n };\r\n this.listens.get(pathString).set(queryId, listenSpec);\r\n if (this.connected_) {\r\n this.sendListen_(listenSpec);\r\n }\r\n };\r\n PersistentConnection.prototype.sendGet_ = function (index) {\r\n var _this = this;\r\n var get = this.outstandingGets_[index];\r\n this.sendRequest('g', get.request, function (message) {\r\n delete _this.outstandingGets_[index];\r\n _this.outstandingGetCount_--;\r\n if (_this.outstandingGetCount_ === 0) {\r\n _this.outstandingGets_ = [];\r\n }\r\n if (get.onComplete) {\r\n get.onComplete(message);\r\n }\r\n });\r\n };\r\n PersistentConnection.prototype.sendListen_ = function (listenSpec) {\r\n var _this = this;\r\n var query = listenSpec.query;\r\n var pathString = query._path.toString();\r\n var queryId = query._queryIdentifier;\r\n this.log_('Listen on ' + pathString + ' for ' + queryId);\r\n var req = { /*path*/ p: pathString };\r\n var action = 'q';\r\n // Only bother to send query if it's non-default.\r\n if (listenSpec.tag) {\r\n req['q'] = query._queryObject;\r\n req['t'] = listenSpec.tag;\r\n }\r\n req[ /*hash*/'h'] = listenSpec.hashFn();\r\n this.sendRequest(action, req, function (message) {\r\n var payload = message[ /*data*/'d'];\r\n var status = message[ /*status*/'s'];\r\n // print warnings in any case...\r\n PersistentConnection.warnOnListenWarnings_(payload, query);\r\n var currentListenSpec = _this.listens.get(pathString) &&\r\n _this.listens.get(pathString).get(queryId);\r\n // only trigger actions if the listen hasn't been removed and readded\r\n if (currentListenSpec === listenSpec) {\r\n _this.log_('listen response', message);\r\n if (status !== 'ok') {\r\n _this.removeListen_(pathString, queryId);\r\n }\r\n if (listenSpec.onComplete) {\r\n listenSpec.onComplete(status, payload);\r\n }\r\n }\r\n });\r\n };\r\n PersistentConnection.warnOnListenWarnings_ = function (payload, query) {\r\n if (payload && typeof payload === 'object' && contains(payload, 'w')) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n var warnings = safeGet(payload, 'w');\r\n if (Array.isArray(warnings) && ~warnings.indexOf('no_index')) {\r\n var indexSpec = '\".indexOn\": \"' + query._queryParams.getIndex().toString() + '\"';\r\n var indexPath = query._path.toString();\r\n warn(\"Using an unspecified index. Your data will be downloaded and \" +\r\n (\"filtered on the client. Consider adding \" + indexSpec + \" at \") +\r\n (indexPath + \" to your security rules for better performance.\"));\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.refreshAuthToken = function (token) {\r\n this.authToken_ = token;\r\n this.log_('Auth token refreshed');\r\n if (this.authToken_) {\r\n this.tryAuth();\r\n }\r\n else {\r\n //If we're connected we want to let the server know to unauthenticate us. If we're not connected, simply delete\r\n //the credential so we dont become authenticated next time we connect.\r\n if (this.connected_) {\r\n this.sendRequest('unauth', {}, function () { });\r\n }\r\n }\r\n this.reduceReconnectDelayIfAdminCredential_(token);\r\n };\r\n PersistentConnection.prototype.reduceReconnectDelayIfAdminCredential_ = function (credential) {\r\n // NOTE: This isn't intended to be bulletproof (a malicious developer can always just modify the client).\r\n // Additionally, we don't bother resetting the max delay back to the default if auth fails / expires.\r\n var isFirebaseSecret = credential && credential.length === 40;\r\n if (isFirebaseSecret || isAdmin(credential)) {\r\n this.log_('Admin auth credential detected. Reducing max reconnect time.');\r\n this.maxReconnectDelay_ = RECONNECT_MAX_DELAY_FOR_ADMINS;\r\n }\r\n };\r\n PersistentConnection.prototype.refreshAppCheckToken = function (token) {\r\n this.appCheckToken_ = token;\r\n this.log_('App check token refreshed');\r\n if (this.appCheckToken_) {\r\n this.tryAppCheck();\r\n }\r\n else {\r\n //If we're connected we want to let the server know to unauthenticate us.\r\n //If we're not connected, simply delete the credential so we dont become\r\n // authenticated next time we connect.\r\n if (this.connected_) {\r\n this.sendRequest('unappeck', {}, function () { });\r\n }\r\n }\r\n };\r\n /**\r\n * Attempts to authenticate with the given credentials. If the authentication attempt fails, it's triggered like\r\n * a auth revoked (the connection is closed).\r\n */\r\n PersistentConnection.prototype.tryAuth = function () {\r\n var _this = this;\r\n if (this.connected_ && this.authToken_) {\r\n var token_1 = this.authToken_;\r\n var authMethod = isValidFormat(token_1) ? 'auth' : 'gauth';\r\n var requestData = { cred: token_1 };\r\n if (this.authOverride_ === null) {\r\n requestData['noauth'] = true;\r\n }\r\n else if (typeof this.authOverride_ === 'object') {\r\n requestData['authvar'] = this.authOverride_;\r\n }\r\n this.sendRequest(authMethod, requestData, function (res) {\r\n var status = res[ /*status*/'s'];\r\n var data = res[ /*data*/'d'] || 'error';\r\n if (_this.authToken_ === token_1) {\r\n if (status === 'ok') {\r\n _this.invalidAuthTokenCount_ = 0;\r\n }\r\n else {\r\n // Triggers reconnect and force refresh for auth token\r\n _this.onAuthRevoked_(status, data);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * Attempts to authenticate with the given token. If the authentication\r\n * attempt fails, it's triggered like the token was revoked (the connection is\r\n * closed).\r\n */\r\n PersistentConnection.prototype.tryAppCheck = function () {\r\n var _this = this;\r\n if (this.connected_ && this.appCheckToken_) {\r\n this.sendRequest('appcheck', { 'token': this.appCheckToken_ }, function (res) {\r\n var status = res[ /*status*/'s'];\r\n var data = res[ /*data*/'d'] || 'error';\r\n if (status === 'ok') {\r\n _this.invalidAppCheckTokenCount_ = 0;\r\n }\r\n else {\r\n _this.onAppCheckRevoked_(status, data);\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PersistentConnection.prototype.unlisten = function (query, tag) {\r\n var pathString = query._path.toString();\r\n var queryId = query._queryIdentifier;\r\n this.log_('Unlisten called for ' + pathString + ' ' + queryId);\r\n assert(query._queryParams.isDefault() || !query._queryParams.loadsAllData(), 'unlisten() called for non-default but complete query');\r\n var listen = this.removeListen_(pathString, queryId);\r\n if (listen && this.connected_) {\r\n this.sendUnlisten_(pathString, queryId, query._queryObject, tag);\r\n }\r\n };\r\n PersistentConnection.prototype.sendUnlisten_ = function (pathString, queryId, queryObj, tag) {\r\n this.log_('Unlisten on ' + pathString + ' for ' + queryId);\r\n var req = { /*path*/ p: pathString };\r\n var action = 'n';\r\n // Only bother sending queryId if it's non-default.\r\n if (tag) {\r\n req['q'] = queryObj;\r\n req['t'] = tag;\r\n }\r\n this.sendRequest(action, req);\r\n };\r\n PersistentConnection.prototype.onDisconnectPut = function (pathString, data, onComplete) {\r\n this.initConnection_();\r\n if (this.connected_) {\r\n this.sendOnDisconnect_('o', pathString, data, onComplete);\r\n }\r\n else {\r\n this.onDisconnectRequestQueue_.push({\r\n pathString: pathString,\r\n action: 'o',\r\n data: data,\r\n onComplete: onComplete\r\n });\r\n }\r\n };\r\n PersistentConnection.prototype.onDisconnectMerge = function (pathString, data, onComplete) {\r\n this.initConnection_();\r\n if (this.connected_) {\r\n this.sendOnDisconnect_('om', pathString, data, onComplete);\r\n }\r\n else {\r\n this.onDisconnectRequestQueue_.push({\r\n pathString: pathString,\r\n action: 'om',\r\n data: data,\r\n onComplete: onComplete\r\n });\r\n }\r\n };\r\n PersistentConnection.prototype.onDisconnectCancel = function (pathString, onComplete) {\r\n this.initConnection_();\r\n if (this.connected_) {\r\n this.sendOnDisconnect_('oc', pathString, null, onComplete);\r\n }\r\n else {\r\n this.onDisconnectRequestQueue_.push({\r\n pathString: pathString,\r\n action: 'oc',\r\n data: null,\r\n onComplete: onComplete\r\n });\r\n }\r\n };\r\n PersistentConnection.prototype.sendOnDisconnect_ = function (action, pathString, data, onComplete) {\r\n var request = { /*path*/ p: pathString, /*data*/ d: data };\r\n this.log_('onDisconnect ' + action, request);\r\n this.sendRequest(action, request, function (response) {\r\n if (onComplete) {\r\n setTimeout(function () {\r\n onComplete(response[ /*status*/'s'], response[ /* data */'d']);\r\n }, Math.floor(0));\r\n }\r\n });\r\n };\r\n PersistentConnection.prototype.put = function (pathString, data, onComplete, hash) {\r\n this.putInternal('p', pathString, data, onComplete, hash);\r\n };\r\n PersistentConnection.prototype.merge = function (pathString, data, onComplete, hash) {\r\n this.putInternal('m', pathString, data, onComplete, hash);\r\n };\r\n PersistentConnection.prototype.putInternal = function (action, pathString, data, onComplete, hash) {\r\n this.initConnection_();\r\n var request = {\r\n /*path*/ p: pathString,\r\n /*data*/ d: data\r\n };\r\n if (hash !== undefined) {\r\n request[ /*hash*/'h'] = hash;\r\n }\r\n // TODO: Only keep track of the most recent put for a given path?\r\n this.outstandingPuts_.push({\r\n action: action,\r\n request: request,\r\n onComplete: onComplete\r\n });\r\n this.outstandingPutCount_++;\r\n var index = this.outstandingPuts_.length - 1;\r\n if (this.connected_) {\r\n this.sendPut_(index);\r\n }\r\n else {\r\n this.log_('Buffering put: ' + pathString);\r\n }\r\n };\r\n PersistentConnection.prototype.sendPut_ = function (index) {\r\n var _this = this;\r\n var action = this.outstandingPuts_[index].action;\r\n var request = this.outstandingPuts_[index].request;\r\n var onComplete = this.outstandingPuts_[index].onComplete;\r\n this.outstandingPuts_[index].queued = this.connected_;\r\n this.sendRequest(action, request, function (message) {\r\n _this.log_(action + ' response', message);\r\n delete _this.outstandingPuts_[index];\r\n _this.outstandingPutCount_--;\r\n // Clean up array occasionally.\r\n if (_this.outstandingPutCount_ === 0) {\r\n _this.outstandingPuts_ = [];\r\n }\r\n if (onComplete) {\r\n onComplete(message[ /*status*/'s'], message[ /* data */'d']);\r\n }\r\n });\r\n };\r\n PersistentConnection.prototype.reportStats = function (stats) {\r\n var _this = this;\r\n // If we're not connected, we just drop the stats.\r\n if (this.connected_) {\r\n var request = { /*counters*/ c: stats };\r\n this.log_('reportStats', request);\r\n this.sendRequest(/*stats*/ 's', request, function (result) {\r\n var status = result[ /*status*/'s'];\r\n if (status !== 'ok') {\r\n var errorReason = result[ /* data */'d'];\r\n _this.log_('reportStats', 'Error sending stats: ' + errorReason);\r\n }\r\n });\r\n }\r\n };\r\n PersistentConnection.prototype.onDataMessage_ = function (message) {\r\n if ('r' in message) {\r\n // this is a response\r\n this.log_('from server: ' + stringify(message));\r\n var reqNum = message['r'];\r\n var onResponse = this.requestCBHash_[reqNum];\r\n if (onResponse) {\r\n delete this.requestCBHash_[reqNum];\r\n onResponse(message[ /*body*/'b']);\r\n }\r\n }\r\n else if ('error' in message) {\r\n throw 'A server-side error has occurred: ' + message['error'];\r\n }\r\n else if ('a' in message) {\r\n // a and b are action and body, respectively\r\n this.onDataPush_(message['a'], message['b']);\r\n }\r\n };\r\n PersistentConnection.prototype.onDataPush_ = function (action, body) {\r\n this.log_('handleServerMessage', action, body);\r\n if (action === 'd') {\r\n this.onDataUpdate_(body[ /*path*/'p'], body[ /*data*/'d'], \r\n /*isMerge*/ false, body['t']);\r\n }\r\n else if (action === 'm') {\r\n this.onDataUpdate_(body[ /*path*/'p'], body[ /*data*/'d'], \r\n /*isMerge=*/ true, body['t']);\r\n }\r\n else if (action === 'c') {\r\n this.onListenRevoked_(body[ /*path*/'p'], body[ /*query*/'q']);\r\n }\r\n else if (action === 'ac') {\r\n this.onAuthRevoked_(body[ /*status code*/'s'], body[ /* explanation */'d']);\r\n }\r\n else if (action === 'apc') {\r\n this.onAppCheckRevoked_(body[ /*status code*/'s'], body[ /* explanation */'d']);\r\n }\r\n else if (action === 'sd') {\r\n this.onSecurityDebugPacket_(body);\r\n }\r\n else {\r\n error('Unrecognized action received from server: ' +\r\n stringify(action) +\r\n '\\nAre you using the latest client?');\r\n }\r\n };\r\n PersistentConnection.prototype.onReady_ = function (timestamp, sessionId) {\r\n this.log_('connection ready');\r\n this.connected_ = true;\r\n this.lastConnectionEstablishedTime_ = new Date().getTime();\r\n this.handleTimestamp_(timestamp);\r\n this.lastSessionId = sessionId;\r\n if (this.firstConnection_) {\r\n this.sendConnectStats_();\r\n }\r\n this.restoreState_();\r\n this.firstConnection_ = false;\r\n this.onConnectStatus_(true);\r\n };\r\n PersistentConnection.prototype.scheduleConnect_ = function (timeout) {\r\n var _this = this;\r\n assert(!this.realtime_, \"Scheduling a connect when we're already connected/ing?\");\r\n if (this.establishConnectionTimer_) {\r\n clearTimeout(this.establishConnectionTimer_);\r\n }\r\n // NOTE: Even when timeout is 0, it's important to do a setTimeout to work around an infuriating \"Security Error\" in\r\n // Firefox when trying to write to our long-polling iframe in some scenarios (e.g. Forge or our unit tests).\r\n this.establishConnectionTimer_ = setTimeout(function () {\r\n _this.establishConnectionTimer_ = null;\r\n _this.establishConnection_();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n }, Math.floor(timeout));\r\n };\r\n PersistentConnection.prototype.initConnection_ = function () {\r\n if (!this.realtime_ && this.firstConnection_) {\r\n this.scheduleConnect_(0);\r\n }\r\n };\r\n PersistentConnection.prototype.onVisible_ = function (visible) {\r\n // NOTE: Tabbing away and back to a window will defeat our reconnect backoff, but I think that's fine.\r\n if (visible &&\r\n !this.visible_ &&\r\n this.reconnectDelay_ === this.maxReconnectDelay_) {\r\n this.log_('Window became visible. Reducing delay.');\r\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n if (!this.realtime_) {\r\n this.scheduleConnect_(0);\r\n }\r\n }\r\n this.visible_ = visible;\r\n };\r\n PersistentConnection.prototype.onOnline_ = function (online) {\r\n if (online) {\r\n this.log_('Browser went online.');\r\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n if (!this.realtime_) {\r\n this.scheduleConnect_(0);\r\n }\r\n }\r\n else {\r\n this.log_('Browser went offline. Killing connection.');\r\n if (this.realtime_) {\r\n this.realtime_.close();\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.onRealtimeDisconnect_ = function () {\r\n this.log_('data client disconnected');\r\n this.connected_ = false;\r\n this.realtime_ = null;\r\n // Since we don't know if our sent transactions succeeded or not, we need to cancel them.\r\n this.cancelSentTransactions_();\r\n // Clear out the pending requests.\r\n this.requestCBHash_ = {};\r\n if (this.shouldReconnect_()) {\r\n if (!this.visible_) {\r\n this.log_(\"Window isn't visible. Delaying reconnect.\");\r\n this.reconnectDelay_ = this.maxReconnectDelay_;\r\n this.lastConnectionAttemptTime_ = new Date().getTime();\r\n }\r\n else if (this.lastConnectionEstablishedTime_) {\r\n // If we've been connected long enough, reset reconnect delay to minimum.\r\n var timeSinceLastConnectSucceeded = new Date().getTime() - this.lastConnectionEstablishedTime_;\r\n if (timeSinceLastConnectSucceeded > RECONNECT_DELAY_RESET_TIMEOUT) {\r\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n }\r\n this.lastConnectionEstablishedTime_ = null;\r\n }\r\n var timeSinceLastConnectAttempt = new Date().getTime() - this.lastConnectionAttemptTime_;\r\n var reconnectDelay = Math.max(0, this.reconnectDelay_ - timeSinceLastConnectAttempt);\r\n reconnectDelay = Math.random() * reconnectDelay;\r\n this.log_('Trying to reconnect in ' + reconnectDelay + 'ms');\r\n this.scheduleConnect_(reconnectDelay);\r\n // Adjust reconnect delay for next time.\r\n this.reconnectDelay_ = Math.min(this.maxReconnectDelay_, this.reconnectDelay_ * RECONNECT_DELAY_MULTIPLIER);\r\n }\r\n this.onConnectStatus_(false);\r\n };\r\n PersistentConnection.prototype.establishConnection_ = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var onDataMessage, onReady, onDisconnect_1, connId, lastSessionId, canceled_1, connection_1, closeFn, sendRequestFn, forceRefresh, _a, authToken, appCheckToken, error_1;\r\n var _this = this;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n if (!this.shouldReconnect_()) return [3 /*break*/, 4];\r\n this.log_('Making a connection attempt');\r\n this.lastConnectionAttemptTime_ = new Date().getTime();\r\n this.lastConnectionEstablishedTime_ = null;\r\n onDataMessage = this.onDataMessage_.bind(this);\r\n onReady = this.onReady_.bind(this);\r\n onDisconnect_1 = this.onRealtimeDisconnect_.bind(this);\r\n connId = this.id + ':' + PersistentConnection.nextConnectionId_++;\r\n lastSessionId = this.lastSessionId;\r\n canceled_1 = false;\r\n connection_1 = null;\r\n closeFn = function () {\r\n if (connection_1) {\r\n connection_1.close();\r\n }\r\n else {\r\n canceled_1 = true;\r\n onDisconnect_1();\r\n }\r\n };\r\n sendRequestFn = function (msg) {\r\n assert(connection_1, \"sendRequest call when we're not connected not allowed.\");\r\n connection_1.sendRequest(msg);\r\n };\r\n this.realtime_ = {\r\n close: closeFn,\r\n sendRequest: sendRequestFn\r\n };\r\n forceRefresh = this.forceTokenRefresh_;\r\n this.forceTokenRefresh_ = false;\r\n _b.label = 1;\r\n case 1:\r\n _b.trys.push([1, 3, , 4]);\r\n return [4 /*yield*/, Promise.all([\r\n this.authTokenProvider_.getToken(forceRefresh),\r\n this.appCheckTokenProvider_.getToken(forceRefresh)\r\n ])];\r\n case 2:\r\n _a = __read.apply(void 0, [_b.sent(), 2]), authToken = _a[0], appCheckToken = _a[1];\r\n if (!canceled_1) {\r\n log('getToken() completed. Creating connection.');\r\n this.authToken_ = authToken && authToken.accessToken;\r\n this.appCheckToken_ = appCheckToken && appCheckToken.token;\r\n connection_1 = new Connection(connId, this.repoInfo_, this.applicationId_, this.appCheckToken_, this.authToken_, onDataMessage, onReady, onDisconnect_1, \r\n /* onKill= */ function (reason) {\r\n warn(reason + ' (' + _this.repoInfo_.toString() + ')');\r\n _this.interrupt(SERVER_KILL_INTERRUPT_REASON);\r\n }, lastSessionId);\r\n }\r\n else {\r\n log('getToken() completed but was canceled');\r\n }\r\n return [3 /*break*/, 4];\r\n case 3:\r\n error_1 = _b.sent();\r\n this.log_('Failed to get token: ' + error_1);\r\n if (!canceled_1) {\r\n if (this.repoInfo_.nodeAdmin) {\r\n // This may be a critical error for the Admin Node.js SDK, so log a warning.\r\n // But getToken() may also just have temporarily failed, so we still want to\r\n // continue retrying.\r\n warn(error_1);\r\n }\r\n closeFn();\r\n }\r\n return [3 /*break*/, 4];\r\n case 4: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n PersistentConnection.prototype.interrupt = function (reason) {\r\n log('Interrupting connection for reason: ' + reason);\r\n this.interruptReasons_[reason] = true;\r\n if (this.realtime_) {\r\n this.realtime_.close();\r\n }\r\n else {\r\n if (this.establishConnectionTimer_) {\r\n clearTimeout(this.establishConnectionTimer_);\r\n this.establishConnectionTimer_ = null;\r\n }\r\n if (this.connected_) {\r\n this.onRealtimeDisconnect_();\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.resume = function (reason) {\r\n log('Resuming connection for reason: ' + reason);\r\n delete this.interruptReasons_[reason];\r\n if (isEmpty(this.interruptReasons_)) {\r\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n if (!this.realtime_) {\r\n this.scheduleConnect_(0);\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.handleTimestamp_ = function (timestamp) {\r\n var delta = timestamp - new Date().getTime();\r\n this.onServerInfoUpdate_({ serverTimeOffset: delta });\r\n };\r\n PersistentConnection.prototype.cancelSentTransactions_ = function () {\r\n for (var i = 0; i < this.outstandingPuts_.length; i++) {\r\n var put = this.outstandingPuts_[i];\r\n if (put && /*hash*/ 'h' in put.request && put.queued) {\r\n if (put.onComplete) {\r\n put.onComplete('disconnect');\r\n }\r\n delete this.outstandingPuts_[i];\r\n this.outstandingPutCount_--;\r\n }\r\n }\r\n // Clean up array occasionally.\r\n if (this.outstandingPutCount_ === 0) {\r\n this.outstandingPuts_ = [];\r\n }\r\n };\r\n PersistentConnection.prototype.onListenRevoked_ = function (pathString, query) {\r\n // Remove the listen and manufacture a \"permission_denied\" error for the failed listen.\r\n var queryId;\r\n if (!query) {\r\n queryId = 'default';\r\n }\r\n else {\r\n queryId = query.map(function (q) { return ObjectToUniqueKey(q); }).join('$');\r\n }\r\n var listen = this.removeListen_(pathString, queryId);\r\n if (listen && listen.onComplete) {\r\n listen.onComplete('permission_denied');\r\n }\r\n };\r\n PersistentConnection.prototype.removeListen_ = function (pathString, queryId) {\r\n var normalizedPathString = new Path(pathString).toString(); // normalize path.\r\n var listen;\r\n if (this.listens.has(normalizedPathString)) {\r\n var map = this.listens.get(normalizedPathString);\r\n listen = map.get(queryId);\r\n map.delete(queryId);\r\n if (map.size === 0) {\r\n this.listens.delete(normalizedPathString);\r\n }\r\n }\r\n else {\r\n // all listens for this path has already been removed\r\n listen = undefined;\r\n }\r\n return listen;\r\n };\r\n PersistentConnection.prototype.onAuthRevoked_ = function (statusCode, explanation) {\r\n log('Auth token revoked: ' + statusCode + '/' + explanation);\r\n this.authToken_ = null;\r\n this.forceTokenRefresh_ = true;\r\n this.realtime_.close();\r\n if (statusCode === 'invalid_token' || statusCode === 'permission_denied') {\r\n // We'll wait a couple times before logging the warning / increasing the\r\n // retry period since oauth tokens will report as \"invalid\" if they're\r\n // just expired. Plus there may be transient issues that resolve themselves.\r\n this.invalidAuthTokenCount_++;\r\n if (this.invalidAuthTokenCount_ >= INVALID_TOKEN_THRESHOLD) {\r\n // Set a long reconnect delay because recovery is unlikely\r\n this.reconnectDelay_ = RECONNECT_MAX_DELAY_FOR_ADMINS;\r\n // Notify the auth token provider that the token is invalid, which will log\r\n // a warning\r\n this.authTokenProvider_.notifyForInvalidToken();\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.onAppCheckRevoked_ = function (statusCode, explanation) {\r\n log('App check token revoked: ' + statusCode + '/' + explanation);\r\n this.appCheckToken_ = null;\r\n this.forceTokenRefresh_ = true;\r\n // Note: We don't close the connection as the developer may not have\r\n // enforcement enabled. The backend closes connections with enforcements.\r\n if (statusCode === 'invalid_token' || statusCode === 'permission_denied') {\r\n // We'll wait a couple times before logging the warning / increasing the\r\n // retry period since oauth tokens will report as \"invalid\" if they're\r\n // just expired. Plus there may be transient issues that resolve themselves.\r\n this.invalidAppCheckTokenCount_++;\r\n if (this.invalidAppCheckTokenCount_ >= INVALID_TOKEN_THRESHOLD) {\r\n this.appCheckTokenProvider_.notifyForInvalidToken();\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.onSecurityDebugPacket_ = function (body) {\r\n if (this.securityDebugCallback_) {\r\n this.securityDebugCallback_(body);\r\n }\r\n else {\r\n if ('msg' in body) {\r\n console.log('FIREBASE: ' + body['msg'].replace('\\n', '\\nFIREBASE: '));\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.restoreState_ = function () {\r\n var e_1, _a, e_2, _b;\r\n //Re-authenticate ourselves if we have a credential stored.\r\n this.tryAuth();\r\n this.tryAppCheck();\r\n try {\r\n // Puts depend on having received the corresponding data update from the server before they complete, so we must\r\n // make sure to send listens before puts.\r\n for (var _c = __values(this.listens.values()), _d = _c.next(); !_d.done; _d = _c.next()) {\r\n var queries = _d.value;\r\n try {\r\n for (var _e = (e_2 = void 0, __values(queries.values())), _f = _e.next(); !_f.done; _f = _e.next()) {\r\n var listenSpec = _f.value;\r\n this.sendListen_(listenSpec);\r\n }\r\n }\r\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\r\n finally {\r\n try {\r\n if (_f && !_f.done && (_b = _e.return)) _b.call(_e);\r\n }\r\n finally { if (e_2) throw e_2.error; }\r\n }\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n for (var i = 0; i < this.outstandingPuts_.length; i++) {\r\n if (this.outstandingPuts_[i]) {\r\n this.sendPut_(i);\r\n }\r\n }\r\n while (this.onDisconnectRequestQueue_.length) {\r\n var request = this.onDisconnectRequestQueue_.shift();\r\n this.sendOnDisconnect_(request.action, request.pathString, request.data, request.onComplete);\r\n }\r\n for (var i = 0; i < this.outstandingGets_.length; i++) {\r\n if (this.outstandingGets_[i]) {\r\n this.sendGet_(i);\r\n }\r\n }\r\n };\r\n /**\r\n * Sends client stats for first connection\r\n */\r\n PersistentConnection.prototype.sendConnectStats_ = function () {\r\n var stats = {};\r\n var clientName = 'js';\r\n if (isNodeSdk()) {\r\n if (this.repoInfo_.nodeAdmin) {\r\n clientName = 'admin_node';\r\n }\r\n else {\r\n clientName = 'node';\r\n }\r\n }\r\n stats['sdk.' + clientName + '.' + SDK_VERSION.replace(/\\./g, '-')] = 1;\r\n if (isMobileCordova()) {\r\n stats['framework.cordova'] = 1;\r\n }\r\n else if (isReactNative()) {\r\n stats['framework.reactnative'] = 1;\r\n }\r\n this.reportStats(stats);\r\n };\r\n PersistentConnection.prototype.shouldReconnect_ = function () {\r\n var online = OnlineMonitor.getInstance().currentlyOnline();\r\n return isEmpty(this.interruptReasons_) && online;\r\n };\r\n PersistentConnection.nextPersistentConnectionId_ = 0;\r\n /**\r\n * Counter for number of connections created. Mainly used for tagging in the logs\r\n */\r\n PersistentConnection.nextConnectionId_ = 0;\r\n return PersistentConnection;\r\n}(ServerActions));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar NamedNode = /** @class */ (function () {\r\n function NamedNode(name, node) {\r\n this.name = name;\r\n this.node = node;\r\n }\r\n NamedNode.Wrap = function (name, node) {\r\n return new NamedNode(name, node);\r\n };\r\n return NamedNode;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar Index = /** @class */ (function () {\r\n function Index() {\r\n }\r\n /**\r\n * @returns A standalone comparison function for\r\n * this index\r\n */\r\n Index.prototype.getCompare = function () {\r\n return this.compare.bind(this);\r\n };\r\n /**\r\n * Given a before and after value for a node, determine if the indexed value has changed. Even if they are different,\r\n * it's possible that the changes are isolated to parts of the snapshot that are not indexed.\r\n *\r\n *\r\n * @returns True if the portion of the snapshot being indexed changed between oldNode and newNode\r\n */\r\n Index.prototype.indexedValueChanged = function (oldNode, newNode) {\r\n var oldWrapped = new NamedNode(MIN_NAME, oldNode);\r\n var newWrapped = new NamedNode(MIN_NAME, newNode);\r\n return this.compare(oldWrapped, newWrapped) !== 0;\r\n };\r\n /**\r\n * @returns a node wrapper that will sort equal to or less than\r\n * any other node wrapper, using this index\r\n */\r\n Index.prototype.minPost = function () {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return NamedNode.MIN;\r\n };\r\n return Index;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar __EMPTY_NODE;\r\nvar KeyIndex = /** @class */ (function (_super) {\r\n __extends(KeyIndex, _super);\r\n function KeyIndex() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n Object.defineProperty(KeyIndex, \"__EMPTY_NODE\", {\r\n get: function () {\r\n return __EMPTY_NODE;\r\n },\r\n set: function (val) {\r\n __EMPTY_NODE = val;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n KeyIndex.prototype.compare = function (a, b) {\r\n return nameCompare(a.name, b.name);\r\n };\r\n KeyIndex.prototype.isDefinedOn = function (node) {\r\n // We could probably return true here (since every node has a key), but it's never called\r\n // so just leaving unimplemented for now.\r\n throw assertionError('KeyIndex.isDefinedOn not expected to be called.');\r\n };\r\n KeyIndex.prototype.indexedValueChanged = function (oldNode, newNode) {\r\n return false; // The key for a node never changes.\r\n };\r\n KeyIndex.prototype.minPost = function () {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return NamedNode.MIN;\r\n };\r\n KeyIndex.prototype.maxPost = function () {\r\n // TODO: This should really be created once and cached in a static property, but\r\n // NamedNode isn't defined yet, so I can't use it in a static. Bleh.\r\n return new NamedNode(MAX_NAME, __EMPTY_NODE);\r\n };\r\n KeyIndex.prototype.makePost = function (indexValue, name) {\r\n assert(typeof indexValue === 'string', 'KeyIndex indexValue must always be a string.');\r\n // We just use empty node, but it'll never be compared, since our comparator only looks at name.\r\n return new NamedNode(indexValue, __EMPTY_NODE);\r\n };\r\n /**\r\n * @returns String representation for inclusion in a query spec\r\n */\r\n KeyIndex.prototype.toString = function () {\r\n return '.key';\r\n };\r\n return KeyIndex;\r\n}(Index));\r\nvar KEY_INDEX = new KeyIndex();\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An iterator over an LLRBNode.\r\n */\r\nvar SortedMapIterator = /** @class */ (function () {\r\n /**\r\n * @param node - Node to iterate.\r\n * @param isReverse_ - Whether or not to iterate in reverse\r\n */\r\n function SortedMapIterator(node, startKey, comparator, isReverse_, resultGenerator_) {\r\n if (resultGenerator_ === void 0) { resultGenerator_ = null; }\r\n this.isReverse_ = isReverse_;\r\n this.resultGenerator_ = resultGenerator_;\r\n this.nodeStack_ = [];\r\n var cmp = 1;\r\n while (!node.isEmpty()) {\r\n node = node;\r\n cmp = startKey ? comparator(node.key, startKey) : 1;\r\n // flip the comparison if we're going in reverse\r\n if (isReverse_) {\r\n cmp *= -1;\r\n }\r\n if (cmp < 0) {\r\n // This node is less than our start key. ignore it\r\n if (this.isReverse_) {\r\n node = node.left;\r\n }\r\n else {\r\n node = node.right;\r\n }\r\n }\r\n else if (cmp === 0) {\r\n // This node is exactly equal to our start key. Push it on the stack, but stop iterating;\r\n this.nodeStack_.push(node);\r\n break;\r\n }\r\n else {\r\n // This node is greater than our start key, add it to the stack and move to the next one\r\n this.nodeStack_.push(node);\r\n if (this.isReverse_) {\r\n node = node.right;\r\n }\r\n else {\r\n node = node.left;\r\n }\r\n }\r\n }\r\n }\r\n SortedMapIterator.prototype.getNext = function () {\r\n if (this.nodeStack_.length === 0) {\r\n return null;\r\n }\r\n var node = this.nodeStack_.pop();\r\n var result;\r\n if (this.resultGenerator_) {\r\n result = this.resultGenerator_(node.key, node.value);\r\n }\r\n else {\r\n result = { key: node.key, value: node.value };\r\n }\r\n if (this.isReverse_) {\r\n node = node.left;\r\n while (!node.isEmpty()) {\r\n this.nodeStack_.push(node);\r\n node = node.right;\r\n }\r\n }\r\n else {\r\n node = node.right;\r\n while (!node.isEmpty()) {\r\n this.nodeStack_.push(node);\r\n node = node.left;\r\n }\r\n }\r\n return result;\r\n };\r\n SortedMapIterator.prototype.hasNext = function () {\r\n return this.nodeStack_.length > 0;\r\n };\r\n SortedMapIterator.prototype.peek = function () {\r\n if (this.nodeStack_.length === 0) {\r\n return null;\r\n }\r\n var node = this.nodeStack_[this.nodeStack_.length - 1];\r\n if (this.resultGenerator_) {\r\n return this.resultGenerator_(node.key, node.value);\r\n }\r\n else {\r\n return { key: node.key, value: node.value };\r\n }\r\n };\r\n return SortedMapIterator;\r\n}());\r\n/**\r\n * Represents a node in a Left-leaning Red-Black tree.\r\n */\r\nvar LLRBNode = /** @class */ (function () {\r\n /**\r\n * @param key - Key associated with this node.\r\n * @param value - Value associated with this node.\r\n * @param color - Whether this node is red.\r\n * @param left - Left child.\r\n * @param right - Right child.\r\n */\r\n function LLRBNode(key, value, color, left, right) {\r\n this.key = key;\r\n this.value = value;\r\n this.color = color != null ? color : LLRBNode.RED;\r\n this.left =\r\n left != null ? left : SortedMap.EMPTY_NODE;\r\n this.right =\r\n right != null ? right : SortedMap.EMPTY_NODE;\r\n }\r\n /**\r\n * Returns a copy of the current node, optionally replacing pieces of it.\r\n *\r\n * @param key - New key for the node, or null.\r\n * @param value - New value for the node, or null.\r\n * @param color - New color for the node, or null.\r\n * @param left - New left child for the node, or null.\r\n * @param right - New right child for the node, or null.\r\n * @returns The node copy.\r\n */\r\n LLRBNode.prototype.copy = function (key, value, color, left, right) {\r\n return new LLRBNode(key != null ? key : this.key, value != null ? value : this.value, color != null ? color : this.color, left != null ? left : this.left, right != null ? right : this.right);\r\n };\r\n /**\r\n * @returns The total number of nodes in the tree.\r\n */\r\n LLRBNode.prototype.count = function () {\r\n return this.left.count() + 1 + this.right.count();\r\n };\r\n /**\r\n * @returns True if the tree is empty.\r\n */\r\n LLRBNode.prototype.isEmpty = function () {\r\n return false;\r\n };\r\n /**\r\n * Traverses the tree in key order and calls the specified action function\r\n * for each node.\r\n *\r\n * @param action - Callback function to be called for each\r\n * node. If it returns true, traversal is aborted.\r\n * @returns The first truthy value returned by action, or the last falsey\r\n * value returned by action\r\n */\r\n LLRBNode.prototype.inorderTraversal = function (action) {\r\n return (this.left.inorderTraversal(action) ||\r\n !!action(this.key, this.value) ||\r\n this.right.inorderTraversal(action));\r\n };\r\n /**\r\n * Traverses the tree in reverse key order and calls the specified action function\r\n * for each node.\r\n *\r\n * @param action - Callback function to be called for each\r\n * node. If it returns true, traversal is aborted.\r\n * @returns True if traversal was aborted.\r\n */\r\n LLRBNode.prototype.reverseTraversal = function (action) {\r\n return (this.right.reverseTraversal(action) ||\r\n action(this.key, this.value) ||\r\n this.left.reverseTraversal(action));\r\n };\r\n /**\r\n * @returns The minimum node in the tree.\r\n */\r\n LLRBNode.prototype.min_ = function () {\r\n if (this.left.isEmpty()) {\r\n return this;\r\n }\r\n else {\r\n return this.left.min_();\r\n }\r\n };\r\n /**\r\n * @returns The maximum key in the tree.\r\n */\r\n LLRBNode.prototype.minKey = function () {\r\n return this.min_().key;\r\n };\r\n /**\r\n * @returns The maximum key in the tree.\r\n */\r\n LLRBNode.prototype.maxKey = function () {\r\n if (this.right.isEmpty()) {\r\n return this.key;\r\n }\r\n else {\r\n return this.right.maxKey();\r\n }\r\n };\r\n /**\r\n * @param key - Key to insert.\r\n * @param value - Value to insert.\r\n * @param comparator - Comparator.\r\n * @returns New tree, with the key/value added.\r\n */\r\n LLRBNode.prototype.insert = function (key, value, comparator) {\r\n var n = this;\r\n var cmp = comparator(key, n.key);\r\n if (cmp < 0) {\r\n n = n.copy(null, null, null, n.left.insert(key, value, comparator), null);\r\n }\r\n else if (cmp === 0) {\r\n n = n.copy(null, value, null, null, null);\r\n }\r\n else {\r\n n = n.copy(null, null, null, null, n.right.insert(key, value, comparator));\r\n }\r\n return n.fixUp_();\r\n };\r\n /**\r\n * @returns New tree, with the minimum key removed.\r\n */\r\n LLRBNode.prototype.removeMin_ = function () {\r\n if (this.left.isEmpty()) {\r\n return SortedMap.EMPTY_NODE;\r\n }\r\n var n = this;\r\n if (!n.left.isRed_() && !n.left.left.isRed_()) {\r\n n = n.moveRedLeft_();\r\n }\r\n n = n.copy(null, null, null, n.left.removeMin_(), null);\r\n return n.fixUp_();\r\n };\r\n /**\r\n * @param key - The key of the item to remove.\r\n * @param comparator - Comparator.\r\n * @returns New tree, with the specified item removed.\r\n */\r\n LLRBNode.prototype.remove = function (key, comparator) {\r\n var n, smallest;\r\n n = this;\r\n if (comparator(key, n.key) < 0) {\r\n if (!n.left.isEmpty() && !n.left.isRed_() && !n.left.left.isRed_()) {\r\n n = n.moveRedLeft_();\r\n }\r\n n = n.copy(null, null, null, n.left.remove(key, comparator), null);\r\n }\r\n else {\r\n if (n.left.isRed_()) {\r\n n = n.rotateRight_();\r\n }\r\n if (!n.right.isEmpty() && !n.right.isRed_() && !n.right.left.isRed_()) {\r\n n = n.moveRedRight_();\r\n }\r\n if (comparator(key, n.key) === 0) {\r\n if (n.right.isEmpty()) {\r\n return SortedMap.EMPTY_NODE;\r\n }\r\n else {\r\n smallest = n.right.min_();\r\n n = n.copy(smallest.key, smallest.value, null, null, n.right.removeMin_());\r\n }\r\n }\r\n n = n.copy(null, null, null, null, n.right.remove(key, comparator));\r\n }\r\n return n.fixUp_();\r\n };\r\n /**\r\n * @returns Whether this is a RED node.\r\n */\r\n LLRBNode.prototype.isRed_ = function () {\r\n return this.color;\r\n };\r\n /**\r\n * @returns New tree after performing any needed rotations.\r\n */\r\n LLRBNode.prototype.fixUp_ = function () {\r\n var n = this;\r\n if (n.right.isRed_() && !n.left.isRed_()) {\r\n n = n.rotateLeft_();\r\n }\r\n if (n.left.isRed_() && n.left.left.isRed_()) {\r\n n = n.rotateRight_();\r\n }\r\n if (n.left.isRed_() && n.right.isRed_()) {\r\n n = n.colorFlip_();\r\n }\r\n return n;\r\n };\r\n /**\r\n * @returns New tree, after moveRedLeft.\r\n */\r\n LLRBNode.prototype.moveRedLeft_ = function () {\r\n var n = this.colorFlip_();\r\n if (n.right.left.isRed_()) {\r\n n = n.copy(null, null, null, null, n.right.rotateRight_());\r\n n = n.rotateLeft_();\r\n n = n.colorFlip_();\r\n }\r\n return n;\r\n };\r\n /**\r\n * @returns New tree, after moveRedRight.\r\n */\r\n LLRBNode.prototype.moveRedRight_ = function () {\r\n var n = this.colorFlip_();\r\n if (n.left.left.isRed_()) {\r\n n = n.rotateRight_();\r\n n = n.colorFlip_();\r\n }\r\n return n;\r\n };\r\n /**\r\n * @returns New tree, after rotateLeft.\r\n */\r\n LLRBNode.prototype.rotateLeft_ = function () {\r\n var nl = this.copy(null, null, LLRBNode.RED, null, this.right.left);\r\n return this.right.copy(null, null, this.color, nl, null);\r\n };\r\n /**\r\n * @returns New tree, after rotateRight.\r\n */\r\n LLRBNode.prototype.rotateRight_ = function () {\r\n var nr = this.copy(null, null, LLRBNode.RED, this.left.right, null);\r\n return this.left.copy(null, null, this.color, null, nr);\r\n };\r\n /**\r\n * @returns Newt ree, after colorFlip.\r\n */\r\n LLRBNode.prototype.colorFlip_ = function () {\r\n var left = this.left.copy(null, null, !this.left.color, null, null);\r\n var right = this.right.copy(null, null, !this.right.color, null, null);\r\n return this.copy(null, null, !this.color, left, right);\r\n };\r\n /**\r\n * For testing.\r\n *\r\n * @returns True if all is well.\r\n */\r\n LLRBNode.prototype.checkMaxDepth_ = function () {\r\n var blackDepth = this.check_();\r\n return Math.pow(2.0, blackDepth) <= this.count() + 1;\r\n };\r\n LLRBNode.prototype.check_ = function () {\r\n if (this.isRed_() && this.left.isRed_()) {\r\n throw new Error('Red node has red child(' + this.key + ',' + this.value + ')');\r\n }\r\n if (this.right.isRed_()) {\r\n throw new Error('Right child of (' + this.key + ',' + this.value + ') is red');\r\n }\r\n var blackDepth = this.left.check_();\r\n if (blackDepth !== this.right.check_()) {\r\n throw new Error('Black depths differ');\r\n }\r\n else {\r\n return blackDepth + (this.isRed_() ? 0 : 1);\r\n }\r\n };\r\n LLRBNode.RED = true;\r\n LLRBNode.BLACK = false;\r\n return LLRBNode;\r\n}());\r\n/**\r\n * Represents an empty node (a leaf node in the Red-Black Tree).\r\n */\r\nvar LLRBEmptyNode = /** @class */ (function () {\r\n function LLRBEmptyNode() {\r\n }\r\n /**\r\n * Returns a copy of the current node.\r\n *\r\n * @returns The node copy.\r\n */\r\n LLRBEmptyNode.prototype.copy = function (key, value, color, left, right) {\r\n return this;\r\n };\r\n /**\r\n * Returns a copy of the tree, with the specified key/value added.\r\n *\r\n * @param key - Key to be added.\r\n * @param value - Value to be added.\r\n * @param comparator - Comparator.\r\n * @returns New tree, with item added.\r\n */\r\n LLRBEmptyNode.prototype.insert = function (key, value, comparator) {\r\n return new LLRBNode(key, value, null);\r\n };\r\n /**\r\n * Returns a copy of the tree, with the specified key removed.\r\n *\r\n * @param key - The key to remove.\r\n * @param comparator - Comparator.\r\n * @returns New tree, with item removed.\r\n */\r\n LLRBEmptyNode.prototype.remove = function (key, comparator) {\r\n return this;\r\n };\r\n /**\r\n * @returns The total number of nodes in the tree.\r\n */\r\n LLRBEmptyNode.prototype.count = function () {\r\n return 0;\r\n };\r\n /**\r\n * @returns True if the tree is empty.\r\n */\r\n LLRBEmptyNode.prototype.isEmpty = function () {\r\n return true;\r\n };\r\n /**\r\n * Traverses the tree in key order and calls the specified action function\r\n * for each node.\r\n *\r\n * @param action - Callback function to be called for each\r\n * node. If it returns true, traversal is aborted.\r\n * @returns True if traversal was aborted.\r\n */\r\n LLRBEmptyNode.prototype.inorderTraversal = function (action) {\r\n return false;\r\n };\r\n /**\r\n * Traverses the tree in reverse key order and calls the specified action function\r\n * for each node.\r\n *\r\n * @param action - Callback function to be called for each\r\n * node. If it returns true, traversal is aborted.\r\n * @returns True if traversal was aborted.\r\n */\r\n LLRBEmptyNode.prototype.reverseTraversal = function (action) {\r\n return false;\r\n };\r\n LLRBEmptyNode.prototype.minKey = function () {\r\n return null;\r\n };\r\n LLRBEmptyNode.prototype.maxKey = function () {\r\n return null;\r\n };\r\n LLRBEmptyNode.prototype.check_ = function () {\r\n return 0;\r\n };\r\n /**\r\n * @returns Whether this node is red.\r\n */\r\n LLRBEmptyNode.prototype.isRed_ = function () {\r\n return false;\r\n };\r\n return LLRBEmptyNode;\r\n}());\r\n/**\r\n * An immutable sorted map implementation, based on a Left-leaning Red-Black\r\n * tree.\r\n */\r\nvar SortedMap = /** @class */ (function () {\r\n /**\r\n * @param comparator_ - Key comparator.\r\n * @param root_ - Optional root node for the map.\r\n */\r\n function SortedMap(comparator_, root_) {\r\n if (root_ === void 0) { root_ = SortedMap.EMPTY_NODE; }\r\n this.comparator_ = comparator_;\r\n this.root_ = root_;\r\n }\r\n /**\r\n * Returns a copy of the map, with the specified key/value added or replaced.\r\n * (TODO: We should perhaps rename this method to 'put')\r\n *\r\n * @param key - Key to be added.\r\n * @param value - Value to be added.\r\n * @returns New map, with item added.\r\n */\r\n SortedMap.prototype.insert = function (key, value) {\r\n return new SortedMap(this.comparator_, this.root_\r\n .insert(key, value, this.comparator_)\r\n .copy(null, null, LLRBNode.BLACK, null, null));\r\n };\r\n /**\r\n * Returns a copy of the map, with the specified key removed.\r\n *\r\n * @param key - The key to remove.\r\n * @returns New map, with item removed.\r\n */\r\n SortedMap.prototype.remove = function (key) {\r\n return new SortedMap(this.comparator_, this.root_\r\n .remove(key, this.comparator_)\r\n .copy(null, null, LLRBNode.BLACK, null, null));\r\n };\r\n /**\r\n * Returns the value of the node with the given key, or null.\r\n *\r\n * @param key - The key to look up.\r\n * @returns The value of the node with the given key, or null if the\r\n * key doesn't exist.\r\n */\r\n SortedMap.prototype.get = function (key) {\r\n var cmp;\r\n var node = this.root_;\r\n while (!node.isEmpty()) {\r\n cmp = this.comparator_(key, node.key);\r\n if (cmp === 0) {\r\n return node.value;\r\n }\r\n else if (cmp < 0) {\r\n node = node.left;\r\n }\r\n else if (cmp > 0) {\r\n node = node.right;\r\n }\r\n }\r\n return null;\r\n };\r\n /**\r\n * Returns the key of the item *before* the specified key, or null if key is the first item.\r\n * @param key - The key to find the predecessor of\r\n * @returns The predecessor key.\r\n */\r\n SortedMap.prototype.getPredecessorKey = function (key) {\r\n var cmp, node = this.root_, rightParent = null;\r\n while (!node.isEmpty()) {\r\n cmp = this.comparator_(key, node.key);\r\n if (cmp === 0) {\r\n if (!node.left.isEmpty()) {\r\n node = node.left;\r\n while (!node.right.isEmpty()) {\r\n node = node.right;\r\n }\r\n return node.key;\r\n }\r\n else if (rightParent) {\r\n return rightParent.key;\r\n }\r\n else {\r\n return null; // first item.\r\n }\r\n }\r\n else if (cmp < 0) {\r\n node = node.left;\r\n }\r\n else if (cmp > 0) {\r\n rightParent = node;\r\n node = node.right;\r\n }\r\n }\r\n throw new Error('Attempted to find predecessor key for a nonexistent key. What gives?');\r\n };\r\n /**\r\n * @returns True if the map is empty.\r\n */\r\n SortedMap.prototype.isEmpty = function () {\r\n return this.root_.isEmpty();\r\n };\r\n /**\r\n * @returns The total number of nodes in the map.\r\n */\r\n SortedMap.prototype.count = function () {\r\n return this.root_.count();\r\n };\r\n /**\r\n * @returns The minimum key in the map.\r\n */\r\n SortedMap.prototype.minKey = function () {\r\n return this.root_.minKey();\r\n };\r\n /**\r\n * @returns The maximum key in the map.\r\n */\r\n SortedMap.prototype.maxKey = function () {\r\n return this.root_.maxKey();\r\n };\r\n /**\r\n * Traverses the map in key order and calls the specified action function\r\n * for each key/value pair.\r\n *\r\n * @param action - Callback function to be called\r\n * for each key/value pair. If action returns true, traversal is aborted.\r\n * @returns The first truthy value returned by action, or the last falsey\r\n * value returned by action\r\n */\r\n SortedMap.prototype.inorderTraversal = function (action) {\r\n return this.root_.inorderTraversal(action);\r\n };\r\n /**\r\n * Traverses the map in reverse key order and calls the specified action function\r\n * for each key/value pair.\r\n *\r\n * @param action - Callback function to be called\r\n * for each key/value pair. If action returns true, traversal is aborted.\r\n * @returns True if the traversal was aborted.\r\n */\r\n SortedMap.prototype.reverseTraversal = function (action) {\r\n return this.root_.reverseTraversal(action);\r\n };\r\n /**\r\n * Returns an iterator over the SortedMap.\r\n * @returns The iterator.\r\n */\r\n SortedMap.prototype.getIterator = function (resultGenerator) {\r\n return new SortedMapIterator(this.root_, null, this.comparator_, false, resultGenerator);\r\n };\r\n SortedMap.prototype.getIteratorFrom = function (key, resultGenerator) {\r\n return new SortedMapIterator(this.root_, key, this.comparator_, false, resultGenerator);\r\n };\r\n SortedMap.prototype.getReverseIteratorFrom = function (key, resultGenerator) {\r\n return new SortedMapIterator(this.root_, key, this.comparator_, true, resultGenerator);\r\n };\r\n SortedMap.prototype.getReverseIterator = function (resultGenerator) {\r\n return new SortedMapIterator(this.root_, null, this.comparator_, true, resultGenerator);\r\n };\r\n /**\r\n * Always use the same empty node, to reduce memory.\r\n */\r\n SortedMap.EMPTY_NODE = new LLRBEmptyNode();\r\n return SortedMap;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction NAME_ONLY_COMPARATOR(left, right) {\r\n return nameCompare(left.name, right.name);\r\n}\r\nfunction NAME_COMPARATOR(left, right) {\r\n return nameCompare(left, right);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar MAX_NODE$2;\r\nfunction setMaxNode$1(val) {\r\n MAX_NODE$2 = val;\r\n}\r\nvar priorityHashText = function (priority) {\r\n if (typeof priority === 'number') {\r\n return 'number:' + doubleToIEEE754String(priority);\r\n }\r\n else {\r\n return 'string:' + priority;\r\n }\r\n};\r\n/**\r\n * Validates that a priority snapshot Node is valid.\r\n */\r\nvar validatePriorityNode = function (priorityNode) {\r\n if (priorityNode.isLeafNode()) {\r\n var val = priorityNode.val();\r\n assert(typeof val === 'string' ||\r\n typeof val === 'number' ||\r\n (typeof val === 'object' && contains(val, '.sv')), 'Priority must be a string or number.');\r\n }\r\n else {\r\n assert(priorityNode === MAX_NODE$2 || priorityNode.isEmpty(), 'priority of unexpected type.');\r\n }\r\n // Don't call getPriority() on MAX_NODE to avoid hitting assertion.\r\n assert(priorityNode === MAX_NODE$2 || priorityNode.getPriority().isEmpty(), \"Priority nodes can't have a priority of their own.\");\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar __childrenNodeConstructor;\r\n/**\r\n * LeafNode is a class for storing leaf nodes in a DataSnapshot. It\r\n * implements Node and stores the value of the node (a string,\r\n * number, or boolean) accessible via getValue().\r\n */\r\nvar LeafNode = /** @class */ (function () {\r\n /**\r\n * @param value_ - The value to store in this leaf node. The object type is\r\n * possible in the event of a deferred value\r\n * @param priorityNode_ - The priority of this node.\r\n */\r\n function LeafNode(value_, priorityNode_) {\r\n if (priorityNode_ === void 0) { priorityNode_ = LeafNode.__childrenNodeConstructor.EMPTY_NODE; }\r\n this.value_ = value_;\r\n this.priorityNode_ = priorityNode_;\r\n this.lazyHash_ = null;\r\n assert(this.value_ !== undefined && this.value_ !== null, \"LeafNode shouldn't be created with null/undefined value.\");\r\n validatePriorityNode(this.priorityNode_);\r\n }\r\n Object.defineProperty(LeafNode, \"__childrenNodeConstructor\", {\r\n get: function () {\r\n return __childrenNodeConstructor;\r\n },\r\n set: function (val) {\r\n __childrenNodeConstructor = val;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n /** @inheritDoc */\r\n LeafNode.prototype.isLeafNode = function () {\r\n return true;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.getPriority = function () {\r\n return this.priorityNode_;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.updatePriority = function (newPriorityNode) {\r\n return new LeafNode(this.value_, newPriorityNode);\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.getImmediateChild = function (childName) {\r\n // Hack to treat priority as a regular child\r\n if (childName === '.priority') {\r\n return this.priorityNode_;\r\n }\r\n else {\r\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE;\r\n }\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.getChild = function (path) {\r\n if (pathIsEmpty(path)) {\r\n return this;\r\n }\r\n else if (pathGetFront(path) === '.priority') {\r\n return this.priorityNode_;\r\n }\r\n else {\r\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE;\r\n }\r\n };\r\n LeafNode.prototype.hasChild = function () {\r\n return false;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.getPredecessorChildName = function (childName, childNode) {\r\n return null;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.updateImmediateChild = function (childName, newChildNode) {\r\n if (childName === '.priority') {\r\n return this.updatePriority(newChildNode);\r\n }\r\n else if (newChildNode.isEmpty() && childName !== '.priority') {\r\n return this;\r\n }\r\n else {\r\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE.updateImmediateChild(childName, newChildNode).updatePriority(this.priorityNode_);\r\n }\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.updateChild = function (path, newChildNode) {\r\n var front = pathGetFront(path);\r\n if (front === null) {\r\n return newChildNode;\r\n }\r\n else if (newChildNode.isEmpty() && front !== '.priority') {\r\n return this;\r\n }\r\n else {\r\n assert(front !== '.priority' || pathGetLength(path) === 1, '.priority must be the last token in a path');\r\n return this.updateImmediateChild(front, LeafNode.__childrenNodeConstructor.EMPTY_NODE.updateChild(pathPopFront(path), newChildNode));\r\n }\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.isEmpty = function () {\r\n return false;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.numChildren = function () {\r\n return 0;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.forEachChild = function (index, action) {\r\n return false;\r\n };\r\n LeafNode.prototype.val = function (exportFormat) {\r\n if (exportFormat && !this.getPriority().isEmpty()) {\r\n return {\r\n '.value': this.getValue(),\r\n '.priority': this.getPriority().val()\r\n };\r\n }\r\n else {\r\n return this.getValue();\r\n }\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.hash = function () {\r\n if (this.lazyHash_ === null) {\r\n var toHash = '';\r\n if (!this.priorityNode_.isEmpty()) {\r\n toHash +=\r\n 'priority:' +\r\n priorityHashText(this.priorityNode_.val()) +\r\n ':';\r\n }\r\n var type = typeof this.value_;\r\n toHash += type + ':';\r\n if (type === 'number') {\r\n toHash += doubleToIEEE754String(this.value_);\r\n }\r\n else {\r\n toHash += this.value_;\r\n }\r\n this.lazyHash_ = sha1(toHash);\r\n }\r\n return this.lazyHash_;\r\n };\r\n /**\r\n * Returns the value of the leaf node.\r\n * @returns The value of the node.\r\n */\r\n LeafNode.prototype.getValue = function () {\r\n return this.value_;\r\n };\r\n LeafNode.prototype.compareTo = function (other) {\r\n if (other === LeafNode.__childrenNodeConstructor.EMPTY_NODE) {\r\n return 1;\r\n }\r\n else if (other instanceof LeafNode.__childrenNodeConstructor) {\r\n return -1;\r\n }\r\n else {\r\n assert(other.isLeafNode(), 'Unknown node type');\r\n return this.compareToLeafNode_(other);\r\n }\r\n };\r\n /**\r\n * Comparison specifically for two leaf nodes\r\n */\r\n LeafNode.prototype.compareToLeafNode_ = function (otherLeaf) {\r\n var otherLeafType = typeof otherLeaf.value_;\r\n var thisLeafType = typeof this.value_;\r\n var otherIndex = LeafNode.VALUE_TYPE_ORDER.indexOf(otherLeafType);\r\n var thisIndex = LeafNode.VALUE_TYPE_ORDER.indexOf(thisLeafType);\r\n assert(otherIndex >= 0, 'Unknown leaf type: ' + otherLeafType);\r\n assert(thisIndex >= 0, 'Unknown leaf type: ' + thisLeafType);\r\n if (otherIndex === thisIndex) {\r\n // Same type, compare values\r\n if (thisLeafType === 'object') {\r\n // Deferred value nodes are all equal, but we should also never get to this point...\r\n return 0;\r\n }\r\n else {\r\n // Note that this works because true > false, all others are number or string comparisons\r\n if (this.value_ < otherLeaf.value_) {\r\n return -1;\r\n }\r\n else if (this.value_ === otherLeaf.value_) {\r\n return 0;\r\n }\r\n else {\r\n return 1;\r\n }\r\n }\r\n }\r\n else {\r\n return thisIndex - otherIndex;\r\n }\r\n };\r\n LeafNode.prototype.withIndex = function () {\r\n return this;\r\n };\r\n LeafNode.prototype.isIndexed = function () {\r\n return true;\r\n };\r\n LeafNode.prototype.equals = function (other) {\r\n if (other === this) {\r\n return true;\r\n }\r\n else if (other.isLeafNode()) {\r\n var otherLeaf = other;\r\n return (this.value_ === otherLeaf.value_ &&\r\n this.priorityNode_.equals(otherLeaf.priorityNode_));\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n /**\r\n * The sort order for comparing leaf nodes of different types. If two leaf nodes have\r\n * the same type, the comparison falls back to their value\r\n */\r\n LeafNode.VALUE_TYPE_ORDER = ['object', 'boolean', 'number', 'string'];\r\n return LeafNode;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar nodeFromJSON$1;\r\nvar MAX_NODE$1;\r\nfunction setNodeFromJSON(val) {\r\n nodeFromJSON$1 = val;\r\n}\r\nfunction setMaxNode(val) {\r\n MAX_NODE$1 = val;\r\n}\r\nvar PriorityIndex = /** @class */ (function (_super) {\r\n __extends(PriorityIndex, _super);\r\n function PriorityIndex() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n PriorityIndex.prototype.compare = function (a, b) {\r\n var aPriority = a.node.getPriority();\r\n var bPriority = b.node.getPriority();\r\n var indexCmp = aPriority.compareTo(bPriority);\r\n if (indexCmp === 0) {\r\n return nameCompare(a.name, b.name);\r\n }\r\n else {\r\n return indexCmp;\r\n }\r\n };\r\n PriorityIndex.prototype.isDefinedOn = function (node) {\r\n return !node.getPriority().isEmpty();\r\n };\r\n PriorityIndex.prototype.indexedValueChanged = function (oldNode, newNode) {\r\n return !oldNode.getPriority().equals(newNode.getPriority());\r\n };\r\n PriorityIndex.prototype.minPost = function () {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return NamedNode.MIN;\r\n };\r\n PriorityIndex.prototype.maxPost = function () {\r\n return new NamedNode(MAX_NAME, new LeafNode('[PRIORITY-POST]', MAX_NODE$1));\r\n };\r\n PriorityIndex.prototype.makePost = function (indexValue, name) {\r\n var priorityNode = nodeFromJSON$1(indexValue);\r\n return new NamedNode(name, new LeafNode('[PRIORITY-POST]', priorityNode));\r\n };\r\n /**\r\n * @returns String representation for inclusion in a query spec\r\n */\r\n PriorityIndex.prototype.toString = function () {\r\n return '.priority';\r\n };\r\n return PriorityIndex;\r\n}(Index));\r\nvar PRIORITY_INDEX = new PriorityIndex();\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar LOG_2 = Math.log(2);\r\nvar Base12Num = /** @class */ (function () {\r\n function Base12Num(length) {\r\n var logBase2 = function (num) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return parseInt((Math.log(num) / LOG_2), 10);\r\n };\r\n var bitMask = function (bits) { return parseInt(Array(bits + 1).join('1'), 2); };\r\n this.count = logBase2(length + 1);\r\n this.current_ = this.count - 1;\r\n var mask = bitMask(this.count);\r\n this.bits_ = (length + 1) & mask;\r\n }\r\n Base12Num.prototype.nextBitIsOne = function () {\r\n //noinspection JSBitwiseOperatorUsage\r\n var result = !(this.bits_ & (0x1 << this.current_));\r\n this.current_--;\r\n return result;\r\n };\r\n return Base12Num;\r\n}());\r\n/**\r\n * Takes a list of child nodes and constructs a SortedSet using the given comparison\r\n * function\r\n *\r\n * Uses the algorithm described in the paper linked here:\r\n * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.46.1458\r\n *\r\n * @param childList - Unsorted list of children\r\n * @param cmp - The comparison method to be used\r\n * @param keyFn - An optional function to extract K from a node wrapper, if K's\r\n * type is not NamedNode\r\n * @param mapSortFn - An optional override for comparator used by the generated sorted map\r\n */\r\nvar buildChildSet = function (childList, cmp, keyFn, mapSortFn) {\r\n childList.sort(cmp);\r\n var buildBalancedTree = function (low, high) {\r\n var length = high - low;\r\n var namedNode;\r\n var key;\r\n if (length === 0) {\r\n return null;\r\n }\r\n else if (length === 1) {\r\n namedNode = childList[low];\r\n key = keyFn ? keyFn(namedNode) : namedNode;\r\n return new LLRBNode(key, namedNode.node, LLRBNode.BLACK, null, null);\r\n }\r\n else {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n var middle = parseInt((length / 2), 10) + low;\r\n var left = buildBalancedTree(low, middle);\r\n var right = buildBalancedTree(middle + 1, high);\r\n namedNode = childList[middle];\r\n key = keyFn ? keyFn(namedNode) : namedNode;\r\n return new LLRBNode(key, namedNode.node, LLRBNode.BLACK, left, right);\r\n }\r\n };\r\n var buildFrom12Array = function (base12) {\r\n var node = null;\r\n var root = null;\r\n var index = childList.length;\r\n var buildPennant = function (chunkSize, color) {\r\n var low = index - chunkSize;\r\n var high = index;\r\n index -= chunkSize;\r\n var childTree = buildBalancedTree(low + 1, high);\r\n var namedNode = childList[low];\r\n var key = keyFn ? keyFn(namedNode) : namedNode;\r\n attachPennant(new LLRBNode(key, namedNode.node, color, null, childTree));\r\n };\r\n var attachPennant = function (pennant) {\r\n if (node) {\r\n node.left = pennant;\r\n node = pennant;\r\n }\r\n else {\r\n root = pennant;\r\n node = pennant;\r\n }\r\n };\r\n for (var i = 0; i < base12.count; ++i) {\r\n var isOne = base12.nextBitIsOne();\r\n // The number of nodes taken in each slice is 2^(arr.length - (i + 1))\r\n var chunkSize = Math.pow(2, base12.count - (i + 1));\r\n if (isOne) {\r\n buildPennant(chunkSize, LLRBNode.BLACK);\r\n }\r\n else {\r\n // current == 2\r\n buildPennant(chunkSize, LLRBNode.BLACK);\r\n buildPennant(chunkSize, LLRBNode.RED);\r\n }\r\n }\r\n return root;\r\n };\r\n var base12 = new Base12Num(childList.length);\r\n var root = buildFrom12Array(base12);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return new SortedMap(mapSortFn || cmp, root);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar _defaultIndexMap;\r\nvar fallbackObject = {};\r\nvar IndexMap = /** @class */ (function () {\r\n function IndexMap(indexes_, indexSet_) {\r\n this.indexes_ = indexes_;\r\n this.indexSet_ = indexSet_;\r\n }\r\n Object.defineProperty(IndexMap, \"Default\", {\r\n /**\r\n * The default IndexMap for nodes without a priority\r\n */\r\n get: function () {\r\n assert(fallbackObject && PRIORITY_INDEX, 'ChildrenNode.ts has not been loaded');\r\n _defaultIndexMap =\r\n _defaultIndexMap ||\r\n new IndexMap({ '.priority': fallbackObject }, { '.priority': PRIORITY_INDEX });\r\n return _defaultIndexMap;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n IndexMap.prototype.get = function (indexKey) {\r\n var sortedMap = safeGet(this.indexes_, indexKey);\r\n if (!sortedMap) {\r\n throw new Error('No index defined for ' + indexKey);\r\n }\r\n if (sortedMap instanceof SortedMap) {\r\n return sortedMap;\r\n }\r\n else {\r\n // The index exists, but it falls back to just name comparison. Return null so that the calling code uses the\r\n // regular child map\r\n return null;\r\n }\r\n };\r\n IndexMap.prototype.hasIndex = function (indexDefinition) {\r\n return contains(this.indexSet_, indexDefinition.toString());\r\n };\r\n IndexMap.prototype.addIndex = function (indexDefinition, existingChildren) {\r\n assert(indexDefinition !== KEY_INDEX, \"KeyIndex always exists and isn't meant to be added to the IndexMap.\");\r\n var childList = [];\r\n var sawIndexedValue = false;\r\n var iter = existingChildren.getIterator(NamedNode.Wrap);\r\n var next = iter.getNext();\r\n while (next) {\r\n sawIndexedValue =\r\n sawIndexedValue || indexDefinition.isDefinedOn(next.node);\r\n childList.push(next);\r\n next = iter.getNext();\r\n }\r\n var newIndex;\r\n if (sawIndexedValue) {\r\n newIndex = buildChildSet(childList, indexDefinition.getCompare());\r\n }\r\n else {\r\n newIndex = fallbackObject;\r\n }\r\n var indexName = indexDefinition.toString();\r\n var newIndexSet = __assign({}, this.indexSet_);\r\n newIndexSet[indexName] = indexDefinition;\r\n var newIndexes = __assign({}, this.indexes_);\r\n newIndexes[indexName] = newIndex;\r\n return new IndexMap(newIndexes, newIndexSet);\r\n };\r\n /**\r\n * Ensure that this node is properly tracked in any indexes that we're maintaining\r\n */\r\n IndexMap.prototype.addToIndexes = function (namedNode, existingChildren) {\r\n var _this = this;\r\n var newIndexes = map(this.indexes_, function (indexedChildren, indexName) {\r\n var index = safeGet(_this.indexSet_, indexName);\r\n assert(index, 'Missing index implementation for ' + indexName);\r\n if (indexedChildren === fallbackObject) {\r\n // Check to see if we need to index everything\r\n if (index.isDefinedOn(namedNode.node)) {\r\n // We need to build this index\r\n var childList = [];\r\n var iter = existingChildren.getIterator(NamedNode.Wrap);\r\n var next = iter.getNext();\r\n while (next) {\r\n if (next.name !== namedNode.name) {\r\n childList.push(next);\r\n }\r\n next = iter.getNext();\r\n }\r\n childList.push(namedNode);\r\n return buildChildSet(childList, index.getCompare());\r\n }\r\n else {\r\n // No change, this remains a fallback\r\n return fallbackObject;\r\n }\r\n }\r\n else {\r\n var existingSnap = existingChildren.get(namedNode.name);\r\n var newChildren = indexedChildren;\r\n if (existingSnap) {\r\n newChildren = newChildren.remove(new NamedNode(namedNode.name, existingSnap));\r\n }\r\n return newChildren.insert(namedNode, namedNode.node);\r\n }\r\n });\r\n return new IndexMap(newIndexes, this.indexSet_);\r\n };\r\n /**\r\n * Create a new IndexMap instance with the given value removed\r\n */\r\n IndexMap.prototype.removeFromIndexes = function (namedNode, existingChildren) {\r\n var newIndexes = map(this.indexes_, function (indexedChildren) {\r\n if (indexedChildren === fallbackObject) {\r\n // This is the fallback. Just return it, nothing to do in this case\r\n return indexedChildren;\r\n }\r\n else {\r\n var existingSnap = existingChildren.get(namedNode.name);\r\n if (existingSnap) {\r\n return indexedChildren.remove(new NamedNode(namedNode.name, existingSnap));\r\n }\r\n else {\r\n // No record of this child\r\n return indexedChildren;\r\n }\r\n }\r\n });\r\n return new IndexMap(newIndexes, this.indexSet_);\r\n };\r\n return IndexMap;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// TODO: For memory savings, don't store priorityNode_ if it's empty.\r\nvar EMPTY_NODE;\r\n/**\r\n * ChildrenNode is a class for storing internal nodes in a DataSnapshot\r\n * (i.e. nodes with children). It implements Node and stores the\r\n * list of children in the children property, sorted by child name.\r\n */\r\nvar ChildrenNode = /** @class */ (function () {\r\n /**\r\n * @param children_ - List of children of this node..\r\n * @param priorityNode_ - The priority of this node (as a snapshot node).\r\n */\r\n function ChildrenNode(children_, priorityNode_, indexMap_) {\r\n this.children_ = children_;\r\n this.priorityNode_ = priorityNode_;\r\n this.indexMap_ = indexMap_;\r\n this.lazyHash_ = null;\r\n /**\r\n * Note: The only reason we allow null priority is for EMPTY_NODE, since we can't use\r\n * EMPTY_NODE as the priority of EMPTY_NODE. We might want to consider making EMPTY_NODE its own\r\n * class instead of an empty ChildrenNode.\r\n */\r\n if (this.priorityNode_) {\r\n validatePriorityNode(this.priorityNode_);\r\n }\r\n if (this.children_.isEmpty()) {\r\n assert(!this.priorityNode_ || this.priorityNode_.isEmpty(), 'An empty node cannot have a priority');\r\n }\r\n }\r\n Object.defineProperty(ChildrenNode, \"EMPTY_NODE\", {\r\n get: function () {\r\n return (EMPTY_NODE ||\r\n (EMPTY_NODE = new ChildrenNode(new SortedMap(NAME_COMPARATOR), null, IndexMap.Default)));\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.isLeafNode = function () {\r\n return false;\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.getPriority = function () {\r\n return this.priorityNode_ || EMPTY_NODE;\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.updatePriority = function (newPriorityNode) {\r\n if (this.children_.isEmpty()) {\r\n // Don't allow priorities on empty nodes\r\n return this;\r\n }\r\n else {\r\n return new ChildrenNode(this.children_, newPriorityNode, this.indexMap_);\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.getImmediateChild = function (childName) {\r\n // Hack to treat priority as a regular child\r\n if (childName === '.priority') {\r\n return this.getPriority();\r\n }\r\n else {\r\n var child = this.children_.get(childName);\r\n return child === null ? EMPTY_NODE : child;\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.getChild = function (path) {\r\n var front = pathGetFront(path);\r\n if (front === null) {\r\n return this;\r\n }\r\n return this.getImmediateChild(front).getChild(pathPopFront(path));\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.hasChild = function (childName) {\r\n return this.children_.get(childName) !== null;\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.updateImmediateChild = function (childName, newChildNode) {\r\n assert(newChildNode, 'We should always be passing snapshot nodes');\r\n if (childName === '.priority') {\r\n return this.updatePriority(newChildNode);\r\n }\r\n else {\r\n var namedNode = new NamedNode(childName, newChildNode);\r\n var newChildren = void 0, newIndexMap = void 0;\r\n if (newChildNode.isEmpty()) {\r\n newChildren = this.children_.remove(childName);\r\n newIndexMap = this.indexMap_.removeFromIndexes(namedNode, this.children_);\r\n }\r\n else {\r\n newChildren = this.children_.insert(childName, newChildNode);\r\n newIndexMap = this.indexMap_.addToIndexes(namedNode, this.children_);\r\n }\r\n var newPriority = newChildren.isEmpty()\r\n ? EMPTY_NODE\r\n : this.priorityNode_;\r\n return new ChildrenNode(newChildren, newPriority, newIndexMap);\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.updateChild = function (path, newChildNode) {\r\n var front = pathGetFront(path);\r\n if (front === null) {\r\n return newChildNode;\r\n }\r\n else {\r\n assert(pathGetFront(path) !== '.priority' || pathGetLength(path) === 1, '.priority must be the last token in a path');\r\n var newImmediateChild = this.getImmediateChild(front).updateChild(pathPopFront(path), newChildNode);\r\n return this.updateImmediateChild(front, newImmediateChild);\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.isEmpty = function () {\r\n return this.children_.isEmpty();\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.numChildren = function () {\r\n return this.children_.count();\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.val = function (exportFormat) {\r\n if (this.isEmpty()) {\r\n return null;\r\n }\r\n var obj = {};\r\n var numKeys = 0, maxKey = 0, allIntegerKeys = true;\r\n this.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n obj[key] = childNode.val(exportFormat);\r\n numKeys++;\r\n if (allIntegerKeys && ChildrenNode.INTEGER_REGEXP_.test(key)) {\r\n maxKey = Math.max(maxKey, Number(key));\r\n }\r\n else {\r\n allIntegerKeys = false;\r\n }\r\n });\r\n if (!exportFormat && allIntegerKeys && maxKey < 2 * numKeys) {\r\n // convert to array.\r\n var array = [];\r\n // eslint-disable-next-line guard-for-in\r\n for (var key in obj) {\r\n array[key] = obj[key];\r\n }\r\n return array;\r\n }\r\n else {\r\n if (exportFormat && !this.getPriority().isEmpty()) {\r\n obj['.priority'] = this.getPriority().val();\r\n }\r\n return obj;\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.hash = function () {\r\n if (this.lazyHash_ === null) {\r\n var toHash_1 = '';\r\n if (!this.getPriority().isEmpty()) {\r\n toHash_1 +=\r\n 'priority:' +\r\n priorityHashText(this.getPriority().val()) +\r\n ':';\r\n }\r\n this.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n var childHash = childNode.hash();\r\n if (childHash !== '') {\r\n toHash_1 += ':' + key + ':' + childHash;\r\n }\r\n });\r\n this.lazyHash_ = toHash_1 === '' ? '' : sha1(toHash_1);\r\n }\r\n return this.lazyHash_;\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.getPredecessorChildName = function (childName, childNode, index) {\r\n var idx = this.resolveIndex_(index);\r\n if (idx) {\r\n var predecessor = idx.getPredecessorKey(new NamedNode(childName, childNode));\r\n return predecessor ? predecessor.name : null;\r\n }\r\n else {\r\n return this.children_.getPredecessorKey(childName);\r\n }\r\n };\r\n ChildrenNode.prototype.getFirstChildName = function (indexDefinition) {\r\n var idx = this.resolveIndex_(indexDefinition);\r\n if (idx) {\r\n var minKey = idx.minKey();\r\n return minKey && minKey.name;\r\n }\r\n else {\r\n return this.children_.minKey();\r\n }\r\n };\r\n ChildrenNode.prototype.getFirstChild = function (indexDefinition) {\r\n var minKey = this.getFirstChildName(indexDefinition);\r\n if (minKey) {\r\n return new NamedNode(minKey, this.children_.get(minKey));\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n /**\r\n * Given an index, return the key name of the largest value we have, according to that index\r\n */\r\n ChildrenNode.prototype.getLastChildName = function (indexDefinition) {\r\n var idx = this.resolveIndex_(indexDefinition);\r\n if (idx) {\r\n var maxKey = idx.maxKey();\r\n return maxKey && maxKey.name;\r\n }\r\n else {\r\n return this.children_.maxKey();\r\n }\r\n };\r\n ChildrenNode.prototype.getLastChild = function (indexDefinition) {\r\n var maxKey = this.getLastChildName(indexDefinition);\r\n if (maxKey) {\r\n return new NamedNode(maxKey, this.children_.get(maxKey));\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n ChildrenNode.prototype.forEachChild = function (index, action) {\r\n var idx = this.resolveIndex_(index);\r\n if (idx) {\r\n return idx.inorderTraversal(function (wrappedNode) {\r\n return action(wrappedNode.name, wrappedNode.node);\r\n });\r\n }\r\n else {\r\n return this.children_.inorderTraversal(action);\r\n }\r\n };\r\n ChildrenNode.prototype.getIterator = function (indexDefinition) {\r\n return this.getIteratorFrom(indexDefinition.minPost(), indexDefinition);\r\n };\r\n ChildrenNode.prototype.getIteratorFrom = function (startPost, indexDefinition) {\r\n var idx = this.resolveIndex_(indexDefinition);\r\n if (idx) {\r\n return idx.getIteratorFrom(startPost, function (key) { return key; });\r\n }\r\n else {\r\n var iterator = this.children_.getIteratorFrom(startPost.name, NamedNode.Wrap);\r\n var next = iterator.peek();\r\n while (next != null && indexDefinition.compare(next, startPost) < 0) {\r\n iterator.getNext();\r\n next = iterator.peek();\r\n }\r\n return iterator;\r\n }\r\n };\r\n ChildrenNode.prototype.getReverseIterator = function (indexDefinition) {\r\n return this.getReverseIteratorFrom(indexDefinition.maxPost(), indexDefinition);\r\n };\r\n ChildrenNode.prototype.getReverseIteratorFrom = function (endPost, indexDefinition) {\r\n var idx = this.resolveIndex_(indexDefinition);\r\n if (idx) {\r\n return idx.getReverseIteratorFrom(endPost, function (key) {\r\n return key;\r\n });\r\n }\r\n else {\r\n var iterator = this.children_.getReverseIteratorFrom(endPost.name, NamedNode.Wrap);\r\n var next = iterator.peek();\r\n while (next != null && indexDefinition.compare(next, endPost) > 0) {\r\n iterator.getNext();\r\n next = iterator.peek();\r\n }\r\n return iterator;\r\n }\r\n };\r\n ChildrenNode.prototype.compareTo = function (other) {\r\n if (this.isEmpty()) {\r\n if (other.isEmpty()) {\r\n return 0;\r\n }\r\n else {\r\n return -1;\r\n }\r\n }\r\n else if (other.isLeafNode() || other.isEmpty()) {\r\n return 1;\r\n }\r\n else if (other === MAX_NODE) {\r\n return -1;\r\n }\r\n else {\r\n // Must be another node with children.\r\n return 0;\r\n }\r\n };\r\n ChildrenNode.prototype.withIndex = function (indexDefinition) {\r\n if (indexDefinition === KEY_INDEX ||\r\n this.indexMap_.hasIndex(indexDefinition)) {\r\n return this;\r\n }\r\n else {\r\n var newIndexMap = this.indexMap_.addIndex(indexDefinition, this.children_);\r\n return new ChildrenNode(this.children_, this.priorityNode_, newIndexMap);\r\n }\r\n };\r\n ChildrenNode.prototype.isIndexed = function (index) {\r\n return index === KEY_INDEX || this.indexMap_.hasIndex(index);\r\n };\r\n ChildrenNode.prototype.equals = function (other) {\r\n if (other === this) {\r\n return true;\r\n }\r\n else if (other.isLeafNode()) {\r\n return false;\r\n }\r\n else {\r\n var otherChildrenNode = other;\r\n if (!this.getPriority().equals(otherChildrenNode.getPriority())) {\r\n return false;\r\n }\r\n else if (this.children_.count() === otherChildrenNode.children_.count()) {\r\n var thisIter = this.getIterator(PRIORITY_INDEX);\r\n var otherIter = otherChildrenNode.getIterator(PRIORITY_INDEX);\r\n var thisCurrent = thisIter.getNext();\r\n var otherCurrent = otherIter.getNext();\r\n while (thisCurrent && otherCurrent) {\r\n if (thisCurrent.name !== otherCurrent.name ||\r\n !thisCurrent.node.equals(otherCurrent.node)) {\r\n return false;\r\n }\r\n thisCurrent = thisIter.getNext();\r\n otherCurrent = otherIter.getNext();\r\n }\r\n return thisCurrent === null && otherCurrent === null;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n };\r\n /**\r\n * Returns a SortedMap ordered by index, or null if the default (by-key) ordering can be used\r\n * instead.\r\n *\r\n */\r\n ChildrenNode.prototype.resolveIndex_ = function (indexDefinition) {\r\n if (indexDefinition === KEY_INDEX) {\r\n return null;\r\n }\r\n else {\r\n return this.indexMap_.get(indexDefinition.toString());\r\n }\r\n };\r\n ChildrenNode.INTEGER_REGEXP_ = /^(0|[1-9]\\d*)$/;\r\n return ChildrenNode;\r\n}());\r\nvar MaxNode = /** @class */ (function (_super) {\r\n __extends(MaxNode, _super);\r\n function MaxNode() {\r\n return _super.call(this, new SortedMap(NAME_COMPARATOR), ChildrenNode.EMPTY_NODE, IndexMap.Default) || this;\r\n }\r\n MaxNode.prototype.compareTo = function (other) {\r\n if (other === this) {\r\n return 0;\r\n }\r\n else {\r\n return 1;\r\n }\r\n };\r\n MaxNode.prototype.equals = function (other) {\r\n // Not that we every compare it, but MAX_NODE is only ever equal to itself\r\n return other === this;\r\n };\r\n MaxNode.prototype.getPriority = function () {\r\n return this;\r\n };\r\n MaxNode.prototype.getImmediateChild = function (childName) {\r\n return ChildrenNode.EMPTY_NODE;\r\n };\r\n MaxNode.prototype.isEmpty = function () {\r\n return false;\r\n };\r\n return MaxNode;\r\n}(ChildrenNode));\r\n/**\r\n * Marker that will sort higher than any other snapshot.\r\n */\r\nvar MAX_NODE = new MaxNode();\r\nObject.defineProperties(NamedNode, {\r\n MIN: {\r\n value: new NamedNode(MIN_NAME, ChildrenNode.EMPTY_NODE)\r\n },\r\n MAX: {\r\n value: new NamedNode(MAX_NAME, MAX_NODE)\r\n }\r\n});\r\n/**\r\n * Reference Extensions\r\n */\r\nKeyIndex.__EMPTY_NODE = ChildrenNode.EMPTY_NODE;\r\nLeafNode.__childrenNodeConstructor = ChildrenNode;\r\nsetMaxNode$1(MAX_NODE);\r\nsetMaxNode(MAX_NODE);\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar USE_HINZE = true;\r\n/**\r\n * Constructs a snapshot node representing the passed JSON and returns it.\r\n * @param json - JSON to create a node for.\r\n * @param priority - Optional priority to use. This will be ignored if the\r\n * passed JSON contains a .priority property.\r\n */\r\nfunction nodeFromJSON(json, priority) {\r\n if (priority === void 0) { priority = null; }\r\n if (json === null) {\r\n return ChildrenNode.EMPTY_NODE;\r\n }\r\n if (typeof json === 'object' && '.priority' in json) {\r\n priority = json['.priority'];\r\n }\r\n assert(priority === null ||\r\n typeof priority === 'string' ||\r\n typeof priority === 'number' ||\r\n (typeof priority === 'object' && '.sv' in priority), 'Invalid priority type found: ' + typeof priority);\r\n if (typeof json === 'object' && '.value' in json && json['.value'] !== null) {\r\n json = json['.value'];\r\n }\r\n // Valid leaf nodes include non-objects or server-value wrapper objects\r\n if (typeof json !== 'object' || '.sv' in json) {\r\n var jsonLeaf = json;\r\n return new LeafNode(jsonLeaf, nodeFromJSON(priority));\r\n }\r\n if (!(json instanceof Array) && USE_HINZE) {\r\n var children_1 = [];\r\n var childrenHavePriority_1 = false;\r\n var hinzeJsonObj = json;\r\n each(hinzeJsonObj, function (key, child) {\r\n if (key.substring(0, 1) !== '.') {\r\n // Ignore metadata nodes\r\n var childNode = nodeFromJSON(child);\r\n if (!childNode.isEmpty()) {\r\n childrenHavePriority_1 =\r\n childrenHavePriority_1 || !childNode.getPriority().isEmpty();\r\n children_1.push(new NamedNode(key, childNode));\r\n }\r\n }\r\n });\r\n if (children_1.length === 0) {\r\n return ChildrenNode.EMPTY_NODE;\r\n }\r\n var childSet = buildChildSet(children_1, NAME_ONLY_COMPARATOR, function (namedNode) { return namedNode.name; }, NAME_COMPARATOR);\r\n if (childrenHavePriority_1) {\r\n var sortedChildSet = buildChildSet(children_1, PRIORITY_INDEX.getCompare());\r\n return new ChildrenNode(childSet, nodeFromJSON(priority), new IndexMap({ '.priority': sortedChildSet }, { '.priority': PRIORITY_INDEX }));\r\n }\r\n else {\r\n return new ChildrenNode(childSet, nodeFromJSON(priority), IndexMap.Default);\r\n }\r\n }\r\n else {\r\n var node_1 = ChildrenNode.EMPTY_NODE;\r\n each(json, function (key, childData) {\r\n if (contains(json, key)) {\r\n if (key.substring(0, 1) !== '.') {\r\n // ignore metadata nodes.\r\n var childNode = nodeFromJSON(childData);\r\n if (childNode.isLeafNode() || !childNode.isEmpty()) {\r\n node_1 = node_1.updateImmediateChild(key, childNode);\r\n }\r\n }\r\n }\r\n });\r\n return node_1.updatePriority(nodeFromJSON(priority));\r\n }\r\n}\r\nsetNodeFromJSON(nodeFromJSON);\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar PathIndex = /** @class */ (function (_super) {\r\n __extends(PathIndex, _super);\r\n function PathIndex(indexPath_) {\r\n var _this = _super.call(this) || this;\r\n _this.indexPath_ = indexPath_;\r\n assert(!pathIsEmpty(indexPath_) && pathGetFront(indexPath_) !== '.priority', \"Can't create PathIndex with empty path or .priority key\");\r\n return _this;\r\n }\r\n PathIndex.prototype.extractChild = function (snap) {\r\n return snap.getChild(this.indexPath_);\r\n };\r\n PathIndex.prototype.isDefinedOn = function (node) {\r\n return !node.getChild(this.indexPath_).isEmpty();\r\n };\r\n PathIndex.prototype.compare = function (a, b) {\r\n var aChild = this.extractChild(a.node);\r\n var bChild = this.extractChild(b.node);\r\n var indexCmp = aChild.compareTo(bChild);\r\n if (indexCmp === 0) {\r\n return nameCompare(a.name, b.name);\r\n }\r\n else {\r\n return indexCmp;\r\n }\r\n };\r\n PathIndex.prototype.makePost = function (indexValue, name) {\r\n var valueNode = nodeFromJSON(indexValue);\r\n var node = ChildrenNode.EMPTY_NODE.updateChild(this.indexPath_, valueNode);\r\n return new NamedNode(name, node);\r\n };\r\n PathIndex.prototype.maxPost = function () {\r\n var node = ChildrenNode.EMPTY_NODE.updateChild(this.indexPath_, MAX_NODE);\r\n return new NamedNode(MAX_NAME, node);\r\n };\r\n PathIndex.prototype.toString = function () {\r\n return pathSlice(this.indexPath_, 0).join('/');\r\n };\r\n return PathIndex;\r\n}(Index));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar ValueIndex = /** @class */ (function (_super) {\r\n __extends(ValueIndex, _super);\r\n function ValueIndex() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n ValueIndex.prototype.compare = function (a, b) {\r\n var indexCmp = a.node.compareTo(b.node);\r\n if (indexCmp === 0) {\r\n return nameCompare(a.name, b.name);\r\n }\r\n else {\r\n return indexCmp;\r\n }\r\n };\r\n ValueIndex.prototype.isDefinedOn = function (node) {\r\n return true;\r\n };\r\n ValueIndex.prototype.indexedValueChanged = function (oldNode, newNode) {\r\n return !oldNode.equals(newNode);\r\n };\r\n ValueIndex.prototype.minPost = function () {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return NamedNode.MIN;\r\n };\r\n ValueIndex.prototype.maxPost = function () {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return NamedNode.MAX;\r\n };\r\n ValueIndex.prototype.makePost = function (indexValue, name) {\r\n var valueNode = nodeFromJSON(indexValue);\r\n return new NamedNode(name, valueNode);\r\n };\r\n /**\r\n * @returns String representation for inclusion in a query spec\r\n */\r\n ValueIndex.prototype.toString = function () {\r\n return '.value';\r\n };\r\n return ValueIndex;\r\n}(Index));\r\nvar VALUE_INDEX = new ValueIndex();\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Modeled after base64 web-safe chars, but ordered by ASCII.\r\nvar PUSH_CHARS = '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';\r\nvar MIN_PUSH_CHAR = '-';\r\nvar MAX_PUSH_CHAR = 'z';\r\nvar MAX_KEY_LEN = 786;\r\n/**\r\n * Fancy ID generator that creates 20-character string identifiers with the\r\n * following properties:\r\n *\r\n * 1. They're based on timestamp so that they sort *after* any existing ids.\r\n * 2. They contain 72-bits of random data after the timestamp so that IDs won't\r\n * collide with other clients' IDs.\r\n * 3. They sort *lexicographically* (so the timestamp is converted to characters\r\n * that will sort properly).\r\n * 4. They're monotonically increasing. Even if you generate more than one in\r\n * the same timestamp, the latter ones will sort after the former ones. We do\r\n * this by using the previous random bits but \"incrementing\" them by 1 (only\r\n * in the case of a timestamp collision).\r\n */\r\nvar nextPushId = (function () {\r\n // Timestamp of last push, used to prevent local collisions if you push twice\r\n // in one ms.\r\n var lastPushTime = 0;\r\n // We generate 72-bits of randomness which get turned into 12 characters and\r\n // appended to the timestamp to prevent collisions with other clients. We\r\n // store the last characters we generated because in the event of a collision,\r\n // we'll use those same characters except \"incremented\" by one.\r\n var lastRandChars = [];\r\n return function (now) {\r\n var duplicateTime = now === lastPushTime;\r\n lastPushTime = now;\r\n var i;\r\n var timeStampChars = new Array(8);\r\n for (i = 7; i >= 0; i--) {\r\n timeStampChars[i] = PUSH_CHARS.charAt(now % 64);\r\n // NOTE: Can't use << here because javascript will convert to int and lose\r\n // the upper bits.\r\n now = Math.floor(now / 64);\r\n }\r\n assert(now === 0, 'Cannot push at time == 0');\r\n var id = timeStampChars.join('');\r\n if (!duplicateTime) {\r\n for (i = 0; i < 12; i++) {\r\n lastRandChars[i] = Math.floor(Math.random() * 64);\r\n }\r\n }\r\n else {\r\n // If the timestamp hasn't changed since last push, use the same random\r\n // number, except incremented by 1.\r\n for (i = 11; i >= 0 && lastRandChars[i] === 63; i--) {\r\n lastRandChars[i] = 0;\r\n }\r\n lastRandChars[i]++;\r\n }\r\n for (i = 0; i < 12; i++) {\r\n id += PUSH_CHARS.charAt(lastRandChars[i]);\r\n }\r\n assert(id.length === 20, 'nextPushId: Length should be 20.');\r\n return id;\r\n };\r\n})();\r\nvar successor = function (key) {\r\n if (key === '' + INTEGER_32_MAX) {\r\n // See https://firebase.google.com/docs/database/web/lists-of-data#data-order\r\n return MIN_PUSH_CHAR;\r\n }\r\n var keyAsInt = tryParseInt(key);\r\n if (keyAsInt != null) {\r\n return '' + (keyAsInt + 1);\r\n }\r\n var next = new Array(key.length);\r\n for (var i_1 = 0; i_1 < next.length; i_1++) {\r\n next[i_1] = key.charAt(i_1);\r\n }\r\n if (next.length < MAX_KEY_LEN) {\r\n next.push(MIN_PUSH_CHAR);\r\n return next.join('');\r\n }\r\n var i = next.length - 1;\r\n while (i >= 0 && next[i] === MAX_PUSH_CHAR) {\r\n i--;\r\n }\r\n // `successor` was called on the largest possible key, so return the\r\n // MAX_NAME, which sorts larger than all keys.\r\n if (i === -1) {\r\n return MAX_NAME;\r\n }\r\n var source = next[i];\r\n var sourcePlusOne = PUSH_CHARS.charAt(PUSH_CHARS.indexOf(source) + 1);\r\n next[i] = sourcePlusOne;\r\n return next.slice(0, i + 1).join('');\r\n};\r\n// `key` is assumed to be non-empty.\r\nvar predecessor = function (key) {\r\n if (key === '' + INTEGER_32_MIN) {\r\n return MIN_NAME;\r\n }\r\n var keyAsInt = tryParseInt(key);\r\n if (keyAsInt != null) {\r\n return '' + (keyAsInt - 1);\r\n }\r\n var next = new Array(key.length);\r\n for (var i = 0; i < next.length; i++) {\r\n next[i] = key.charAt(i);\r\n }\r\n // If `key` ends in `MIN_PUSH_CHAR`, the largest key lexicographically\r\n // smaller than `key`, is `key[0:key.length - 1]`. The next key smaller\r\n // than that, `predecessor(predecessor(key))`, is\r\n //\r\n // `key[0:key.length - 2] + (key[key.length - 1] - 1) + \\\r\n // { MAX_PUSH_CHAR repeated MAX_KEY_LEN - (key.length - 1) times }\r\n //\r\n // analogous to increment/decrement for base-10 integers.\r\n //\r\n // This works because lexigographic comparison works character-by-character,\r\n // using length as a tie-breaker if one key is a prefix of the other.\r\n if (next[next.length - 1] === MIN_PUSH_CHAR) {\r\n if (next.length === 1) {\r\n // See https://firebase.google.com/docs/database/web/lists-of-data#orderbykey\r\n return '' + INTEGER_32_MAX;\r\n }\r\n delete next[next.length - 1];\r\n return next.join('');\r\n }\r\n // Replace the last character with it's immediate predecessor, and\r\n // fill the suffix of the key with MAX_PUSH_CHAR. This is the\r\n // lexicographically largest possible key smaller than `key`.\r\n next[next.length - 1] = PUSH_CHARS.charAt(PUSH_CHARS.indexOf(next[next.length - 1]) - 1);\r\n return next.join('') + MAX_PUSH_CHAR.repeat(MAX_KEY_LEN - next.length);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction changeValue(snapshotNode) {\r\n return { type: \"value\" /* VALUE */, snapshotNode: snapshotNode };\r\n}\r\nfunction changeChildAdded(childName, snapshotNode) {\r\n return { type: \"child_added\" /* CHILD_ADDED */, snapshotNode: snapshotNode, childName: childName };\r\n}\r\nfunction changeChildRemoved(childName, snapshotNode) {\r\n return { type: \"child_removed\" /* CHILD_REMOVED */, snapshotNode: snapshotNode, childName: childName };\r\n}\r\nfunction changeChildChanged(childName, snapshotNode, oldSnap) {\r\n return {\r\n type: \"child_changed\" /* CHILD_CHANGED */,\r\n snapshotNode: snapshotNode,\r\n childName: childName,\r\n oldSnap: oldSnap\r\n };\r\n}\r\nfunction changeChildMoved(childName, snapshotNode) {\r\n return { type: \"child_moved\" /* CHILD_MOVED */, snapshotNode: snapshotNode, childName: childName };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Doesn't really filter nodes but applies an index to the node and keeps track of any changes\r\n */\r\nvar IndexedFilter = /** @class */ (function () {\r\n function IndexedFilter(index_) {\r\n this.index_ = index_;\r\n }\r\n IndexedFilter.prototype.updateChild = function (snap, key, newChild, affectedPath, source, optChangeAccumulator) {\r\n assert(snap.isIndexed(this.index_), 'A node must be indexed if only a child is updated');\r\n var oldChild = snap.getImmediateChild(key);\r\n // Check if anything actually changed.\r\n if (oldChild.getChild(affectedPath).equals(newChild.getChild(affectedPath))) {\r\n // There's an edge case where a child can enter or leave the view because affectedPath was set to null.\r\n // In this case, affectedPath will appear null in both the old and new snapshots. So we need\r\n // to avoid treating these cases as \"nothing changed.\"\r\n if (oldChild.isEmpty() === newChild.isEmpty()) {\r\n // Nothing changed.\r\n // This assert should be valid, but it's expensive (can dominate perf testing) so don't actually do it.\r\n //assert(oldChild.equals(newChild), 'Old and new snapshots should be equal.');\r\n return snap;\r\n }\r\n }\r\n if (optChangeAccumulator != null) {\r\n if (newChild.isEmpty()) {\r\n if (snap.hasChild(key)) {\r\n optChangeAccumulator.trackChildChange(changeChildRemoved(key, oldChild));\r\n }\r\n else {\r\n assert(snap.isLeafNode(), 'A child remove without an old child only makes sense on a leaf node');\r\n }\r\n }\r\n else if (oldChild.isEmpty()) {\r\n optChangeAccumulator.trackChildChange(changeChildAdded(key, newChild));\r\n }\r\n else {\r\n optChangeAccumulator.trackChildChange(changeChildChanged(key, newChild, oldChild));\r\n }\r\n }\r\n if (snap.isLeafNode() && newChild.isEmpty()) {\r\n return snap;\r\n }\r\n else {\r\n // Make sure the node is indexed\r\n return snap.updateImmediateChild(key, newChild).withIndex(this.index_);\r\n }\r\n };\r\n IndexedFilter.prototype.updateFullNode = function (oldSnap, newSnap, optChangeAccumulator) {\r\n if (optChangeAccumulator != null) {\r\n if (!oldSnap.isLeafNode()) {\r\n oldSnap.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n if (!newSnap.hasChild(key)) {\r\n optChangeAccumulator.trackChildChange(changeChildRemoved(key, childNode));\r\n }\r\n });\r\n }\r\n if (!newSnap.isLeafNode()) {\r\n newSnap.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n if (oldSnap.hasChild(key)) {\r\n var oldChild = oldSnap.getImmediateChild(key);\r\n if (!oldChild.equals(childNode)) {\r\n optChangeAccumulator.trackChildChange(changeChildChanged(key, childNode, oldChild));\r\n }\r\n }\r\n else {\r\n optChangeAccumulator.trackChildChange(changeChildAdded(key, childNode));\r\n }\r\n });\r\n }\r\n }\r\n return newSnap.withIndex(this.index_);\r\n };\r\n IndexedFilter.prototype.updatePriority = function (oldSnap, newPriority) {\r\n if (oldSnap.isEmpty()) {\r\n return ChildrenNode.EMPTY_NODE;\r\n }\r\n else {\r\n return oldSnap.updatePriority(newPriority);\r\n }\r\n };\r\n IndexedFilter.prototype.filtersNodes = function () {\r\n return false;\r\n };\r\n IndexedFilter.prototype.getIndexedFilter = function () {\r\n return this;\r\n };\r\n IndexedFilter.prototype.getIndex = function () {\r\n return this.index_;\r\n };\r\n return IndexedFilter;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Filters nodes by range and uses an IndexFilter to track any changes after filtering the node\r\n */\r\nvar RangedFilter = /** @class */ (function () {\r\n function RangedFilter(params) {\r\n this.indexedFilter_ = new IndexedFilter(params.getIndex());\r\n this.index_ = params.getIndex();\r\n this.startPost_ = RangedFilter.getStartPost_(params);\r\n this.endPost_ = RangedFilter.getEndPost_(params);\r\n }\r\n RangedFilter.prototype.getStartPost = function () {\r\n return this.startPost_;\r\n };\r\n RangedFilter.prototype.getEndPost = function () {\r\n return this.endPost_;\r\n };\r\n RangedFilter.prototype.matches = function (node) {\r\n return (this.index_.compare(this.getStartPost(), node) <= 0 &&\r\n this.index_.compare(node, this.getEndPost()) <= 0);\r\n };\r\n RangedFilter.prototype.updateChild = function (snap, key, newChild, affectedPath, source, optChangeAccumulator) {\r\n if (!this.matches(new NamedNode(key, newChild))) {\r\n newChild = ChildrenNode.EMPTY_NODE;\r\n }\r\n return this.indexedFilter_.updateChild(snap, key, newChild, affectedPath, source, optChangeAccumulator);\r\n };\r\n RangedFilter.prototype.updateFullNode = function (oldSnap, newSnap, optChangeAccumulator) {\r\n if (newSnap.isLeafNode()) {\r\n // Make sure we have a children node with the correct index, not a leaf node;\r\n newSnap = ChildrenNode.EMPTY_NODE;\r\n }\r\n var filtered = newSnap.withIndex(this.index_);\r\n // Don't support priorities on queries\r\n filtered = filtered.updatePriority(ChildrenNode.EMPTY_NODE);\r\n var self = this;\r\n newSnap.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n if (!self.matches(new NamedNode(key, childNode))) {\r\n filtered = filtered.updateImmediateChild(key, ChildrenNode.EMPTY_NODE);\r\n }\r\n });\r\n return this.indexedFilter_.updateFullNode(oldSnap, filtered, optChangeAccumulator);\r\n };\r\n RangedFilter.prototype.updatePriority = function (oldSnap, newPriority) {\r\n // Don't support priorities on queries\r\n return oldSnap;\r\n };\r\n RangedFilter.prototype.filtersNodes = function () {\r\n return true;\r\n };\r\n RangedFilter.prototype.getIndexedFilter = function () {\r\n return this.indexedFilter_;\r\n };\r\n RangedFilter.prototype.getIndex = function () {\r\n return this.index_;\r\n };\r\n RangedFilter.getStartPost_ = function (params) {\r\n if (params.hasStart()) {\r\n var startName = params.getIndexStartName();\r\n return params.getIndex().makePost(params.getIndexStartValue(), startName);\r\n }\r\n else {\r\n return params.getIndex().minPost();\r\n }\r\n };\r\n RangedFilter.getEndPost_ = function (params) {\r\n if (params.hasEnd()) {\r\n var endName = params.getIndexEndName();\r\n return params.getIndex().makePost(params.getIndexEndValue(), endName);\r\n }\r\n else {\r\n return params.getIndex().maxPost();\r\n }\r\n };\r\n return RangedFilter;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Applies a limit and a range to a node and uses RangedFilter to do the heavy lifting where possible\r\n */\r\nvar LimitedFilter = /** @class */ (function () {\r\n function LimitedFilter(params) {\r\n this.rangedFilter_ = new RangedFilter(params);\r\n this.index_ = params.getIndex();\r\n this.limit_ = params.getLimit();\r\n this.reverse_ = !params.isViewFromLeft();\r\n }\r\n LimitedFilter.prototype.updateChild = function (snap, key, newChild, affectedPath, source, optChangeAccumulator) {\r\n if (!this.rangedFilter_.matches(new NamedNode(key, newChild))) {\r\n newChild = ChildrenNode.EMPTY_NODE;\r\n }\r\n if (snap.getImmediateChild(key).equals(newChild)) {\r\n // No change\r\n return snap;\r\n }\r\n else if (snap.numChildren() < this.limit_) {\r\n return this.rangedFilter_\r\n .getIndexedFilter()\r\n .updateChild(snap, key, newChild, affectedPath, source, optChangeAccumulator);\r\n }\r\n else {\r\n return this.fullLimitUpdateChild_(snap, key, newChild, source, optChangeAccumulator);\r\n }\r\n };\r\n LimitedFilter.prototype.updateFullNode = function (oldSnap, newSnap, optChangeAccumulator) {\r\n var filtered;\r\n if (newSnap.isLeafNode() || newSnap.isEmpty()) {\r\n // Make sure we have a children node with the correct index, not a leaf node;\r\n filtered = ChildrenNode.EMPTY_NODE.withIndex(this.index_);\r\n }\r\n else {\r\n if (this.limit_ * 2 < newSnap.numChildren() &&\r\n newSnap.isIndexed(this.index_)) {\r\n // Easier to build up a snapshot, since what we're given has more than twice the elements we want\r\n filtered = ChildrenNode.EMPTY_NODE.withIndex(this.index_);\r\n // anchor to the startPost, endPost, or last element as appropriate\r\n var iterator = void 0;\r\n if (this.reverse_) {\r\n iterator = newSnap.getReverseIteratorFrom(this.rangedFilter_.getEndPost(), this.index_);\r\n }\r\n else {\r\n iterator = newSnap.getIteratorFrom(this.rangedFilter_.getStartPost(), this.index_);\r\n }\r\n var count = 0;\r\n while (iterator.hasNext() && count < this.limit_) {\r\n var next = iterator.getNext();\r\n var inRange = void 0;\r\n if (this.reverse_) {\r\n inRange =\r\n this.index_.compare(this.rangedFilter_.getStartPost(), next) <= 0;\r\n }\r\n else {\r\n inRange =\r\n this.index_.compare(next, this.rangedFilter_.getEndPost()) <= 0;\r\n }\r\n if (inRange) {\r\n filtered = filtered.updateImmediateChild(next.name, next.node);\r\n count++;\r\n }\r\n else {\r\n // if we have reached the end post, we cannot keep adding elemments\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n // The snap contains less than twice the limit. Faster to delete from the snap than build up a new one\r\n filtered = newSnap.withIndex(this.index_);\r\n // Don't support priorities on queries\r\n filtered = filtered.updatePriority(ChildrenNode.EMPTY_NODE);\r\n var startPost = void 0;\r\n var endPost = void 0;\r\n var cmp = void 0;\r\n var iterator = void 0;\r\n if (this.reverse_) {\r\n iterator = filtered.getReverseIterator(this.index_);\r\n startPost = this.rangedFilter_.getEndPost();\r\n endPost = this.rangedFilter_.getStartPost();\r\n var indexCompare_1 = this.index_.getCompare();\r\n cmp = function (a, b) { return indexCompare_1(b, a); };\r\n }\r\n else {\r\n iterator = filtered.getIterator(this.index_);\r\n startPost = this.rangedFilter_.getStartPost();\r\n endPost = this.rangedFilter_.getEndPost();\r\n cmp = this.index_.getCompare();\r\n }\r\n var count = 0;\r\n var foundStartPost = false;\r\n while (iterator.hasNext()) {\r\n var next = iterator.getNext();\r\n if (!foundStartPost && cmp(startPost, next) <= 0) {\r\n // start adding\r\n foundStartPost = true;\r\n }\r\n var inRange = foundStartPost && count < this.limit_ && cmp(next, endPost) <= 0;\r\n if (inRange) {\r\n count++;\r\n }\r\n else {\r\n filtered = filtered.updateImmediateChild(next.name, ChildrenNode.EMPTY_NODE);\r\n }\r\n }\r\n }\r\n }\r\n return this.rangedFilter_\r\n .getIndexedFilter()\r\n .updateFullNode(oldSnap, filtered, optChangeAccumulator);\r\n };\r\n LimitedFilter.prototype.updatePriority = function (oldSnap, newPriority) {\r\n // Don't support priorities on queries\r\n return oldSnap;\r\n };\r\n LimitedFilter.prototype.filtersNodes = function () {\r\n return true;\r\n };\r\n LimitedFilter.prototype.getIndexedFilter = function () {\r\n return this.rangedFilter_.getIndexedFilter();\r\n };\r\n LimitedFilter.prototype.getIndex = function () {\r\n return this.index_;\r\n };\r\n LimitedFilter.prototype.fullLimitUpdateChild_ = function (snap, childKey, childSnap, source, changeAccumulator) {\r\n // TODO: rename all cache stuff etc to general snap terminology\r\n var cmp;\r\n if (this.reverse_) {\r\n var indexCmp_1 = this.index_.getCompare();\r\n cmp = function (a, b) { return indexCmp_1(b, a); };\r\n }\r\n else {\r\n cmp = this.index_.getCompare();\r\n }\r\n var oldEventCache = snap;\r\n assert(oldEventCache.numChildren() === this.limit_, '');\r\n var newChildNamedNode = new NamedNode(childKey, childSnap);\r\n var windowBoundary = this.reverse_\r\n ? oldEventCache.getFirstChild(this.index_)\r\n : oldEventCache.getLastChild(this.index_);\r\n var inRange = this.rangedFilter_.matches(newChildNamedNode);\r\n if (oldEventCache.hasChild(childKey)) {\r\n var oldChildSnap = oldEventCache.getImmediateChild(childKey);\r\n var nextChild = source.getChildAfterChild(this.index_, windowBoundary, this.reverse_);\r\n while (nextChild != null &&\r\n (nextChild.name === childKey || oldEventCache.hasChild(nextChild.name))) {\r\n // There is a weird edge case where a node is updated as part of a merge in the write tree, but hasn't\r\n // been applied to the limited filter yet. Ignore this next child which will be updated later in\r\n // the limited filter...\r\n nextChild = source.getChildAfterChild(this.index_, nextChild, this.reverse_);\r\n }\r\n var compareNext = nextChild == null ? 1 : cmp(nextChild, newChildNamedNode);\r\n var remainsInWindow = inRange && !childSnap.isEmpty() && compareNext >= 0;\r\n if (remainsInWindow) {\r\n if (changeAccumulator != null) {\r\n changeAccumulator.trackChildChange(changeChildChanged(childKey, childSnap, oldChildSnap));\r\n }\r\n return oldEventCache.updateImmediateChild(childKey, childSnap);\r\n }\r\n else {\r\n if (changeAccumulator != null) {\r\n changeAccumulator.trackChildChange(changeChildRemoved(childKey, oldChildSnap));\r\n }\r\n var newEventCache = oldEventCache.updateImmediateChild(childKey, ChildrenNode.EMPTY_NODE);\r\n var nextChildInRange = nextChild != null && this.rangedFilter_.matches(nextChild);\r\n if (nextChildInRange) {\r\n if (changeAccumulator != null) {\r\n changeAccumulator.trackChildChange(changeChildAdded(nextChild.name, nextChild.node));\r\n }\r\n return newEventCache.updateImmediateChild(nextChild.name, nextChild.node);\r\n }\r\n else {\r\n return newEventCache;\r\n }\r\n }\r\n }\r\n else if (childSnap.isEmpty()) {\r\n // we're deleting a node, but it was not in the window, so ignore it\r\n return snap;\r\n }\r\n else if (inRange) {\r\n if (cmp(windowBoundary, newChildNamedNode) >= 0) {\r\n if (changeAccumulator != null) {\r\n changeAccumulator.trackChildChange(changeChildRemoved(windowBoundary.name, windowBoundary.node));\r\n changeAccumulator.trackChildChange(changeChildAdded(childKey, childSnap));\r\n }\r\n return oldEventCache\r\n .updateImmediateChild(childKey, childSnap)\r\n .updateImmediateChild(windowBoundary.name, ChildrenNode.EMPTY_NODE);\r\n }\r\n else {\r\n return snap;\r\n }\r\n }\r\n else {\r\n return snap;\r\n }\r\n };\r\n return LimitedFilter;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * This class is an immutable-from-the-public-api struct containing a set of query parameters defining a\r\n * range to be returned for a particular location. It is assumed that validation of parameters is done at the\r\n * user-facing API level, so it is not done here.\r\n */\r\nvar QueryParams = /** @class */ (function () {\r\n function QueryParams() {\r\n this.limitSet_ = false;\r\n this.startSet_ = false;\r\n this.startNameSet_ = false;\r\n this.startAfterSet_ = false;\r\n this.endSet_ = false;\r\n this.endNameSet_ = false;\r\n this.endBeforeSet_ = false;\r\n this.limit_ = 0;\r\n this.viewFrom_ = '';\r\n this.indexStartValue_ = null;\r\n this.indexStartName_ = '';\r\n this.indexEndValue_ = null;\r\n this.indexEndName_ = '';\r\n this.index_ = PRIORITY_INDEX;\r\n }\r\n QueryParams.prototype.hasStart = function () {\r\n return this.startSet_;\r\n };\r\n QueryParams.prototype.hasStartAfter = function () {\r\n return this.startAfterSet_;\r\n };\r\n QueryParams.prototype.hasEndBefore = function () {\r\n return this.endBeforeSet_;\r\n };\r\n /**\r\n * @returns True if it would return from left.\r\n */\r\n QueryParams.prototype.isViewFromLeft = function () {\r\n if (this.viewFrom_ === '') {\r\n // limit(), rather than limitToFirst or limitToLast was called.\r\n // This means that only one of startSet_ and endSet_ is true. Use them\r\n // to calculate which side of the view to anchor to. If neither is set,\r\n // anchor to the end.\r\n return this.startSet_;\r\n }\r\n else {\r\n return this.viewFrom_ === \"l\" /* VIEW_FROM_LEFT */;\r\n }\r\n };\r\n /**\r\n * Only valid to call if hasStart() returns true\r\n */\r\n QueryParams.prototype.getIndexStartValue = function () {\r\n assert(this.startSet_, 'Only valid if start has been set');\r\n return this.indexStartValue_;\r\n };\r\n /**\r\n * Only valid to call if hasStart() returns true.\r\n * Returns the starting key name for the range defined by these query parameters\r\n */\r\n QueryParams.prototype.getIndexStartName = function () {\r\n assert(this.startSet_, 'Only valid if start has been set');\r\n if (this.startNameSet_) {\r\n return this.indexStartName_;\r\n }\r\n else {\r\n return MIN_NAME;\r\n }\r\n };\r\n QueryParams.prototype.hasEnd = function () {\r\n return this.endSet_;\r\n };\r\n /**\r\n * Only valid to call if hasEnd() returns true.\r\n */\r\n QueryParams.prototype.getIndexEndValue = function () {\r\n assert(this.endSet_, 'Only valid if end has been set');\r\n return this.indexEndValue_;\r\n };\r\n /**\r\n * Only valid to call if hasEnd() returns true.\r\n * Returns the end key name for the range defined by these query parameters\r\n */\r\n QueryParams.prototype.getIndexEndName = function () {\r\n assert(this.endSet_, 'Only valid if end has been set');\r\n if (this.endNameSet_) {\r\n return this.indexEndName_;\r\n }\r\n else {\r\n return MAX_NAME;\r\n }\r\n };\r\n QueryParams.prototype.hasLimit = function () {\r\n return this.limitSet_;\r\n };\r\n /**\r\n * @returns True if a limit has been set and it has been explicitly anchored\r\n */\r\n QueryParams.prototype.hasAnchoredLimit = function () {\r\n return this.limitSet_ && this.viewFrom_ !== '';\r\n };\r\n /**\r\n * Only valid to call if hasLimit() returns true\r\n */\r\n QueryParams.prototype.getLimit = function () {\r\n assert(this.limitSet_, 'Only valid if limit has been set');\r\n return this.limit_;\r\n };\r\n QueryParams.prototype.getIndex = function () {\r\n return this.index_;\r\n };\r\n QueryParams.prototype.loadsAllData = function () {\r\n return !(this.startSet_ || this.endSet_ || this.limitSet_);\r\n };\r\n QueryParams.prototype.isDefault = function () {\r\n return this.loadsAllData() && this.index_ === PRIORITY_INDEX;\r\n };\r\n QueryParams.prototype.copy = function () {\r\n var copy = new QueryParams();\r\n copy.limitSet_ = this.limitSet_;\r\n copy.limit_ = this.limit_;\r\n copy.startSet_ = this.startSet_;\r\n copy.indexStartValue_ = this.indexStartValue_;\r\n copy.startNameSet_ = this.startNameSet_;\r\n copy.indexStartName_ = this.indexStartName_;\r\n copy.endSet_ = this.endSet_;\r\n copy.indexEndValue_ = this.indexEndValue_;\r\n copy.endNameSet_ = this.endNameSet_;\r\n copy.indexEndName_ = this.indexEndName_;\r\n copy.index_ = this.index_;\r\n copy.viewFrom_ = this.viewFrom_;\r\n return copy;\r\n };\r\n return QueryParams;\r\n}());\r\nfunction queryParamsGetNodeFilter(queryParams) {\r\n if (queryParams.loadsAllData()) {\r\n return new IndexedFilter(queryParams.getIndex());\r\n }\r\n else if (queryParams.hasLimit()) {\r\n return new LimitedFilter(queryParams);\r\n }\r\n else {\r\n return new RangedFilter(queryParams);\r\n }\r\n}\r\nfunction queryParamsLimitToFirst(queryParams, newLimit) {\r\n var newParams = queryParams.copy();\r\n newParams.limitSet_ = true;\r\n newParams.limit_ = newLimit;\r\n newParams.viewFrom_ = \"l\" /* VIEW_FROM_LEFT */;\r\n return newParams;\r\n}\r\nfunction queryParamsLimitToLast(queryParams, newLimit) {\r\n var newParams = queryParams.copy();\r\n newParams.limitSet_ = true;\r\n newParams.limit_ = newLimit;\r\n newParams.viewFrom_ = \"r\" /* VIEW_FROM_RIGHT */;\r\n return newParams;\r\n}\r\nfunction queryParamsStartAt(queryParams, indexValue, key) {\r\n var newParams = queryParams.copy();\r\n newParams.startSet_ = true;\r\n if (indexValue === undefined) {\r\n indexValue = null;\r\n }\r\n newParams.indexStartValue_ = indexValue;\r\n if (key != null) {\r\n newParams.startNameSet_ = true;\r\n newParams.indexStartName_ = key;\r\n }\r\n else {\r\n newParams.startNameSet_ = false;\r\n newParams.indexStartName_ = '';\r\n }\r\n return newParams;\r\n}\r\nfunction queryParamsStartAfter(queryParams, indexValue, key) {\r\n var params;\r\n if (queryParams.index_ === KEY_INDEX) {\r\n if (typeof indexValue === 'string') {\r\n indexValue = successor(indexValue);\r\n }\r\n params = queryParamsStartAt(queryParams, indexValue, key);\r\n }\r\n else {\r\n var childKey = void 0;\r\n if (key == null) {\r\n childKey = MAX_NAME;\r\n }\r\n else {\r\n childKey = successor(key);\r\n }\r\n params = queryParamsStartAt(queryParams, indexValue, childKey);\r\n }\r\n params.startAfterSet_ = true;\r\n return params;\r\n}\r\nfunction queryParamsEndAt(queryParams, indexValue, key) {\r\n var newParams = queryParams.copy();\r\n newParams.endSet_ = true;\r\n if (indexValue === undefined) {\r\n indexValue = null;\r\n }\r\n newParams.indexEndValue_ = indexValue;\r\n if (key !== undefined) {\r\n newParams.endNameSet_ = true;\r\n newParams.indexEndName_ = key;\r\n }\r\n else {\r\n newParams.endNameSet_ = false;\r\n newParams.indexEndName_ = '';\r\n }\r\n return newParams;\r\n}\r\nfunction queryParamsEndBefore(queryParams, indexValue, key) {\r\n var childKey;\r\n var params;\r\n if (queryParams.index_ === KEY_INDEX) {\r\n if (typeof indexValue === 'string') {\r\n indexValue = predecessor(indexValue);\r\n }\r\n params = queryParamsEndAt(queryParams, indexValue, key);\r\n }\r\n else {\r\n if (key == null) {\r\n childKey = MIN_NAME;\r\n }\r\n else {\r\n childKey = predecessor(key);\r\n }\r\n params = queryParamsEndAt(queryParams, indexValue, childKey);\r\n }\r\n params.endBeforeSet_ = true;\r\n return params;\r\n}\r\nfunction queryParamsOrderBy(queryParams, index) {\r\n var newParams = queryParams.copy();\r\n newParams.index_ = index;\r\n return newParams;\r\n}\r\n/**\r\n * Returns a set of REST query string parameters representing this query.\r\n *\r\n * @returns query string parameters\r\n */\r\nfunction queryParamsToRestQueryStringParameters(queryParams) {\r\n var qs = {};\r\n if (queryParams.isDefault()) {\r\n return qs;\r\n }\r\n var orderBy;\r\n if (queryParams.index_ === PRIORITY_INDEX) {\r\n orderBy = \"$priority\" /* PRIORITY_INDEX */;\r\n }\r\n else if (queryParams.index_ === VALUE_INDEX) {\r\n orderBy = \"$value\" /* VALUE_INDEX */;\r\n }\r\n else if (queryParams.index_ === KEY_INDEX) {\r\n orderBy = \"$key\" /* KEY_INDEX */;\r\n }\r\n else {\r\n assert(queryParams.index_ instanceof PathIndex, 'Unrecognized index type!');\r\n orderBy = queryParams.index_.toString();\r\n }\r\n qs[\"orderBy\" /* ORDER_BY */] = stringify(orderBy);\r\n if (queryParams.startSet_) {\r\n qs[\"startAt\" /* START_AT */] = stringify(queryParams.indexStartValue_);\r\n if (queryParams.startNameSet_) {\r\n qs[\"startAt\" /* START_AT */] +=\r\n ',' + stringify(queryParams.indexStartName_);\r\n }\r\n }\r\n if (queryParams.endSet_) {\r\n qs[\"endAt\" /* END_AT */] = stringify(queryParams.indexEndValue_);\r\n if (queryParams.endNameSet_) {\r\n qs[\"endAt\" /* END_AT */] +=\r\n ',' + stringify(queryParams.indexEndName_);\r\n }\r\n }\r\n if (queryParams.limitSet_) {\r\n if (queryParams.isViewFromLeft()) {\r\n qs[\"limitToFirst\" /* LIMIT_TO_FIRST */] = queryParams.limit_;\r\n }\r\n else {\r\n qs[\"limitToLast\" /* LIMIT_TO_LAST */] = queryParams.limit_;\r\n }\r\n }\r\n return qs;\r\n}\r\nfunction queryParamsGetQueryObject(queryParams) {\r\n var obj = {};\r\n if (queryParams.startSet_) {\r\n obj[\"sp\" /* INDEX_START_VALUE */] =\r\n queryParams.indexStartValue_;\r\n if (queryParams.startNameSet_) {\r\n obj[\"sn\" /* INDEX_START_NAME */] =\r\n queryParams.indexStartName_;\r\n }\r\n }\r\n if (queryParams.endSet_) {\r\n obj[\"ep\" /* INDEX_END_VALUE */] = queryParams.indexEndValue_;\r\n if (queryParams.endNameSet_) {\r\n obj[\"en\" /* INDEX_END_NAME */] = queryParams.indexEndName_;\r\n }\r\n }\r\n if (queryParams.limitSet_) {\r\n obj[\"l\" /* LIMIT */] = queryParams.limit_;\r\n var viewFrom = queryParams.viewFrom_;\r\n if (viewFrom === '') {\r\n if (queryParams.isViewFromLeft()) {\r\n viewFrom = \"l\" /* VIEW_FROM_LEFT */;\r\n }\r\n else {\r\n viewFrom = \"r\" /* VIEW_FROM_RIGHT */;\r\n }\r\n }\r\n obj[\"vf\" /* VIEW_FROM */] = viewFrom;\r\n }\r\n // For now, priority index is the default, so we only specify if it's some other index\r\n if (queryParams.index_ !== PRIORITY_INDEX) {\r\n obj[\"i\" /* INDEX */] = queryParams.index_.toString();\r\n }\r\n return obj;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An implementation of ServerActions that communicates with the server via REST requests.\r\n * This is mostly useful for compatibility with crawlers, where we don't want to spin up a full\r\n * persistent connection (using WebSockets or long-polling)\r\n */\r\nvar ReadonlyRestClient = /** @class */ (function (_super) {\r\n __extends(ReadonlyRestClient, _super);\r\n /**\r\n * @param repoInfo_ - Data about the namespace we are connecting to\r\n * @param onDataUpdate_ - A callback for new data from the server\r\n */\r\n function ReadonlyRestClient(repoInfo_, onDataUpdate_, authTokenProvider_, appCheckTokenProvider_) {\r\n var _this = _super.call(this) || this;\r\n _this.repoInfo_ = repoInfo_;\r\n _this.onDataUpdate_ = onDataUpdate_;\r\n _this.authTokenProvider_ = authTokenProvider_;\r\n _this.appCheckTokenProvider_ = appCheckTokenProvider_;\r\n /** @private {function(...[*])} */\r\n _this.log_ = logWrapper('p:rest:');\r\n /**\r\n * We don't actually need to track listens, except to prevent us calling an onComplete for a listen\r\n * that's been removed. :-/\r\n */\r\n _this.listens_ = {};\r\n return _this;\r\n }\r\n ReadonlyRestClient.prototype.reportStats = function (stats) {\r\n throw new Error('Method not implemented.');\r\n };\r\n ReadonlyRestClient.getListenId_ = function (query, tag) {\r\n if (tag !== undefined) {\r\n return 'tag$' + tag;\r\n }\r\n else {\r\n assert(query._queryParams.isDefault(), \"should have a tag if it's not a default query.\");\r\n return query._path.toString();\r\n }\r\n };\r\n /** @inheritDoc */\r\n ReadonlyRestClient.prototype.listen = function (query, currentHashFn, tag, onComplete) {\r\n var _this = this;\r\n var pathString = query._path.toString();\r\n this.log_('Listen called for ' + pathString + ' ' + query._queryIdentifier);\r\n // Mark this listener so we can tell if it's removed.\r\n var listenId = ReadonlyRestClient.getListenId_(query, tag);\r\n var thisListen = {};\r\n this.listens_[listenId] = thisListen;\r\n var queryStringParameters = queryParamsToRestQueryStringParameters(query._queryParams);\r\n this.restRequest_(pathString + '.json', queryStringParameters, function (error, result) {\r\n var data = result;\r\n if (error === 404) {\r\n data = null;\r\n error = null;\r\n }\r\n if (error === null) {\r\n _this.onDataUpdate_(pathString, data, /*isMerge=*/ false, tag);\r\n }\r\n if (safeGet(_this.listens_, listenId) === thisListen) {\r\n var status_1;\r\n if (!error) {\r\n status_1 = 'ok';\r\n }\r\n else if (error === 401) {\r\n status_1 = 'permission_denied';\r\n }\r\n else {\r\n status_1 = 'rest_error:' + error;\r\n }\r\n onComplete(status_1, null);\r\n }\r\n });\r\n };\r\n /** @inheritDoc */\r\n ReadonlyRestClient.prototype.unlisten = function (query, tag) {\r\n var listenId = ReadonlyRestClient.getListenId_(query, tag);\r\n delete this.listens_[listenId];\r\n };\r\n ReadonlyRestClient.prototype.get = function (query) {\r\n var _this = this;\r\n var queryStringParameters = queryParamsToRestQueryStringParameters(query._queryParams);\r\n var pathString = query._path.toString();\r\n var deferred = new Deferred();\r\n this.restRequest_(pathString + '.json', queryStringParameters, function (error, result) {\r\n var data = result;\r\n if (error === 404) {\r\n data = null;\r\n error = null;\r\n }\r\n if (error === null) {\r\n _this.onDataUpdate_(pathString, data, \r\n /*isMerge=*/ false, \r\n /*tag=*/ null);\r\n deferred.resolve(data);\r\n }\r\n else {\r\n deferred.reject(new Error(data));\r\n }\r\n });\r\n return deferred.promise;\r\n };\r\n /** @inheritDoc */\r\n ReadonlyRestClient.prototype.refreshAuthToken = function (token) {\r\n // no-op since we just always call getToken.\r\n };\r\n /**\r\n * Performs a REST request to the given path, with the provided query string parameters,\r\n * and any auth credentials we have.\r\n */\r\n ReadonlyRestClient.prototype.restRequest_ = function (pathString, queryStringParameters, callback) {\r\n var _this = this;\r\n if (queryStringParameters === void 0) { queryStringParameters = {}; }\r\n queryStringParameters['format'] = 'export';\r\n return Promise.all([\r\n this.authTokenProvider_.getToken(/*forceRefresh=*/ false),\r\n this.appCheckTokenProvider_.getToken(/*forceRefresh=*/ false)\r\n ]).then(function (_a) {\r\n var _b = __read(_a, 2), authToken = _b[0], appCheckToken = _b[1];\r\n if (authToken && authToken.accessToken) {\r\n queryStringParameters['auth'] = authToken.accessToken;\r\n }\r\n if (appCheckToken && appCheckToken.token) {\r\n queryStringParameters['ac'] = appCheckToken.token;\r\n }\r\n var url = (_this.repoInfo_.secure ? 'https://' : 'http://') +\r\n _this.repoInfo_.host +\r\n pathString +\r\n '?' +\r\n 'ns=' +\r\n _this.repoInfo_.namespace +\r\n querystring(queryStringParameters);\r\n _this.log_('Sending REST request for ' + url);\r\n var xhr = new XMLHttpRequest();\r\n xhr.onreadystatechange = function () {\r\n if (callback && xhr.readyState === 4) {\r\n _this.log_('REST Response for ' + url + ' received. status:', xhr.status, 'response:', xhr.responseText);\r\n var res = null;\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n try {\r\n res = jsonEval(xhr.responseText);\r\n }\r\n catch (e) {\r\n warn('Failed to parse JSON response for ' +\r\n url +\r\n ': ' +\r\n xhr.responseText);\r\n }\r\n callback(null, res);\r\n }\r\n else {\r\n // 401 and 404 are expected.\r\n if (xhr.status !== 401 && xhr.status !== 404) {\r\n warn('Got unsuccessful REST response for ' +\r\n url +\r\n ' Status: ' +\r\n xhr.status);\r\n }\r\n callback(xhr.status);\r\n }\r\n callback = null;\r\n }\r\n };\r\n xhr.open('GET', url, /*asynchronous=*/ true);\r\n xhr.send();\r\n });\r\n };\r\n return ReadonlyRestClient;\r\n}(ServerActions));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Mutable object which basically just stores a reference to the \"latest\" immutable snapshot.\r\n */\r\nvar SnapshotHolder = /** @class */ (function () {\r\n function SnapshotHolder() {\r\n this.rootNode_ = ChildrenNode.EMPTY_NODE;\r\n }\r\n SnapshotHolder.prototype.getNode = function (path) {\r\n return this.rootNode_.getChild(path);\r\n };\r\n SnapshotHolder.prototype.updateSnapshot = function (path, newSnapshotNode) {\r\n this.rootNode_ = this.rootNode_.updateChild(path, newSnapshotNode);\r\n };\r\n return SnapshotHolder;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction newSparseSnapshotTree() {\r\n return {\r\n value: null,\r\n children: new Map()\r\n };\r\n}\r\n/**\r\n * Stores the given node at the specified path. If there is already a node\r\n * at a shallower path, it merges the new data into that snapshot node.\r\n *\r\n * @param path - Path to look up snapshot for.\r\n * @param data - The new data, or null.\r\n */\r\nfunction sparseSnapshotTreeRemember(sparseSnapshotTree, path, data) {\r\n if (pathIsEmpty(path)) {\r\n sparseSnapshotTree.value = data;\r\n sparseSnapshotTree.children.clear();\r\n }\r\n else if (sparseSnapshotTree.value !== null) {\r\n sparseSnapshotTree.value = sparseSnapshotTree.value.updateChild(path, data);\r\n }\r\n else {\r\n var childKey = pathGetFront(path);\r\n if (!sparseSnapshotTree.children.has(childKey)) {\r\n sparseSnapshotTree.children.set(childKey, newSparseSnapshotTree());\r\n }\r\n var child = sparseSnapshotTree.children.get(childKey);\r\n path = pathPopFront(path);\r\n sparseSnapshotTreeRemember(child, path, data);\r\n }\r\n}\r\n/**\r\n * Purge the data at path from the cache.\r\n *\r\n * @param path - Path to look up snapshot for.\r\n * @returns True if this node should now be removed.\r\n */\r\nfunction sparseSnapshotTreeForget(sparseSnapshotTree, path) {\r\n if (pathIsEmpty(path)) {\r\n sparseSnapshotTree.value = null;\r\n sparseSnapshotTree.children.clear();\r\n return true;\r\n }\r\n else {\r\n if (sparseSnapshotTree.value !== null) {\r\n if (sparseSnapshotTree.value.isLeafNode()) {\r\n // We're trying to forget a node that doesn't exist\r\n return false;\r\n }\r\n else {\r\n var value = sparseSnapshotTree.value;\r\n sparseSnapshotTree.value = null;\r\n value.forEachChild(PRIORITY_INDEX, function (key, tree) {\r\n sparseSnapshotTreeRemember(sparseSnapshotTree, new Path(key), tree);\r\n });\r\n return sparseSnapshotTreeForget(sparseSnapshotTree, path);\r\n }\r\n }\r\n else if (sparseSnapshotTree.children.size > 0) {\r\n var childKey = pathGetFront(path);\r\n path = pathPopFront(path);\r\n if (sparseSnapshotTree.children.has(childKey)) {\r\n var safeToRemove = sparseSnapshotTreeForget(sparseSnapshotTree.children.get(childKey), path);\r\n if (safeToRemove) {\r\n sparseSnapshotTree.children.delete(childKey);\r\n }\r\n }\r\n return sparseSnapshotTree.children.size === 0;\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n}\r\n/**\r\n * Recursively iterates through all of the stored tree and calls the\r\n * callback on each one.\r\n *\r\n * @param prefixPath - Path to look up node for.\r\n * @param func - The function to invoke for each tree.\r\n */\r\nfunction sparseSnapshotTreeForEachTree(sparseSnapshotTree, prefixPath, func) {\r\n if (sparseSnapshotTree.value !== null) {\r\n func(prefixPath, sparseSnapshotTree.value);\r\n }\r\n else {\r\n sparseSnapshotTreeForEachChild(sparseSnapshotTree, function (key, tree) {\r\n var path = new Path(prefixPath.toString() + '/' + key);\r\n sparseSnapshotTreeForEachTree(tree, path, func);\r\n });\r\n }\r\n}\r\n/**\r\n * Iterates through each immediate child and triggers the callback.\r\n * Only seems to be used in tests.\r\n *\r\n * @param func - The function to invoke for each child.\r\n */\r\nfunction sparseSnapshotTreeForEachChild(sparseSnapshotTree, func) {\r\n sparseSnapshotTree.children.forEach(function (tree, key) {\r\n func(key, tree);\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns the delta from the previous call to get stats.\r\n *\r\n * @param collection_ - The collection to \"listen\" to.\r\n */\r\nvar StatsListener = /** @class */ (function () {\r\n function StatsListener(collection_) {\r\n this.collection_ = collection_;\r\n this.last_ = null;\r\n }\r\n StatsListener.prototype.get = function () {\r\n var newStats = this.collection_.get();\r\n var delta = __assign({}, newStats);\r\n if (this.last_) {\r\n each(this.last_, function (stat, value) {\r\n delta[stat] = delta[stat] - value;\r\n });\r\n }\r\n this.last_ = newStats;\r\n return delta;\r\n };\r\n return StatsListener;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Assuming some apps may have a short amount of time on page, and a bulk of firebase operations probably\r\n// happen on page load, we try to report our first set of stats pretty quickly, but we wait at least 10\r\n// seconds to try to ensure the Firebase connection is established / settled.\r\nvar FIRST_STATS_MIN_TIME = 10 * 1000;\r\nvar FIRST_STATS_MAX_TIME = 30 * 1000;\r\n// We'll continue to report stats on average every 5 minutes.\r\nvar REPORT_STATS_INTERVAL = 5 * 60 * 1000;\r\nvar StatsReporter = /** @class */ (function () {\r\n function StatsReporter(collection, server_) {\r\n this.server_ = server_;\r\n this.statsToReport_ = {};\r\n this.statsListener_ = new StatsListener(collection);\r\n var timeout = FIRST_STATS_MIN_TIME +\r\n (FIRST_STATS_MAX_TIME - FIRST_STATS_MIN_TIME) * Math.random();\r\n setTimeoutNonBlocking(this.reportStats_.bind(this), Math.floor(timeout));\r\n }\r\n StatsReporter.prototype.reportStats_ = function () {\r\n var _this = this;\r\n var stats = this.statsListener_.get();\r\n var reportedStats = {};\r\n var haveStatsToReport = false;\r\n each(stats, function (stat, value) {\r\n if (value > 0 && contains(_this.statsToReport_, stat)) {\r\n reportedStats[stat] = value;\r\n haveStatsToReport = true;\r\n }\r\n });\r\n if (haveStatsToReport) {\r\n this.server_.reportStats(reportedStats);\r\n }\r\n // queue our next run.\r\n setTimeoutNonBlocking(this.reportStats_.bind(this), Math.floor(Math.random() * 2 * REPORT_STATS_INTERVAL));\r\n };\r\n return StatsReporter;\r\n}());\r\nfunction statsReporterIncludeStat(reporter, stat) {\r\n reporter.statsToReport_[stat] = true;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n *\r\n * @enum\r\n */\r\nvar OperationType;\r\n(function (OperationType) {\r\n OperationType[OperationType[\"OVERWRITE\"] = 0] = \"OVERWRITE\";\r\n OperationType[OperationType[\"MERGE\"] = 1] = \"MERGE\";\r\n OperationType[OperationType[\"ACK_USER_WRITE\"] = 2] = \"ACK_USER_WRITE\";\r\n OperationType[OperationType[\"LISTEN_COMPLETE\"] = 3] = \"LISTEN_COMPLETE\";\r\n})(OperationType || (OperationType = {}));\r\nfunction newOperationSourceUser() {\r\n return {\r\n fromUser: true,\r\n fromServer: false,\r\n queryId: null,\r\n tagged: false\r\n };\r\n}\r\nfunction newOperationSourceServer() {\r\n return {\r\n fromUser: false,\r\n fromServer: true,\r\n queryId: null,\r\n tagged: false\r\n };\r\n}\r\nfunction newOperationSourceServerTaggedQuery(queryId) {\r\n return {\r\n fromUser: false,\r\n fromServer: true,\r\n queryId: queryId,\r\n tagged: true\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar AckUserWrite = /** @class */ (function () {\r\n /**\r\n * @param affectedTree - A tree containing true for each affected path. Affected paths can't overlap.\r\n */\r\n function AckUserWrite(\r\n /** @inheritDoc */ path, \r\n /** @inheritDoc */ affectedTree, \r\n /** @inheritDoc */ revert) {\r\n this.path = path;\r\n this.affectedTree = affectedTree;\r\n this.revert = revert;\r\n /** @inheritDoc */\r\n this.type = OperationType.ACK_USER_WRITE;\r\n /** @inheritDoc */\r\n this.source = newOperationSourceUser();\r\n }\r\n AckUserWrite.prototype.operationForChild = function (childName) {\r\n if (!pathIsEmpty(this.path)) {\r\n assert(pathGetFront(this.path) === childName, 'operationForChild called for unrelated child.');\r\n return new AckUserWrite(pathPopFront(this.path), this.affectedTree, this.revert);\r\n }\r\n else if (this.affectedTree.value != null) {\r\n assert(this.affectedTree.children.isEmpty(), 'affectedTree should not have overlapping affected paths.');\r\n // All child locations are affected as well; just return same operation.\r\n return this;\r\n }\r\n else {\r\n var childTree = this.affectedTree.subtree(new Path(childName));\r\n return new AckUserWrite(newEmptyPath(), childTree, this.revert);\r\n }\r\n };\r\n return AckUserWrite;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar ListenComplete = /** @class */ (function () {\r\n function ListenComplete(source, path) {\r\n this.source = source;\r\n this.path = path;\r\n /** @inheritDoc */\r\n this.type = OperationType.LISTEN_COMPLETE;\r\n }\r\n ListenComplete.prototype.operationForChild = function (childName) {\r\n if (pathIsEmpty(this.path)) {\r\n return new ListenComplete(this.source, newEmptyPath());\r\n }\r\n else {\r\n return new ListenComplete(this.source, pathPopFront(this.path));\r\n }\r\n };\r\n return ListenComplete;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar Overwrite = /** @class */ (function () {\r\n function Overwrite(source, path, snap) {\r\n this.source = source;\r\n this.path = path;\r\n this.snap = snap;\r\n /** @inheritDoc */\r\n this.type = OperationType.OVERWRITE;\r\n }\r\n Overwrite.prototype.operationForChild = function (childName) {\r\n if (pathIsEmpty(this.path)) {\r\n return new Overwrite(this.source, newEmptyPath(), this.snap.getImmediateChild(childName));\r\n }\r\n else {\r\n return new Overwrite(this.source, pathPopFront(this.path), this.snap);\r\n }\r\n };\r\n return Overwrite;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar Merge = /** @class */ (function () {\r\n function Merge(\r\n /** @inheritDoc */ source, \r\n /** @inheritDoc */ path, \r\n /** @inheritDoc */ children) {\r\n this.source = source;\r\n this.path = path;\r\n this.children = children;\r\n /** @inheritDoc */\r\n this.type = OperationType.MERGE;\r\n }\r\n Merge.prototype.operationForChild = function (childName) {\r\n if (pathIsEmpty(this.path)) {\r\n var childTree = this.children.subtree(new Path(childName));\r\n if (childTree.isEmpty()) {\r\n // This child is unaffected\r\n return null;\r\n }\r\n else if (childTree.value) {\r\n // We have a snapshot for the child in question. This becomes an overwrite of the child.\r\n return new Overwrite(this.source, newEmptyPath(), childTree.value);\r\n }\r\n else {\r\n // This is a merge at a deeper level\r\n return new Merge(this.source, newEmptyPath(), childTree);\r\n }\r\n }\r\n else {\r\n assert(pathGetFront(this.path) === childName, \"Can't get a merge for a child not on the path of the operation\");\r\n return new Merge(this.source, pathPopFront(this.path), this.children);\r\n }\r\n };\r\n Merge.prototype.toString = function () {\r\n return ('Operation(' +\r\n this.path +\r\n ': ' +\r\n this.source.toString() +\r\n ' merge: ' +\r\n this.children.toString() +\r\n ')');\r\n };\r\n return Merge;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A cache node only stores complete children. Additionally it holds a flag whether the node can be considered fully\r\n * initialized in the sense that we know at one point in time this represented a valid state of the world, e.g.\r\n * initialized with data from the server, or a complete overwrite by the client. The filtered flag also tracks\r\n * whether a node potentially had children removed due to a filter.\r\n */\r\nvar CacheNode = /** @class */ (function () {\r\n function CacheNode(node_, fullyInitialized_, filtered_) {\r\n this.node_ = node_;\r\n this.fullyInitialized_ = fullyInitialized_;\r\n this.filtered_ = filtered_;\r\n }\r\n /**\r\n * Returns whether this node was fully initialized with either server data or a complete overwrite by the client\r\n */\r\n CacheNode.prototype.isFullyInitialized = function () {\r\n return this.fullyInitialized_;\r\n };\r\n /**\r\n * Returns whether this node is potentially missing children due to a filter applied to the node\r\n */\r\n CacheNode.prototype.isFiltered = function () {\r\n return this.filtered_;\r\n };\r\n CacheNode.prototype.isCompleteForPath = function (path) {\r\n if (pathIsEmpty(path)) {\r\n return this.isFullyInitialized() && !this.filtered_;\r\n }\r\n var childKey = pathGetFront(path);\r\n return this.isCompleteForChild(childKey);\r\n };\r\n CacheNode.prototype.isCompleteForChild = function (key) {\r\n return ((this.isFullyInitialized() && !this.filtered_) || this.node_.hasChild(key));\r\n };\r\n CacheNode.prototype.getNode = function () {\r\n return this.node_;\r\n };\r\n return CacheNode;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An EventGenerator is used to convert \"raw\" changes (Change) as computed by the\r\n * CacheDiffer into actual events (Event) that can be raised. See generateEventsForChanges()\r\n * for details.\r\n *\r\n */\r\nvar EventGenerator = /** @class */ (function () {\r\n function EventGenerator(query_) {\r\n this.query_ = query_;\r\n this.index_ = this.query_._queryParams.getIndex();\r\n }\r\n return EventGenerator;\r\n}());\r\n/**\r\n * Given a set of raw changes (no moved events and prevName not specified yet), and a set of\r\n * EventRegistrations that should be notified of these changes, generate the actual events to be raised.\r\n *\r\n * Notes:\r\n * - child_moved events will be synthesized at this time for any child_changed events that affect\r\n * our index.\r\n * - prevName will be calculated based on the index ordering.\r\n */\r\nfunction eventGeneratorGenerateEventsForChanges(eventGenerator, changes, eventCache, eventRegistrations) {\r\n var events = [];\r\n var moves = [];\r\n changes.forEach(function (change) {\r\n if (change.type === \"child_changed\" /* CHILD_CHANGED */ &&\r\n eventGenerator.index_.indexedValueChanged(change.oldSnap, change.snapshotNode)) {\r\n moves.push(changeChildMoved(change.childName, change.snapshotNode));\r\n }\r\n });\r\n eventGeneratorGenerateEventsForType(eventGenerator, events, \"child_removed\" /* CHILD_REMOVED */, changes, eventRegistrations, eventCache);\r\n eventGeneratorGenerateEventsForType(eventGenerator, events, \"child_added\" /* CHILD_ADDED */, changes, eventRegistrations, eventCache);\r\n eventGeneratorGenerateEventsForType(eventGenerator, events, \"child_moved\" /* CHILD_MOVED */, moves, eventRegistrations, eventCache);\r\n eventGeneratorGenerateEventsForType(eventGenerator, events, \"child_changed\" /* CHILD_CHANGED */, changes, eventRegistrations, eventCache);\r\n eventGeneratorGenerateEventsForType(eventGenerator, events, \"value\" /* VALUE */, changes, eventRegistrations, eventCache);\r\n return events;\r\n}\r\n/**\r\n * Given changes of a single change type, generate the corresponding events.\r\n */\r\nfunction eventGeneratorGenerateEventsForType(eventGenerator, events, eventType, changes, registrations, eventCache) {\r\n var filteredChanges = changes.filter(function (change) { return change.type === eventType; });\r\n filteredChanges.sort(function (a, b) {\r\n return eventGeneratorCompareChanges(eventGenerator, a, b);\r\n });\r\n filteredChanges.forEach(function (change) {\r\n var materializedChange = eventGeneratorMaterializeSingleChange(eventGenerator, change, eventCache);\r\n registrations.forEach(function (registration) {\r\n if (registration.respondsTo(change.type)) {\r\n events.push(registration.createEvent(materializedChange, eventGenerator.query_));\r\n }\r\n });\r\n });\r\n}\r\nfunction eventGeneratorMaterializeSingleChange(eventGenerator, change, eventCache) {\r\n if (change.type === 'value' || change.type === 'child_removed') {\r\n return change;\r\n }\r\n else {\r\n change.prevName = eventCache.getPredecessorChildName(change.childName, change.snapshotNode, eventGenerator.index_);\r\n return change;\r\n }\r\n}\r\nfunction eventGeneratorCompareChanges(eventGenerator, a, b) {\r\n if (a.childName == null || b.childName == null) {\r\n throw assertionError('Should only compare child_ events.');\r\n }\r\n var aWrapped = new NamedNode(a.childName, a.snapshotNode);\r\n var bWrapped = new NamedNode(b.childName, b.snapshotNode);\r\n return eventGenerator.index_.compare(aWrapped, bWrapped);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction newViewCache(eventCache, serverCache) {\r\n return { eventCache: eventCache, serverCache: serverCache };\r\n}\r\nfunction viewCacheUpdateEventSnap(viewCache, eventSnap, complete, filtered) {\r\n return newViewCache(new CacheNode(eventSnap, complete, filtered), viewCache.serverCache);\r\n}\r\nfunction viewCacheUpdateServerSnap(viewCache, serverSnap, complete, filtered) {\r\n return newViewCache(viewCache.eventCache, new CacheNode(serverSnap, complete, filtered));\r\n}\r\nfunction viewCacheGetCompleteEventSnap(viewCache) {\r\n return viewCache.eventCache.isFullyInitialized()\r\n ? viewCache.eventCache.getNode()\r\n : null;\r\n}\r\nfunction viewCacheGetCompleteServerSnap(viewCache) {\r\n return viewCache.serverCache.isFullyInitialized()\r\n ? viewCache.serverCache.getNode()\r\n : null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar emptyChildrenSingleton;\r\n/**\r\n * Singleton empty children collection.\r\n *\r\n */\r\nvar EmptyChildren = function () {\r\n if (!emptyChildrenSingleton) {\r\n emptyChildrenSingleton = new SortedMap(stringCompare);\r\n }\r\n return emptyChildrenSingleton;\r\n};\r\n/**\r\n * A tree with immutable elements.\r\n */\r\nvar ImmutableTree = /** @class */ (function () {\r\n function ImmutableTree(value, children) {\r\n if (children === void 0) { children = EmptyChildren(); }\r\n this.value = value;\r\n this.children = children;\r\n }\r\n ImmutableTree.fromObject = function (obj) {\r\n var tree = new ImmutableTree(null);\r\n each(obj, function (childPath, childSnap) {\r\n tree = tree.set(new Path(childPath), childSnap);\r\n });\r\n return tree;\r\n };\r\n /**\r\n * True if the value is empty and there are no children\r\n */\r\n ImmutableTree.prototype.isEmpty = function () {\r\n return this.value === null && this.children.isEmpty();\r\n };\r\n /**\r\n * Given a path and predicate, return the first node and the path to that node\r\n * where the predicate returns true.\r\n *\r\n * TODO Do a perf test -- If we're creating a bunch of `{path: value:}`\r\n * objects on the way back out, it may be better to pass down a pathSoFar obj.\r\n *\r\n * @param relativePath - The remainder of the path\r\n * @param predicate - The predicate to satisfy to return a node\r\n */\r\n ImmutableTree.prototype.findRootMostMatchingPathAndValue = function (relativePath, predicate) {\r\n if (this.value != null && predicate(this.value)) {\r\n return { path: newEmptyPath(), value: this.value };\r\n }\r\n else {\r\n if (pathIsEmpty(relativePath)) {\r\n return null;\r\n }\r\n else {\r\n var front = pathGetFront(relativePath);\r\n var child = this.children.get(front);\r\n if (child !== null) {\r\n var childExistingPathAndValue = child.findRootMostMatchingPathAndValue(pathPopFront(relativePath), predicate);\r\n if (childExistingPathAndValue != null) {\r\n var fullPath = pathChild(new Path(front), childExistingPathAndValue.path);\r\n return { path: fullPath, value: childExistingPathAndValue.value };\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n }\r\n };\r\n /**\r\n * Find, if it exists, the shortest subpath of the given path that points a defined\r\n * value in the tree\r\n */\r\n ImmutableTree.prototype.findRootMostValueAndPath = function (relativePath) {\r\n return this.findRootMostMatchingPathAndValue(relativePath, function () { return true; });\r\n };\r\n /**\r\n * @returns The subtree at the given path\r\n */\r\n ImmutableTree.prototype.subtree = function (relativePath) {\r\n if (pathIsEmpty(relativePath)) {\r\n return this;\r\n }\r\n else {\r\n var front = pathGetFront(relativePath);\r\n var childTree = this.children.get(front);\r\n if (childTree !== null) {\r\n return childTree.subtree(pathPopFront(relativePath));\r\n }\r\n else {\r\n return new ImmutableTree(null);\r\n }\r\n }\r\n };\r\n /**\r\n * Sets a value at the specified path.\r\n *\r\n * @param relativePath - Path to set value at.\r\n * @param toSet - Value to set.\r\n * @returns Resulting tree.\r\n */\r\n ImmutableTree.prototype.set = function (relativePath, toSet) {\r\n if (pathIsEmpty(relativePath)) {\r\n return new ImmutableTree(toSet, this.children);\r\n }\r\n else {\r\n var front = pathGetFront(relativePath);\r\n var child = this.children.get(front) || new ImmutableTree(null);\r\n var newChild = child.set(pathPopFront(relativePath), toSet);\r\n var newChildren = this.children.insert(front, newChild);\r\n return new ImmutableTree(this.value, newChildren);\r\n }\r\n };\r\n /**\r\n * Removes the value at the specified path.\r\n *\r\n * @param relativePath - Path to value to remove.\r\n * @returns Resulting tree.\r\n */\r\n ImmutableTree.prototype.remove = function (relativePath) {\r\n if (pathIsEmpty(relativePath)) {\r\n if (this.children.isEmpty()) {\r\n return new ImmutableTree(null);\r\n }\r\n else {\r\n return new ImmutableTree(null, this.children);\r\n }\r\n }\r\n else {\r\n var front = pathGetFront(relativePath);\r\n var child = this.children.get(front);\r\n if (child) {\r\n var newChild = child.remove(pathPopFront(relativePath));\r\n var newChildren = void 0;\r\n if (newChild.isEmpty()) {\r\n newChildren = this.children.remove(front);\r\n }\r\n else {\r\n newChildren = this.children.insert(front, newChild);\r\n }\r\n if (this.value === null && newChildren.isEmpty()) {\r\n return new ImmutableTree(null);\r\n }\r\n else {\r\n return new ImmutableTree(this.value, newChildren);\r\n }\r\n }\r\n else {\r\n return this;\r\n }\r\n }\r\n };\r\n /**\r\n * Gets a value from the tree.\r\n *\r\n * @param relativePath - Path to get value for.\r\n * @returns Value at path, or null.\r\n */\r\n ImmutableTree.prototype.get = function (relativePath) {\r\n if (pathIsEmpty(relativePath)) {\r\n return this.value;\r\n }\r\n else {\r\n var front = pathGetFront(relativePath);\r\n var child = this.children.get(front);\r\n if (child) {\r\n return child.get(pathPopFront(relativePath));\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n };\r\n /**\r\n * Replace the subtree at the specified path with the given new tree.\r\n *\r\n * @param relativePath - Path to replace subtree for.\r\n * @param newTree - New tree.\r\n * @returns Resulting tree.\r\n */\r\n ImmutableTree.prototype.setTree = function (relativePath, newTree) {\r\n if (pathIsEmpty(relativePath)) {\r\n return newTree;\r\n }\r\n else {\r\n var front = pathGetFront(relativePath);\r\n var child = this.children.get(front) || new ImmutableTree(null);\r\n var newChild = child.setTree(pathPopFront(relativePath), newTree);\r\n var newChildren = void 0;\r\n if (newChild.isEmpty()) {\r\n newChildren = this.children.remove(front);\r\n }\r\n else {\r\n newChildren = this.children.insert(front, newChild);\r\n }\r\n return new ImmutableTree(this.value, newChildren);\r\n }\r\n };\r\n /**\r\n * Performs a depth first fold on this tree. Transforms a tree into a single\r\n * value, given a function that operates on the path to a node, an optional\r\n * current value, and a map of child names to folded subtrees\r\n */\r\n ImmutableTree.prototype.fold = function (fn) {\r\n return this.fold_(newEmptyPath(), fn);\r\n };\r\n /**\r\n * Recursive helper for public-facing fold() method\r\n */\r\n ImmutableTree.prototype.fold_ = function (pathSoFar, fn) {\r\n var accum = {};\r\n this.children.inorderTraversal(function (childKey, childTree) {\r\n accum[childKey] = childTree.fold_(pathChild(pathSoFar, childKey), fn);\r\n });\r\n return fn(pathSoFar, this.value, accum);\r\n };\r\n /**\r\n * Find the first matching value on the given path. Return the result of applying f to it.\r\n */\r\n ImmutableTree.prototype.findOnPath = function (path, f) {\r\n return this.findOnPath_(path, newEmptyPath(), f);\r\n };\r\n ImmutableTree.prototype.findOnPath_ = function (pathToFollow, pathSoFar, f) {\r\n var result = this.value ? f(pathSoFar, this.value) : false;\r\n if (result) {\r\n return result;\r\n }\r\n else {\r\n if (pathIsEmpty(pathToFollow)) {\r\n return null;\r\n }\r\n else {\r\n var front = pathGetFront(pathToFollow);\r\n var nextChild = this.children.get(front);\r\n if (nextChild) {\r\n return nextChild.findOnPath_(pathPopFront(pathToFollow), pathChild(pathSoFar, front), f);\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n }\r\n };\r\n ImmutableTree.prototype.foreachOnPath = function (path, f) {\r\n return this.foreachOnPath_(path, newEmptyPath(), f);\r\n };\r\n ImmutableTree.prototype.foreachOnPath_ = function (pathToFollow, currentRelativePath, f) {\r\n if (pathIsEmpty(pathToFollow)) {\r\n return this;\r\n }\r\n else {\r\n if (this.value) {\r\n f(currentRelativePath, this.value);\r\n }\r\n var front = pathGetFront(pathToFollow);\r\n var nextChild = this.children.get(front);\r\n if (nextChild) {\r\n return nextChild.foreachOnPath_(pathPopFront(pathToFollow), pathChild(currentRelativePath, front), f);\r\n }\r\n else {\r\n return new ImmutableTree(null);\r\n }\r\n }\r\n };\r\n /**\r\n * Calls the given function for each node in the tree that has a value.\r\n *\r\n * @param f - A function to be called with the path from the root of the tree to\r\n * a node, and the value at that node. Called in depth-first order.\r\n */\r\n ImmutableTree.prototype.foreach = function (f) {\r\n this.foreach_(newEmptyPath(), f);\r\n };\r\n ImmutableTree.prototype.foreach_ = function (currentRelativePath, f) {\r\n this.children.inorderTraversal(function (childName, childTree) {\r\n childTree.foreach_(pathChild(currentRelativePath, childName), f);\r\n });\r\n if (this.value) {\r\n f(currentRelativePath, this.value);\r\n }\r\n };\r\n ImmutableTree.prototype.foreachChild = function (f) {\r\n this.children.inorderTraversal(function (childName, childTree) {\r\n if (childTree.value) {\r\n f(childName, childTree.value);\r\n }\r\n });\r\n };\r\n return ImmutableTree;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * This class holds a collection of writes that can be applied to nodes in unison. It abstracts away the logic with\r\n * dealing with priority writes and multiple nested writes. At any given path there is only allowed to be one write\r\n * modifying that path. Any write to an existing path or shadowing an existing path will modify that existing write\r\n * to reflect the write added.\r\n */\r\nvar CompoundWrite = /** @class */ (function () {\r\n function CompoundWrite(writeTree_) {\r\n this.writeTree_ = writeTree_;\r\n }\r\n CompoundWrite.empty = function () {\r\n return new CompoundWrite(new ImmutableTree(null));\r\n };\r\n return CompoundWrite;\r\n}());\r\nfunction compoundWriteAddWrite(compoundWrite, path, node) {\r\n if (pathIsEmpty(path)) {\r\n return new CompoundWrite(new ImmutableTree(node));\r\n }\r\n else {\r\n var rootmost = compoundWrite.writeTree_.findRootMostValueAndPath(path);\r\n if (rootmost != null) {\r\n var rootMostPath = rootmost.path;\r\n var value = rootmost.value;\r\n var relativePath = newRelativePath(rootMostPath, path);\r\n value = value.updateChild(relativePath, node);\r\n return new CompoundWrite(compoundWrite.writeTree_.set(rootMostPath, value));\r\n }\r\n else {\r\n var subtree = new ImmutableTree(node);\r\n var newWriteTree = compoundWrite.writeTree_.setTree(path, subtree);\r\n return new CompoundWrite(newWriteTree);\r\n }\r\n }\r\n}\r\nfunction compoundWriteAddWrites(compoundWrite, path, updates) {\r\n var newWrite = compoundWrite;\r\n each(updates, function (childKey, node) {\r\n newWrite = compoundWriteAddWrite(newWrite, pathChild(path, childKey), node);\r\n });\r\n return newWrite;\r\n}\r\n/**\r\n * Will remove a write at the given path and deeper paths. This will not modify a write at a higher\r\n * location, which must be removed by calling this method with that path.\r\n *\r\n * @param compoundWrite - The CompoundWrite to remove.\r\n * @param path - The path at which a write and all deeper writes should be removed\r\n * @returns The new CompoundWrite with the removed path\r\n */\r\nfunction compoundWriteRemoveWrite(compoundWrite, path) {\r\n if (pathIsEmpty(path)) {\r\n return CompoundWrite.empty();\r\n }\r\n else {\r\n var newWriteTree = compoundWrite.writeTree_.setTree(path, new ImmutableTree(null));\r\n return new CompoundWrite(newWriteTree);\r\n }\r\n}\r\n/**\r\n * Returns whether this CompoundWrite will fully overwrite a node at a given location and can therefore be\r\n * considered \"complete\".\r\n *\r\n * @param compoundWrite - The CompoundWrite to check.\r\n * @param path - The path to check for\r\n * @returns Whether there is a complete write at that path\r\n */\r\nfunction compoundWriteHasCompleteWrite(compoundWrite, path) {\r\n return compoundWriteGetCompleteNode(compoundWrite, path) != null;\r\n}\r\n/**\r\n * Returns a node for a path if and only if the node is a \"complete\" overwrite at that path. This will not aggregate\r\n * writes from deeper paths, but will return child nodes from a more shallow path.\r\n *\r\n * @param compoundWrite - The CompoundWrite to get the node from.\r\n * @param path - The path to get a complete write\r\n * @returns The node if complete at that path, or null otherwise.\r\n */\r\nfunction compoundWriteGetCompleteNode(compoundWrite, path) {\r\n var rootmost = compoundWrite.writeTree_.findRootMostValueAndPath(path);\r\n if (rootmost != null) {\r\n return compoundWrite.writeTree_\r\n .get(rootmost.path)\r\n .getChild(newRelativePath(rootmost.path, path));\r\n }\r\n else {\r\n return null;\r\n }\r\n}\r\n/**\r\n * Returns all children that are guaranteed to be a complete overwrite.\r\n *\r\n * @param compoundWrite - The CompoundWrite to get children from.\r\n * @returns A list of all complete children.\r\n */\r\nfunction compoundWriteGetCompleteChildren(compoundWrite) {\r\n var children = [];\r\n var node = compoundWrite.writeTree_.value;\r\n if (node != null) {\r\n // If it's a leaf node, it has no children; so nothing to do.\r\n if (!node.isLeafNode()) {\r\n node.forEachChild(PRIORITY_INDEX, function (childName, childNode) {\r\n children.push(new NamedNode(childName, childNode));\r\n });\r\n }\r\n }\r\n else {\r\n compoundWrite.writeTree_.children.inorderTraversal(function (childName, childTree) {\r\n if (childTree.value != null) {\r\n children.push(new NamedNode(childName, childTree.value));\r\n }\r\n });\r\n }\r\n return children;\r\n}\r\nfunction compoundWriteChildCompoundWrite(compoundWrite, path) {\r\n if (pathIsEmpty(path)) {\r\n return compoundWrite;\r\n }\r\n else {\r\n var shadowingNode = compoundWriteGetCompleteNode(compoundWrite, path);\r\n if (shadowingNode != null) {\r\n return new CompoundWrite(new ImmutableTree(shadowingNode));\r\n }\r\n else {\r\n return new CompoundWrite(compoundWrite.writeTree_.subtree(path));\r\n }\r\n }\r\n}\r\n/**\r\n * Returns true if this CompoundWrite is empty and therefore does not modify any nodes.\r\n * @returns Whether this CompoundWrite is empty\r\n */\r\nfunction compoundWriteIsEmpty(compoundWrite) {\r\n return compoundWrite.writeTree_.isEmpty();\r\n}\r\n/**\r\n * Applies this CompoundWrite to a node. The node is returned with all writes from this CompoundWrite applied to the\r\n * node\r\n * @param node - The node to apply this CompoundWrite to\r\n * @returns The node with all writes applied\r\n */\r\nfunction compoundWriteApply(compoundWrite, node) {\r\n return applySubtreeWrite(newEmptyPath(), compoundWrite.writeTree_, node);\r\n}\r\nfunction applySubtreeWrite(relativePath, writeTree, node) {\r\n if (writeTree.value != null) {\r\n // Since there a write is always a leaf, we're done here\r\n return node.updateChild(relativePath, writeTree.value);\r\n }\r\n else {\r\n var priorityWrite_1 = null;\r\n writeTree.children.inorderTraversal(function (childKey, childTree) {\r\n if (childKey === '.priority') {\r\n // Apply priorities at the end so we don't update priorities for either empty nodes or forget\r\n // to apply priorities to empty nodes that are later filled\r\n assert(childTree.value !== null, 'Priority writes must always be leaf nodes');\r\n priorityWrite_1 = childTree.value;\r\n }\r\n else {\r\n node = applySubtreeWrite(pathChild(relativePath, childKey), childTree, node);\r\n }\r\n });\r\n // If there was a priority write, we only apply it if the node is not empty\r\n if (!node.getChild(relativePath).isEmpty() && priorityWrite_1 !== null) {\r\n node = node.updateChild(pathChild(relativePath, '.priority'), priorityWrite_1);\r\n }\r\n return node;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Create a new WriteTreeRef for the given path. For use with a new sync point at the given path.\r\n *\r\n */\r\nfunction writeTreeChildWrites(writeTree, path) {\r\n return newWriteTreeRef(path, writeTree);\r\n}\r\n/**\r\n * Record a new overwrite from user code.\r\n *\r\n * @param visible - This is set to false by some transactions. It should be excluded from event caches\r\n */\r\nfunction writeTreeAddOverwrite(writeTree, path, snap, writeId, visible) {\r\n assert(writeId > writeTree.lastWriteId, 'Stacking an older write on top of newer ones');\r\n if (visible === undefined) {\r\n visible = true;\r\n }\r\n writeTree.allWrites.push({\r\n path: path,\r\n snap: snap,\r\n writeId: writeId,\r\n visible: visible\r\n });\r\n if (visible) {\r\n writeTree.visibleWrites = compoundWriteAddWrite(writeTree.visibleWrites, path, snap);\r\n }\r\n writeTree.lastWriteId = writeId;\r\n}\r\n/**\r\n * Record a new merge from user code.\r\n */\r\nfunction writeTreeAddMerge(writeTree, path, changedChildren, writeId) {\r\n assert(writeId > writeTree.lastWriteId, 'Stacking an older merge on top of newer ones');\r\n writeTree.allWrites.push({\r\n path: path,\r\n children: changedChildren,\r\n writeId: writeId,\r\n visible: true\r\n });\r\n writeTree.visibleWrites = compoundWriteAddWrites(writeTree.visibleWrites, path, changedChildren);\r\n writeTree.lastWriteId = writeId;\r\n}\r\nfunction writeTreeGetWrite(writeTree, writeId) {\r\n for (var i = 0; i < writeTree.allWrites.length; i++) {\r\n var record = writeTree.allWrites[i];\r\n if (record.writeId === writeId) {\r\n return record;\r\n }\r\n }\r\n return null;\r\n}\r\n/**\r\n * Remove a write (either an overwrite or merge) that has been successfully acknowledge by the server. Recalculates\r\n * the tree if necessary. We return true if it may have been visible, meaning views need to reevaluate.\r\n *\r\n * @returns true if the write may have been visible (meaning we'll need to reevaluate / raise\r\n * events as a result).\r\n */\r\nfunction writeTreeRemoveWrite(writeTree, writeId) {\r\n // Note: disabling this check. It could be a transaction that preempted another transaction, and thus was applied\r\n // out of order.\r\n //const validClear = revert || this.allWrites_.length === 0 || writeId <= this.allWrites_[0].writeId;\r\n //assert(validClear, \"Either we don't have this write, or it's the first one in the queue\");\r\n var idx = writeTree.allWrites.findIndex(function (s) {\r\n return s.writeId === writeId;\r\n });\r\n assert(idx >= 0, 'removeWrite called with nonexistent writeId.');\r\n var writeToRemove = writeTree.allWrites[idx];\r\n writeTree.allWrites.splice(idx, 1);\r\n var removedWriteWasVisible = writeToRemove.visible;\r\n var removedWriteOverlapsWithOtherWrites = false;\r\n var i = writeTree.allWrites.length - 1;\r\n while (removedWriteWasVisible && i >= 0) {\r\n var currentWrite = writeTree.allWrites[i];\r\n if (currentWrite.visible) {\r\n if (i >= idx &&\r\n writeTreeRecordContainsPath_(currentWrite, writeToRemove.path)) {\r\n // The removed write was completely shadowed by a subsequent write.\r\n removedWriteWasVisible = false;\r\n }\r\n else if (pathContains(writeToRemove.path, currentWrite.path)) {\r\n // Either we're covering some writes or they're covering part of us (depending on which came first).\r\n removedWriteOverlapsWithOtherWrites = true;\r\n }\r\n }\r\n i--;\r\n }\r\n if (!removedWriteWasVisible) {\r\n return false;\r\n }\r\n else if (removedWriteOverlapsWithOtherWrites) {\r\n // There's some shadowing going on. Just rebuild the visible writes from scratch.\r\n writeTreeResetTree_(writeTree);\r\n return true;\r\n }\r\n else {\r\n // There's no shadowing. We can safely just remove the write(s) from visibleWrites.\r\n if (writeToRemove.snap) {\r\n writeTree.visibleWrites = compoundWriteRemoveWrite(writeTree.visibleWrites, writeToRemove.path);\r\n }\r\n else {\r\n var children = writeToRemove.children;\r\n each(children, function (childName) {\r\n writeTree.visibleWrites = compoundWriteRemoveWrite(writeTree.visibleWrites, pathChild(writeToRemove.path, childName));\r\n });\r\n }\r\n return true;\r\n }\r\n}\r\nfunction writeTreeRecordContainsPath_(writeRecord, path) {\r\n if (writeRecord.snap) {\r\n return pathContains(writeRecord.path, path);\r\n }\r\n else {\r\n for (var childName in writeRecord.children) {\r\n if (writeRecord.children.hasOwnProperty(childName) &&\r\n pathContains(pathChild(writeRecord.path, childName), path)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n/**\r\n * Re-layer the writes and merges into a tree so we can efficiently calculate event snapshots\r\n */\r\nfunction writeTreeResetTree_(writeTree) {\r\n writeTree.visibleWrites = writeTreeLayerTree_(writeTree.allWrites, writeTreeDefaultFilter_, newEmptyPath());\r\n if (writeTree.allWrites.length > 0) {\r\n writeTree.lastWriteId =\r\n writeTree.allWrites[writeTree.allWrites.length - 1].writeId;\r\n }\r\n else {\r\n writeTree.lastWriteId = -1;\r\n }\r\n}\r\n/**\r\n * The default filter used when constructing the tree. Keep everything that's visible.\r\n */\r\nfunction writeTreeDefaultFilter_(write) {\r\n return write.visible;\r\n}\r\n/**\r\n * Static method. Given an array of WriteRecords, a filter for which ones to include, and a path, construct the tree of\r\n * event data at that path.\r\n */\r\nfunction writeTreeLayerTree_(writes, filter, treeRoot) {\r\n var compoundWrite = CompoundWrite.empty();\r\n for (var i = 0; i < writes.length; ++i) {\r\n var write = writes[i];\r\n // Theory, a later set will either:\r\n // a) abort a relevant transaction, so no need to worry about excluding it from calculating that transaction\r\n // b) not be relevant to a transaction (separate branch), so again will not affect the data for that transaction\r\n if (filter(write)) {\r\n var writePath = write.path;\r\n var relativePath = void 0;\r\n if (write.snap) {\r\n if (pathContains(treeRoot, writePath)) {\r\n relativePath = newRelativePath(treeRoot, writePath);\r\n compoundWrite = compoundWriteAddWrite(compoundWrite, relativePath, write.snap);\r\n }\r\n else if (pathContains(writePath, treeRoot)) {\r\n relativePath = newRelativePath(writePath, treeRoot);\r\n compoundWrite = compoundWriteAddWrite(compoundWrite, newEmptyPath(), write.snap.getChild(relativePath));\r\n }\r\n else ;\r\n }\r\n else if (write.children) {\r\n if (pathContains(treeRoot, writePath)) {\r\n relativePath = newRelativePath(treeRoot, writePath);\r\n compoundWrite = compoundWriteAddWrites(compoundWrite, relativePath, write.children);\r\n }\r\n else if (pathContains(writePath, treeRoot)) {\r\n relativePath = newRelativePath(writePath, treeRoot);\r\n if (pathIsEmpty(relativePath)) {\r\n compoundWrite = compoundWriteAddWrites(compoundWrite, newEmptyPath(), write.children);\r\n }\r\n else {\r\n var child = safeGet(write.children, pathGetFront(relativePath));\r\n if (child) {\r\n // There exists a child in this node that matches the root path\r\n var deepNode = child.getChild(pathPopFront(relativePath));\r\n compoundWrite = compoundWriteAddWrite(compoundWrite, newEmptyPath(), deepNode);\r\n }\r\n }\r\n }\r\n else ;\r\n }\r\n else {\r\n throw assertionError('WriteRecord should have .snap or .children');\r\n }\r\n }\r\n }\r\n return compoundWrite;\r\n}\r\n/**\r\n * Given optional, underlying server data, and an optional set of constraints (exclude some sets, include hidden\r\n * writes), attempt to calculate a complete snapshot for the given path\r\n *\r\n * @param writeIdsToExclude - An optional set to be excluded\r\n * @param includeHiddenWrites - Defaults to false, whether or not to layer on writes with visible set to false\r\n */\r\nfunction writeTreeCalcCompleteEventCache(writeTree, treePath, completeServerCache, writeIdsToExclude, includeHiddenWrites) {\r\n if (!writeIdsToExclude && !includeHiddenWrites) {\r\n var shadowingNode = compoundWriteGetCompleteNode(writeTree.visibleWrites, treePath);\r\n if (shadowingNode != null) {\r\n return shadowingNode;\r\n }\r\n else {\r\n var subMerge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n if (compoundWriteIsEmpty(subMerge)) {\r\n return completeServerCache;\r\n }\r\n else if (completeServerCache == null &&\r\n !compoundWriteHasCompleteWrite(subMerge, newEmptyPath())) {\r\n // We wouldn't have a complete snapshot, since there's no underlying data and no complete shadow\r\n return null;\r\n }\r\n else {\r\n var layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\r\n return compoundWriteApply(subMerge, layeredCache);\r\n }\r\n }\r\n }\r\n else {\r\n var merge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n if (!includeHiddenWrites && compoundWriteIsEmpty(merge)) {\r\n return completeServerCache;\r\n }\r\n else {\r\n // If the server cache is null, and we don't have a complete cache, we need to return null\r\n if (!includeHiddenWrites &&\r\n completeServerCache == null &&\r\n !compoundWriteHasCompleteWrite(merge, newEmptyPath())) {\r\n return null;\r\n }\r\n else {\r\n var filter = function (write) {\r\n return ((write.visible || includeHiddenWrites) &&\r\n (!writeIdsToExclude ||\r\n !~writeIdsToExclude.indexOf(write.writeId)) &&\r\n (pathContains(write.path, treePath) ||\r\n pathContains(treePath, write.path)));\r\n };\r\n var mergeAtPath = writeTreeLayerTree_(writeTree.allWrites, filter, treePath);\r\n var layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\r\n return compoundWriteApply(mergeAtPath, layeredCache);\r\n }\r\n }\r\n }\r\n}\r\n/**\r\n * With optional, underlying server data, attempt to return a children node of children that we have complete data for.\r\n * Used when creating new views, to pre-fill their complete event children snapshot.\r\n */\r\nfunction writeTreeCalcCompleteEventChildren(writeTree, treePath, completeServerChildren) {\r\n var completeChildren = ChildrenNode.EMPTY_NODE;\r\n var topLevelSet = compoundWriteGetCompleteNode(writeTree.visibleWrites, treePath);\r\n if (topLevelSet) {\r\n if (!topLevelSet.isLeafNode()) {\r\n // we're shadowing everything. Return the children.\r\n topLevelSet.forEachChild(PRIORITY_INDEX, function (childName, childSnap) {\r\n completeChildren = completeChildren.updateImmediateChild(childName, childSnap);\r\n });\r\n }\r\n return completeChildren;\r\n }\r\n else if (completeServerChildren) {\r\n // Layer any children we have on top of this\r\n // We know we don't have a top-level set, so just enumerate existing children\r\n var merge_1 = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n completeServerChildren.forEachChild(PRIORITY_INDEX, function (childName, childNode) {\r\n var node = compoundWriteApply(compoundWriteChildCompoundWrite(merge_1, new Path(childName)), childNode);\r\n completeChildren = completeChildren.updateImmediateChild(childName, node);\r\n });\r\n // Add any complete children we have from the set\r\n compoundWriteGetCompleteChildren(merge_1).forEach(function (namedNode) {\r\n completeChildren = completeChildren.updateImmediateChild(namedNode.name, namedNode.node);\r\n });\r\n return completeChildren;\r\n }\r\n else {\r\n // We don't have anything to layer on top of. Layer on any children we have\r\n // Note that we can return an empty snap if we have a defined delete\r\n var merge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n compoundWriteGetCompleteChildren(merge).forEach(function (namedNode) {\r\n completeChildren = completeChildren.updateImmediateChild(namedNode.name, namedNode.node);\r\n });\r\n return completeChildren;\r\n }\r\n}\r\n/**\r\n * Given that the underlying server data has updated, determine what, if anything, needs to be\r\n * applied to the event cache.\r\n *\r\n * Possibilities:\r\n *\r\n * 1. No writes are shadowing. Events should be raised, the snap to be applied comes from the server data\r\n *\r\n * 2. Some write is completely shadowing. No events to be raised\r\n *\r\n * 3. Is partially shadowed. Events\r\n *\r\n * Either existingEventSnap or existingServerSnap must exist\r\n */\r\nfunction writeTreeCalcEventCacheAfterServerOverwrite(writeTree, treePath, childPath, existingEventSnap, existingServerSnap) {\r\n assert(existingEventSnap || existingServerSnap, 'Either existingEventSnap or existingServerSnap must exist');\r\n var path = pathChild(treePath, childPath);\r\n if (compoundWriteHasCompleteWrite(writeTree.visibleWrites, path)) {\r\n // At this point we can probably guarantee that we're in case 2, meaning no events\r\n // May need to check visibility while doing the findRootMostValueAndPath call\r\n return null;\r\n }\r\n else {\r\n // No complete shadowing. We're either partially shadowing or not shadowing at all.\r\n var childMerge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, path);\r\n if (compoundWriteIsEmpty(childMerge)) {\r\n // We're not shadowing at all. Case 1\r\n return existingServerSnap.getChild(childPath);\r\n }\r\n else {\r\n // This could be more efficient if the serverNode + updates doesn't change the eventSnap\r\n // However this is tricky to find out, since user updates don't necessary change the server\r\n // snap, e.g. priority updates on empty nodes, or deep deletes. Another special case is if the server\r\n // adds nodes, but doesn't change any existing writes. It is therefore not enough to\r\n // only check if the updates change the serverNode.\r\n // Maybe check if the merge tree contains these special cases and only do a full overwrite in that case?\r\n return compoundWriteApply(childMerge, existingServerSnap.getChild(childPath));\r\n }\r\n }\r\n}\r\n/**\r\n * Returns a complete child for a given server snap after applying all user writes or null if there is no\r\n * complete child for this ChildKey.\r\n */\r\nfunction writeTreeCalcCompleteChild(writeTree, treePath, childKey, existingServerSnap) {\r\n var path = pathChild(treePath, childKey);\r\n var shadowingNode = compoundWriteGetCompleteNode(writeTree.visibleWrites, path);\r\n if (shadowingNode != null) {\r\n return shadowingNode;\r\n }\r\n else {\r\n if (existingServerSnap.isCompleteForChild(childKey)) {\r\n var childMerge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, path);\r\n return compoundWriteApply(childMerge, existingServerSnap.getNode().getImmediateChild(childKey));\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n}\r\n/**\r\n * Returns a node if there is a complete overwrite for this path. More specifically, if there is a write at\r\n * a higher path, this will return the child of that write relative to the write and this path.\r\n * Returns null if there is no write at this path.\r\n */\r\nfunction writeTreeShadowingWrite(writeTree, path) {\r\n return compoundWriteGetCompleteNode(writeTree.visibleWrites, path);\r\n}\r\n/**\r\n * This method is used when processing child remove events on a query. If we can, we pull in children that were outside\r\n * the window, but may now be in the window.\r\n */\r\nfunction writeTreeCalcIndexedSlice(writeTree, treePath, completeServerData, startPost, count, reverse, index) {\r\n var toIterate;\r\n var merge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n var shadowingNode = compoundWriteGetCompleteNode(merge, newEmptyPath());\r\n if (shadowingNode != null) {\r\n toIterate = shadowingNode;\r\n }\r\n else if (completeServerData != null) {\r\n toIterate = compoundWriteApply(merge, completeServerData);\r\n }\r\n else {\r\n // no children to iterate on\r\n return [];\r\n }\r\n toIterate = toIterate.withIndex(index);\r\n if (!toIterate.isEmpty() && !toIterate.isLeafNode()) {\r\n var nodes = [];\r\n var cmp = index.getCompare();\r\n var iter = reverse\r\n ? toIterate.getReverseIteratorFrom(startPost, index)\r\n : toIterate.getIteratorFrom(startPost, index);\r\n var next = iter.getNext();\r\n while (next && nodes.length < count) {\r\n if (cmp(next, startPost) !== 0) {\r\n nodes.push(next);\r\n }\r\n next = iter.getNext();\r\n }\r\n return nodes;\r\n }\r\n else {\r\n return [];\r\n }\r\n}\r\nfunction newWriteTree() {\r\n return {\r\n visibleWrites: CompoundWrite.empty(),\r\n allWrites: [],\r\n lastWriteId: -1\r\n };\r\n}\r\n/**\r\n * If possible, returns a complete event cache, using the underlying server data if possible. In addition, can be used\r\n * to get a cache that includes hidden writes, and excludes arbitrary writes. Note that customizing the returned node\r\n * can lead to a more expensive calculation.\r\n *\r\n * @param writeIdsToExclude - Optional writes to exclude.\r\n * @param includeHiddenWrites - Defaults to false, whether or not to layer on writes with visible set to false\r\n */\r\nfunction writeTreeRefCalcCompleteEventCache(writeTreeRef, completeServerCache, writeIdsToExclude, includeHiddenWrites) {\r\n return writeTreeCalcCompleteEventCache(writeTreeRef.writeTree, writeTreeRef.treePath, completeServerCache, writeIdsToExclude, includeHiddenWrites);\r\n}\r\n/**\r\n * If possible, returns a children node containing all of the complete children we have data for. The returned data is a\r\n * mix of the given server data and write data.\r\n *\r\n */\r\nfunction writeTreeRefCalcCompleteEventChildren(writeTreeRef, completeServerChildren) {\r\n return writeTreeCalcCompleteEventChildren(writeTreeRef.writeTree, writeTreeRef.treePath, completeServerChildren);\r\n}\r\n/**\r\n * Given that either the underlying server data has updated or the outstanding writes have updated, determine what,\r\n * if anything, needs to be applied to the event cache.\r\n *\r\n * Possibilities:\r\n *\r\n * 1. No writes are shadowing. Events should be raised, the snap to be applied comes from the server data\r\n *\r\n * 2. Some write is completely shadowing. No events to be raised\r\n *\r\n * 3. Is partially shadowed. Events should be raised\r\n *\r\n * Either existingEventSnap or existingServerSnap must exist, this is validated via an assert\r\n *\r\n *\r\n */\r\nfunction writeTreeRefCalcEventCacheAfterServerOverwrite(writeTreeRef, path, existingEventSnap, existingServerSnap) {\r\n return writeTreeCalcEventCacheAfterServerOverwrite(writeTreeRef.writeTree, writeTreeRef.treePath, path, existingEventSnap, existingServerSnap);\r\n}\r\n/**\r\n * Returns a node if there is a complete overwrite for this path. More specifically, if there is a write at\r\n * a higher path, this will return the child of that write relative to the write and this path.\r\n * Returns null if there is no write at this path.\r\n *\r\n */\r\nfunction writeTreeRefShadowingWrite(writeTreeRef, path) {\r\n return writeTreeShadowingWrite(writeTreeRef.writeTree, pathChild(writeTreeRef.treePath, path));\r\n}\r\n/**\r\n * This method is used when processing child remove events on a query. If we can, we pull in children that were outside\r\n * the window, but may now be in the window\r\n */\r\nfunction writeTreeRefCalcIndexedSlice(writeTreeRef, completeServerData, startPost, count, reverse, index) {\r\n return writeTreeCalcIndexedSlice(writeTreeRef.writeTree, writeTreeRef.treePath, completeServerData, startPost, count, reverse, index);\r\n}\r\n/**\r\n * Returns a complete child for a given server snap after applying all user writes or null if there is no\r\n * complete child for this ChildKey.\r\n */\r\nfunction writeTreeRefCalcCompleteChild(writeTreeRef, childKey, existingServerCache) {\r\n return writeTreeCalcCompleteChild(writeTreeRef.writeTree, writeTreeRef.treePath, childKey, existingServerCache);\r\n}\r\n/**\r\n * Return a WriteTreeRef for a child.\r\n */\r\nfunction writeTreeRefChild(writeTreeRef, childName) {\r\n return newWriteTreeRef(pathChild(writeTreeRef.treePath, childName), writeTreeRef.writeTree);\r\n}\r\nfunction newWriteTreeRef(path, writeTree) {\r\n return {\r\n treePath: path,\r\n writeTree: writeTree\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar ChildChangeAccumulator = /** @class */ (function () {\r\n function ChildChangeAccumulator() {\r\n this.changeMap = new Map();\r\n }\r\n ChildChangeAccumulator.prototype.trackChildChange = function (change) {\r\n var type = change.type;\r\n var childKey = change.childName;\r\n assert(type === \"child_added\" /* CHILD_ADDED */ ||\r\n type === \"child_changed\" /* CHILD_CHANGED */ ||\r\n type === \"child_removed\" /* CHILD_REMOVED */, 'Only child changes supported for tracking');\r\n assert(childKey !== '.priority', 'Only non-priority child changes can be tracked.');\r\n var oldChange = this.changeMap.get(childKey);\r\n if (oldChange) {\r\n var oldType = oldChange.type;\r\n if (type === \"child_added\" /* CHILD_ADDED */ &&\r\n oldType === \"child_removed\" /* CHILD_REMOVED */) {\r\n this.changeMap.set(childKey, changeChildChanged(childKey, change.snapshotNode, oldChange.snapshotNode));\r\n }\r\n else if (type === \"child_removed\" /* CHILD_REMOVED */ &&\r\n oldType === \"child_added\" /* CHILD_ADDED */) {\r\n this.changeMap.delete(childKey);\r\n }\r\n else if (type === \"child_removed\" /* CHILD_REMOVED */ &&\r\n oldType === \"child_changed\" /* CHILD_CHANGED */) {\r\n this.changeMap.set(childKey, changeChildRemoved(childKey, oldChange.oldSnap));\r\n }\r\n else if (type === \"child_changed\" /* CHILD_CHANGED */ &&\r\n oldType === \"child_added\" /* CHILD_ADDED */) {\r\n this.changeMap.set(childKey, changeChildAdded(childKey, change.snapshotNode));\r\n }\r\n else if (type === \"child_changed\" /* CHILD_CHANGED */ &&\r\n oldType === \"child_changed\" /* CHILD_CHANGED */) {\r\n this.changeMap.set(childKey, changeChildChanged(childKey, change.snapshotNode, oldChange.oldSnap));\r\n }\r\n else {\r\n throw assertionError('Illegal combination of changes: ' +\r\n change +\r\n ' occurred after ' +\r\n oldChange);\r\n }\r\n }\r\n else {\r\n this.changeMap.set(childKey, change);\r\n }\r\n };\r\n ChildChangeAccumulator.prototype.getChanges = function () {\r\n return Array.from(this.changeMap.values());\r\n };\r\n return ChildChangeAccumulator;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An implementation of CompleteChildSource that never returns any additional children\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nvar NoCompleteChildSource_ = /** @class */ (function () {\r\n function NoCompleteChildSource_() {\r\n }\r\n NoCompleteChildSource_.prototype.getCompleteChild = function (childKey) {\r\n return null;\r\n };\r\n NoCompleteChildSource_.prototype.getChildAfterChild = function (index, child, reverse) {\r\n return null;\r\n };\r\n return NoCompleteChildSource_;\r\n}());\r\n/**\r\n * Singleton instance.\r\n */\r\nvar NO_COMPLETE_CHILD_SOURCE = new NoCompleteChildSource_();\r\n/**\r\n * An implementation of CompleteChildSource that uses a WriteTree in addition to any other server data or\r\n * old event caches available to calculate complete children.\r\n */\r\nvar WriteTreeCompleteChildSource = /** @class */ (function () {\r\n function WriteTreeCompleteChildSource(writes_, viewCache_, optCompleteServerCache_) {\r\n if (optCompleteServerCache_ === void 0) { optCompleteServerCache_ = null; }\r\n this.writes_ = writes_;\r\n this.viewCache_ = viewCache_;\r\n this.optCompleteServerCache_ = optCompleteServerCache_;\r\n }\r\n WriteTreeCompleteChildSource.prototype.getCompleteChild = function (childKey) {\r\n var node = this.viewCache_.eventCache;\r\n if (node.isCompleteForChild(childKey)) {\r\n return node.getNode().getImmediateChild(childKey);\r\n }\r\n else {\r\n var serverNode = this.optCompleteServerCache_ != null\r\n ? new CacheNode(this.optCompleteServerCache_, true, false)\r\n : this.viewCache_.serverCache;\r\n return writeTreeRefCalcCompleteChild(this.writes_, childKey, serverNode);\r\n }\r\n };\r\n WriteTreeCompleteChildSource.prototype.getChildAfterChild = function (index, child, reverse) {\r\n var completeServerData = this.optCompleteServerCache_ != null\r\n ? this.optCompleteServerCache_\r\n : viewCacheGetCompleteServerSnap(this.viewCache_);\r\n var nodes = writeTreeRefCalcIndexedSlice(this.writes_, completeServerData, child, 1, reverse, index);\r\n if (nodes.length === 0) {\r\n return null;\r\n }\r\n else {\r\n return nodes[0];\r\n }\r\n };\r\n return WriteTreeCompleteChildSource;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction newViewProcessor(filter) {\r\n return { filter: filter };\r\n}\r\nfunction viewProcessorAssertIndexed(viewProcessor, viewCache) {\r\n assert(viewCache.eventCache.getNode().isIndexed(viewProcessor.filter.getIndex()), 'Event snap not indexed');\r\n assert(viewCache.serverCache.getNode().isIndexed(viewProcessor.filter.getIndex()), 'Server snap not indexed');\r\n}\r\nfunction viewProcessorApplyOperation(viewProcessor, oldViewCache, operation, writesCache, completeCache) {\r\n var accumulator = new ChildChangeAccumulator();\r\n var newViewCache, filterServerNode;\r\n if (operation.type === OperationType.OVERWRITE) {\r\n var overwrite = operation;\r\n if (overwrite.source.fromUser) {\r\n newViewCache = viewProcessorApplyUserOverwrite(viewProcessor, oldViewCache, overwrite.path, overwrite.snap, writesCache, completeCache, accumulator);\r\n }\r\n else {\r\n assert(overwrite.source.fromServer, 'Unknown source.');\r\n // We filter the node if it's a tagged update or the node has been previously filtered and the\r\n // update is not at the root in which case it is ok (and necessary) to mark the node unfiltered\r\n // again\r\n filterServerNode =\r\n overwrite.source.tagged ||\r\n (oldViewCache.serverCache.isFiltered() && !pathIsEmpty(overwrite.path));\r\n newViewCache = viewProcessorApplyServerOverwrite(viewProcessor, oldViewCache, overwrite.path, overwrite.snap, writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n }\r\n else if (operation.type === OperationType.MERGE) {\r\n var merge = operation;\r\n if (merge.source.fromUser) {\r\n newViewCache = viewProcessorApplyUserMerge(viewProcessor, oldViewCache, merge.path, merge.children, writesCache, completeCache, accumulator);\r\n }\r\n else {\r\n assert(merge.source.fromServer, 'Unknown source.');\r\n // We filter the node if it's a tagged update or the node has been previously filtered\r\n filterServerNode =\r\n merge.source.tagged || oldViewCache.serverCache.isFiltered();\r\n newViewCache = viewProcessorApplyServerMerge(viewProcessor, oldViewCache, merge.path, merge.children, writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n }\r\n else if (operation.type === OperationType.ACK_USER_WRITE) {\r\n var ackUserWrite = operation;\r\n if (!ackUserWrite.revert) {\r\n newViewCache = viewProcessorAckUserWrite(viewProcessor, oldViewCache, ackUserWrite.path, ackUserWrite.affectedTree, writesCache, completeCache, accumulator);\r\n }\r\n else {\r\n newViewCache = viewProcessorRevertUserWrite(viewProcessor, oldViewCache, ackUserWrite.path, writesCache, completeCache, accumulator);\r\n }\r\n }\r\n else if (operation.type === OperationType.LISTEN_COMPLETE) {\r\n newViewCache = viewProcessorListenComplete(viewProcessor, oldViewCache, operation.path, writesCache, accumulator);\r\n }\r\n else {\r\n throw assertionError('Unknown operation type: ' + operation.type);\r\n }\r\n var changes = accumulator.getChanges();\r\n viewProcessorMaybeAddValueEvent(oldViewCache, newViewCache, changes);\r\n return { viewCache: newViewCache, changes: changes };\r\n}\r\nfunction viewProcessorMaybeAddValueEvent(oldViewCache, newViewCache, accumulator) {\r\n var eventSnap = newViewCache.eventCache;\r\n if (eventSnap.isFullyInitialized()) {\r\n var isLeafOrEmpty = eventSnap.getNode().isLeafNode() || eventSnap.getNode().isEmpty();\r\n var oldCompleteSnap = viewCacheGetCompleteEventSnap(oldViewCache);\r\n if (accumulator.length > 0 ||\r\n !oldViewCache.eventCache.isFullyInitialized() ||\r\n (isLeafOrEmpty && !eventSnap.getNode().equals(oldCompleteSnap)) ||\r\n !eventSnap.getNode().getPriority().equals(oldCompleteSnap.getPriority())) {\r\n accumulator.push(changeValue(viewCacheGetCompleteEventSnap(newViewCache)));\r\n }\r\n }\r\n}\r\nfunction viewProcessorGenerateEventCacheAfterServerEvent(viewProcessor, viewCache, changePath, writesCache, source, accumulator) {\r\n var oldEventSnap = viewCache.eventCache;\r\n if (writeTreeRefShadowingWrite(writesCache, changePath) != null) {\r\n // we have a shadowing write, ignore changes\r\n return viewCache;\r\n }\r\n else {\r\n var newEventCache = void 0, serverNode = void 0;\r\n if (pathIsEmpty(changePath)) {\r\n // TODO: figure out how this plays with \"sliding ack windows\"\r\n assert(viewCache.serverCache.isFullyInitialized(), 'If change path is empty, we must have complete server data');\r\n if (viewCache.serverCache.isFiltered()) {\r\n // We need to special case this, because we need to only apply writes to complete children, or\r\n // we might end up raising events for incomplete children. If the server data is filtered deep\r\n // writes cannot be guaranteed to be complete\r\n var serverCache = viewCacheGetCompleteServerSnap(viewCache);\r\n var completeChildren = serverCache instanceof ChildrenNode\r\n ? serverCache\r\n : ChildrenNode.EMPTY_NODE;\r\n var completeEventChildren = writeTreeRefCalcCompleteEventChildren(writesCache, completeChildren);\r\n newEventCache = viewProcessor.filter.updateFullNode(viewCache.eventCache.getNode(), completeEventChildren, accumulator);\r\n }\r\n else {\r\n var completeNode = writeTreeRefCalcCompleteEventCache(writesCache, viewCacheGetCompleteServerSnap(viewCache));\r\n newEventCache = viewProcessor.filter.updateFullNode(viewCache.eventCache.getNode(), completeNode, accumulator);\r\n }\r\n }\r\n else {\r\n var childKey = pathGetFront(changePath);\r\n if (childKey === '.priority') {\r\n assert(pathGetLength(changePath) === 1, \"Can't have a priority with additional path components\");\r\n var oldEventNode = oldEventSnap.getNode();\r\n serverNode = viewCache.serverCache.getNode();\r\n // we might have overwrites for this priority\r\n var updatedPriority = writeTreeRefCalcEventCacheAfterServerOverwrite(writesCache, changePath, oldEventNode, serverNode);\r\n if (updatedPriority != null) {\r\n newEventCache = viewProcessor.filter.updatePriority(oldEventNode, updatedPriority);\r\n }\r\n else {\r\n // priority didn't change, keep old node\r\n newEventCache = oldEventSnap.getNode();\r\n }\r\n }\r\n else {\r\n var childChangePath = pathPopFront(changePath);\r\n // update child\r\n var newEventChild = void 0;\r\n if (oldEventSnap.isCompleteForChild(childKey)) {\r\n serverNode = viewCache.serverCache.getNode();\r\n var eventChildUpdate = writeTreeRefCalcEventCacheAfterServerOverwrite(writesCache, changePath, oldEventSnap.getNode(), serverNode);\r\n if (eventChildUpdate != null) {\r\n newEventChild = oldEventSnap\r\n .getNode()\r\n .getImmediateChild(childKey)\r\n .updateChild(childChangePath, eventChildUpdate);\r\n }\r\n else {\r\n // Nothing changed, just keep the old child\r\n newEventChild = oldEventSnap.getNode().getImmediateChild(childKey);\r\n }\r\n }\r\n else {\r\n newEventChild = writeTreeRefCalcCompleteChild(writesCache, childKey, viewCache.serverCache);\r\n }\r\n if (newEventChild != null) {\r\n newEventCache = viewProcessor.filter.updateChild(oldEventSnap.getNode(), childKey, newEventChild, childChangePath, source, accumulator);\r\n }\r\n else {\r\n // no complete child available or no change\r\n newEventCache = oldEventSnap.getNode();\r\n }\r\n }\r\n }\r\n return viewCacheUpdateEventSnap(viewCache, newEventCache, oldEventSnap.isFullyInitialized() || pathIsEmpty(changePath), viewProcessor.filter.filtersNodes());\r\n }\r\n}\r\nfunction viewProcessorApplyServerOverwrite(viewProcessor, oldViewCache, changePath, changedSnap, writesCache, completeCache, filterServerNode, accumulator) {\r\n var oldServerSnap = oldViewCache.serverCache;\r\n var newServerCache;\r\n var serverFilter = filterServerNode\r\n ? viewProcessor.filter\r\n : viewProcessor.filter.getIndexedFilter();\r\n if (pathIsEmpty(changePath)) {\r\n newServerCache = serverFilter.updateFullNode(oldServerSnap.getNode(), changedSnap, null);\r\n }\r\n else if (serverFilter.filtersNodes() && !oldServerSnap.isFiltered()) {\r\n // we want to filter the server node, but we didn't filter the server node yet, so simulate a full update\r\n var newServerNode = oldServerSnap\r\n .getNode()\r\n .updateChild(changePath, changedSnap);\r\n newServerCache = serverFilter.updateFullNode(oldServerSnap.getNode(), newServerNode, null);\r\n }\r\n else {\r\n var childKey = pathGetFront(changePath);\r\n if (!oldServerSnap.isCompleteForPath(changePath) &&\r\n pathGetLength(changePath) > 1) {\r\n // We don't update incomplete nodes with updates intended for other listeners\r\n return oldViewCache;\r\n }\r\n var childChangePath = pathPopFront(changePath);\r\n var childNode = oldServerSnap.getNode().getImmediateChild(childKey);\r\n var newChildNode = childNode.updateChild(childChangePath, changedSnap);\r\n if (childKey === '.priority') {\r\n newServerCache = serverFilter.updatePriority(oldServerSnap.getNode(), newChildNode);\r\n }\r\n else {\r\n newServerCache = serverFilter.updateChild(oldServerSnap.getNode(), childKey, newChildNode, childChangePath, NO_COMPLETE_CHILD_SOURCE, null);\r\n }\r\n }\r\n var newViewCache = viewCacheUpdateServerSnap(oldViewCache, newServerCache, oldServerSnap.isFullyInitialized() || pathIsEmpty(changePath), serverFilter.filtersNodes());\r\n var source = new WriteTreeCompleteChildSource(writesCache, newViewCache, completeCache);\r\n return viewProcessorGenerateEventCacheAfterServerEvent(viewProcessor, newViewCache, changePath, writesCache, source, accumulator);\r\n}\r\nfunction viewProcessorApplyUserOverwrite(viewProcessor, oldViewCache, changePath, changedSnap, writesCache, completeCache, accumulator) {\r\n var oldEventSnap = oldViewCache.eventCache;\r\n var newViewCache, newEventCache;\r\n var source = new WriteTreeCompleteChildSource(writesCache, oldViewCache, completeCache);\r\n if (pathIsEmpty(changePath)) {\r\n newEventCache = viewProcessor.filter.updateFullNode(oldViewCache.eventCache.getNode(), changedSnap, accumulator);\r\n newViewCache = viewCacheUpdateEventSnap(oldViewCache, newEventCache, true, viewProcessor.filter.filtersNodes());\r\n }\r\n else {\r\n var childKey = pathGetFront(changePath);\r\n if (childKey === '.priority') {\r\n newEventCache = viewProcessor.filter.updatePriority(oldViewCache.eventCache.getNode(), changedSnap);\r\n newViewCache = viewCacheUpdateEventSnap(oldViewCache, newEventCache, oldEventSnap.isFullyInitialized(), oldEventSnap.isFiltered());\r\n }\r\n else {\r\n var childChangePath = pathPopFront(changePath);\r\n var oldChild = oldEventSnap.getNode().getImmediateChild(childKey);\r\n var newChild = void 0;\r\n if (pathIsEmpty(childChangePath)) {\r\n // Child overwrite, we can replace the child\r\n newChild = changedSnap;\r\n }\r\n else {\r\n var childNode = source.getCompleteChild(childKey);\r\n if (childNode != null) {\r\n if (pathGetBack(childChangePath) === '.priority' &&\r\n childNode.getChild(pathParent(childChangePath)).isEmpty()) {\r\n // This is a priority update on an empty node. If this node exists on the server, the\r\n // server will send down the priority in the update, so ignore for now\r\n newChild = childNode;\r\n }\r\n else {\r\n newChild = childNode.updateChild(childChangePath, changedSnap);\r\n }\r\n }\r\n else {\r\n // There is no complete child node available\r\n newChild = ChildrenNode.EMPTY_NODE;\r\n }\r\n }\r\n if (!oldChild.equals(newChild)) {\r\n var newEventSnap = viewProcessor.filter.updateChild(oldEventSnap.getNode(), childKey, newChild, childChangePath, source, accumulator);\r\n newViewCache = viewCacheUpdateEventSnap(oldViewCache, newEventSnap, oldEventSnap.isFullyInitialized(), viewProcessor.filter.filtersNodes());\r\n }\r\n else {\r\n newViewCache = oldViewCache;\r\n }\r\n }\r\n }\r\n return newViewCache;\r\n}\r\nfunction viewProcessorCacheHasChild(viewCache, childKey) {\r\n return viewCache.eventCache.isCompleteForChild(childKey);\r\n}\r\nfunction viewProcessorApplyUserMerge(viewProcessor, viewCache, path, changedChildren, writesCache, serverCache, accumulator) {\r\n // HACK: In the case of a limit query, there may be some changes that bump things out of the\r\n // window leaving room for new items. It's important we process these changes first, so we\r\n // iterate the changes twice, first processing any that affect items currently in view.\r\n // TODO: I consider an item \"in view\" if cacheHasChild is true, which checks both the server\r\n // and event snap. I'm not sure if this will result in edge cases when a child is in one but\r\n // not the other.\r\n var curViewCache = viewCache;\r\n changedChildren.foreach(function (relativePath, childNode) {\r\n var writePath = pathChild(path, relativePath);\r\n if (viewProcessorCacheHasChild(viewCache, pathGetFront(writePath))) {\r\n curViewCache = viewProcessorApplyUserOverwrite(viewProcessor, curViewCache, writePath, childNode, writesCache, serverCache, accumulator);\r\n }\r\n });\r\n changedChildren.foreach(function (relativePath, childNode) {\r\n var writePath = pathChild(path, relativePath);\r\n if (!viewProcessorCacheHasChild(viewCache, pathGetFront(writePath))) {\r\n curViewCache = viewProcessorApplyUserOverwrite(viewProcessor, curViewCache, writePath, childNode, writesCache, serverCache, accumulator);\r\n }\r\n });\r\n return curViewCache;\r\n}\r\nfunction viewProcessorApplyMerge(viewProcessor, node, merge) {\r\n merge.foreach(function (relativePath, childNode) {\r\n node = node.updateChild(relativePath, childNode);\r\n });\r\n return node;\r\n}\r\nfunction viewProcessorApplyServerMerge(viewProcessor, viewCache, path, changedChildren, writesCache, serverCache, filterServerNode, accumulator) {\r\n // If we don't have a cache yet, this merge was intended for a previously listen in the same location. Ignore it and\r\n // wait for the complete data update coming soon.\r\n if (viewCache.serverCache.getNode().isEmpty() &&\r\n !viewCache.serverCache.isFullyInitialized()) {\r\n return viewCache;\r\n }\r\n // HACK: In the case of a limit query, there may be some changes that bump things out of the\r\n // window leaving room for new items. It's important we process these changes first, so we\r\n // iterate the changes twice, first processing any that affect items currently in view.\r\n // TODO: I consider an item \"in view\" if cacheHasChild is true, which checks both the server\r\n // and event snap. I'm not sure if this will result in edge cases when a child is in one but\r\n // not the other.\r\n var curViewCache = viewCache;\r\n var viewMergeTree;\r\n if (pathIsEmpty(path)) {\r\n viewMergeTree = changedChildren;\r\n }\r\n else {\r\n viewMergeTree = new ImmutableTree(null).setTree(path, changedChildren);\r\n }\r\n var serverNode = viewCache.serverCache.getNode();\r\n viewMergeTree.children.inorderTraversal(function (childKey, childTree) {\r\n if (serverNode.hasChild(childKey)) {\r\n var serverChild = viewCache.serverCache\r\n .getNode()\r\n .getImmediateChild(childKey);\r\n var newChild = viewProcessorApplyMerge(viewProcessor, serverChild, childTree);\r\n curViewCache = viewProcessorApplyServerOverwrite(viewProcessor, curViewCache, new Path(childKey), newChild, writesCache, serverCache, filterServerNode, accumulator);\r\n }\r\n });\r\n viewMergeTree.children.inorderTraversal(function (childKey, childMergeTree) {\r\n var isUnknownDeepMerge = !viewCache.serverCache.isCompleteForChild(childKey) &&\r\n childMergeTree.value === undefined;\r\n if (!serverNode.hasChild(childKey) && !isUnknownDeepMerge) {\r\n var serverChild = viewCache.serverCache\r\n .getNode()\r\n .getImmediateChild(childKey);\r\n var newChild = viewProcessorApplyMerge(viewProcessor, serverChild, childMergeTree);\r\n curViewCache = viewProcessorApplyServerOverwrite(viewProcessor, curViewCache, new Path(childKey), newChild, writesCache, serverCache, filterServerNode, accumulator);\r\n }\r\n });\r\n return curViewCache;\r\n}\r\nfunction viewProcessorAckUserWrite(viewProcessor, viewCache, ackPath, affectedTree, writesCache, completeCache, accumulator) {\r\n if (writeTreeRefShadowingWrite(writesCache, ackPath) != null) {\r\n return viewCache;\r\n }\r\n // Only filter server node if it is currently filtered\r\n var filterServerNode = viewCache.serverCache.isFiltered();\r\n // Essentially we'll just get our existing server cache for the affected paths and re-apply it as a server update\r\n // now that it won't be shadowed.\r\n var serverCache = viewCache.serverCache;\r\n if (affectedTree.value != null) {\r\n // This is an overwrite.\r\n if ((pathIsEmpty(ackPath) && serverCache.isFullyInitialized()) ||\r\n serverCache.isCompleteForPath(ackPath)) {\r\n return viewProcessorApplyServerOverwrite(viewProcessor, viewCache, ackPath, serverCache.getNode().getChild(ackPath), writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n else if (pathIsEmpty(ackPath)) {\r\n // This is a goofy edge case where we are acking data at this location but don't have full data. We\r\n // should just re-apply whatever we have in our cache as a merge.\r\n var changedChildren_1 = new ImmutableTree(null);\r\n serverCache.getNode().forEachChild(KEY_INDEX, function (name, node) {\r\n changedChildren_1 = changedChildren_1.set(new Path(name), node);\r\n });\r\n return viewProcessorApplyServerMerge(viewProcessor, viewCache, ackPath, changedChildren_1, writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n else {\r\n return viewCache;\r\n }\r\n }\r\n else {\r\n // This is a merge.\r\n var changedChildren_2 = new ImmutableTree(null);\r\n affectedTree.foreach(function (mergePath, value) {\r\n var serverCachePath = pathChild(ackPath, mergePath);\r\n if (serverCache.isCompleteForPath(serverCachePath)) {\r\n changedChildren_2 = changedChildren_2.set(mergePath, serverCache.getNode().getChild(serverCachePath));\r\n }\r\n });\r\n return viewProcessorApplyServerMerge(viewProcessor, viewCache, ackPath, changedChildren_2, writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n}\r\nfunction viewProcessorListenComplete(viewProcessor, viewCache, path, writesCache, accumulator) {\r\n var oldServerNode = viewCache.serverCache;\r\n var newViewCache = viewCacheUpdateServerSnap(viewCache, oldServerNode.getNode(), oldServerNode.isFullyInitialized() || pathIsEmpty(path), oldServerNode.isFiltered());\r\n return viewProcessorGenerateEventCacheAfterServerEvent(viewProcessor, newViewCache, path, writesCache, NO_COMPLETE_CHILD_SOURCE, accumulator);\r\n}\r\nfunction viewProcessorRevertUserWrite(viewProcessor, viewCache, path, writesCache, completeServerCache, accumulator) {\r\n var complete;\r\n if (writeTreeRefShadowingWrite(writesCache, path) != null) {\r\n return viewCache;\r\n }\r\n else {\r\n var source = new WriteTreeCompleteChildSource(writesCache, viewCache, completeServerCache);\r\n var oldEventCache = viewCache.eventCache.getNode();\r\n var newEventCache = void 0;\r\n if (pathIsEmpty(path) || pathGetFront(path) === '.priority') {\r\n var newNode = void 0;\r\n if (viewCache.serverCache.isFullyInitialized()) {\r\n newNode = writeTreeRefCalcCompleteEventCache(writesCache, viewCacheGetCompleteServerSnap(viewCache));\r\n }\r\n else {\r\n var serverChildren = viewCache.serverCache.getNode();\r\n assert(serverChildren instanceof ChildrenNode, 'serverChildren would be complete if leaf node');\r\n newNode = writeTreeRefCalcCompleteEventChildren(writesCache, serverChildren);\r\n }\r\n newNode = newNode;\r\n newEventCache = viewProcessor.filter.updateFullNode(oldEventCache, newNode, accumulator);\r\n }\r\n else {\r\n var childKey = pathGetFront(path);\r\n var newChild = writeTreeRefCalcCompleteChild(writesCache, childKey, viewCache.serverCache);\r\n if (newChild == null &&\r\n viewCache.serverCache.isCompleteForChild(childKey)) {\r\n newChild = oldEventCache.getImmediateChild(childKey);\r\n }\r\n if (newChild != null) {\r\n newEventCache = viewProcessor.filter.updateChild(oldEventCache, childKey, newChild, pathPopFront(path), source, accumulator);\r\n }\r\n else if (viewCache.eventCache.getNode().hasChild(childKey)) {\r\n // No complete child available, delete the existing one, if any\r\n newEventCache = viewProcessor.filter.updateChild(oldEventCache, childKey, ChildrenNode.EMPTY_NODE, pathPopFront(path), source, accumulator);\r\n }\r\n else {\r\n newEventCache = oldEventCache;\r\n }\r\n if (newEventCache.isEmpty() &&\r\n viewCache.serverCache.isFullyInitialized()) {\r\n // We might have reverted all child writes. Maybe the old event was a leaf node\r\n complete = writeTreeRefCalcCompleteEventCache(writesCache, viewCacheGetCompleteServerSnap(viewCache));\r\n if (complete.isLeafNode()) {\r\n newEventCache = viewProcessor.filter.updateFullNode(newEventCache, complete, accumulator);\r\n }\r\n }\r\n }\r\n complete =\r\n viewCache.serverCache.isFullyInitialized() ||\r\n writeTreeRefShadowingWrite(writesCache, newEmptyPath()) != null;\r\n return viewCacheUpdateEventSnap(viewCache, newEventCache, complete, viewProcessor.filter.filtersNodes());\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A view represents a specific location and query that has 1 or more event registrations.\r\n *\r\n * It does several things:\r\n * - Maintains the list of event registrations for this location/query.\r\n * - Maintains a cache of the data visible for this location/query.\r\n * - Applies new operations (via applyOperation), updates the cache, and based on the event\r\n * registrations returns the set of events to be raised.\r\n */\r\nvar View = /** @class */ (function () {\r\n function View(query_, initialViewCache) {\r\n this.query_ = query_;\r\n this.eventRegistrations_ = [];\r\n var params = this.query_._queryParams;\r\n var indexFilter = new IndexedFilter(params.getIndex());\r\n var filter = queryParamsGetNodeFilter(params);\r\n this.processor_ = newViewProcessor(filter);\r\n var initialServerCache = initialViewCache.serverCache;\r\n var initialEventCache = initialViewCache.eventCache;\r\n // Don't filter server node with other filter than index, wait for tagged listen\r\n var serverSnap = indexFilter.updateFullNode(ChildrenNode.EMPTY_NODE, initialServerCache.getNode(), null);\r\n var eventSnap = filter.updateFullNode(ChildrenNode.EMPTY_NODE, initialEventCache.getNode(), null);\r\n var newServerCache = new CacheNode(serverSnap, initialServerCache.isFullyInitialized(), indexFilter.filtersNodes());\r\n var newEventCache = new CacheNode(eventSnap, initialEventCache.isFullyInitialized(), filter.filtersNodes());\r\n this.viewCache_ = newViewCache(newEventCache, newServerCache);\r\n this.eventGenerator_ = new EventGenerator(this.query_);\r\n }\r\n Object.defineProperty(View.prototype, \"query\", {\r\n get: function () {\r\n return this.query_;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n return View;\r\n}());\r\nfunction viewGetServerCache(view) {\r\n return view.viewCache_.serverCache.getNode();\r\n}\r\nfunction viewGetCompleteNode(view) {\r\n return viewCacheGetCompleteEventSnap(view.viewCache_);\r\n}\r\nfunction viewGetCompleteServerCache(view, path) {\r\n var cache = viewCacheGetCompleteServerSnap(view.viewCache_);\r\n if (cache) {\r\n // If this isn't a \"loadsAllData\" view, then cache isn't actually a complete cache and\r\n // we need to see if it contains the child we're interested in.\r\n if (view.query._queryParams.loadsAllData() ||\r\n (!pathIsEmpty(path) &&\r\n !cache.getImmediateChild(pathGetFront(path)).isEmpty())) {\r\n return cache.getChild(path);\r\n }\r\n }\r\n return null;\r\n}\r\nfunction viewIsEmpty(view) {\r\n return view.eventRegistrations_.length === 0;\r\n}\r\nfunction viewAddEventRegistration(view, eventRegistration) {\r\n view.eventRegistrations_.push(eventRegistration);\r\n}\r\n/**\r\n * @param eventRegistration - If null, remove all callbacks.\r\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\r\n * @returns Cancel events, if cancelError was provided.\r\n */\r\nfunction viewRemoveEventRegistration(view, eventRegistration, cancelError) {\r\n var cancelEvents = [];\r\n if (cancelError) {\r\n assert(eventRegistration == null, 'A cancel should cancel all event registrations.');\r\n var path_1 = view.query._path;\r\n view.eventRegistrations_.forEach(function (registration) {\r\n var maybeEvent = registration.createCancelEvent(cancelError, path_1);\r\n if (maybeEvent) {\r\n cancelEvents.push(maybeEvent);\r\n }\r\n });\r\n }\r\n if (eventRegistration) {\r\n var remaining = [];\r\n for (var i = 0; i < view.eventRegistrations_.length; ++i) {\r\n var existing = view.eventRegistrations_[i];\r\n if (!existing.matches(eventRegistration)) {\r\n remaining.push(existing);\r\n }\r\n else if (eventRegistration.hasAnyCallback()) {\r\n // We're removing just this one\r\n remaining = remaining.concat(view.eventRegistrations_.slice(i + 1));\r\n break;\r\n }\r\n }\r\n view.eventRegistrations_ = remaining;\r\n }\r\n else {\r\n view.eventRegistrations_ = [];\r\n }\r\n return cancelEvents;\r\n}\r\n/**\r\n * Applies the given Operation, updates our cache, and returns the appropriate events.\r\n */\r\nfunction viewApplyOperation(view, operation, writesCache, completeServerCache) {\r\n if (operation.type === OperationType.MERGE &&\r\n operation.source.queryId !== null) {\r\n assert(viewCacheGetCompleteServerSnap(view.viewCache_), 'We should always have a full cache before handling merges');\r\n assert(viewCacheGetCompleteEventSnap(view.viewCache_), 'Missing event cache, even though we have a server cache');\r\n }\r\n var oldViewCache = view.viewCache_;\r\n var result = viewProcessorApplyOperation(view.processor_, oldViewCache, operation, writesCache, completeServerCache);\r\n viewProcessorAssertIndexed(view.processor_, result.viewCache);\r\n assert(result.viewCache.serverCache.isFullyInitialized() ||\r\n !oldViewCache.serverCache.isFullyInitialized(), 'Once a server snap is complete, it should never go back');\r\n view.viewCache_ = result.viewCache;\r\n return viewGenerateEventsForChanges_(view, result.changes, result.viewCache.eventCache.getNode(), null);\r\n}\r\nfunction viewGetInitialEvents(view, registration) {\r\n var eventSnap = view.viewCache_.eventCache;\r\n var initialChanges = [];\r\n if (!eventSnap.getNode().isLeafNode()) {\r\n var eventNode = eventSnap.getNode();\r\n eventNode.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n initialChanges.push(changeChildAdded(key, childNode));\r\n });\r\n }\r\n if (eventSnap.isFullyInitialized()) {\r\n initialChanges.push(changeValue(eventSnap.getNode()));\r\n }\r\n return viewGenerateEventsForChanges_(view, initialChanges, eventSnap.getNode(), registration);\r\n}\r\nfunction viewGenerateEventsForChanges_(view, changes, eventCache, eventRegistration) {\r\n var registrations = eventRegistration\r\n ? [eventRegistration]\r\n : view.eventRegistrations_;\r\n return eventGeneratorGenerateEventsForChanges(view.eventGenerator_, changes, eventCache, registrations);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar referenceConstructor$1;\r\n/**\r\n * SyncPoint represents a single location in a SyncTree with 1 or more event registrations, meaning we need to\r\n * maintain 1 or more Views at this location to cache server data and raise appropriate events for server changes\r\n * and user writes (set, transaction, update).\r\n *\r\n * It's responsible for:\r\n * - Maintaining the set of 1 or more views necessary at this location (a SyncPoint with 0 views should be removed).\r\n * - Proxying user / server operations to the views as appropriate (i.e. applyServerOverwrite,\r\n * applyUserOverwrite, etc.)\r\n */\r\nvar SyncPoint = /** @class */ (function () {\r\n function SyncPoint() {\r\n /**\r\n * The Views being tracked at this location in the tree, stored as a map where the key is a\r\n * queryId and the value is the View for that query.\r\n *\r\n * NOTE: This list will be quite small (usually 1, but perhaps 2 or 3; any more is an odd use case).\r\n */\r\n this.views = new Map();\r\n }\r\n return SyncPoint;\r\n}());\r\nfunction syncPointSetReferenceConstructor(val) {\r\n assert(!referenceConstructor$1, '__referenceConstructor has already been defined');\r\n referenceConstructor$1 = val;\r\n}\r\nfunction syncPointGetReferenceConstructor() {\r\n assert(referenceConstructor$1, 'Reference.ts has not been loaded');\r\n return referenceConstructor$1;\r\n}\r\nfunction syncPointIsEmpty(syncPoint) {\r\n return syncPoint.views.size === 0;\r\n}\r\nfunction syncPointApplyOperation(syncPoint, operation, writesCache, optCompleteServerCache) {\r\n var e_1, _a;\r\n var queryId = operation.source.queryId;\r\n if (queryId !== null) {\r\n var view = syncPoint.views.get(queryId);\r\n assert(view != null, 'SyncTree gave us an op for an invalid query.');\r\n return viewApplyOperation(view, operation, writesCache, optCompleteServerCache);\r\n }\r\n else {\r\n var events = [];\r\n try {\r\n for (var _b = __values(syncPoint.views.values()), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var view = _c.value;\r\n events = events.concat(viewApplyOperation(view, operation, writesCache, optCompleteServerCache));\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n return events;\r\n }\r\n}\r\n/**\r\n * Get a view for the specified query.\r\n *\r\n * @param query - The query to return a view for\r\n * @param writesCache\r\n * @param serverCache\r\n * @param serverCacheComplete\r\n * @returns Events to raise.\r\n */\r\nfunction syncPointGetView(syncPoint, query, writesCache, serverCache, serverCacheComplete) {\r\n var queryId = query._queryIdentifier;\r\n var view = syncPoint.views.get(queryId);\r\n if (!view) {\r\n // TODO: make writesCache take flag for complete server node\r\n var eventCache = writeTreeRefCalcCompleteEventCache(writesCache, serverCacheComplete ? serverCache : null);\r\n var eventCacheComplete = false;\r\n if (eventCache) {\r\n eventCacheComplete = true;\r\n }\r\n else if (serverCache instanceof ChildrenNode) {\r\n eventCache = writeTreeRefCalcCompleteEventChildren(writesCache, serverCache);\r\n eventCacheComplete = false;\r\n }\r\n else {\r\n eventCache = ChildrenNode.EMPTY_NODE;\r\n eventCacheComplete = false;\r\n }\r\n var viewCache = newViewCache(new CacheNode(eventCache, eventCacheComplete, false), new CacheNode(serverCache, serverCacheComplete, false));\r\n return new View(query, viewCache);\r\n }\r\n return view;\r\n}\r\n/**\r\n * Add an event callback for the specified query.\r\n *\r\n * @param query\r\n * @param eventRegistration\r\n * @param writesCache\r\n * @param serverCache - Complete server cache, if we have it.\r\n * @param serverCacheComplete\r\n * @returns Events to raise.\r\n */\r\nfunction syncPointAddEventRegistration(syncPoint, query, eventRegistration, writesCache, serverCache, serverCacheComplete) {\r\n var view = syncPointGetView(syncPoint, query, writesCache, serverCache, serverCacheComplete);\r\n if (!syncPoint.views.has(query._queryIdentifier)) {\r\n syncPoint.views.set(query._queryIdentifier, view);\r\n }\r\n // This is guaranteed to exist now, we just created anything that was missing\r\n viewAddEventRegistration(view, eventRegistration);\r\n return viewGetInitialEvents(view, eventRegistration);\r\n}\r\n/**\r\n * Remove event callback(s). Return cancelEvents if a cancelError is specified.\r\n *\r\n * If query is the default query, we'll check all views for the specified eventRegistration.\r\n * If eventRegistration is null, we'll remove all callbacks for the specified view(s).\r\n *\r\n * @param eventRegistration - If null, remove all callbacks.\r\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\r\n * @returns removed queries and any cancel events\r\n */\r\nfunction syncPointRemoveEventRegistration(syncPoint, query, eventRegistration, cancelError) {\r\n var e_2, _a;\r\n var queryId = query._queryIdentifier;\r\n var removed = [];\r\n var cancelEvents = [];\r\n var hadCompleteView = syncPointHasCompleteView(syncPoint);\r\n if (queryId === 'default') {\r\n try {\r\n // When you do ref.off(...), we search all views for the registration to remove.\r\n for (var _b = __values(syncPoint.views.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var _d = __read(_c.value, 2), viewQueryId = _d[0], view = _d[1];\r\n cancelEvents = cancelEvents.concat(viewRemoveEventRegistration(view, eventRegistration, cancelError));\r\n if (viewIsEmpty(view)) {\r\n syncPoint.views.delete(viewQueryId);\r\n // We'll deal with complete views later.\r\n if (!view.query._queryParams.loadsAllData()) {\r\n removed.push(view.query);\r\n }\r\n }\r\n }\r\n }\r\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_2) throw e_2.error; }\r\n }\r\n }\r\n else {\r\n // remove the callback from the specific view.\r\n var view = syncPoint.views.get(queryId);\r\n if (view) {\r\n cancelEvents = cancelEvents.concat(viewRemoveEventRegistration(view, eventRegistration, cancelError));\r\n if (viewIsEmpty(view)) {\r\n syncPoint.views.delete(queryId);\r\n // We'll deal with complete views later.\r\n if (!view.query._queryParams.loadsAllData()) {\r\n removed.push(view.query);\r\n }\r\n }\r\n }\r\n }\r\n if (hadCompleteView && !syncPointHasCompleteView(syncPoint)) {\r\n // We removed our last complete view.\r\n removed.push(new (syncPointGetReferenceConstructor())(query._repo, query._path));\r\n }\r\n return { removed: removed, events: cancelEvents };\r\n}\r\nfunction syncPointGetQueryViews(syncPoint) {\r\n var e_3, _a;\r\n var result = [];\r\n try {\r\n for (var _b = __values(syncPoint.views.values()), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var view = _c.value;\r\n if (!view.query._queryParams.loadsAllData()) {\r\n result.push(view);\r\n }\r\n }\r\n }\r\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_3) throw e_3.error; }\r\n }\r\n return result;\r\n}\r\n/**\r\n * @param path - The path to the desired complete snapshot\r\n * @returns A complete cache, if it exists\r\n */\r\nfunction syncPointGetCompleteServerCache(syncPoint, path) {\r\n var e_4, _a;\r\n var serverCache = null;\r\n try {\r\n for (var _b = __values(syncPoint.views.values()), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var view = _c.value;\r\n serverCache = serverCache || viewGetCompleteServerCache(view, path);\r\n }\r\n }\r\n catch (e_4_1) { e_4 = { error: e_4_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_4) throw e_4.error; }\r\n }\r\n return serverCache;\r\n}\r\nfunction syncPointViewForQuery(syncPoint, query) {\r\n var params = query._queryParams;\r\n if (params.loadsAllData()) {\r\n return syncPointGetCompleteView(syncPoint);\r\n }\r\n else {\r\n var queryId = query._queryIdentifier;\r\n return syncPoint.views.get(queryId);\r\n }\r\n}\r\nfunction syncPointViewExistsForQuery(syncPoint, query) {\r\n return syncPointViewForQuery(syncPoint, query) != null;\r\n}\r\nfunction syncPointHasCompleteView(syncPoint) {\r\n return syncPointGetCompleteView(syncPoint) != null;\r\n}\r\nfunction syncPointGetCompleteView(syncPoint) {\r\n var e_5, _a;\r\n try {\r\n for (var _b = __values(syncPoint.views.values()), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var view = _c.value;\r\n if (view.query._queryParams.loadsAllData()) {\r\n return view;\r\n }\r\n }\r\n }\r\n catch (e_5_1) { e_5 = { error: e_5_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_5) throw e_5.error; }\r\n }\r\n return null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar referenceConstructor;\r\nfunction syncTreeSetReferenceConstructor(val) {\r\n assert(!referenceConstructor, '__referenceConstructor has already been defined');\r\n referenceConstructor = val;\r\n}\r\nfunction syncTreeGetReferenceConstructor() {\r\n assert(referenceConstructor, 'Reference.ts has not been loaded');\r\n return referenceConstructor;\r\n}\r\n/**\r\n * Static tracker for next query tag.\r\n */\r\nvar syncTreeNextQueryTag_ = 1;\r\n/**\r\n * SyncTree is the central class for managing event callback registration, data caching, views\r\n * (query processing), and event generation. There are typically two SyncTree instances for\r\n * each Repo, one for the normal Firebase data, and one for the .info data.\r\n *\r\n * It has a number of responsibilities, including:\r\n * - Tracking all user event callbacks (registered via addEventRegistration() and removeEventRegistration()).\r\n * - Applying and caching data changes for user set(), transaction(), and update() calls\r\n * (applyUserOverwrite(), applyUserMerge()).\r\n * - Applying and caching data changes for server data changes (applyServerOverwrite(),\r\n * applyServerMerge()).\r\n * - Generating user-facing events for server and user changes (all of the apply* methods\r\n * return the set of events that need to be raised as a result).\r\n * - Maintaining the appropriate set of server listens to ensure we are always subscribed\r\n * to the correct set of paths and queries to satisfy the current set of user event\r\n * callbacks (listens are started/stopped using the provided listenProvider).\r\n *\r\n * NOTE: Although SyncTree tracks event callbacks and calculates events to raise, the actual\r\n * events are returned to the caller rather than raised synchronously.\r\n *\r\n */\r\nvar SyncTree = /** @class */ (function () {\r\n /**\r\n * @param listenProvider_ - Used by SyncTree to start / stop listening\r\n * to server data.\r\n */\r\n function SyncTree(listenProvider_) {\r\n this.listenProvider_ = listenProvider_;\r\n /**\r\n * Tree of SyncPoints. There's a SyncPoint at any location that has 1 or more views.\r\n */\r\n this.syncPointTree_ = new ImmutableTree(null);\r\n /**\r\n * A tree of all pending user writes (user-initiated set()'s, transaction()'s, update()'s, etc.).\r\n */\r\n this.pendingWriteTree_ = newWriteTree();\r\n this.tagToQueryMap = new Map();\r\n this.queryToTagMap = new Map();\r\n }\r\n return SyncTree;\r\n}());\r\n/**\r\n * Apply the data changes for a user-generated set() or transaction() call.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyUserOverwrite(syncTree, path, newData, writeId, visible) {\r\n // Record pending write.\r\n writeTreeAddOverwrite(syncTree.pendingWriteTree_, path, newData, writeId, visible);\r\n if (!visible) {\r\n return [];\r\n }\r\n else {\r\n return syncTreeApplyOperationToSyncPoints_(syncTree, new Overwrite(newOperationSourceUser(), path, newData));\r\n }\r\n}\r\n/**\r\n * Apply the data from a user-generated update() call\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyUserMerge(syncTree, path, changedChildren, writeId) {\r\n // Record pending merge.\r\n writeTreeAddMerge(syncTree.pendingWriteTree_, path, changedChildren, writeId);\r\n var changeTree = ImmutableTree.fromObject(changedChildren);\r\n return syncTreeApplyOperationToSyncPoints_(syncTree, new Merge(newOperationSourceUser(), path, changeTree));\r\n}\r\n/**\r\n * Acknowledge a pending user write that was previously registered with applyUserOverwrite() or applyUserMerge().\r\n *\r\n * @param revert - True if the given write failed and needs to be reverted\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeAckUserWrite(syncTree, writeId, revert) {\r\n if (revert === void 0) { revert = false; }\r\n var write = writeTreeGetWrite(syncTree.pendingWriteTree_, writeId);\r\n var needToReevaluate = writeTreeRemoveWrite(syncTree.pendingWriteTree_, writeId);\r\n if (!needToReevaluate) {\r\n return [];\r\n }\r\n else {\r\n var affectedTree_1 = new ImmutableTree(null);\r\n if (write.snap != null) {\r\n // overwrite\r\n affectedTree_1 = affectedTree_1.set(newEmptyPath(), true);\r\n }\r\n else {\r\n each(write.children, function (pathString) {\r\n affectedTree_1 = affectedTree_1.set(new Path(pathString), true);\r\n });\r\n }\r\n return syncTreeApplyOperationToSyncPoints_(syncTree, new AckUserWrite(write.path, affectedTree_1, revert));\r\n }\r\n}\r\n/**\r\n * Apply new server data for the specified path..\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyServerOverwrite(syncTree, path, newData) {\r\n return syncTreeApplyOperationToSyncPoints_(syncTree, new Overwrite(newOperationSourceServer(), path, newData));\r\n}\r\n/**\r\n * Apply new server data to be merged in at the specified path.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyServerMerge(syncTree, path, changedChildren) {\r\n var changeTree = ImmutableTree.fromObject(changedChildren);\r\n return syncTreeApplyOperationToSyncPoints_(syncTree, new Merge(newOperationSourceServer(), path, changeTree));\r\n}\r\n/**\r\n * Apply a listen complete for a query\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyListenComplete(syncTree, path) {\r\n return syncTreeApplyOperationToSyncPoints_(syncTree, new ListenComplete(newOperationSourceServer(), path));\r\n}\r\n/**\r\n * Apply a listen complete for a tagged query\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyTaggedListenComplete(syncTree, path, tag) {\r\n var queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\r\n if (queryKey) {\r\n var r = syncTreeParseQueryKey_(queryKey);\r\n var queryPath = r.path, queryId = r.queryId;\r\n var relativePath = newRelativePath(queryPath, path);\r\n var op = new ListenComplete(newOperationSourceServerTaggedQuery(queryId), relativePath);\r\n return syncTreeApplyTaggedOperation_(syncTree, queryPath, op);\r\n }\r\n else {\r\n // We've already removed the query. No big deal, ignore the update\r\n return [];\r\n }\r\n}\r\n/**\r\n * Remove event callback(s).\r\n *\r\n * If query is the default query, we'll check all queries for the specified eventRegistration.\r\n * If eventRegistration is null, we'll remove all callbacks for the specified query/queries.\r\n *\r\n * @param eventRegistration - If null, all callbacks are removed.\r\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\r\n * @returns Cancel events, if cancelError was provided.\r\n */\r\nfunction syncTreeRemoveEventRegistration(syncTree, query, eventRegistration, cancelError) {\r\n // Find the syncPoint first. Then deal with whether or not it has matching listeners\r\n var path = query._path;\r\n var maybeSyncPoint = syncTree.syncPointTree_.get(path);\r\n var cancelEvents = [];\r\n // A removal on a default query affects all queries at that location. A removal on an indexed query, even one without\r\n // other query constraints, does *not* affect all queries at that location. So this check must be for 'default', and\r\n // not loadsAllData().\r\n if (maybeSyncPoint &&\r\n (query._queryIdentifier === 'default' ||\r\n syncPointViewExistsForQuery(maybeSyncPoint, query))) {\r\n var removedAndEvents = syncPointRemoveEventRegistration(maybeSyncPoint, query, eventRegistration, cancelError);\r\n if (syncPointIsEmpty(maybeSyncPoint)) {\r\n syncTree.syncPointTree_ = syncTree.syncPointTree_.remove(path);\r\n }\r\n var removed = removedAndEvents.removed;\r\n cancelEvents = removedAndEvents.events;\r\n // We may have just removed one of many listeners and can short-circuit this whole process\r\n // We may also not have removed a default listener, in which case all of the descendant listeners should already be\r\n // properly set up.\r\n //\r\n // Since indexed queries can shadow if they don't have other query constraints, check for loadsAllData(), instead of\r\n // queryId === 'default'\r\n var removingDefault = -1 !==\r\n removed.findIndex(function (query) {\r\n return query._queryParams.loadsAllData();\r\n });\r\n var covered = syncTree.syncPointTree_.findOnPath(path, function (relativePath, parentSyncPoint) {\r\n return syncPointHasCompleteView(parentSyncPoint);\r\n });\r\n if (removingDefault && !covered) {\r\n var subtree = syncTree.syncPointTree_.subtree(path);\r\n // There are potentially child listeners. Determine what if any listens we need to send before executing the\r\n // removal\r\n if (!subtree.isEmpty()) {\r\n // We need to fold over our subtree and collect the listeners to send\r\n var newViews = syncTreeCollectDistinctViewsForSubTree_(subtree);\r\n // Ok, we've collected all the listens we need. Set them up.\r\n for (var i = 0; i < newViews.length; ++i) {\r\n var view = newViews[i], newQuery = view.query;\r\n var listener = syncTreeCreateListenerForView_(syncTree, view);\r\n syncTree.listenProvider_.startListening(syncTreeQueryForListening_(newQuery), syncTreeTagForQuery_(syncTree, newQuery), listener.hashFn, listener.onComplete);\r\n }\r\n }\r\n }\r\n // If we removed anything and we're not covered by a higher up listen, we need to stop listening on this query\r\n // The above block has us covered in terms of making sure we're set up on listens lower in the tree.\r\n // Also, note that if we have a cancelError, it's already been removed at the provider level.\r\n if (!covered && removed.length > 0 && !cancelError) {\r\n // If we removed a default, then we weren't listening on any of the other queries here. Just cancel the one\r\n // default. Otherwise, we need to iterate through and cancel each individual query\r\n if (removingDefault) {\r\n // We don't tag default listeners\r\n var defaultTag = null;\r\n syncTree.listenProvider_.stopListening(syncTreeQueryForListening_(query), defaultTag);\r\n }\r\n else {\r\n removed.forEach(function (queryToRemove) {\r\n var tagToRemove = syncTree.queryToTagMap.get(syncTreeMakeQueryKey_(queryToRemove));\r\n syncTree.listenProvider_.stopListening(syncTreeQueryForListening_(queryToRemove), tagToRemove);\r\n });\r\n }\r\n }\r\n // Now, clear all of the tags we're tracking for the removed listens\r\n syncTreeRemoveTags_(syncTree, removed);\r\n }\r\n return cancelEvents;\r\n}\r\n/**\r\n * Apply new server data for the specified tagged query.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyTaggedQueryOverwrite(syncTree, path, snap, tag) {\r\n var queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\r\n if (queryKey != null) {\r\n var r = syncTreeParseQueryKey_(queryKey);\r\n var queryPath = r.path, queryId = r.queryId;\r\n var relativePath = newRelativePath(queryPath, path);\r\n var op = new Overwrite(newOperationSourceServerTaggedQuery(queryId), relativePath, snap);\r\n return syncTreeApplyTaggedOperation_(syncTree, queryPath, op);\r\n }\r\n else {\r\n // Query must have been removed already\r\n return [];\r\n }\r\n}\r\n/**\r\n * Apply server data to be merged in for the specified tagged query.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyTaggedQueryMerge(syncTree, path, changedChildren, tag) {\r\n var queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\r\n if (queryKey) {\r\n var r = syncTreeParseQueryKey_(queryKey);\r\n var queryPath = r.path, queryId = r.queryId;\r\n var relativePath = newRelativePath(queryPath, path);\r\n var changeTree = ImmutableTree.fromObject(changedChildren);\r\n var op = new Merge(newOperationSourceServerTaggedQuery(queryId), relativePath, changeTree);\r\n return syncTreeApplyTaggedOperation_(syncTree, queryPath, op);\r\n }\r\n else {\r\n // We've already removed the query. No big deal, ignore the update\r\n return [];\r\n }\r\n}\r\n/**\r\n * Add an event callback for the specified query.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeAddEventRegistration(syncTree, query, eventRegistration) {\r\n var path = query._path;\r\n var serverCache = null;\r\n var foundAncestorDefaultView = false;\r\n // Any covering writes will necessarily be at the root, so really all we need to find is the server cache.\r\n // Consider optimizing this once there's a better understanding of what actual behavior will be.\r\n syncTree.syncPointTree_.foreachOnPath(path, function (pathToSyncPoint, sp) {\r\n var relativePath = newRelativePath(pathToSyncPoint, path);\r\n serverCache =\r\n serverCache || syncPointGetCompleteServerCache(sp, relativePath);\r\n foundAncestorDefaultView =\r\n foundAncestorDefaultView || syncPointHasCompleteView(sp);\r\n });\r\n var syncPoint = syncTree.syncPointTree_.get(path);\r\n if (!syncPoint) {\r\n syncPoint = new SyncPoint();\r\n syncTree.syncPointTree_ = syncTree.syncPointTree_.set(path, syncPoint);\r\n }\r\n else {\r\n foundAncestorDefaultView =\r\n foundAncestorDefaultView || syncPointHasCompleteView(syncPoint);\r\n serverCache =\r\n serverCache || syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\r\n }\r\n var serverCacheComplete;\r\n if (serverCache != null) {\r\n serverCacheComplete = true;\r\n }\r\n else {\r\n serverCacheComplete = false;\r\n serverCache = ChildrenNode.EMPTY_NODE;\r\n var subtree = syncTree.syncPointTree_.subtree(path);\r\n subtree.foreachChild(function (childName, childSyncPoint) {\r\n var completeCache = syncPointGetCompleteServerCache(childSyncPoint, newEmptyPath());\r\n if (completeCache) {\r\n serverCache = serverCache.updateImmediateChild(childName, completeCache);\r\n }\r\n });\r\n }\r\n var viewAlreadyExists = syncPointViewExistsForQuery(syncPoint, query);\r\n if (!viewAlreadyExists && !query._queryParams.loadsAllData()) {\r\n // We need to track a tag for this query\r\n var queryKey = syncTreeMakeQueryKey_(query);\r\n assert(!syncTree.queryToTagMap.has(queryKey), 'View does not exist, but we have a tag');\r\n var tag = syncTreeGetNextQueryTag_();\r\n syncTree.queryToTagMap.set(queryKey, tag);\r\n syncTree.tagToQueryMap.set(tag, queryKey);\r\n }\r\n var writesCache = writeTreeChildWrites(syncTree.pendingWriteTree_, path);\r\n var events = syncPointAddEventRegistration(syncPoint, query, eventRegistration, writesCache, serverCache, serverCacheComplete);\r\n if (!viewAlreadyExists && !foundAncestorDefaultView) {\r\n var view = syncPointViewForQuery(syncPoint, query);\r\n events = events.concat(syncTreeSetupListener_(syncTree, query, view));\r\n }\r\n return events;\r\n}\r\n/**\r\n * Returns a complete cache, if we have one, of the data at a particular path. If the location does not have a\r\n * listener above it, we will get a false \"null\". This shouldn't be a problem because transactions will always\r\n * have a listener above, and atomic operations would correctly show a jitter of ->\r\n * as the write is applied locally and then acknowledged at the server.\r\n *\r\n * Note: this method will *include* hidden writes from transaction with applyLocally set to false.\r\n *\r\n * @param path - The path to the data we want\r\n * @param writeIdsToExclude - A specific set to be excluded\r\n */\r\nfunction syncTreeCalcCompleteEventCache(syncTree, path, writeIdsToExclude) {\r\n var includeHiddenSets = true;\r\n var writeTree = syncTree.pendingWriteTree_;\r\n var serverCache = syncTree.syncPointTree_.findOnPath(path, function (pathSoFar, syncPoint) {\r\n var relativePath = newRelativePath(pathSoFar, path);\r\n var serverCache = syncPointGetCompleteServerCache(syncPoint, relativePath);\r\n if (serverCache) {\r\n return serverCache;\r\n }\r\n });\r\n return writeTreeCalcCompleteEventCache(writeTree, path, serverCache, writeIdsToExclude, includeHiddenSets);\r\n}\r\nfunction syncTreeGetServerValue(syncTree, query) {\r\n var path = query._path;\r\n var serverCache = null;\r\n // Any covering writes will necessarily be at the root, so really all we need to find is the server cache.\r\n // Consider optimizing this once there's a better understanding of what actual behavior will be.\r\n syncTree.syncPointTree_.foreachOnPath(path, function (pathToSyncPoint, sp) {\r\n var relativePath = newRelativePath(pathToSyncPoint, path);\r\n serverCache =\r\n serverCache || syncPointGetCompleteServerCache(sp, relativePath);\r\n });\r\n var syncPoint = syncTree.syncPointTree_.get(path);\r\n if (!syncPoint) {\r\n syncPoint = new SyncPoint();\r\n syncTree.syncPointTree_ = syncTree.syncPointTree_.set(path, syncPoint);\r\n }\r\n else {\r\n serverCache =\r\n serverCache || syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\r\n }\r\n var serverCacheComplete = serverCache != null;\r\n var serverCacheNode = serverCacheComplete\r\n ? new CacheNode(serverCache, true, false)\r\n : null;\r\n var writesCache = writeTreeChildWrites(syncTree.pendingWriteTree_, query._path);\r\n var view = syncPointGetView(syncPoint, query, writesCache, serverCacheComplete ? serverCacheNode.getNode() : ChildrenNode.EMPTY_NODE, serverCacheComplete);\r\n return viewGetCompleteNode(view);\r\n}\r\n/**\r\n * A helper method that visits all descendant and ancestor SyncPoints, applying the operation.\r\n *\r\n * NOTES:\r\n * - Descendant SyncPoints will be visited first (since we raise events depth-first).\r\n *\r\n * - We call applyOperation() on each SyncPoint passing three things:\r\n * 1. A version of the Operation that has been made relative to the SyncPoint location.\r\n * 2. A WriteTreeRef of any writes we have cached at the SyncPoint location.\r\n * 3. A snapshot Node with cached server data, if we have it.\r\n *\r\n * - We concatenate all of the events returned by each SyncPoint and return the result.\r\n */\r\nfunction syncTreeApplyOperationToSyncPoints_(syncTree, operation) {\r\n return syncTreeApplyOperationHelper_(operation, syncTree.syncPointTree_, \r\n /*serverCache=*/ null, writeTreeChildWrites(syncTree.pendingWriteTree_, newEmptyPath()));\r\n}\r\n/**\r\n * Recursive helper for applyOperationToSyncPoints_\r\n */\r\nfunction syncTreeApplyOperationHelper_(operation, syncPointTree, serverCache, writesCache) {\r\n if (pathIsEmpty(operation.path)) {\r\n return syncTreeApplyOperationDescendantsHelper_(operation, syncPointTree, serverCache, writesCache);\r\n }\r\n else {\r\n var syncPoint = syncPointTree.get(newEmptyPath());\r\n // If we don't have cached server data, see if we can get it from this SyncPoint.\r\n if (serverCache == null && syncPoint != null) {\r\n serverCache = syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\r\n }\r\n var events = [];\r\n var childName = pathGetFront(operation.path);\r\n var childOperation = operation.operationForChild(childName);\r\n var childTree = syncPointTree.children.get(childName);\r\n if (childTree && childOperation) {\r\n var childServerCache = serverCache\r\n ? serverCache.getImmediateChild(childName)\r\n : null;\r\n var childWritesCache = writeTreeRefChild(writesCache, childName);\r\n events = events.concat(syncTreeApplyOperationHelper_(childOperation, childTree, childServerCache, childWritesCache));\r\n }\r\n if (syncPoint) {\r\n events = events.concat(syncPointApplyOperation(syncPoint, operation, writesCache, serverCache));\r\n }\r\n return events;\r\n }\r\n}\r\n/**\r\n * Recursive helper for applyOperationToSyncPoints_\r\n */\r\nfunction syncTreeApplyOperationDescendantsHelper_(operation, syncPointTree, serverCache, writesCache) {\r\n var syncPoint = syncPointTree.get(newEmptyPath());\r\n // If we don't have cached server data, see if we can get it from this SyncPoint.\r\n if (serverCache == null && syncPoint != null) {\r\n serverCache = syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\r\n }\r\n var events = [];\r\n syncPointTree.children.inorderTraversal(function (childName, childTree) {\r\n var childServerCache = serverCache\r\n ? serverCache.getImmediateChild(childName)\r\n : null;\r\n var childWritesCache = writeTreeRefChild(writesCache, childName);\r\n var childOperation = operation.operationForChild(childName);\r\n if (childOperation) {\r\n events = events.concat(syncTreeApplyOperationDescendantsHelper_(childOperation, childTree, childServerCache, childWritesCache));\r\n }\r\n });\r\n if (syncPoint) {\r\n events = events.concat(syncPointApplyOperation(syncPoint, operation, writesCache, serverCache));\r\n }\r\n return events;\r\n}\r\nfunction syncTreeCreateListenerForView_(syncTree, view) {\r\n var query = view.query;\r\n var tag = syncTreeTagForQuery_(syncTree, query);\r\n return {\r\n hashFn: function () {\r\n var cache = viewGetServerCache(view) || ChildrenNode.EMPTY_NODE;\r\n return cache.hash();\r\n },\r\n onComplete: function (status) {\r\n if (status === 'ok') {\r\n if (tag) {\r\n return syncTreeApplyTaggedListenComplete(syncTree, query._path, tag);\r\n }\r\n else {\r\n return syncTreeApplyListenComplete(syncTree, query._path);\r\n }\r\n }\r\n else {\r\n // If a listen failed, kill all of the listeners here, not just the one that triggered the error.\r\n // Note that this may need to be scoped to just this listener if we change permissions on filtered children\r\n var error = errorForServerCode(status, query);\r\n return syncTreeRemoveEventRegistration(syncTree, query, \r\n /*eventRegistration*/ null, error);\r\n }\r\n }\r\n };\r\n}\r\n/**\r\n * Return the tag associated with the given query.\r\n */\r\nfunction syncTreeTagForQuery_(syncTree, query) {\r\n var queryKey = syncTreeMakeQueryKey_(query);\r\n return syncTree.queryToTagMap.get(queryKey);\r\n}\r\n/**\r\n * Given a query, computes a \"queryKey\" suitable for use in our queryToTagMap_.\r\n */\r\nfunction syncTreeMakeQueryKey_(query) {\r\n return query._path.toString() + '$' + query._queryIdentifier;\r\n}\r\n/**\r\n * Return the query associated with the given tag, if we have one\r\n */\r\nfunction syncTreeQueryKeyForTag_(syncTree, tag) {\r\n return syncTree.tagToQueryMap.get(tag);\r\n}\r\n/**\r\n * Given a queryKey (created by makeQueryKey), parse it back into a path and queryId.\r\n */\r\nfunction syncTreeParseQueryKey_(queryKey) {\r\n var splitIndex = queryKey.indexOf('$');\r\n assert(splitIndex !== -1 && splitIndex < queryKey.length - 1, 'Bad queryKey.');\r\n return {\r\n queryId: queryKey.substr(splitIndex + 1),\r\n path: new Path(queryKey.substr(0, splitIndex))\r\n };\r\n}\r\n/**\r\n * A helper method to apply tagged operations\r\n */\r\nfunction syncTreeApplyTaggedOperation_(syncTree, queryPath, operation) {\r\n var syncPoint = syncTree.syncPointTree_.get(queryPath);\r\n assert(syncPoint, \"Missing sync point for query tag that we're tracking\");\r\n var writesCache = writeTreeChildWrites(syncTree.pendingWriteTree_, queryPath);\r\n return syncPointApplyOperation(syncPoint, operation, writesCache, null);\r\n}\r\n/**\r\n * This collapses multiple unfiltered views into a single view, since we only need a single\r\n * listener for them.\r\n */\r\nfunction syncTreeCollectDistinctViewsForSubTree_(subtree) {\r\n return subtree.fold(function (relativePath, maybeChildSyncPoint, childMap) {\r\n if (maybeChildSyncPoint && syncPointHasCompleteView(maybeChildSyncPoint)) {\r\n var completeView = syncPointGetCompleteView(maybeChildSyncPoint);\r\n return [completeView];\r\n }\r\n else {\r\n // No complete view here, flatten any deeper listens into an array\r\n var views_1 = [];\r\n if (maybeChildSyncPoint) {\r\n views_1 = syncPointGetQueryViews(maybeChildSyncPoint);\r\n }\r\n each(childMap, function (_key, childViews) {\r\n views_1 = views_1.concat(childViews);\r\n });\r\n return views_1;\r\n }\r\n });\r\n}\r\n/**\r\n * Normalizes a query to a query we send the server for listening\r\n *\r\n * @returns The normalized query\r\n */\r\nfunction syncTreeQueryForListening_(query) {\r\n if (query._queryParams.loadsAllData() && !query._queryParams.isDefault()) {\r\n // We treat queries that load all data as default queries\r\n // Cast is necessary because ref() technically returns Firebase which is actually fb.api.Firebase which inherits\r\n // from Query\r\n return new (syncTreeGetReferenceConstructor())(query._repo, query._path);\r\n }\r\n else {\r\n return query;\r\n }\r\n}\r\nfunction syncTreeRemoveTags_(syncTree, queries) {\r\n for (var j = 0; j < queries.length; ++j) {\r\n var removedQuery = queries[j];\r\n if (!removedQuery._queryParams.loadsAllData()) {\r\n // We should have a tag for this\r\n var removedQueryKey = syncTreeMakeQueryKey_(removedQuery);\r\n var removedQueryTag = syncTree.queryToTagMap.get(removedQueryKey);\r\n syncTree.queryToTagMap.delete(removedQueryKey);\r\n syncTree.tagToQueryMap.delete(removedQueryTag);\r\n }\r\n }\r\n}\r\n/**\r\n * Static accessor for query tags.\r\n */\r\nfunction syncTreeGetNextQueryTag_() {\r\n return syncTreeNextQueryTag_++;\r\n}\r\n/**\r\n * For a given new listen, manage the de-duplication of outstanding subscriptions.\r\n *\r\n * @returns This method can return events to support synchronous data sources\r\n */\r\nfunction syncTreeSetupListener_(syncTree, query, view) {\r\n var path = query._path;\r\n var tag = syncTreeTagForQuery_(syncTree, query);\r\n var listener = syncTreeCreateListenerForView_(syncTree, view);\r\n var events = syncTree.listenProvider_.startListening(syncTreeQueryForListening_(query), tag, listener.hashFn, listener.onComplete);\r\n var subtree = syncTree.syncPointTree_.subtree(path);\r\n // The root of this subtree has our query. We're here because we definitely need to send a listen for that, but we\r\n // may need to shadow other listens as well.\r\n if (tag) {\r\n assert(!syncPointHasCompleteView(subtree.value), \"If we're adding a query, it shouldn't be shadowed\");\r\n }\r\n else {\r\n // Shadow everything at or below this location, this is a default listener.\r\n var queriesToStop = subtree.fold(function (relativePath, maybeChildSyncPoint, childMap) {\r\n if (!pathIsEmpty(relativePath) &&\r\n maybeChildSyncPoint &&\r\n syncPointHasCompleteView(maybeChildSyncPoint)) {\r\n return [syncPointGetCompleteView(maybeChildSyncPoint).query];\r\n }\r\n else {\r\n // No default listener here, flatten any deeper queries into an array\r\n var queries_1 = [];\r\n if (maybeChildSyncPoint) {\r\n queries_1 = queries_1.concat(syncPointGetQueryViews(maybeChildSyncPoint).map(function (view) { return view.query; }));\r\n }\r\n each(childMap, function (_key, childQueries) {\r\n queries_1 = queries_1.concat(childQueries);\r\n });\r\n return queries_1;\r\n }\r\n });\r\n for (var i = 0; i < queriesToStop.length; ++i) {\r\n var queryToStop = queriesToStop[i];\r\n syncTree.listenProvider_.stopListening(syncTreeQueryForListening_(queryToStop), syncTreeTagForQuery_(syncTree, queryToStop));\r\n }\r\n }\r\n return events;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar ExistingValueProvider = /** @class */ (function () {\r\n function ExistingValueProvider(node_) {\r\n this.node_ = node_;\r\n }\r\n ExistingValueProvider.prototype.getImmediateChild = function (childName) {\r\n var child = this.node_.getImmediateChild(childName);\r\n return new ExistingValueProvider(child);\r\n };\r\n ExistingValueProvider.prototype.node = function () {\r\n return this.node_;\r\n };\r\n return ExistingValueProvider;\r\n}());\r\nvar DeferredValueProvider = /** @class */ (function () {\r\n function DeferredValueProvider(syncTree, path) {\r\n this.syncTree_ = syncTree;\r\n this.path_ = path;\r\n }\r\n DeferredValueProvider.prototype.getImmediateChild = function (childName) {\r\n var childPath = pathChild(this.path_, childName);\r\n return new DeferredValueProvider(this.syncTree_, childPath);\r\n };\r\n DeferredValueProvider.prototype.node = function () {\r\n return syncTreeCalcCompleteEventCache(this.syncTree_, this.path_);\r\n };\r\n return DeferredValueProvider;\r\n}());\r\n/**\r\n * Generate placeholders for deferred values.\r\n */\r\nvar generateWithValues = function (values) {\r\n values = values || {};\r\n values['timestamp'] = values['timestamp'] || new Date().getTime();\r\n return values;\r\n};\r\n/**\r\n * Value to use when firing local events. When writing server values, fire\r\n * local events with an approximate value, otherwise return value as-is.\r\n */\r\nvar resolveDeferredLeafValue = function (value, existingVal, serverValues) {\r\n if (!value || typeof value !== 'object') {\r\n return value;\r\n }\r\n assert('.sv' in value, 'Unexpected leaf node or priority contents');\r\n if (typeof value['.sv'] === 'string') {\r\n return resolveScalarDeferredValue(value['.sv'], existingVal, serverValues);\r\n }\r\n else if (typeof value['.sv'] === 'object') {\r\n return resolveComplexDeferredValue(value['.sv'], existingVal);\r\n }\r\n else {\r\n assert(false, 'Unexpected server value: ' + JSON.stringify(value, null, 2));\r\n }\r\n};\r\nvar resolveScalarDeferredValue = function (op, existing, serverValues) {\r\n switch (op) {\r\n case 'timestamp':\r\n return serverValues['timestamp'];\r\n default:\r\n assert(false, 'Unexpected server value: ' + op);\r\n }\r\n};\r\nvar resolveComplexDeferredValue = function (op, existing, unused) {\r\n if (!op.hasOwnProperty('increment')) {\r\n assert(false, 'Unexpected server value: ' + JSON.stringify(op, null, 2));\r\n }\r\n var delta = op['increment'];\r\n if (typeof delta !== 'number') {\r\n assert(false, 'Unexpected increment value: ' + delta);\r\n }\r\n var existingNode = existing.node();\r\n assert(existingNode !== null && typeof existingNode !== 'undefined', 'Expected ChildrenNode.EMPTY_NODE for nulls');\r\n // Incrementing a non-number sets the value to the incremented amount\r\n if (!existingNode.isLeafNode()) {\r\n return delta;\r\n }\r\n var leaf = existingNode;\r\n var existingVal = leaf.getValue();\r\n if (typeof existingVal !== 'number') {\r\n return delta;\r\n }\r\n // No need to do over/underflow arithmetic here because JS only handles floats under the covers\r\n return existingVal + delta;\r\n};\r\n/**\r\n * Recursively replace all deferred values and priorities in the tree with the\r\n * specified generated replacement values.\r\n * @param path - path to which write is relative\r\n * @param node - new data written at path\r\n * @param syncTree - current data\r\n */\r\nvar resolveDeferredValueTree = function (path, node, syncTree, serverValues) {\r\n return resolveDeferredValue(node, new DeferredValueProvider(syncTree, path), serverValues);\r\n};\r\n/**\r\n * Recursively replace all deferred values and priorities in the node with the\r\n * specified generated replacement values. If there are no server values in the node,\r\n * it'll be returned as-is.\r\n */\r\nvar resolveDeferredValueSnapshot = function (node, existing, serverValues) {\r\n return resolveDeferredValue(node, new ExistingValueProvider(existing), serverValues);\r\n};\r\nfunction resolveDeferredValue(node, existingVal, serverValues) {\r\n var rawPri = node.getPriority().val();\r\n var priority = resolveDeferredLeafValue(rawPri, existingVal.getImmediateChild('.priority'), serverValues);\r\n var newNode;\r\n if (node.isLeafNode()) {\r\n var leafNode = node;\r\n var value = resolveDeferredLeafValue(leafNode.getValue(), existingVal, serverValues);\r\n if (value !== leafNode.getValue() ||\r\n priority !== leafNode.getPriority().val()) {\r\n return new LeafNode(value, nodeFromJSON(priority));\r\n }\r\n else {\r\n return node;\r\n }\r\n }\r\n else {\r\n var childrenNode = node;\r\n newNode = childrenNode;\r\n if (priority !== childrenNode.getPriority().val()) {\r\n newNode = newNode.updatePriority(new LeafNode(priority));\r\n }\r\n childrenNode.forEachChild(PRIORITY_INDEX, function (childName, childNode) {\r\n var newChildNode = resolveDeferredValue(childNode, existingVal.getImmediateChild(childName), serverValues);\r\n if (newChildNode !== childNode) {\r\n newNode = newNode.updateImmediateChild(childName, newChildNode);\r\n }\r\n });\r\n return newNode;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A light-weight tree, traversable by path. Nodes can have both values and children.\r\n * Nodes are not enumerated (by forEachChild) unless they have a value or non-empty\r\n * children.\r\n */\r\nvar Tree = /** @class */ (function () {\r\n /**\r\n * @param name - Optional name of the node.\r\n * @param parent - Optional parent node.\r\n * @param node - Optional node to wrap.\r\n */\r\n function Tree(name, parent, node) {\r\n if (name === void 0) { name = ''; }\r\n if (parent === void 0) { parent = null; }\r\n if (node === void 0) { node = { children: {}, childCount: 0 }; }\r\n this.name = name;\r\n this.parent = parent;\r\n this.node = node;\r\n }\r\n return Tree;\r\n}());\r\n/**\r\n * Returns a sub-Tree for the given path.\r\n *\r\n * @param pathObj - Path to look up.\r\n * @returns Tree for path.\r\n */\r\nfunction treeSubTree(tree, pathObj) {\r\n // TODO: Require pathObj to be Path?\r\n var path = pathObj instanceof Path ? pathObj : new Path(pathObj);\r\n var child = tree, next = pathGetFront(path);\r\n while (next !== null) {\r\n var childNode = safeGet(child.node.children, next) || {\r\n children: {},\r\n childCount: 0\r\n };\r\n child = new Tree(next, child, childNode);\r\n path = pathPopFront(path);\r\n next = pathGetFront(path);\r\n }\r\n return child;\r\n}\r\n/**\r\n * Returns the data associated with this tree node.\r\n *\r\n * @returns The data or null if no data exists.\r\n */\r\nfunction treeGetValue(tree) {\r\n return tree.node.value;\r\n}\r\n/**\r\n * Sets data to this tree node.\r\n *\r\n * @param value - Value to set.\r\n */\r\nfunction treeSetValue(tree, value) {\r\n tree.node.value = value;\r\n treeUpdateParents(tree);\r\n}\r\n/**\r\n * @returns Whether the tree has any children.\r\n */\r\nfunction treeHasChildren(tree) {\r\n return tree.node.childCount > 0;\r\n}\r\n/**\r\n * @returns Whethe rthe tree is empty (no value or children).\r\n */\r\nfunction treeIsEmpty(tree) {\r\n return treeGetValue(tree) === undefined && !treeHasChildren(tree);\r\n}\r\n/**\r\n * Calls action for each child of this tree node.\r\n *\r\n * @param action - Action to be called for each child.\r\n */\r\nfunction treeForEachChild(tree, action) {\r\n each(tree.node.children, function (child, childTree) {\r\n action(new Tree(child, tree, childTree));\r\n });\r\n}\r\n/**\r\n * Does a depth-first traversal of this node's descendants, calling action for each one.\r\n *\r\n * @param action - Action to be called for each child.\r\n * @param includeSelf - Whether to call action on this node as well. Defaults to\r\n * false.\r\n * @param childrenFirst - Whether to call action on children before calling it on\r\n * parent.\r\n */\r\nfunction treeForEachDescendant(tree, action, includeSelf, childrenFirst) {\r\n if (includeSelf && !childrenFirst) {\r\n action(tree);\r\n }\r\n treeForEachChild(tree, function (child) {\r\n treeForEachDescendant(child, action, true, childrenFirst);\r\n });\r\n if (includeSelf && childrenFirst) {\r\n action(tree);\r\n }\r\n}\r\n/**\r\n * Calls action on each ancestor node.\r\n *\r\n * @param action - Action to be called on each parent; return\r\n * true to abort.\r\n * @param includeSelf - Whether to call action on this node as well.\r\n * @returns true if the action callback returned true.\r\n */\r\nfunction treeForEachAncestor(tree, action, includeSelf) {\r\n var node = includeSelf ? tree : tree.parent;\r\n while (node !== null) {\r\n if (action(node)) {\r\n return true;\r\n }\r\n node = node.parent;\r\n }\r\n return false;\r\n}\r\n/**\r\n * @returns The path of this tree node, as a Path.\r\n */\r\nfunction treeGetPath(tree) {\r\n return new Path(tree.parent === null\r\n ? tree.name\r\n : treeGetPath(tree.parent) + '/' + tree.name);\r\n}\r\n/**\r\n * Adds or removes this child from its parent based on whether it's empty or not.\r\n */\r\nfunction treeUpdateParents(tree) {\r\n if (tree.parent !== null) {\r\n treeUpdateChild(tree.parent, tree.name, tree);\r\n }\r\n}\r\n/**\r\n * Adds or removes the passed child to this tree node, depending on whether it's empty.\r\n *\r\n * @param childName - The name of the child to update.\r\n * @param child - The child to update.\r\n */\r\nfunction treeUpdateChild(tree, childName, child) {\r\n var childEmpty = treeIsEmpty(child);\r\n var childExists = contains(tree.node.children, childName);\r\n if (childEmpty && childExists) {\r\n delete tree.node.children[childName];\r\n tree.node.childCount--;\r\n treeUpdateParents(tree);\r\n }\r\n else if (!childEmpty && !childExists) {\r\n tree.node.children[childName] = child.node;\r\n tree.node.childCount++;\r\n treeUpdateParents(tree);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * True for invalid Firebase keys\r\n */\r\nvar INVALID_KEY_REGEX_ = /[\\[\\].#$\\/\\u0000-\\u001F\\u007F]/;\r\n/**\r\n * True for invalid Firebase paths.\r\n * Allows '/' in paths.\r\n */\r\nvar INVALID_PATH_REGEX_ = /[\\[\\].#$\\u0000-\\u001F\\u007F]/;\r\n/**\r\n * Maximum number of characters to allow in leaf value\r\n */\r\nvar MAX_LEAF_SIZE_ = 10 * 1024 * 1024;\r\nvar isValidKey = function (key) {\r\n return (typeof key === 'string' && key.length !== 0 && !INVALID_KEY_REGEX_.test(key));\r\n};\r\nvar isValidPathString = function (pathString) {\r\n return (typeof pathString === 'string' &&\r\n pathString.length !== 0 &&\r\n !INVALID_PATH_REGEX_.test(pathString));\r\n};\r\nvar isValidRootPathString = function (pathString) {\r\n if (pathString) {\r\n // Allow '/.info/' at the beginning.\r\n pathString = pathString.replace(/^\\/*\\.info(\\/|$)/, '/');\r\n }\r\n return isValidPathString(pathString);\r\n};\r\nvar isValidPriority = function (priority) {\r\n return (priority === null ||\r\n typeof priority === 'string' ||\r\n (typeof priority === 'number' && !isInvalidJSONNumber(priority)) ||\r\n (priority &&\r\n typeof priority === 'object' &&\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n contains(priority, '.sv')));\r\n};\r\n/**\r\n * Pre-validate a datum passed as an argument to Firebase function.\r\n */\r\nvar validateFirebaseDataArg = function (fnName, value, path, optional) {\r\n if (optional && value === undefined) {\r\n return;\r\n }\r\n validateFirebaseData(errorPrefix(fnName, 'value'), value, path);\r\n};\r\n/**\r\n * Validate a data object client-side before sending to server.\r\n */\r\nvar validateFirebaseData = function (errorPrefix, data, path_) {\r\n var path = path_ instanceof Path ? new ValidationPath(path_, errorPrefix) : path_;\r\n if (data === undefined) {\r\n throw new Error(errorPrefix + 'contains undefined ' + validationPathToErrorString(path));\r\n }\r\n if (typeof data === 'function') {\r\n throw new Error(errorPrefix +\r\n 'contains a function ' +\r\n validationPathToErrorString(path) +\r\n ' with contents = ' +\r\n data.toString());\r\n }\r\n if (isInvalidJSONNumber(data)) {\r\n throw new Error(errorPrefix +\r\n 'contains ' +\r\n data.toString() +\r\n ' ' +\r\n validationPathToErrorString(path));\r\n }\r\n // Check max leaf size, but try to avoid the utf8 conversion if we can.\r\n if (typeof data === 'string' &&\r\n data.length > MAX_LEAF_SIZE_ / 3 &&\r\n stringLength(data) > MAX_LEAF_SIZE_) {\r\n throw new Error(errorPrefix +\r\n 'contains a string greater than ' +\r\n MAX_LEAF_SIZE_ +\r\n ' utf8 bytes ' +\r\n validationPathToErrorString(path) +\r\n \" ('\" +\r\n data.substring(0, 50) +\r\n \"...')\");\r\n }\r\n // TODO = Perf = Consider combining the recursive validation of keys into NodeFromJSON\r\n // to save extra walking of large objects.\r\n if (data && typeof data === 'object') {\r\n var hasDotValue_1 = false;\r\n var hasActualChild_1 = false;\r\n each(data, function (key, value) {\r\n if (key === '.value') {\r\n hasDotValue_1 = true;\r\n }\r\n else if (key !== '.priority' && key !== '.sv') {\r\n hasActualChild_1 = true;\r\n if (!isValidKey(key)) {\r\n throw new Error(errorPrefix +\r\n ' contains an invalid key (' +\r\n key +\r\n ') ' +\r\n validationPathToErrorString(path) +\r\n '. Keys must be non-empty strings ' +\r\n 'and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"');\r\n }\r\n }\r\n validationPathPush(path, key);\r\n validateFirebaseData(errorPrefix, value, path);\r\n validationPathPop(path);\r\n });\r\n if (hasDotValue_1 && hasActualChild_1) {\r\n throw new Error(errorPrefix +\r\n ' contains \".value\" child ' +\r\n validationPathToErrorString(path) +\r\n ' in addition to actual children.');\r\n }\r\n }\r\n};\r\n/**\r\n * Pre-validate paths passed in the firebase function.\r\n */\r\nvar validateFirebaseMergePaths = function (errorPrefix, mergePaths) {\r\n var i, curPath;\r\n for (i = 0; i < mergePaths.length; i++) {\r\n curPath = mergePaths[i];\r\n var keys = pathSlice(curPath);\r\n for (var j = 0; j < keys.length; j++) {\r\n if (keys[j] === '.priority' && j === keys.length - 1) ;\r\n else if (!isValidKey(keys[j])) {\r\n throw new Error(errorPrefix +\r\n 'contains an invalid key (' +\r\n keys[j] +\r\n ') in path ' +\r\n curPath.toString() +\r\n '. Keys must be non-empty strings ' +\r\n 'and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"');\r\n }\r\n }\r\n }\r\n // Check that update keys are not descendants of each other.\r\n // We rely on the property that sorting guarantees that ancestors come\r\n // right before descendants.\r\n mergePaths.sort(pathCompare);\r\n var prevPath = null;\r\n for (i = 0; i < mergePaths.length; i++) {\r\n curPath = mergePaths[i];\r\n if (prevPath !== null && pathContains(prevPath, curPath)) {\r\n throw new Error(errorPrefix +\r\n 'contains a path ' +\r\n prevPath.toString() +\r\n ' that is ancestor of another path ' +\r\n curPath.toString());\r\n }\r\n prevPath = curPath;\r\n }\r\n};\r\n/**\r\n * pre-validate an object passed as an argument to firebase function (\r\n * must be an object - e.g. for firebase.update()).\r\n */\r\nvar validateFirebaseMergeDataArg = function (fnName, data, path, optional) {\r\n if (optional && data === undefined) {\r\n return;\r\n }\r\n var errorPrefix$1 = errorPrefix(fnName, 'values');\r\n if (!(data && typeof data === 'object') || Array.isArray(data)) {\r\n throw new Error(errorPrefix$1 + ' must be an object containing the children to replace.');\r\n }\r\n var mergePaths = [];\r\n each(data, function (key, value) {\r\n var curPath = new Path(key);\r\n validateFirebaseData(errorPrefix$1, value, pathChild(path, curPath));\r\n if (pathGetBack(curPath) === '.priority') {\r\n if (!isValidPriority(value)) {\r\n throw new Error(errorPrefix$1 +\r\n \"contains an invalid value for '\" +\r\n curPath.toString() +\r\n \"', which must be a valid \" +\r\n 'Firebase priority (a string, finite number, server value, or null).');\r\n }\r\n }\r\n mergePaths.push(curPath);\r\n });\r\n validateFirebaseMergePaths(errorPrefix$1, mergePaths);\r\n};\r\nvar validatePriority = function (fnName, priority, optional) {\r\n if (optional && priority === undefined) {\r\n return;\r\n }\r\n if (isInvalidJSONNumber(priority)) {\r\n throw new Error(errorPrefix(fnName, 'priority') +\r\n 'is ' +\r\n priority.toString() +\r\n ', but must be a valid Firebase priority (a string, finite number, ' +\r\n 'server value, or null).');\r\n }\r\n // Special case to allow importing data with a .sv.\r\n if (!isValidPriority(priority)) {\r\n throw new Error(errorPrefix(fnName, 'priority') +\r\n 'must be a valid Firebase priority ' +\r\n '(a string, finite number, server value, or null).');\r\n }\r\n};\r\nvar validateEventType = function (fnName, eventType, optional) {\r\n if (optional && eventType === undefined) {\r\n return;\r\n }\r\n switch (eventType) {\r\n case 'value':\r\n case 'child_added':\r\n case 'child_removed':\r\n case 'child_changed':\r\n case 'child_moved':\r\n break;\r\n default:\r\n throw new Error(errorPrefix(fnName, 'eventType') +\r\n 'must be a valid event type = \"value\", \"child_added\", \"child_removed\", ' +\r\n '\"child_changed\", or \"child_moved\".');\r\n }\r\n};\r\nvar validateKey = function (fnName, argumentName, key, optional) {\r\n if (optional && key === undefined) {\r\n return;\r\n }\r\n if (!isValidKey(key)) {\r\n throw new Error(errorPrefix(fnName, argumentName) +\r\n 'was an invalid key = \"' +\r\n key +\r\n '\". Firebase keys must be non-empty strings and ' +\r\n 'can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\").');\r\n }\r\n};\r\nvar validatePathString = function (fnName, argumentName, pathString, optional) {\r\n if (optional && pathString === undefined) {\r\n return;\r\n }\r\n if (!isValidPathString(pathString)) {\r\n throw new Error(errorPrefix(fnName, argumentName) +\r\n 'was an invalid path = \"' +\r\n pathString +\r\n '\". Paths must be non-empty strings and ' +\r\n 'can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\"');\r\n }\r\n};\r\nvar validateRootPathString = function (fnName, argumentName, pathString, optional) {\r\n if (pathString) {\r\n // Allow '/.info/' at the beginning.\r\n pathString = pathString.replace(/^\\/*\\.info(\\/|$)/, '/');\r\n }\r\n validatePathString(fnName, argumentName, pathString, optional);\r\n};\r\nvar validateWritablePath = function (fnName, path) {\r\n if (pathGetFront(path) === '.info') {\r\n throw new Error(fnName + \" failed = Can't modify data under /.info/\");\r\n }\r\n};\r\nvar validateUrl = function (fnName, parsedUrl) {\r\n // TODO = Validate server better.\r\n var pathString = parsedUrl.path.toString();\r\n if (!(typeof parsedUrl.repoInfo.host === 'string') ||\r\n parsedUrl.repoInfo.host.length === 0 ||\r\n (!isValidKey(parsedUrl.repoInfo.namespace) &&\r\n parsedUrl.repoInfo.host.split(':')[0] !== 'localhost') ||\r\n (pathString.length !== 0 && !isValidRootPathString(pathString))) {\r\n throw new Error(errorPrefix(fnName, 'url') +\r\n 'must be a valid firebase URL and ' +\r\n 'the path can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\".');\r\n }\r\n};\r\nvar validateBoolean = function (fnName, argumentName, bool, optional) {\r\n if (optional && bool === undefined) {\r\n return;\r\n }\r\n if (typeof bool !== 'boolean') {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a boolean.');\r\n }\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The event queue serves a few purposes:\r\n * 1. It ensures we maintain event order in the face of event callbacks doing operations that result in more\r\n * events being queued.\r\n * 2. raiseQueuedEvents() handles being called reentrantly nicely. That is, if in the course of raising events,\r\n * raiseQueuedEvents() is called again, the \"inner\" call will pick up raising events where the \"outer\" call\r\n * left off, ensuring that the events are still raised synchronously and in order.\r\n * 3. You can use raiseEventsAtPath and raiseEventsForChangedPath to ensure only relevant previously-queued\r\n * events are raised synchronously.\r\n *\r\n * NOTE: This can all go away if/when we move to async events.\r\n *\r\n */\r\nvar EventQueue = /** @class */ (function () {\r\n function EventQueue() {\r\n this.eventLists_ = [];\r\n /**\r\n * Tracks recursion depth of raiseQueuedEvents_, for debugging purposes.\r\n */\r\n this.recursionDepth_ = 0;\r\n }\r\n return EventQueue;\r\n}());\r\n/**\r\n * @param eventDataList - The new events to queue.\r\n */\r\nfunction eventQueueQueueEvents(eventQueue, eventDataList) {\r\n // We group events by path, storing them in a single EventList, to make it easier to skip over them quickly.\r\n var currList = null;\r\n for (var i = 0; i < eventDataList.length; i++) {\r\n var data = eventDataList[i];\r\n var path = data.getPath();\r\n if (currList !== null && !pathEquals(path, currList.path)) {\r\n eventQueue.eventLists_.push(currList);\r\n currList = null;\r\n }\r\n if (currList === null) {\r\n currList = { events: [], path: path };\r\n }\r\n currList.events.push(data);\r\n }\r\n if (currList) {\r\n eventQueue.eventLists_.push(currList);\r\n }\r\n}\r\n/**\r\n * Queues the specified events and synchronously raises all events (including previously queued ones)\r\n * for the specified path.\r\n *\r\n * It is assumed that the new events are all for the specified path.\r\n *\r\n * @param path - The path to raise events for.\r\n * @param eventDataList - The new events to raise.\r\n */\r\nfunction eventQueueRaiseEventsAtPath(eventQueue, path, eventDataList) {\r\n eventQueueQueueEvents(eventQueue, eventDataList);\r\n eventQueueRaiseQueuedEventsMatchingPredicate(eventQueue, function (eventPath) {\r\n return pathEquals(eventPath, path);\r\n });\r\n}\r\n/**\r\n * Queues the specified events and synchronously raises all events (including previously queued ones) for\r\n * locations related to the specified change path (i.e. all ancestors and descendants).\r\n *\r\n * It is assumed that the new events are all related (ancestor or descendant) to the specified path.\r\n *\r\n * @param changedPath - The path to raise events for.\r\n * @param eventDataList - The events to raise\r\n */\r\nfunction eventQueueRaiseEventsForChangedPath(eventQueue, changedPath, eventDataList) {\r\n eventQueueQueueEvents(eventQueue, eventDataList);\r\n eventQueueRaiseQueuedEventsMatchingPredicate(eventQueue, function (eventPath) {\r\n return pathContains(eventPath, changedPath) ||\r\n pathContains(changedPath, eventPath);\r\n });\r\n}\r\nfunction eventQueueRaiseQueuedEventsMatchingPredicate(eventQueue, predicate) {\r\n eventQueue.recursionDepth_++;\r\n var sentAll = true;\r\n for (var i = 0; i < eventQueue.eventLists_.length; i++) {\r\n var eventList = eventQueue.eventLists_[i];\r\n if (eventList) {\r\n var eventPath = eventList.path;\r\n if (predicate(eventPath)) {\r\n eventListRaise(eventQueue.eventLists_[i]);\r\n eventQueue.eventLists_[i] = null;\r\n }\r\n else {\r\n sentAll = false;\r\n }\r\n }\r\n }\r\n if (sentAll) {\r\n eventQueue.eventLists_ = [];\r\n }\r\n eventQueue.recursionDepth_--;\r\n}\r\n/**\r\n * Iterates through the list and raises each event\r\n */\r\nfunction eventListRaise(eventList) {\r\n for (var i = 0; i < eventList.events.length; i++) {\r\n var eventData = eventList.events[i];\r\n if (eventData !== null) {\r\n eventList.events[i] = null;\r\n var eventFn = eventData.getEventRunner();\r\n if (logger) {\r\n log('event: ' + eventData.toString());\r\n }\r\n exceptionGuard(eventFn);\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar INTERRUPT_REASON = 'repo_interrupt';\r\n/**\r\n * If a transaction does not succeed after 25 retries, we abort it. Among other\r\n * things this ensure that if there's ever a bug causing a mismatch between\r\n * client / server hashes for some data, we won't retry indefinitely.\r\n */\r\nvar MAX_TRANSACTION_RETRIES = 25;\r\n/**\r\n * A connection to a single data repository.\r\n */\r\nvar Repo = /** @class */ (function () {\r\n function Repo(repoInfo_, forceRestClient_, authTokenProvider_, appCheckProvider_) {\r\n this.repoInfo_ = repoInfo_;\r\n this.forceRestClient_ = forceRestClient_;\r\n this.authTokenProvider_ = authTokenProvider_;\r\n this.appCheckProvider_ = appCheckProvider_;\r\n this.dataUpdateCount = 0;\r\n this.statsListener_ = null;\r\n this.eventQueue_ = new EventQueue();\r\n this.nextWriteId_ = 1;\r\n this.interceptServerDataCallback_ = null;\r\n /** A list of data pieces and paths to be set when this client disconnects. */\r\n this.onDisconnect_ = newSparseSnapshotTree();\r\n /** Stores queues of outstanding transactions for Firebase locations. */\r\n this.transactionQueueTree_ = new Tree();\r\n // TODO: This should be @private but it's used by test_access.js and internal.js\r\n this.persistentConnection_ = null;\r\n // This key is intentionally not updated if RepoInfo is later changed or replaced\r\n this.key = this.repoInfo_.toURLString();\r\n }\r\n /**\r\n * @returns The URL corresponding to the root of this Firebase.\r\n */\r\n Repo.prototype.toString = function () {\r\n return ((this.repoInfo_.secure ? 'https://' : 'http://') + this.repoInfo_.host);\r\n };\r\n return Repo;\r\n}());\r\nfunction repoStart(repo, appId, authOverride) {\r\n repo.stats_ = statsManagerGetCollection(repo.repoInfo_);\r\n if (repo.forceRestClient_ || beingCrawled()) {\r\n repo.server_ = new ReadonlyRestClient(repo.repoInfo_, function (pathString, data, isMerge, tag) {\r\n repoOnDataUpdate(repo, pathString, data, isMerge, tag);\r\n }, repo.authTokenProvider_, repo.appCheckProvider_);\r\n // Minor hack: Fire onConnect immediately, since there's no actual connection.\r\n setTimeout(function () { return repoOnConnectStatus(repo, /* connectStatus= */ true); }, 0);\r\n }\r\n else {\r\n // Validate authOverride\r\n if (typeof authOverride !== 'undefined' && authOverride !== null) {\r\n if (typeof authOverride !== 'object') {\r\n throw new Error('Only objects are supported for option databaseAuthVariableOverride');\r\n }\r\n try {\r\n stringify(authOverride);\r\n }\r\n catch (e) {\r\n throw new Error('Invalid authOverride provided: ' + e);\r\n }\r\n }\r\n repo.persistentConnection_ = new PersistentConnection(repo.repoInfo_, appId, function (pathString, data, isMerge, tag) {\r\n repoOnDataUpdate(repo, pathString, data, isMerge, tag);\r\n }, function (connectStatus) {\r\n repoOnConnectStatus(repo, connectStatus);\r\n }, function (updates) {\r\n repoOnServerInfoUpdate(repo, updates);\r\n }, repo.authTokenProvider_, repo.appCheckProvider_, authOverride);\r\n repo.server_ = repo.persistentConnection_;\r\n }\r\n repo.authTokenProvider_.addTokenChangeListener(function (token) {\r\n repo.server_.refreshAuthToken(token);\r\n });\r\n repo.appCheckProvider_.addTokenChangeListener(function (result) {\r\n repo.server_.refreshAppCheckToken(result.token);\r\n });\r\n // In the case of multiple Repos for the same repoInfo (i.e. there are multiple Firebase.Contexts being used),\r\n // we only want to create one StatsReporter. As such, we'll report stats over the first Repo created.\r\n repo.statsReporter_ = statsManagerGetOrCreateReporter(repo.repoInfo_, function () { return new StatsReporter(repo.stats_, repo.server_); });\r\n // Used for .info.\r\n repo.infoData_ = new SnapshotHolder();\r\n repo.infoSyncTree_ = new SyncTree({\r\n startListening: function (query, tag, currentHashFn, onComplete) {\r\n var infoEvents = [];\r\n var node = repo.infoData_.getNode(query._path);\r\n // This is possibly a hack, but we have different semantics for .info endpoints. We don't raise null events\r\n // on initial data...\r\n if (!node.isEmpty()) {\r\n infoEvents = syncTreeApplyServerOverwrite(repo.infoSyncTree_, query._path, node);\r\n setTimeout(function () {\r\n onComplete('ok');\r\n }, 0);\r\n }\r\n return infoEvents;\r\n },\r\n stopListening: function () { }\r\n });\r\n repoUpdateInfo(repo, 'connected', false);\r\n repo.serverSyncTree_ = new SyncTree({\r\n startListening: function (query, tag, currentHashFn, onComplete) {\r\n repo.server_.listen(query, currentHashFn, tag, function (status, data) {\r\n var events = onComplete(status, data);\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, query._path, events);\r\n });\r\n // No synchronous events for network-backed sync trees\r\n return [];\r\n },\r\n stopListening: function (query, tag) {\r\n repo.server_.unlisten(query, tag);\r\n }\r\n });\r\n}\r\n/**\r\n * @returns The time in milliseconds, taking the server offset into account if we have one.\r\n */\r\nfunction repoServerTime(repo) {\r\n var offsetNode = repo.infoData_.getNode(new Path('.info/serverTimeOffset'));\r\n var offset = offsetNode.val() || 0;\r\n return new Date().getTime() + offset;\r\n}\r\n/**\r\n * Generate ServerValues using some variables from the repo object.\r\n */\r\nfunction repoGenerateServerValues(repo) {\r\n return generateWithValues({\r\n timestamp: repoServerTime(repo)\r\n });\r\n}\r\n/**\r\n * Called by realtime when we get new messages from the server.\r\n */\r\nfunction repoOnDataUpdate(repo, pathString, data, isMerge, tag) {\r\n // For testing.\r\n repo.dataUpdateCount++;\r\n var path = new Path(pathString);\r\n data = repo.interceptServerDataCallback_\r\n ? repo.interceptServerDataCallback_(pathString, data)\r\n : data;\r\n var events = [];\r\n if (tag) {\r\n if (isMerge) {\r\n var taggedChildren = map(data, function (raw) { return nodeFromJSON(raw); });\r\n events = syncTreeApplyTaggedQueryMerge(repo.serverSyncTree_, path, taggedChildren, tag);\r\n }\r\n else {\r\n var taggedSnap = nodeFromJSON(data);\r\n events = syncTreeApplyTaggedQueryOverwrite(repo.serverSyncTree_, path, taggedSnap, tag);\r\n }\r\n }\r\n else if (isMerge) {\r\n var changedChildren = map(data, function (raw) { return nodeFromJSON(raw); });\r\n events = syncTreeApplyServerMerge(repo.serverSyncTree_, path, changedChildren);\r\n }\r\n else {\r\n var snap = nodeFromJSON(data);\r\n events = syncTreeApplyServerOverwrite(repo.serverSyncTree_, path, snap);\r\n }\r\n var affectedPath = path;\r\n if (events.length > 0) {\r\n // Since we have a listener outstanding for each transaction, receiving any events\r\n // is a proxy for some change having occurred.\r\n affectedPath = repoRerunTransactions(repo, path);\r\n }\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, events);\r\n}\r\n// TODO: This should be @private but it's used by test_access.js and internal.js\r\nfunction repoInterceptServerData(repo, callback) {\r\n repo.interceptServerDataCallback_ = callback;\r\n}\r\nfunction repoOnConnectStatus(repo, connectStatus) {\r\n repoUpdateInfo(repo, 'connected', connectStatus);\r\n if (connectStatus === false) {\r\n repoRunOnDisconnectEvents(repo);\r\n }\r\n}\r\nfunction repoOnServerInfoUpdate(repo, updates) {\r\n each(updates, function (key, value) {\r\n repoUpdateInfo(repo, key, value);\r\n });\r\n}\r\nfunction repoUpdateInfo(repo, pathString, value) {\r\n var path = new Path('/.info/' + pathString);\r\n var newNode = nodeFromJSON(value);\r\n repo.infoData_.updateSnapshot(path, newNode);\r\n var events = syncTreeApplyServerOverwrite(repo.infoSyncTree_, path, newNode);\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\r\n}\r\nfunction repoGetNextWriteId(repo) {\r\n return repo.nextWriteId_++;\r\n}\r\n/**\r\n * The purpose of `getValue` is to return the latest known value\r\n * satisfying `query`.\r\n *\r\n * This method will first check for in-memory cached values\r\n * belonging to active listeners. If they are found, such values\r\n * are considered to be the most up-to-date.\r\n *\r\n * If the client is not connected, this method will try to\r\n * establish a connection and request the value for `query`. If\r\n * the client is not able to retrieve the query result, it reports\r\n * an error.\r\n *\r\n * @param query - The query to surface a value for.\r\n */\r\nfunction repoGetValue(repo, query) {\r\n // Only active queries are cached. There is no persisted cache.\r\n var cached = syncTreeGetServerValue(repo.serverSyncTree_, query);\r\n if (cached != null) {\r\n return Promise.resolve(cached);\r\n }\r\n return repo.server_.get(query).then(function (payload) {\r\n var node = nodeFromJSON(payload).withIndex(query._queryParams.getIndex());\r\n var events = syncTreeApplyServerOverwrite(repo.serverSyncTree_, query._path, node);\r\n eventQueueRaiseEventsAtPath(repo.eventQueue_, query._path, events);\r\n return Promise.resolve(node);\r\n }, function (err) {\r\n repoLog(repo, 'get for query ' + stringify(query) + ' failed: ' + err);\r\n return Promise.reject(new Error(err));\r\n });\r\n}\r\nfunction repoSetWithPriority(repo, path, newVal, newPriority, onComplete) {\r\n repoLog(repo, 'set', {\r\n path: path.toString(),\r\n value: newVal,\r\n priority: newPriority\r\n });\r\n // TODO: Optimize this behavior to either (a) store flag to skip resolving where possible and / or\r\n // (b) store unresolved paths on JSON parse\r\n var serverValues = repoGenerateServerValues(repo);\r\n var newNodeUnresolved = nodeFromJSON(newVal, newPriority);\r\n var existing = syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path);\r\n var newNode = resolveDeferredValueSnapshot(newNodeUnresolved, existing, serverValues);\r\n var writeId = repoGetNextWriteId(repo);\r\n var events = syncTreeApplyUserOverwrite(repo.serverSyncTree_, path, newNode, writeId, true);\r\n eventQueueQueueEvents(repo.eventQueue_, events);\r\n repo.server_.put(path.toString(), newNodeUnresolved.val(/*export=*/ true), function (status, errorReason) {\r\n var success = status === 'ok';\r\n if (!success) {\r\n warn('set at ' + path + ' failed: ' + status);\r\n }\r\n var clearEvents = syncTreeAckUserWrite(repo.serverSyncTree_, writeId, !success);\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, clearEvents);\r\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n });\r\n var affectedPath = repoAbortTransactions(repo, path);\r\n repoRerunTransactions(repo, affectedPath);\r\n // We queued the events above, so just flush the queue here\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, []);\r\n}\r\nfunction repoUpdate(repo, path, childrenToMerge, onComplete) {\r\n repoLog(repo, 'update', { path: path.toString(), value: childrenToMerge });\r\n // Start with our existing data and merge each child into it.\r\n var empty = true;\r\n var serverValues = repoGenerateServerValues(repo);\r\n var changedChildren = {};\r\n each(childrenToMerge, function (changedKey, changedValue) {\r\n empty = false;\r\n changedChildren[changedKey] = resolveDeferredValueTree(pathChild(path, changedKey), nodeFromJSON(changedValue), repo.serverSyncTree_, serverValues);\r\n });\r\n if (!empty) {\r\n var writeId_1 = repoGetNextWriteId(repo);\r\n var events = syncTreeApplyUserMerge(repo.serverSyncTree_, path, changedChildren, writeId_1);\r\n eventQueueQueueEvents(repo.eventQueue_, events);\r\n repo.server_.merge(path.toString(), childrenToMerge, function (status, errorReason) {\r\n var success = status === 'ok';\r\n if (!success) {\r\n warn('update at ' + path + ' failed: ' + status);\r\n }\r\n var clearEvents = syncTreeAckUserWrite(repo.serverSyncTree_, writeId_1, !success);\r\n var affectedPath = clearEvents.length > 0 ? repoRerunTransactions(repo, path) : path;\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, clearEvents);\r\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n });\r\n each(childrenToMerge, function (changedPath) {\r\n var affectedPath = repoAbortTransactions(repo, pathChild(path, changedPath));\r\n repoRerunTransactions(repo, affectedPath);\r\n });\r\n // We queued the events above, so just flush the queue here\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, []);\r\n }\r\n else {\r\n log(\"update() called with empty data. Don't do anything.\");\r\n repoCallOnCompleteCallback(repo, onComplete, 'ok', undefined);\r\n }\r\n}\r\n/**\r\n * Applies all of the changes stored up in the onDisconnect_ tree.\r\n */\r\nfunction repoRunOnDisconnectEvents(repo) {\r\n repoLog(repo, 'onDisconnectEvents');\r\n var serverValues = repoGenerateServerValues(repo);\r\n var resolvedOnDisconnectTree = newSparseSnapshotTree();\r\n sparseSnapshotTreeForEachTree(repo.onDisconnect_, newEmptyPath(), function (path, node) {\r\n var resolved = resolveDeferredValueTree(path, node, repo.serverSyncTree_, serverValues);\r\n sparseSnapshotTreeRemember(resolvedOnDisconnectTree, path, resolved);\r\n });\r\n var events = [];\r\n sparseSnapshotTreeForEachTree(resolvedOnDisconnectTree, newEmptyPath(), function (path, snap) {\r\n events = events.concat(syncTreeApplyServerOverwrite(repo.serverSyncTree_, path, snap));\r\n var affectedPath = repoAbortTransactions(repo, path);\r\n repoRerunTransactions(repo, affectedPath);\r\n });\r\n repo.onDisconnect_ = newSparseSnapshotTree();\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, newEmptyPath(), events);\r\n}\r\nfunction repoOnDisconnectCancel(repo, path, onComplete) {\r\n repo.server_.onDisconnectCancel(path.toString(), function (status, errorReason) {\r\n if (status === 'ok') {\r\n sparseSnapshotTreeForget(repo.onDisconnect_, path);\r\n }\r\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n });\r\n}\r\nfunction repoOnDisconnectSet(repo, path, value, onComplete) {\r\n var newNode = nodeFromJSON(value);\r\n repo.server_.onDisconnectPut(path.toString(), newNode.val(/*export=*/ true), function (status, errorReason) {\r\n if (status === 'ok') {\r\n sparseSnapshotTreeRemember(repo.onDisconnect_, path, newNode);\r\n }\r\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n });\r\n}\r\nfunction repoOnDisconnectSetWithPriority(repo, path, value, priority, onComplete) {\r\n var newNode = nodeFromJSON(value, priority);\r\n repo.server_.onDisconnectPut(path.toString(), newNode.val(/*export=*/ true), function (status, errorReason) {\r\n if (status === 'ok') {\r\n sparseSnapshotTreeRemember(repo.onDisconnect_, path, newNode);\r\n }\r\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n });\r\n}\r\nfunction repoOnDisconnectUpdate(repo, path, childrenToMerge, onComplete) {\r\n if (isEmpty(childrenToMerge)) {\r\n log(\"onDisconnect().update() called with empty data. Don't do anything.\");\r\n repoCallOnCompleteCallback(repo, onComplete, 'ok', undefined);\r\n return;\r\n }\r\n repo.server_.onDisconnectMerge(path.toString(), childrenToMerge, function (status, errorReason) {\r\n if (status === 'ok') {\r\n each(childrenToMerge, function (childName, childNode) {\r\n var newChildNode = nodeFromJSON(childNode);\r\n sparseSnapshotTreeRemember(repo.onDisconnect_, pathChild(path, childName), newChildNode);\r\n });\r\n }\r\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n });\r\n}\r\nfunction repoAddEventCallbackForQuery(repo, query, eventRegistration) {\r\n var events;\r\n if (pathGetFront(query._path) === '.info') {\r\n events = syncTreeAddEventRegistration(repo.infoSyncTree_, query, eventRegistration);\r\n }\r\n else {\r\n events = syncTreeAddEventRegistration(repo.serverSyncTree_, query, eventRegistration);\r\n }\r\n eventQueueRaiseEventsAtPath(repo.eventQueue_, query._path, events);\r\n}\r\nfunction repoRemoveEventCallbackForQuery(repo, query, eventRegistration) {\r\n // These are guaranteed not to raise events, since we're not passing in a cancelError. However, we can future-proof\r\n // a little bit by handling the return values anyways.\r\n var events;\r\n if (pathGetFront(query._path) === '.info') {\r\n events = syncTreeRemoveEventRegistration(repo.infoSyncTree_, query, eventRegistration);\r\n }\r\n else {\r\n events = syncTreeRemoveEventRegistration(repo.serverSyncTree_, query, eventRegistration);\r\n }\r\n eventQueueRaiseEventsAtPath(repo.eventQueue_, query._path, events);\r\n}\r\nfunction repoInterrupt(repo) {\r\n if (repo.persistentConnection_) {\r\n repo.persistentConnection_.interrupt(INTERRUPT_REASON);\r\n }\r\n}\r\nfunction repoResume(repo) {\r\n if (repo.persistentConnection_) {\r\n repo.persistentConnection_.resume(INTERRUPT_REASON);\r\n }\r\n}\r\nfunction repoStats(repo, showDelta) {\r\n if (showDelta === void 0) { showDelta = false; }\r\n if (typeof console === 'undefined') {\r\n return;\r\n }\r\n var stats;\r\n if (showDelta) {\r\n if (!repo.statsListener_) {\r\n repo.statsListener_ = new StatsListener(repo.stats_);\r\n }\r\n stats = repo.statsListener_.get();\r\n }\r\n else {\r\n stats = repo.stats_.get();\r\n }\r\n var longestName = Object.keys(stats).reduce(function (previousValue, currentValue) {\r\n return Math.max(currentValue.length, previousValue);\r\n }, 0);\r\n each(stats, function (stat, value) {\r\n var paddedStat = stat;\r\n // pad stat names to be the same length (plus 2 extra spaces).\r\n for (var i = stat.length; i < longestName + 2; i++) {\r\n paddedStat += ' ';\r\n }\r\n console.log(paddedStat + value);\r\n });\r\n}\r\nfunction repoStatsIncrementCounter(repo, metric) {\r\n repo.stats_.incrementCounter(metric);\r\n statsReporterIncludeStat(repo.statsReporter_, metric);\r\n}\r\nfunction repoLog(repo) {\r\n var varArgs = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n varArgs[_i - 1] = arguments[_i];\r\n }\r\n var prefix = '';\r\n if (repo.persistentConnection_) {\r\n prefix = repo.persistentConnection_.id + ':';\r\n }\r\n log.apply(void 0, __spreadArray([prefix], __read(varArgs)));\r\n}\r\nfunction repoCallOnCompleteCallback(repo, callback, status, errorReason) {\r\n if (callback) {\r\n exceptionGuard(function () {\r\n if (status === 'ok') {\r\n callback(null);\r\n }\r\n else {\r\n var code = (status || 'error').toUpperCase();\r\n var message = code;\r\n if (errorReason) {\r\n message += ': ' + errorReason;\r\n }\r\n var error = new Error(message);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error.code = code;\r\n callback(error);\r\n }\r\n });\r\n }\r\n}\r\n/**\r\n * Creates a new transaction, adds it to the transactions we're tracking, and\r\n * sends it to the server if possible.\r\n *\r\n * @param path - Path at which to do transaction.\r\n * @param transactionUpdate - Update callback.\r\n * @param onComplete - Completion callback.\r\n * @param unwatcher - Function that will be called when the transaction no longer\r\n * need data updates for `path`.\r\n * @param applyLocally - Whether or not to make intermediate results visible\r\n */\r\nfunction repoStartTransaction(repo, path, transactionUpdate, onComplete, unwatcher, applyLocally) {\r\n repoLog(repo, 'transaction on ' + path);\r\n // Initialize transaction.\r\n var transaction = {\r\n path: path,\r\n update: transactionUpdate,\r\n onComplete: onComplete,\r\n // One of TransactionStatus enums.\r\n status: null,\r\n // Used when combining transactions at different locations to figure out\r\n // which one goes first.\r\n order: LUIDGenerator(),\r\n // Whether to raise local events for this transaction.\r\n applyLocally: applyLocally,\r\n // Count of how many times we've retried the transaction.\r\n retryCount: 0,\r\n // Function to call to clean up our .on() listener.\r\n unwatcher: unwatcher,\r\n // Stores why a transaction was aborted.\r\n abortReason: null,\r\n currentWriteId: null,\r\n currentInputSnapshot: null,\r\n currentOutputSnapshotRaw: null,\r\n currentOutputSnapshotResolved: null\r\n };\r\n // Run transaction initially.\r\n var currentState = repoGetLatestState(repo, path, undefined);\r\n transaction.currentInputSnapshot = currentState;\r\n var newVal = transaction.update(currentState.val());\r\n if (newVal === undefined) {\r\n // Abort transaction.\r\n transaction.unwatcher();\r\n transaction.currentOutputSnapshotRaw = null;\r\n transaction.currentOutputSnapshotResolved = null;\r\n if (transaction.onComplete) {\r\n transaction.onComplete(null, false, transaction.currentInputSnapshot);\r\n }\r\n }\r\n else {\r\n validateFirebaseData('transaction failed: Data returned ', newVal, transaction.path);\r\n // Mark as run and add to our queue.\r\n transaction.status = 0 /* RUN */;\r\n var queueNode = treeSubTree(repo.transactionQueueTree_, path);\r\n var nodeQueue = treeGetValue(queueNode) || [];\r\n nodeQueue.push(transaction);\r\n treeSetValue(queueNode, nodeQueue);\r\n // Update visibleData and raise events\r\n // Note: We intentionally raise events after updating all of our\r\n // transaction state, since the user could start new transactions from the\r\n // event callbacks.\r\n var priorityForNode = void 0;\r\n if (typeof newVal === 'object' &&\r\n newVal !== null &&\r\n contains(newVal, '.priority')) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n priorityForNode = safeGet(newVal, '.priority');\r\n assert(isValidPriority(priorityForNode), 'Invalid priority returned by transaction. ' +\r\n 'Priority must be a valid string, finite number, server value, or null.');\r\n }\r\n else {\r\n var currentNode = syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path) ||\r\n ChildrenNode.EMPTY_NODE;\r\n priorityForNode = currentNode.getPriority().val();\r\n }\r\n var serverValues = repoGenerateServerValues(repo);\r\n var newNodeUnresolved = nodeFromJSON(newVal, priorityForNode);\r\n var newNode = resolveDeferredValueSnapshot(newNodeUnresolved, currentState, serverValues);\r\n transaction.currentOutputSnapshotRaw = newNodeUnresolved;\r\n transaction.currentOutputSnapshotResolved = newNode;\r\n transaction.currentWriteId = repoGetNextWriteId(repo);\r\n var events = syncTreeApplyUserOverwrite(repo.serverSyncTree_, path, newNode, transaction.currentWriteId, transaction.applyLocally);\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\r\n repoSendReadyTransactions(repo, repo.transactionQueueTree_);\r\n }\r\n}\r\n/**\r\n * @param excludeSets - A specific set to exclude\r\n */\r\nfunction repoGetLatestState(repo, path, excludeSets) {\r\n return (syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path, excludeSets) ||\r\n ChildrenNode.EMPTY_NODE);\r\n}\r\n/**\r\n * Sends any already-run transactions that aren't waiting for outstanding\r\n * transactions to complete.\r\n *\r\n * Externally it's called with no arguments, but it calls itself recursively\r\n * with a particular transactionQueueTree node to recurse through the tree.\r\n *\r\n * @param node - transactionQueueTree node to start at.\r\n */\r\nfunction repoSendReadyTransactions(repo, node) {\r\n if (node === void 0) { node = repo.transactionQueueTree_; }\r\n // Before recursing, make sure any completed transactions are removed.\r\n if (!node) {\r\n repoPruneCompletedTransactionsBelowNode(repo, node);\r\n }\r\n if (treeGetValue(node)) {\r\n var queue = repoBuildTransactionQueue(repo, node);\r\n assert(queue.length > 0, 'Sending zero length transaction queue');\r\n var allRun = queue.every(function (transaction) { return transaction.status === 0 /* RUN */; });\r\n // If they're all run (and not sent), we can send them. Else, we must wait.\r\n if (allRun) {\r\n repoSendTransactionQueue(repo, treeGetPath(node), queue);\r\n }\r\n }\r\n else if (treeHasChildren(node)) {\r\n treeForEachChild(node, function (childNode) {\r\n repoSendReadyTransactions(repo, childNode);\r\n });\r\n }\r\n}\r\n/**\r\n * Given a list of run transactions, send them to the server and then handle\r\n * the result (success or failure).\r\n *\r\n * @param path - The location of the queue.\r\n * @param queue - Queue of transactions under the specified location.\r\n */\r\nfunction repoSendTransactionQueue(repo, path, queue) {\r\n // Mark transactions as sent and increment retry count!\r\n var setsToIgnore = queue.map(function (txn) {\r\n return txn.currentWriteId;\r\n });\r\n var latestState = repoGetLatestState(repo, path, setsToIgnore);\r\n var snapToSend = latestState;\r\n var latestHash = latestState.hash();\r\n for (var i = 0; i < queue.length; i++) {\r\n var txn = queue[i];\r\n assert(txn.status === 0 /* RUN */, 'tryToSendTransactionQueue_: items in queue should all be run.');\r\n txn.status = 1 /* SENT */;\r\n txn.retryCount++;\r\n var relativePath = newRelativePath(path, txn.path);\r\n // If we've gotten to this point, the output snapshot must be defined.\r\n snapToSend = snapToSend.updateChild(relativePath /** @type {!Node} */, txn.currentOutputSnapshotRaw);\r\n }\r\n var dataToSend = snapToSend.val(true);\r\n var pathToSend = path;\r\n // Send the put.\r\n repo.server_.put(pathToSend.toString(), dataToSend, function (status) {\r\n repoLog(repo, 'transaction put response', {\r\n path: pathToSend.toString(),\r\n status: status\r\n });\r\n var events = [];\r\n if (status === 'ok') {\r\n // Queue up the callbacks and fire them after cleaning up all of our\r\n // transaction state, since the callback could trigger more\r\n // transactions or sets.\r\n var callbacks = [];\r\n var _loop_1 = function (i) {\r\n queue[i].status = 2 /* COMPLETED */;\r\n events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, queue[i].currentWriteId));\r\n if (queue[i].onComplete) {\r\n // We never unset the output snapshot, and given that this\r\n // transaction is complete, it should be set\r\n callbacks.push(function () {\r\n return queue[i].onComplete(null, true, queue[i].currentOutputSnapshotResolved);\r\n });\r\n }\r\n queue[i].unwatcher();\r\n };\r\n for (var i = 0; i < queue.length; i++) {\r\n _loop_1(i);\r\n }\r\n // Now remove the completed transactions.\r\n repoPruneCompletedTransactionsBelowNode(repo, treeSubTree(repo.transactionQueueTree_, path));\r\n // There may be pending transactions that we can now send.\r\n repoSendReadyTransactions(repo, repo.transactionQueueTree_);\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\r\n // Finally, trigger onComplete callbacks.\r\n for (var i = 0; i < callbacks.length; i++) {\r\n exceptionGuard(callbacks[i]);\r\n }\r\n }\r\n else {\r\n // transactions are no longer sent. Update their status appropriately.\r\n if (status === 'datastale') {\r\n for (var i = 0; i < queue.length; i++) {\r\n if (queue[i].status === 3 /* SENT_NEEDS_ABORT */) {\r\n queue[i].status = 4 /* NEEDS_ABORT */;\r\n }\r\n else {\r\n queue[i].status = 0 /* RUN */;\r\n }\r\n }\r\n }\r\n else {\r\n warn('transaction at ' + pathToSend.toString() + ' failed: ' + status);\r\n for (var i = 0; i < queue.length; i++) {\r\n queue[i].status = 4 /* NEEDS_ABORT */;\r\n queue[i].abortReason = status;\r\n }\r\n }\r\n repoRerunTransactions(repo, path);\r\n }\r\n }, latestHash);\r\n}\r\n/**\r\n * Finds all transactions dependent on the data at changedPath and reruns them.\r\n *\r\n * Should be called any time cached data changes.\r\n *\r\n * Return the highest path that was affected by rerunning transactions. This\r\n * is the path at which events need to be raised for.\r\n *\r\n * @param changedPath - The path in mergedData that changed.\r\n * @returns The rootmost path that was affected by rerunning transactions.\r\n */\r\nfunction repoRerunTransactions(repo, changedPath) {\r\n var rootMostTransactionNode = repoGetAncestorTransactionNode(repo, changedPath);\r\n var path = treeGetPath(rootMostTransactionNode);\r\n var queue = repoBuildTransactionQueue(repo, rootMostTransactionNode);\r\n repoRerunTransactionQueue(repo, queue, path);\r\n return path;\r\n}\r\n/**\r\n * Does all the work of rerunning transactions (as well as cleans up aborted\r\n * transactions and whatnot).\r\n *\r\n * @param queue - The queue of transactions to run.\r\n * @param path - The path the queue is for.\r\n */\r\nfunction repoRerunTransactionQueue(repo, queue, path) {\r\n if (queue.length === 0) {\r\n return; // Nothing to do!\r\n }\r\n // Queue up the callbacks and fire them after cleaning up all of our\r\n // transaction state, since the callback could trigger more transactions or\r\n // sets.\r\n var callbacks = [];\r\n var events = [];\r\n // Ignore all of the sets we're going to re-run.\r\n var txnsToRerun = queue.filter(function (q) {\r\n return q.status === 0 /* RUN */;\r\n });\r\n var setsToIgnore = txnsToRerun.map(function (q) {\r\n return q.currentWriteId;\r\n });\r\n var _loop_2 = function (i) {\r\n var transaction = queue[i];\r\n var relativePath = newRelativePath(path, transaction.path);\r\n var abortTransaction = false, abortReason;\r\n assert(relativePath !== null, 'rerunTransactionsUnderNode_: relativePath should not be null.');\r\n if (transaction.status === 4 /* NEEDS_ABORT */) {\r\n abortTransaction = true;\r\n abortReason = transaction.abortReason;\r\n events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, transaction.currentWriteId, true));\r\n }\r\n else if (transaction.status === 0 /* RUN */) {\r\n if (transaction.retryCount >= MAX_TRANSACTION_RETRIES) {\r\n abortTransaction = true;\r\n abortReason = 'maxretry';\r\n events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, transaction.currentWriteId, true));\r\n }\r\n else {\r\n // This code reruns a transaction\r\n var currentNode = repoGetLatestState(repo, transaction.path, setsToIgnore);\r\n transaction.currentInputSnapshot = currentNode;\r\n var newData = queue[i].update(currentNode.val());\r\n if (newData !== undefined) {\r\n validateFirebaseData('transaction failed: Data returned ', newData, transaction.path);\r\n var newDataNode = nodeFromJSON(newData);\r\n var hasExplicitPriority = typeof newData === 'object' &&\r\n newData != null &&\r\n contains(newData, '.priority');\r\n if (!hasExplicitPriority) {\r\n // Keep the old priority if there wasn't a priority explicitly specified.\r\n newDataNode = newDataNode.updatePriority(currentNode.getPriority());\r\n }\r\n var oldWriteId = transaction.currentWriteId;\r\n var serverValues = repoGenerateServerValues(repo);\r\n var newNodeResolved = resolveDeferredValueSnapshot(newDataNode, currentNode, serverValues);\r\n transaction.currentOutputSnapshotRaw = newDataNode;\r\n transaction.currentOutputSnapshotResolved = newNodeResolved;\r\n transaction.currentWriteId = repoGetNextWriteId(repo);\r\n // Mutates setsToIgnore in place\r\n setsToIgnore.splice(setsToIgnore.indexOf(oldWriteId), 1);\r\n events = events.concat(syncTreeApplyUserOverwrite(repo.serverSyncTree_, transaction.path, newNodeResolved, transaction.currentWriteId, transaction.applyLocally));\r\n events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, oldWriteId, true));\r\n }\r\n else {\r\n abortTransaction = true;\r\n abortReason = 'nodata';\r\n events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, transaction.currentWriteId, true));\r\n }\r\n }\r\n }\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\r\n events = [];\r\n if (abortTransaction) {\r\n // Abort.\r\n queue[i].status = 2 /* COMPLETED */;\r\n // Removing a listener can trigger pruning which can muck with\r\n // mergedData/visibleData (as it prunes data). So defer the unwatcher\r\n // until we're done.\r\n (function (unwatcher) {\r\n setTimeout(unwatcher, Math.floor(0));\r\n })(queue[i].unwatcher);\r\n if (queue[i].onComplete) {\r\n if (abortReason === 'nodata') {\r\n callbacks.push(function () {\r\n return queue[i].onComplete(null, false, queue[i].currentInputSnapshot);\r\n });\r\n }\r\n else {\r\n callbacks.push(function () {\r\n return queue[i].onComplete(new Error(abortReason), false, null);\r\n });\r\n }\r\n }\r\n }\r\n };\r\n for (var i = 0; i < queue.length; i++) {\r\n _loop_2(i);\r\n }\r\n // Clean up completed transactions.\r\n repoPruneCompletedTransactionsBelowNode(repo, repo.transactionQueueTree_);\r\n // Now fire callbacks, now that we're in a good, known state.\r\n for (var i = 0; i < callbacks.length; i++) {\r\n exceptionGuard(callbacks[i]);\r\n }\r\n // Try to send the transaction result to the server.\r\n repoSendReadyTransactions(repo, repo.transactionQueueTree_);\r\n}\r\n/**\r\n * Returns the rootmost ancestor node of the specified path that has a pending\r\n * transaction on it, or just returns the node for the given path if there are\r\n * no pending transactions on any ancestor.\r\n *\r\n * @param path - The location to start at.\r\n * @returns The rootmost node with a transaction.\r\n */\r\nfunction repoGetAncestorTransactionNode(repo, path) {\r\n var front;\r\n // Start at the root and walk deeper into the tree towards path until we\r\n // find a node with pending transactions.\r\n var transactionNode = repo.transactionQueueTree_;\r\n front = pathGetFront(path);\r\n while (front !== null && treeGetValue(transactionNode) === undefined) {\r\n transactionNode = treeSubTree(transactionNode, front);\r\n path = pathPopFront(path);\r\n front = pathGetFront(path);\r\n }\r\n return transactionNode;\r\n}\r\n/**\r\n * Builds the queue of all transactions at or below the specified\r\n * transactionNode.\r\n *\r\n * @param transactionNode\r\n * @returns The generated queue.\r\n */\r\nfunction repoBuildTransactionQueue(repo, transactionNode) {\r\n // Walk any child transaction queues and aggregate them into a single queue.\r\n var transactionQueue = [];\r\n repoAggregateTransactionQueuesForNode(repo, transactionNode, transactionQueue);\r\n // Sort them by the order the transactions were created.\r\n transactionQueue.sort(function (a, b) { return a.order - b.order; });\r\n return transactionQueue;\r\n}\r\nfunction repoAggregateTransactionQueuesForNode(repo, node, queue) {\r\n var nodeQueue = treeGetValue(node);\r\n if (nodeQueue) {\r\n for (var i = 0; i < nodeQueue.length; i++) {\r\n queue.push(nodeQueue[i]);\r\n }\r\n }\r\n treeForEachChild(node, function (child) {\r\n repoAggregateTransactionQueuesForNode(repo, child, queue);\r\n });\r\n}\r\n/**\r\n * Remove COMPLETED transactions at or below this node in the transactionQueueTree_.\r\n */\r\nfunction repoPruneCompletedTransactionsBelowNode(repo, node) {\r\n var queue = treeGetValue(node);\r\n if (queue) {\r\n var to = 0;\r\n for (var from = 0; from < queue.length; from++) {\r\n if (queue[from].status !== 2 /* COMPLETED */) {\r\n queue[to] = queue[from];\r\n to++;\r\n }\r\n }\r\n queue.length = to;\r\n treeSetValue(node, queue.length > 0 ? queue : undefined);\r\n }\r\n treeForEachChild(node, function (childNode) {\r\n repoPruneCompletedTransactionsBelowNode(repo, childNode);\r\n });\r\n}\r\n/**\r\n * Aborts all transactions on ancestors or descendants of the specified path.\r\n * Called when doing a set() or update() since we consider them incompatible\r\n * with transactions.\r\n *\r\n * @param path - Path for which we want to abort related transactions.\r\n */\r\nfunction repoAbortTransactions(repo, path) {\r\n var affectedPath = treeGetPath(repoGetAncestorTransactionNode(repo, path));\r\n var transactionNode = treeSubTree(repo.transactionQueueTree_, path);\r\n treeForEachAncestor(transactionNode, function (node) {\r\n repoAbortTransactionsOnNode(repo, node);\r\n });\r\n repoAbortTransactionsOnNode(repo, transactionNode);\r\n treeForEachDescendant(transactionNode, function (node) {\r\n repoAbortTransactionsOnNode(repo, node);\r\n });\r\n return affectedPath;\r\n}\r\n/**\r\n * Abort transactions stored in this transaction queue node.\r\n *\r\n * @param node - Node to abort transactions for.\r\n */\r\nfunction repoAbortTransactionsOnNode(repo, node) {\r\n var queue = treeGetValue(node);\r\n if (queue) {\r\n // Queue up the callbacks and fire them after cleaning up all of our\r\n // transaction state, since the callback could trigger more transactions\r\n // or sets.\r\n var callbacks = [];\r\n // Go through queue. Any already-sent transactions must be marked for\r\n // abort, while the unsent ones can be immediately aborted and removed.\r\n var events = [];\r\n var lastSent = -1;\r\n for (var i = 0; i < queue.length; i++) {\r\n if (queue[i].status === 3 /* SENT_NEEDS_ABORT */) ;\r\n else if (queue[i].status === 1 /* SENT */) {\r\n assert(lastSent === i - 1, 'All SENT items should be at beginning of queue.');\r\n lastSent = i;\r\n // Mark transaction for abort when it comes back.\r\n queue[i].status = 3 /* SENT_NEEDS_ABORT */;\r\n queue[i].abortReason = 'set';\r\n }\r\n else {\r\n assert(queue[i].status === 0 /* RUN */, 'Unexpected transaction status in abort');\r\n // We can abort it immediately.\r\n queue[i].unwatcher();\r\n events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, queue[i].currentWriteId, true));\r\n if (queue[i].onComplete) {\r\n callbacks.push(queue[i].onComplete.bind(null, new Error('set'), false, null));\r\n }\r\n }\r\n }\r\n if (lastSent === -1) {\r\n // We're not waiting for any sent transactions. We can clear the queue.\r\n treeSetValue(node, undefined);\r\n }\r\n else {\r\n // Remove the transactions we aborted.\r\n queue.length = lastSent + 1;\r\n }\r\n // Now fire the callbacks.\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, treeGetPath(node), events);\r\n for (var i = 0; i < callbacks.length; i++) {\r\n exceptionGuard(callbacks[i]);\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction decodePath(pathString) {\r\n var pathStringDecoded = '';\r\n var pieces = pathString.split('/');\r\n for (var i = 0; i < pieces.length; i++) {\r\n if (pieces[i].length > 0) {\r\n var piece = pieces[i];\r\n try {\r\n piece = decodeURIComponent(piece.replace(/\\+/g, ' '));\r\n }\r\n catch (e) { }\r\n pathStringDecoded += '/' + piece;\r\n }\r\n }\r\n return pathStringDecoded;\r\n}\r\n/**\r\n * @returns key value hash\r\n */\r\nfunction decodeQuery(queryString) {\r\n var e_1, _a;\r\n var results = {};\r\n if (queryString.charAt(0) === '?') {\r\n queryString = queryString.substring(1);\r\n }\r\n try {\r\n for (var _b = __values(queryString.split('&')), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var segment = _c.value;\r\n if (segment.length === 0) {\r\n continue;\r\n }\r\n var kv = segment.split('=');\r\n if (kv.length === 2) {\r\n results[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1]);\r\n }\r\n else {\r\n warn(\"Invalid query segment '\" + segment + \"' in query '\" + queryString + \"'\");\r\n }\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n return results;\r\n}\r\nvar parseRepoInfo = function (dataURL, nodeAdmin) {\r\n var parsedUrl = parseDatabaseURL(dataURL), namespace = parsedUrl.namespace;\r\n if (parsedUrl.domain === 'firebase.com') {\r\n fatal(parsedUrl.host +\r\n ' is no longer supported. ' +\r\n 'Please use .firebaseio.com instead');\r\n }\r\n // Catch common error of uninitialized namespace value.\r\n if ((!namespace || namespace === 'undefined') &&\r\n parsedUrl.domain !== 'localhost') {\r\n fatal('Cannot parse Firebase url. Please use https://.firebaseio.com');\r\n }\r\n if (!parsedUrl.secure) {\r\n warnIfPageIsSecure();\r\n }\r\n var webSocketOnly = parsedUrl.scheme === 'ws' || parsedUrl.scheme === 'wss';\r\n return {\r\n repoInfo: new RepoInfo(parsedUrl.host, parsedUrl.secure, namespace, nodeAdmin, webSocketOnly, \r\n /*persistenceKey=*/ '', \r\n /*includeNamespaceInQueryParams=*/ namespace !== parsedUrl.subdomain),\r\n path: new Path(parsedUrl.pathString)\r\n };\r\n};\r\nvar parseDatabaseURL = function (dataURL) {\r\n // Default to empty strings in the event of a malformed string.\r\n var host = '', domain = '', subdomain = '', pathString = '', namespace = '';\r\n // Always default to SSL, unless otherwise specified.\r\n var secure = true, scheme = 'https', port = 443;\r\n // Don't do any validation here. The caller is responsible for validating the result of parsing.\r\n if (typeof dataURL === 'string') {\r\n // Parse scheme.\r\n var colonInd = dataURL.indexOf('//');\r\n if (colonInd >= 0) {\r\n scheme = dataURL.substring(0, colonInd - 1);\r\n dataURL = dataURL.substring(colonInd + 2);\r\n }\r\n // Parse host, path, and query string.\r\n var slashInd = dataURL.indexOf('/');\r\n if (slashInd === -1) {\r\n slashInd = dataURL.length;\r\n }\r\n var questionMarkInd = dataURL.indexOf('?');\r\n if (questionMarkInd === -1) {\r\n questionMarkInd = dataURL.length;\r\n }\r\n host = dataURL.substring(0, Math.min(slashInd, questionMarkInd));\r\n if (slashInd < questionMarkInd) {\r\n // For pathString, questionMarkInd will always come after slashInd\r\n pathString = decodePath(dataURL.substring(slashInd, questionMarkInd));\r\n }\r\n var queryParams = decodeQuery(dataURL.substring(Math.min(dataURL.length, questionMarkInd)));\r\n // If we have a port, use scheme for determining if it's secure.\r\n colonInd = host.indexOf(':');\r\n if (colonInd >= 0) {\r\n secure = scheme === 'https' || scheme === 'wss';\r\n port = parseInt(host.substring(colonInd + 1), 10);\r\n }\r\n else {\r\n colonInd = host.length;\r\n }\r\n var hostWithoutPort = host.slice(0, colonInd);\r\n if (hostWithoutPort.toLowerCase() === 'localhost') {\r\n domain = 'localhost';\r\n }\r\n else if (hostWithoutPort.split('.').length <= 2) {\r\n domain = hostWithoutPort;\r\n }\r\n else {\r\n // Interpret the subdomain of a 3 or more component URL as the namespace name.\r\n var dotInd = host.indexOf('.');\r\n subdomain = host.substring(0, dotInd).toLowerCase();\r\n domain = host.substring(dotInd + 1);\r\n // Normalize namespaces to lowercase to share storage / connection.\r\n namespace = subdomain;\r\n }\r\n // Always treat the value of the `ns` as the namespace name if it is present.\r\n if ('ns' in queryParams) {\r\n namespace = queryParams['ns'];\r\n }\r\n }\r\n return {\r\n host: host,\r\n port: port,\r\n domain: domain,\r\n subdomain: subdomain,\r\n secure: secure,\r\n scheme: scheme,\r\n pathString: pathString,\r\n namespace: namespace\r\n };\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Encapsulates the data needed to raise an event\r\n */\r\nvar DataEvent = /** @class */ (function () {\r\n /**\r\n * @param eventType - One of: value, child_added, child_changed, child_moved, child_removed\r\n * @param eventRegistration - The function to call to with the event data. User provided\r\n * @param snapshot - The data backing the event\r\n * @param prevName - Optional, the name of the previous child for child_* events.\r\n */\r\n function DataEvent(eventType, eventRegistration, snapshot, prevName) {\r\n this.eventType = eventType;\r\n this.eventRegistration = eventRegistration;\r\n this.snapshot = snapshot;\r\n this.prevName = prevName;\r\n }\r\n DataEvent.prototype.getPath = function () {\r\n var ref = this.snapshot.ref;\r\n if (this.eventType === 'value') {\r\n return ref._path;\r\n }\r\n else {\r\n return ref.parent._path;\r\n }\r\n };\r\n DataEvent.prototype.getEventType = function () {\r\n return this.eventType;\r\n };\r\n DataEvent.prototype.getEventRunner = function () {\r\n return this.eventRegistration.getEventRunner(this);\r\n };\r\n DataEvent.prototype.toString = function () {\r\n return (this.getPath().toString() +\r\n ':' +\r\n this.eventType +\r\n ':' +\r\n stringify(this.snapshot.exportVal()));\r\n };\r\n return DataEvent;\r\n}());\r\nvar CancelEvent = /** @class */ (function () {\r\n function CancelEvent(eventRegistration, error, path) {\r\n this.eventRegistration = eventRegistration;\r\n this.error = error;\r\n this.path = path;\r\n }\r\n CancelEvent.prototype.getPath = function () {\r\n return this.path;\r\n };\r\n CancelEvent.prototype.getEventType = function () {\r\n return 'cancel';\r\n };\r\n CancelEvent.prototype.getEventRunner = function () {\r\n return this.eventRegistration.getEventRunner(this);\r\n };\r\n CancelEvent.prototype.toString = function () {\r\n return this.path.toString() + ':cancel';\r\n };\r\n return CancelEvent;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A wrapper class that converts events from the database@exp SDK to the legacy\r\n * Database SDK. Events are not converted directly as event registration relies\r\n * on reference comparison of the original user callback (see `matches()`) and\r\n * relies on equality of the legacy SDK's `context` object.\r\n */\r\nvar CallbackContext = /** @class */ (function () {\r\n function CallbackContext(snapshotCallback, cancelCallback) {\r\n this.snapshotCallback = snapshotCallback;\r\n this.cancelCallback = cancelCallback;\r\n }\r\n CallbackContext.prototype.onValue = function (expDataSnapshot, previousChildName) {\r\n this.snapshotCallback.call(null, expDataSnapshot, previousChildName);\r\n };\r\n CallbackContext.prototype.onCancel = function (error) {\r\n assert(this.hasCancelCallback, 'Raising a cancel event on a listener with no cancel callback');\r\n return this.cancelCallback.call(null, error);\r\n };\r\n Object.defineProperty(CallbackContext.prototype, \"hasCancelCallback\", {\r\n get: function () {\r\n return !!this.cancelCallback;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n CallbackContext.prototype.matches = function (other) {\r\n return (this.snapshotCallback === other.snapshotCallback ||\r\n (this.snapshotCallback.userCallback !== undefined &&\r\n this.snapshotCallback.userCallback ===\r\n other.snapshotCallback.userCallback &&\r\n this.snapshotCallback.context === other.snapshotCallback.context));\r\n };\r\n return CallbackContext;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The `onDisconnect` class allows you to write or clear data when your client\r\n * disconnects from the Database server. These updates occur whether your\r\n * client disconnects cleanly or not, so you can rely on them to clean up data\r\n * even if a connection is dropped or a client crashes.\r\n *\r\n * The `onDisconnect` class is most commonly used to manage presence in\r\n * applications where it is useful to detect how many clients are connected and\r\n * when other clients disconnect. See\r\n * {@link https://firebase.google.com/docs/database/web/offline-capabilities | Enabling Offline Capabilities in JavaScript}\r\n * for more information.\r\n *\r\n * To avoid problems when a connection is dropped before the requests can be\r\n * transferred to the Database server, these functions should be called before\r\n * writing any data.\r\n *\r\n * Note that `onDisconnect` operations are only triggered once. If you want an\r\n * operation to occur each time a disconnect occurs, you'll need to re-establish\r\n * the `onDisconnect` operations each time you reconnect.\r\n */\r\nvar OnDisconnect$1 = /** @class */ (function () {\r\n /** @hideconstructor */\r\n function OnDisconnect(_repo, _path) {\r\n this._repo = _repo;\r\n this._path = _path;\r\n }\r\n /**\r\n * Cancels all previously queued `onDisconnect()` set or update events for this\r\n * location and all children.\r\n *\r\n * If a write has been queued for this location via a `set()` or `update()` at a\r\n * parent location, the write at this location will be canceled, though writes\r\n * to sibling locations will still occur.\r\n *\r\n * @returns Resolves when synchronization to the server is complete.\r\n */\r\n OnDisconnect.prototype.cancel = function () {\r\n var deferred = new Deferred();\r\n repoOnDisconnectCancel(this._repo, this._path, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n };\r\n /**\r\n * Ensures the data at this location is deleted when the client is disconnected\r\n * (due to closing the browser, navigating to a new page, or network issues).\r\n *\r\n * @returns Resolves when synchronization to the server is complete.\r\n */\r\n OnDisconnect.prototype.remove = function () {\r\n validateWritablePath('OnDisconnect.remove', this._path);\r\n var deferred = new Deferred();\r\n repoOnDisconnectSet(this._repo, this._path, null, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n };\r\n /**\r\n * Ensures the data at this location is set to the specified value when the\r\n * client is disconnected (due to closing the browser, navigating to a new page,\r\n * or network issues).\r\n *\r\n * `set()` is especially useful for implementing \"presence\" systems, where a\r\n * value should be changed or cleared when a user disconnects so that they\r\n * appear \"offline\" to other users. See\r\n * {@link https://firebase.google.com/docs/database/web/offline-capabilities | Enabling Offline Capabilities in JavaScript}\r\n * for more information.\r\n *\r\n * Note that `onDisconnect` operations are only triggered once. If you want an\r\n * operation to occur each time a disconnect occurs, you'll need to re-establish\r\n * the `onDisconnect` operations each time.\r\n *\r\n * @param value - The value to be written to this location on disconnect (can\r\n * be an object, array, string, number, boolean, or null).\r\n * @returns Resolves when synchronization to the Database is complete.\r\n */\r\n OnDisconnect.prototype.set = function (value) {\r\n validateWritablePath('OnDisconnect.set', this._path);\r\n validateFirebaseDataArg('OnDisconnect.set', value, this._path, false);\r\n var deferred = new Deferred();\r\n repoOnDisconnectSet(this._repo, this._path, value, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n };\r\n /**\r\n * Ensures the data at this location is set to the specified value and priority\r\n * when the client is disconnected (due to closing the browser, navigating to a\r\n * new page, or network issues).\r\n *\r\n * @param value - The value to be written to this location on disconnect (can\r\n * be an object, array, string, number, boolean, or null).\r\n * @param priority - The priority to be written (string, number, or null).\r\n * @returns Resolves when synchronization to the Database is complete.\r\n */\r\n OnDisconnect.prototype.setWithPriority = function (value, priority) {\r\n validateWritablePath('OnDisconnect.setWithPriority', this._path);\r\n validateFirebaseDataArg('OnDisconnect.setWithPriority', value, this._path, false);\r\n validatePriority('OnDisconnect.setWithPriority', priority, false);\r\n var deferred = new Deferred();\r\n repoOnDisconnectSetWithPriority(this._repo, this._path, value, priority, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n };\r\n /**\r\n * Writes multiple values at this location when the client is disconnected (due\r\n * to closing the browser, navigating to a new page, or network issues).\r\n *\r\n * The `values` argument contains multiple property-value pairs that will be\r\n * written to the Database together. Each child property can either be a simple\r\n * property (for example, \"name\") or a relative path (for example, \"name/first\")\r\n * from the current location to the data to update.\r\n *\r\n * As opposed to the `set()` method, `update()` can be use to selectively update\r\n * only the referenced properties at the current location (instead of replacing\r\n * all the child properties at the current location).\r\n *\r\n * @param values - Object containing multiple values.\r\n * @returns Resolves when synchronization to the Database is complete.\r\n */\r\n OnDisconnect.prototype.update = function (values) {\r\n validateWritablePath('OnDisconnect.update', this._path);\r\n validateFirebaseMergeDataArg('OnDisconnect.update', values, this._path, false);\r\n var deferred = new Deferred();\r\n repoOnDisconnectUpdate(this._repo, this._path, values, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n };\r\n return OnDisconnect;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @internal\r\n */\r\nvar QueryImpl = /** @class */ (function () {\r\n /**\r\n * @hideconstructor\r\n */\r\n function QueryImpl(_repo, _path, _queryParams, _orderByCalled) {\r\n this._repo = _repo;\r\n this._path = _path;\r\n this._queryParams = _queryParams;\r\n this._orderByCalled = _orderByCalled;\r\n }\r\n Object.defineProperty(QueryImpl.prototype, \"key\", {\r\n get: function () {\r\n if (pathIsEmpty(this._path)) {\r\n return null;\r\n }\r\n else {\r\n return pathGetBack(this._path);\r\n }\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(QueryImpl.prototype, \"ref\", {\r\n get: function () {\r\n return new ReferenceImpl(this._repo, this._path);\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(QueryImpl.prototype, \"_queryIdentifier\", {\r\n get: function () {\r\n var obj = queryParamsGetQueryObject(this._queryParams);\r\n var id = ObjectToUniqueKey(obj);\r\n return id === '{}' ? 'default' : id;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(QueryImpl.prototype, \"_queryObject\", {\r\n /**\r\n * An object representation of the query parameters used by this Query.\r\n */\r\n get: function () {\r\n return queryParamsGetQueryObject(this._queryParams);\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n QueryImpl.prototype.isEqual = function (other) {\r\n other = getModularInstance(other);\r\n if (!(other instanceof QueryImpl)) {\r\n return false;\r\n }\r\n var sameRepo = this._repo === other._repo;\r\n var samePath = pathEquals(this._path, other._path);\r\n var sameQueryIdentifier = this._queryIdentifier === other._queryIdentifier;\r\n return sameRepo && samePath && sameQueryIdentifier;\r\n };\r\n QueryImpl.prototype.toJSON = function () {\r\n return this.toString();\r\n };\r\n QueryImpl.prototype.toString = function () {\r\n return this._repo.toString() + pathToUrlEncodedString(this._path);\r\n };\r\n return QueryImpl;\r\n}());\r\n/**\r\n * Validates that no other order by call has been made\r\n */\r\nfunction validateNoPreviousOrderByCall(query, fnName) {\r\n if (query._orderByCalled === true) {\r\n throw new Error(fnName + \": You can't combine multiple orderBy calls.\");\r\n }\r\n}\r\n/**\r\n * Validates start/end values for queries.\r\n */\r\nfunction validateQueryEndpoints(params) {\r\n var startNode = null;\r\n var endNode = null;\r\n if (params.hasStart()) {\r\n startNode = params.getIndexStartValue();\r\n }\r\n if (params.hasEnd()) {\r\n endNode = params.getIndexEndValue();\r\n }\r\n if (params.getIndex() === KEY_INDEX) {\r\n var tooManyArgsError = 'Query: When ordering by key, you may only pass one argument to ' +\r\n 'startAt(), endAt(), or equalTo().';\r\n var wrongArgTypeError = 'Query: When ordering by key, the argument passed to startAt(), startAfter(), ' +\r\n 'endAt(), endBefore(), or equalTo() must be a string.';\r\n if (params.hasStart()) {\r\n var startName = params.getIndexStartName();\r\n if (startName !== MIN_NAME) {\r\n throw new Error(tooManyArgsError);\r\n }\r\n else if (typeof startNode !== 'string') {\r\n throw new Error(wrongArgTypeError);\r\n }\r\n }\r\n if (params.hasEnd()) {\r\n var endName = params.getIndexEndName();\r\n if (endName !== MAX_NAME) {\r\n throw new Error(tooManyArgsError);\r\n }\r\n else if (typeof endNode !== 'string') {\r\n throw new Error(wrongArgTypeError);\r\n }\r\n }\r\n }\r\n else if (params.getIndex() === PRIORITY_INDEX) {\r\n if ((startNode != null && !isValidPriority(startNode)) ||\r\n (endNode != null && !isValidPriority(endNode))) {\r\n throw new Error('Query: When ordering by priority, the first argument passed to startAt(), ' +\r\n 'startAfter() endAt(), endBefore(), or equalTo() must be a valid priority value ' +\r\n '(null, a number, or a string).');\r\n }\r\n }\r\n else {\r\n assert(params.getIndex() instanceof PathIndex ||\r\n params.getIndex() === VALUE_INDEX, 'unknown index type.');\r\n if ((startNode != null && typeof startNode === 'object') ||\r\n (endNode != null && typeof endNode === 'object')) {\r\n throw new Error('Query: First argument passed to startAt(), startAfter(), endAt(), endBefore(), or ' +\r\n 'equalTo() cannot be an object.');\r\n }\r\n }\r\n}\r\n/**\r\n * Validates that limit* has been called with the correct combination of parameters\r\n */\r\nfunction validateLimit(params) {\r\n if (params.hasStart() &&\r\n params.hasEnd() &&\r\n params.hasLimit() &&\r\n !params.hasAnchoredLimit()) {\r\n throw new Error(\"Query: Can't combine startAt(), startAfter(), endAt(), endBefore(), and limit(). Use \" +\r\n 'limitToFirst() or limitToLast() instead.');\r\n }\r\n}\r\n/**\r\n * @internal\r\n */\r\nvar ReferenceImpl = /** @class */ (function (_super) {\r\n __extends(ReferenceImpl, _super);\r\n /** @hideconstructor */\r\n function ReferenceImpl(repo, path) {\r\n return _super.call(this, repo, path, new QueryParams(), false) || this;\r\n }\r\n Object.defineProperty(ReferenceImpl.prototype, \"parent\", {\r\n get: function () {\r\n var parentPath = pathParent(this._path);\r\n return parentPath === null\r\n ? null\r\n : new ReferenceImpl(this._repo, parentPath);\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReferenceImpl.prototype, \"root\", {\r\n get: function () {\r\n var ref = this;\r\n while (ref.parent !== null) {\r\n ref = ref.parent;\r\n }\r\n return ref;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n return ReferenceImpl;\r\n}(QueryImpl));\r\n/**\r\n * A `DataSnapshot` contains data from a Database location.\r\n *\r\n * Any time you read data from the Database, you receive the data as a\r\n * `DataSnapshot`. A `DataSnapshot` is passed to the event callbacks you attach\r\n * with `on()` or `once()`. You can extract the contents of the snapshot as a\r\n * JavaScript object by calling the `val()` method. Alternatively, you can\r\n * traverse into the snapshot by calling `child()` to return child snapshots\r\n * (which you could then call `val()` on).\r\n *\r\n * A `DataSnapshot` is an efficiently generated, immutable copy of the data at\r\n * a Database location. It cannot be modified and will never change (to modify\r\n * data, you always call the `set()` method on a `Reference` directly).\r\n */\r\nvar DataSnapshot$1 = /** @class */ (function () {\r\n /**\r\n * @param _node - A SnapshotNode to wrap.\r\n * @param ref - The location this snapshot came from.\r\n * @param _index - The iteration order for this snapshot\r\n * @hideconstructor\r\n */\r\n function DataSnapshot(_node, \r\n /**\r\n * The location of this DataSnapshot.\r\n */\r\n ref, _index) {\r\n this._node = _node;\r\n this.ref = ref;\r\n this._index = _index;\r\n }\r\n Object.defineProperty(DataSnapshot.prototype, \"priority\", {\r\n /**\r\n * Gets the priority value of the data in this `DataSnapshot`.\r\n *\r\n * Applications need not use priority but can order collections by\r\n * ordinary properties (see\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data |Sorting and filtering data}\r\n * ).\r\n */\r\n get: function () {\r\n // typecast here because we never return deferred values or internal priorities (MAX_PRIORITY)\r\n return this._node.getPriority().val();\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(DataSnapshot.prototype, \"key\", {\r\n /**\r\n * The key (last part of the path) of the location of this `DataSnapshot`.\r\n *\r\n * The last token in a Database location is considered its key. For example,\r\n * \"ada\" is the key for the /users/ada/ node. Accessing the key on any\r\n * `DataSnapshot` will return the key for the location that generated it.\r\n * However, accessing the key on the root URL of a Database will return\r\n * `null`.\r\n */\r\n get: function () {\r\n return this.ref.key;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(DataSnapshot.prototype, \"size\", {\r\n /** Returns the number of child properties of this `DataSnapshot`. */\r\n get: function () {\r\n return this._node.numChildren();\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n /**\r\n * Gets another `DataSnapshot` for the location at the specified relative path.\r\n *\r\n * Passing a relative path to the `child()` method of a DataSnapshot returns\r\n * another `DataSnapshot` for the location at the specified relative path. The\r\n * relative path can either be a simple child name (for example, \"ada\") or a\r\n * deeper, slash-separated path (for example, \"ada/name/first\"). If the child\r\n * location has no data, an empty `DataSnapshot` (that is, a `DataSnapshot`\r\n * whose value is `null`) is returned.\r\n *\r\n * @param path - A relative path to the location of child data.\r\n */\r\n DataSnapshot.prototype.child = function (path) {\r\n var childPath = new Path(path);\r\n var childRef = child(this.ref, path);\r\n return new DataSnapshot(this._node.getChild(childPath), childRef, PRIORITY_INDEX);\r\n };\r\n /**\r\n * Returns true if this `DataSnapshot` contains any data. It is slightly more\r\n * efficient than using `snapshot.val() !== null`.\r\n */\r\n DataSnapshot.prototype.exists = function () {\r\n return !this._node.isEmpty();\r\n };\r\n /**\r\n * Exports the entire contents of the DataSnapshot as a JavaScript object.\r\n *\r\n * The `exportVal()` method is similar to `val()`, except priority information\r\n * is included (if available), making it suitable for backing up your data.\r\n *\r\n * @returns The DataSnapshot's contents as a JavaScript value (Object,\r\n * Array, string, number, boolean, or `null`).\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n DataSnapshot.prototype.exportVal = function () {\r\n return this._node.val(true);\r\n };\r\n /**\r\n * Enumerates the top-level children in the `DataSnapshot`.\r\n *\r\n * Because of the way JavaScript objects work, the ordering of data in the\r\n * JavaScript object returned by `val()` is not guaranteed to match the\r\n * ordering on the server nor the ordering of `onChildAdded()` events. That is\r\n * where `forEach()` comes in handy. It guarantees the children of a\r\n * `DataSnapshot` will be iterated in their query order.\r\n *\r\n * If no explicit `orderBy*()` method is used, results are returned\r\n * ordered by key (unless priorities are used, in which case, results are\r\n * returned by priority).\r\n *\r\n * @param action - A function that will be called for each child DataSnapshot.\r\n * The callback can return true to cancel further enumeration.\r\n * @returns true if enumeration was canceled due to your callback returning\r\n * true.\r\n */\r\n DataSnapshot.prototype.forEach = function (action) {\r\n var _this = this;\r\n if (this._node.isLeafNode()) {\r\n return false;\r\n }\r\n var childrenNode = this._node;\r\n // Sanitize the return value to a boolean. ChildrenNode.forEachChild has a weird return type...\r\n return !!childrenNode.forEachChild(this._index, function (key, node) {\r\n return action(new DataSnapshot(node, child(_this.ref, key), PRIORITY_INDEX));\r\n });\r\n };\r\n /**\r\n * Returns true if the specified child path has (non-null) data.\r\n *\r\n * @param path - A relative path to the location of a potential child.\r\n * @returns `true` if data exists at the specified child path; else\r\n * `false`.\r\n */\r\n DataSnapshot.prototype.hasChild = function (path) {\r\n var childPath = new Path(path);\r\n return !this._node.getChild(childPath).isEmpty();\r\n };\r\n /**\r\n * Returns whether or not the `DataSnapshot` has any non-`null` child\r\n * properties.\r\n *\r\n * You can use `hasChildren()` to determine if a `DataSnapshot` has any\r\n * children. If it does, you can enumerate them using `forEach()`. If it\r\n * doesn't, then either this snapshot contains a primitive value (which can be\r\n * retrieved with `val()`) or it is empty (in which case, `val()` will return\r\n * `null`).\r\n *\r\n * @returns true if this snapshot has any children; else false.\r\n */\r\n DataSnapshot.prototype.hasChildren = function () {\r\n if (this._node.isLeafNode()) {\r\n return false;\r\n }\r\n else {\r\n return !this._node.isEmpty();\r\n }\r\n };\r\n /**\r\n * Returns a JSON-serializable representation of this object.\r\n */\r\n DataSnapshot.prototype.toJSON = function () {\r\n return this.exportVal();\r\n };\r\n /**\r\n * Extracts a JavaScript value from a `DataSnapshot`.\r\n *\r\n * Depending on the data in a `DataSnapshot`, the `val()` method may return a\r\n * scalar type (string, number, or boolean), an array, or an object. It may\r\n * also return null, indicating that the `DataSnapshot` is empty (contains no\r\n * data).\r\n *\r\n * @returns The DataSnapshot's contents as a JavaScript value (Object,\r\n * Array, string, number, boolean, or `null`).\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n DataSnapshot.prototype.val = function () {\r\n return this._node.val();\r\n };\r\n return DataSnapshot;\r\n}());\r\n/**\r\n *\r\n * Returns a `Reference` representing the location in the Database\r\n * corresponding to the provided path. If no path is provided, the `Reference`\r\n * will point to the root of the Database.\r\n *\r\n * @param db - The database instance to obtain a reference for.\r\n * @param path - Optional path representing the location the returned\r\n * `Reference` will point. If not provided, the returned `Reference` will\r\n * point to the root of the Database.\r\n * @returns If a path is provided, a `Reference`\r\n * pointing to the provided path. Otherwise, a `Reference` pointing to the\r\n * root of the Database.\r\n */\r\nfunction ref(db, path) {\r\n db = getModularInstance(db);\r\n db._checkNotDeleted('ref');\r\n return path !== undefined ? child(db._root, path) : db._root;\r\n}\r\n/**\r\n * Returns a `Reference` representing the location in the Database\r\n * corresponding to the provided Firebase URL.\r\n *\r\n * An exception is thrown if the URL is not a valid Firebase Database URL or it\r\n * has a different domain than the current `Database` instance.\r\n *\r\n * Note that all query parameters (`orderBy`, `limitToLast`, etc.) are ignored\r\n * and are not applied to the returned `Reference`.\r\n *\r\n * @param db - The database instance to obtain a reference for.\r\n * @param url - The Firebase URL at which the returned `Reference` will\r\n * point.\r\n * @returns A `Reference` pointing to the provided\r\n * Firebase URL.\r\n */\r\nfunction refFromURL(db, url) {\r\n db = getModularInstance(db);\r\n db._checkNotDeleted('refFromURL');\r\n var parsedURL = parseRepoInfo(url, db._repo.repoInfo_.nodeAdmin);\r\n validateUrl('refFromURL', parsedURL);\r\n var repoInfo = parsedURL.repoInfo;\r\n if (!db._repo.repoInfo_.isCustomHost() &&\r\n repoInfo.host !== db._repo.repoInfo_.host) {\r\n fatal('refFromURL' +\r\n ': Host name does not match the current database: ' +\r\n '(found ' +\r\n repoInfo.host +\r\n ' but expected ' +\r\n db._repo.repoInfo_.host +\r\n ')');\r\n }\r\n return ref(db, parsedURL.path.toString());\r\n}\r\n/**\r\n * Gets a `Reference` for the location at the specified relative path.\r\n *\r\n * The relative path can either be a simple child name (for example, \"ada\") or\r\n * a deeper slash-separated path (for example, \"ada/name/first\").\r\n *\r\n * @param parent - The parent location.\r\n * @param path - A relative path from this location to the desired child\r\n * location.\r\n * @returns The specified child location.\r\n */\r\nfunction child(parent, path) {\r\n parent = getModularInstance(parent);\r\n if (pathGetFront(parent._path) === null) {\r\n validateRootPathString('child', 'path', path, false);\r\n }\r\n else {\r\n validatePathString('child', 'path', path, false);\r\n }\r\n return new ReferenceImpl(parent._repo, pathChild(parent._path, path));\r\n}\r\n/**\r\n * Generates a new child location using a unique key and returns its\r\n * `Reference`.\r\n *\r\n * This is the most common pattern for adding data to a collection of items.\r\n *\r\n * If you provide a value to `push()`, the value is written to the\r\n * generated location. If you don't pass a value, nothing is written to the\r\n * database and the child remains empty (but you can use the `Reference`\r\n * elsewhere).\r\n *\r\n * The unique keys generated by `push()` are ordered by the current time, so the\r\n * resulting list of items is chronologically sorted. The keys are also\r\n * designed to be unguessable (they contain 72 random bits of entropy).\r\n *\r\n * See {@link https://firebase.google.com/docs/database/web/lists-of-data#append_to_a_list_of_data | Append to a list of data}\r\n *
See {@link ttps://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html | The 2^120 Ways to Ensure Unique Identifiers}\r\n *\r\n * @param parent - The parent location.\r\n * @param value - Optional value to be written at the generated location.\r\n * @returns Combined `Promise` and `Reference`; resolves when write is complete,\r\n * but can be used immediately as the `Reference` to the child location.\r\n */\r\nfunction push(parent, value) {\r\n parent = getModularInstance(parent);\r\n validateWritablePath('push', parent._path);\r\n validateFirebaseDataArg('push', value, parent._path, true);\r\n var now = repoServerTime(parent._repo);\r\n var name = nextPushId(now);\r\n // push() returns a ThennableReference whose promise is fulfilled with a\r\n // regular Reference. We use child() to create handles to two different\r\n // references. The first is turned into a ThennableReference below by adding\r\n // then() and catch() methods and is used as the return value of push(). The\r\n // second remains a regular Reference and is used as the fulfilled value of\r\n // the first ThennableReference.\r\n var thennablePushRef = child(parent, name);\r\n var pushRef = child(parent, name);\r\n var promise;\r\n if (value != null) {\r\n promise = set(pushRef, value).then(function () { return pushRef; });\r\n }\r\n else {\r\n promise = Promise.resolve(pushRef);\r\n }\r\n thennablePushRef.then = promise.then.bind(promise);\r\n thennablePushRef.catch = promise.then.bind(promise, undefined);\r\n return thennablePushRef;\r\n}\r\n/**\r\n * Removes the data at this Database location.\r\n *\r\n * Any data at child locations will also be deleted.\r\n *\r\n * The effect of the remove will be visible immediately and the corresponding\r\n * event 'value' will be triggered. Synchronization of the remove to the\r\n * Firebase servers will also be started, and the returned Promise will resolve\r\n * when complete. If provided, the onComplete callback will be called\r\n * asynchronously after synchronization has finished.\r\n *\r\n * @param ref - The location to remove.\r\n * @returns Resolves when remove on server is complete.\r\n */\r\nfunction remove(ref) {\r\n validateWritablePath('remove', ref._path);\r\n return set(ref, null);\r\n}\r\n/**\r\n * Writes data to this Database location.\r\n *\r\n * This will overwrite any data at this location and all child locations.\r\n *\r\n * The effect of the write will be visible immediately, and the corresponding\r\n * events (\"value\", \"child_added\", etc.) will be triggered. Synchronization of\r\n * the data to the Firebase servers will also be started, and the returned\r\n * Promise will resolve when complete. If provided, the `onComplete` callback\r\n * will be called asynchronously after synchronization has finished.\r\n *\r\n * Passing `null` for the new value is equivalent to calling `remove()`; namely,\r\n * all data at this location and all child locations will be deleted.\r\n *\r\n * `set()` will remove any priority stored at this location, so if priority is\r\n * meant to be preserved, you need to use `setWithPriority()` instead.\r\n *\r\n * Note that modifying data with `set()` will cancel any pending transactions\r\n * at that location, so extreme care should be taken if mixing `set()` and\r\n * `transaction()` to modify the same data.\r\n *\r\n * A single `set()` will generate a single \"value\" event at the location where\r\n * the `set()` was performed.\r\n *\r\n * @param ref - The location to write to.\r\n * @param value - The value to be written (string, number, boolean, object,\r\n * array, or null).\r\n * @returns Resolves when write to server is complete.\r\n */\r\nfunction set(ref, value) {\r\n ref = getModularInstance(ref);\r\n validateWritablePath('set', ref._path);\r\n validateFirebaseDataArg('set', value, ref._path, false);\r\n var deferred = new Deferred();\r\n repoSetWithPriority(ref._repo, ref._path, value, \r\n /*priority=*/ null, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n}\r\n/**\r\n * Sets a priority for the data at this Database location.\r\n *\r\n * Applications need not use priority but can order collections by\r\n * ordinary properties (see\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data | Sorting and filtering data}\r\n * ).\r\n *\r\n * @param ref - The location to write to.\r\n * @param priority - The priority to be written (string, number, or null).\r\n * @returns Resolves when write to server is complete.\r\n */\r\nfunction setPriority(ref, priority) {\r\n ref = getModularInstance(ref);\r\n validateWritablePath('setPriority', ref._path);\r\n validatePriority('setPriority', priority, false);\r\n var deferred = new Deferred();\r\n repoSetWithPriority(ref._repo, pathChild(ref._path, '.priority'), priority, null, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n}\r\n/**\r\n * Writes data the Database location. Like `set()` but also specifies the\r\n * priority for that data.\r\n *\r\n * Applications need not use priority but can order collections by\r\n * ordinary properties (see\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data | Sorting and filtering data}\r\n * ).\r\n *\r\n * @param ref - The location to write to.\r\n * @param value - The value to be written (string, number, boolean, object,\r\n * array, or null).\r\n * @param priority - The priority to be written (string, number, or null).\r\n * @returns Resolves when write to server is complete.\r\n */\r\nfunction setWithPriority(ref, value, priority) {\r\n validateWritablePath('setWithPriority', ref._path);\r\n validateFirebaseDataArg('setWithPriority', value, ref._path, false);\r\n validatePriority('setWithPriority', priority, false);\r\n if (ref.key === '.length' || ref.key === '.keys') {\r\n throw 'setWithPriority failed: ' + ref.key + ' is a read-only object.';\r\n }\r\n var deferred = new Deferred();\r\n repoSetWithPriority(ref._repo, ref._path, value, priority, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n}\r\n/**\r\n * Writes multiple values to the Database at once.\r\n *\r\n * The `values` argument contains multiple property-value pairs that will be\r\n * written to the Database together. Each child property can either be a simple\r\n * property (for example, \"name\") or a relative path (for example,\r\n * \"name/first\") from the current location to the data to update.\r\n *\r\n * As opposed to the `set()` method, `update()` can be use to selectively update\r\n * only the referenced properties at the current location (instead of replacing\r\n * all the child properties at the current location).\r\n *\r\n * The effect of the write will be visible immediately, and the corresponding\r\n * events ('value', 'child_added', etc.) will be triggered. Synchronization of\r\n * the data to the Firebase servers will also be started, and the returned\r\n * Promise will resolve when complete. If provided, the `onComplete` callback\r\n * will be called asynchronously after synchronization has finished.\r\n *\r\n * A single `update()` will generate a single \"value\" event at the location\r\n * where the `update()` was performed, regardless of how many children were\r\n * modified.\r\n *\r\n * Note that modifying data with `update()` will cancel any pending\r\n * transactions at that location, so extreme care should be taken if mixing\r\n * `update()` and `transaction()` to modify the same data.\r\n *\r\n * Passing `null` to `update()` will remove the data at this location.\r\n *\r\n * See\r\n * {@link https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html | Introducing multi-location updates and more}.\r\n *\r\n * @param ref - The location to write to.\r\n * @param values - Object containing multiple values.\r\n * @returns Resolves when update on server is complete.\r\n */\r\nfunction update(ref, values) {\r\n validateFirebaseMergeDataArg('update', values, ref._path, false);\r\n var deferred = new Deferred();\r\n repoUpdate(ref._repo, ref._path, values, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n}\r\n/**\r\n * Gets the most up-to-date result for this query.\r\n *\r\n * @param query - The query to run.\r\n * @returns A promise which resolves to the resulting DataSnapshot if a value is\r\n * available, or rejects if the client is unable to return a value (e.g., if the\r\n * server is unreachable and there is nothing cached).\r\n */\r\nfunction get(query) {\r\n query = getModularInstance(query);\r\n return repoGetValue(query._repo, query).then(function (node) {\r\n return new DataSnapshot$1(node, new ReferenceImpl(query._repo, query._path), query._queryParams.getIndex());\r\n });\r\n}\r\n/**\r\n * Represents registration for 'value' events.\r\n */\r\nvar ValueEventRegistration = /** @class */ (function () {\r\n function ValueEventRegistration(callbackContext) {\r\n this.callbackContext = callbackContext;\r\n }\r\n ValueEventRegistration.prototype.respondsTo = function (eventType) {\r\n return eventType === 'value';\r\n };\r\n ValueEventRegistration.prototype.createEvent = function (change, query) {\r\n var index = query._queryParams.getIndex();\r\n return new DataEvent('value', this, new DataSnapshot$1(change.snapshotNode, new ReferenceImpl(query._repo, query._path), index));\r\n };\r\n ValueEventRegistration.prototype.getEventRunner = function (eventData) {\r\n var _this = this;\r\n if (eventData.getEventType() === 'cancel') {\r\n return function () {\r\n return _this.callbackContext.onCancel(eventData.error);\r\n };\r\n }\r\n else {\r\n return function () {\r\n return _this.callbackContext.onValue(eventData.snapshot, null);\r\n };\r\n }\r\n };\r\n ValueEventRegistration.prototype.createCancelEvent = function (error, path) {\r\n if (this.callbackContext.hasCancelCallback) {\r\n return new CancelEvent(this, error, path);\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n ValueEventRegistration.prototype.matches = function (other) {\r\n if (!(other instanceof ValueEventRegistration)) {\r\n return false;\r\n }\r\n else if (!other.callbackContext || !this.callbackContext) {\r\n // If no callback specified, we consider it to match any callback.\r\n return true;\r\n }\r\n else {\r\n return other.callbackContext.matches(this.callbackContext);\r\n }\r\n };\r\n ValueEventRegistration.prototype.hasAnyCallback = function () {\r\n return this.callbackContext !== null;\r\n };\r\n return ValueEventRegistration;\r\n}());\r\n/**\r\n * Represents the registration of a child_x event.\r\n */\r\nvar ChildEventRegistration = /** @class */ (function () {\r\n function ChildEventRegistration(eventType, callbackContext) {\r\n this.eventType = eventType;\r\n this.callbackContext = callbackContext;\r\n }\r\n ChildEventRegistration.prototype.respondsTo = function (eventType) {\r\n var eventToCheck = eventType === 'children_added' ? 'child_added' : eventType;\r\n eventToCheck =\r\n eventToCheck === 'children_removed' ? 'child_removed' : eventToCheck;\r\n return this.eventType === eventToCheck;\r\n };\r\n ChildEventRegistration.prototype.createCancelEvent = function (error, path) {\r\n if (this.callbackContext.hasCancelCallback) {\r\n return new CancelEvent(this, error, path);\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n ChildEventRegistration.prototype.createEvent = function (change, query) {\r\n assert(change.childName != null, 'Child events should have a childName.');\r\n var childRef = child(new ReferenceImpl(query._repo, query._path), change.childName);\r\n var index = query._queryParams.getIndex();\r\n return new DataEvent(change.type, this, new DataSnapshot$1(change.snapshotNode, childRef, index), change.prevName);\r\n };\r\n ChildEventRegistration.prototype.getEventRunner = function (eventData) {\r\n var _this = this;\r\n if (eventData.getEventType() === 'cancel') {\r\n return function () {\r\n return _this.callbackContext.onCancel(eventData.error);\r\n };\r\n }\r\n else {\r\n return function () {\r\n return _this.callbackContext.onValue(eventData.snapshot, eventData.prevName);\r\n };\r\n }\r\n };\r\n ChildEventRegistration.prototype.matches = function (other) {\r\n if (other instanceof ChildEventRegistration) {\r\n return (this.eventType === other.eventType &&\r\n (!this.callbackContext ||\r\n !other.callbackContext ||\r\n this.callbackContext.matches(other.callbackContext)));\r\n }\r\n return false;\r\n };\r\n ChildEventRegistration.prototype.hasAnyCallback = function () {\r\n return !!this.callbackContext;\r\n };\r\n return ChildEventRegistration;\r\n}());\r\nfunction addEventListener(query, eventType, callback, cancelCallbackOrListenOptions, options) {\r\n var cancelCallback;\r\n if (typeof cancelCallbackOrListenOptions === 'object') {\r\n cancelCallback = undefined;\r\n options = cancelCallbackOrListenOptions;\r\n }\r\n if (typeof cancelCallbackOrListenOptions === 'function') {\r\n cancelCallback = cancelCallbackOrListenOptions;\r\n }\r\n if (options && options.onlyOnce) {\r\n var userCallback_1 = callback;\r\n var onceCallback = function (dataSnapshot, previousChildName) {\r\n repoRemoveEventCallbackForQuery(query._repo, query, container);\r\n userCallback_1(dataSnapshot, previousChildName);\r\n };\r\n onceCallback.userCallback = callback.userCallback;\r\n onceCallback.context = callback.context;\r\n callback = onceCallback;\r\n }\r\n var callbackContext = new CallbackContext(callback, cancelCallback || undefined);\r\n var container = eventType === 'value'\r\n ? new ValueEventRegistration(callbackContext)\r\n : new ChildEventRegistration(eventType, callbackContext);\r\n repoAddEventCallbackForQuery(query._repo, query, container);\r\n return function () { return repoRemoveEventCallbackForQuery(query._repo, query, container); };\r\n}\r\nfunction onValue(query, callback, cancelCallbackOrListenOptions, options) {\r\n return addEventListener(query, 'value', callback, cancelCallbackOrListenOptions, options);\r\n}\r\nfunction onChildAdded(query, callback, cancelCallbackOrListenOptions, options) {\r\n return addEventListener(query, 'child_added', callback, cancelCallbackOrListenOptions, options);\r\n}\r\nfunction onChildChanged(query, callback, cancelCallbackOrListenOptions, options) {\r\n return addEventListener(query, 'child_changed', callback, cancelCallbackOrListenOptions, options);\r\n}\r\nfunction onChildMoved(query, callback, cancelCallbackOrListenOptions, options) {\r\n return addEventListener(query, 'child_moved', callback, cancelCallbackOrListenOptions, options);\r\n}\r\nfunction onChildRemoved(query, callback, cancelCallbackOrListenOptions, options) {\r\n return addEventListener(query, 'child_removed', callback, cancelCallbackOrListenOptions, options);\r\n}\r\n/**\r\n * Detaches a callback previously attached with `on()`.\r\n *\r\n * Detach a callback previously attached with `on()`. Note that if `on()` was\r\n * called multiple times with the same eventType and callback, the callback\r\n * will be called multiple times for each event, and `off()` must be called\r\n * multiple times to remove the callback. Calling `off()` on a parent listener\r\n * will not automatically remove listeners registered on child nodes, `off()`\r\n * must also be called on any child listeners to remove the callback.\r\n *\r\n * If a callback is not specified, all callbacks for the specified eventType\r\n * will be removed. Similarly, if no eventType is specified, all callbacks\r\n * for the `Reference` will be removed.\r\n *\r\n * Individual listeners can also be removed by invoking their unsubscribe\r\n * callbacks.\r\n *\r\n * @param query - The query that the listener was registered with.\r\n * @param eventType - One of the following strings: \"value\", \"child_added\",\r\n * \"child_changed\", \"child_removed\", or \"child_moved.\" If omitted, all callbacks\r\n * for the `Reference` will be removed.\r\n * @param callback - The callback function that was passed to `on()` or\r\n * `undefined` to remove all callbacks.\r\n */\r\nfunction off(query, eventType, callback) {\r\n var container = null;\r\n var expCallback = callback ? new CallbackContext(callback) : null;\r\n if (eventType === 'value') {\r\n container = new ValueEventRegistration(expCallback);\r\n }\r\n else if (eventType) {\r\n container = new ChildEventRegistration(eventType, expCallback);\r\n }\r\n repoRemoveEventCallbackForQuery(query._repo, query, container);\r\n}\r\n/**\r\n * A `QueryConstraint` is used to narrow the set of documents returned by a\r\n * Database query. `QueryConstraint`s are created by invoking {@link endAt},\r\n * {@link endBefore}, {@link startAt}, {@link startAfter}, {@link\r\n * limitToFirst}, {@link limitToLast}, {@link orderByChild},\r\n * {@link orderByChild}, {@link orderByKey} , {@link orderByPriority} ,\r\n * {@link orderByValue} or {@link equalTo} and\r\n * can then be passed to {@link query} to create a new query instance that\r\n * also contains this `QueryConstraint`.\r\n */\r\nvar QueryConstraint = /** @class */ (function () {\r\n function QueryConstraint() {\r\n }\r\n return QueryConstraint;\r\n}());\r\nvar QueryEndAtConstraint = /** @class */ (function (_super) {\r\n __extends(QueryEndAtConstraint, _super);\r\n function QueryEndAtConstraint(_value, _key) {\r\n var _this = _super.call(this) || this;\r\n _this._value = _value;\r\n _this._key = _key;\r\n return _this;\r\n }\r\n QueryEndAtConstraint.prototype._apply = function (query) {\r\n validateFirebaseDataArg('endAt', this._value, query._path, true);\r\n var newParams = queryParamsEndAt(query._queryParams, this._value, this._key);\r\n validateLimit(newParams);\r\n validateQueryEndpoints(newParams);\r\n if (query._queryParams.hasEnd()) {\r\n throw new Error('endAt: Starting point was already set (by another call to endAt, ' +\r\n 'endBefore or equalTo).');\r\n }\r\n return new QueryImpl(query._repo, query._path, newParams, query._orderByCalled);\r\n };\r\n return QueryEndAtConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a `QueryConstraint` with the specified ending point.\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The ending point is inclusive, so children with exactly the specified value\r\n * will be included in the query. The optional key argument can be used to\r\n * further limit the range of the query. If it is specified, then children that\r\n * have exactly the specified value must also have a key name less than or equal\r\n * to the specified key.\r\n *\r\n * You can read more about `endAt()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param value - The value to end at. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to end at, among the children with the previously\r\n * specified priority. This argument is only allowed if ordering by child,\r\n * value, or priority.\r\n */\r\nfunction endAt(value, key) {\r\n validateKey('endAt', 'key', key, true);\r\n return new QueryEndAtConstraint(value, key);\r\n}\r\nvar QueryEndBeforeConstraint = /** @class */ (function (_super) {\r\n __extends(QueryEndBeforeConstraint, _super);\r\n function QueryEndBeforeConstraint(_value, _key) {\r\n var _this = _super.call(this) || this;\r\n _this._value = _value;\r\n _this._key = _key;\r\n return _this;\r\n }\r\n QueryEndBeforeConstraint.prototype._apply = function (query) {\r\n validateFirebaseDataArg('endBefore', this._value, query._path, false);\r\n var newParams = queryParamsEndBefore(query._queryParams, this._value, this._key);\r\n validateLimit(newParams);\r\n validateQueryEndpoints(newParams);\r\n if (query._queryParams.hasEnd()) {\r\n throw new Error('endBefore: Starting point was already set (by another call to endAt, ' +\r\n 'endBefore or equalTo).');\r\n }\r\n return new QueryImpl(query._repo, query._path, newParams, query._orderByCalled);\r\n };\r\n return QueryEndBeforeConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a `QueryConstraint` with the specified ending point (exclusive).\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The ending point is exclusive. If only a value is provided, children\r\n * with a value less than the specified value will be included in the query.\r\n * If a key is specified, then children must have a value lesss than or equal\r\n * to the specified value and a a key name less than the specified key.\r\n *\r\n * @param value - The value to end before. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to end before, among the children with the\r\n * previously specified priority. This argument is only allowed if ordering by\r\n * child, value, or priority.\r\n */\r\nfunction endBefore(value, key) {\r\n validateKey('endBefore', 'key', key, true);\r\n return new QueryEndBeforeConstraint(value, key);\r\n}\r\nvar QueryStartAtConstraint = /** @class */ (function (_super) {\r\n __extends(QueryStartAtConstraint, _super);\r\n function QueryStartAtConstraint(_value, _key) {\r\n var _this = _super.call(this) || this;\r\n _this._value = _value;\r\n _this._key = _key;\r\n return _this;\r\n }\r\n QueryStartAtConstraint.prototype._apply = function (query) {\r\n validateFirebaseDataArg('startAt', this._value, query._path, true);\r\n var newParams = queryParamsStartAt(query._queryParams, this._value, this._key);\r\n validateLimit(newParams);\r\n validateQueryEndpoints(newParams);\r\n if (query._queryParams.hasStart()) {\r\n throw new Error('startAt: Starting point was already set (by another call to startAt, ' +\r\n 'startBefore or equalTo).');\r\n }\r\n return new QueryImpl(query._repo, query._path, newParams, query._orderByCalled);\r\n };\r\n return QueryStartAtConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a `QueryConstraint` with the specified starting point.\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The starting point is inclusive, so children with exactly the specified value\r\n * will be included in the query. The optional key argument can be used to\r\n * further limit the range of the query. If it is specified, then children that\r\n * have exactly the specified value must also have a key name greater than or\r\n * equal to the specified key.\r\n *\r\n * You can read more about `startAt()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param value - The value to start at. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to start at. This argument is only allowed if\r\n * ordering by child, value, or priority.\r\n */\r\nfunction startAt(value, key) {\r\n if (value === void 0) { value = null; }\r\n validateKey('startAt', 'key', key, true);\r\n return new QueryStartAtConstraint(value, key);\r\n}\r\nvar QueryStartAfterConstraint = /** @class */ (function (_super) {\r\n __extends(QueryStartAfterConstraint, _super);\r\n function QueryStartAfterConstraint(_value, _key) {\r\n var _this = _super.call(this) || this;\r\n _this._value = _value;\r\n _this._key = _key;\r\n return _this;\r\n }\r\n QueryStartAfterConstraint.prototype._apply = function (query) {\r\n validateFirebaseDataArg('startAfter', this._value, query._path, false);\r\n var newParams = queryParamsStartAfter(query._queryParams, this._value, this._key);\r\n validateLimit(newParams);\r\n validateQueryEndpoints(newParams);\r\n if (query._queryParams.hasStart()) {\r\n throw new Error('startAfter: Starting point was already set (by another call to startAt, ' +\r\n 'startAfter, or equalTo).');\r\n }\r\n return new QueryImpl(query._repo, query._path, newParams, query._orderByCalled);\r\n };\r\n return QueryStartAfterConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a `QueryConstraint` with the specified starting point (exclusive).\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The starting point is exclusive. If only a value is provided, children\r\n * with a value greater than the specified value will be included in the query.\r\n * If a key is specified, then children must have a value greater than or equal\r\n * to the specified value and a a key name greater than the specified key.\r\n *\r\n * @param value - The value to start after. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to start after. This argument is only allowed if\r\n * ordering by child, value, or priority.\r\n */\r\nfunction startAfter(value, key) {\r\n validateKey('startAfter', 'key', key, true);\r\n return new QueryStartAfterConstraint(value, key);\r\n}\r\nvar QueryLimitToFirstConstraint = /** @class */ (function (_super) {\r\n __extends(QueryLimitToFirstConstraint, _super);\r\n function QueryLimitToFirstConstraint(_limit) {\r\n var _this = _super.call(this) || this;\r\n _this._limit = _limit;\r\n return _this;\r\n }\r\n QueryLimitToFirstConstraint.prototype._apply = function (query) {\r\n if (query._queryParams.hasLimit()) {\r\n throw new Error('limitToFirst: Limit was already set (by another call to limitToFirst ' +\r\n 'or limitToLast).');\r\n }\r\n return new QueryImpl(query._repo, query._path, queryParamsLimitToFirst(query._queryParams, this._limit), query._orderByCalled);\r\n };\r\n return QueryLimitToFirstConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a new `QueryConstraint` that if limited to the first specific number\r\n * of children.\r\n *\r\n * The `limitToFirst()` method is used to set a maximum number of children to be\r\n * synced for a given callback. If we set a limit of 100, we will initially only\r\n * receive up to 100 `child_added` events. If we have fewer than 100 messages\r\n * stored in our Database, a `child_added` event will fire for each message.\r\n * However, if we have over 100 messages, we will only receive a `child_added`\r\n * event for the first 100 ordered messages. As items change, we will receive\r\n * `child_removed` events for each item that drops out of the active list so\r\n * that the total number stays at 100.\r\n *\r\n * You can read more about `limitToFirst()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param limit - The maximum number of nodes to include in this query.\r\n */\r\nfunction limitToFirst(limit) {\r\n if (typeof limit !== 'number' || Math.floor(limit) !== limit || limit <= 0) {\r\n throw new Error('limitToFirst: First argument must be a positive integer.');\r\n }\r\n return new QueryLimitToFirstConstraint(limit);\r\n}\r\nvar QueryLimitToLastConstraint = /** @class */ (function (_super) {\r\n __extends(QueryLimitToLastConstraint, _super);\r\n function QueryLimitToLastConstraint(_limit) {\r\n var _this = _super.call(this) || this;\r\n _this._limit = _limit;\r\n return _this;\r\n }\r\n QueryLimitToLastConstraint.prototype._apply = function (query) {\r\n if (query._queryParams.hasLimit()) {\r\n throw new Error('limitToLast: Limit was already set (by another call to limitToFirst ' +\r\n 'or limitToLast).');\r\n }\r\n return new QueryImpl(query._repo, query._path, queryParamsLimitToLast(query._queryParams, this._limit), query._orderByCalled);\r\n };\r\n return QueryLimitToLastConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a new `QueryConstraint` that is limited to return only the last\r\n * specified number of children.\r\n *\r\n * The `limitToLast()` method is used to set a maximum number of children to be\r\n * synced for a given callback. If we set a limit of 100, we will initially only\r\n * receive up to 100 `child_added` events. If we have fewer than 100 messages\r\n * stored in our Database, a `child_added` event will fire for each message.\r\n * However, if we have over 100 messages, we will only receive a `child_added`\r\n * event for the last 100 ordered messages. As items change, we will receive\r\n * `child_removed` events for each item that drops out of the active list so\r\n * that the total number stays at 100.\r\n *\r\n * You can read more about `limitToLast()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param limit - The maximum number of nodes to include in this query.\r\n */\r\nfunction limitToLast(limit) {\r\n if (typeof limit !== 'number' || Math.floor(limit) !== limit || limit <= 0) {\r\n throw new Error('limitToLast: First argument must be a positive integer.');\r\n }\r\n return new QueryLimitToLastConstraint(limit);\r\n}\r\nvar QueryOrderByChildConstraint = /** @class */ (function (_super) {\r\n __extends(QueryOrderByChildConstraint, _super);\r\n function QueryOrderByChildConstraint(_path) {\r\n var _this = _super.call(this) || this;\r\n _this._path = _path;\r\n return _this;\r\n }\r\n QueryOrderByChildConstraint.prototype._apply = function (query) {\r\n validateNoPreviousOrderByCall(query, 'orderByChild');\r\n var parsedPath = new Path(this._path);\r\n if (pathIsEmpty(parsedPath)) {\r\n throw new Error('orderByChild: cannot pass in empty path. Use orderByValue() instead.');\r\n }\r\n var index = new PathIndex(parsedPath);\r\n var newParams = queryParamsOrderBy(query._queryParams, index);\r\n validateQueryEndpoints(newParams);\r\n return new QueryImpl(query._repo, query._path, newParams, \r\n /*orderByCalled=*/ true);\r\n };\r\n return QueryOrderByChildConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a new `QueryConstraint` that orders by the specified child key.\r\n *\r\n * Queries can only order by one key at a time. Calling `orderByChild()`\r\n * multiple times on the same query is an error.\r\n *\r\n * Firebase queries allow you to order your data by any child key on the fly.\r\n * However, if you know in advance what your indexes will be, you can define\r\n * them via the .indexOn rule in your Security Rules for better performance. See\r\n * the{@link https://firebase.google.com/docs/database/security/indexing-data}\r\n * rule for more information.\r\n *\r\n * You can read more about `orderByChild()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\r\n *\r\n * @param path - The path to order by.\r\n */\r\nfunction orderByChild(path) {\r\n if (path === '$key') {\r\n throw new Error('orderByChild: \"$key\" is invalid. Use orderByKey() instead.');\r\n }\r\n else if (path === '$priority') {\r\n throw new Error('orderByChild: \"$priority\" is invalid. Use orderByPriority() instead.');\r\n }\r\n else if (path === '$value') {\r\n throw new Error('orderByChild: \"$value\" is invalid. Use orderByValue() instead.');\r\n }\r\n validatePathString('orderByChild', 'path', path, false);\r\n return new QueryOrderByChildConstraint(path);\r\n}\r\nvar QueryOrderByKeyConstraint = /** @class */ (function (_super) {\r\n __extends(QueryOrderByKeyConstraint, _super);\r\n function QueryOrderByKeyConstraint() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n QueryOrderByKeyConstraint.prototype._apply = function (query) {\r\n validateNoPreviousOrderByCall(query, 'orderByKey');\r\n var newParams = queryParamsOrderBy(query._queryParams, KEY_INDEX);\r\n validateQueryEndpoints(newParams);\r\n return new QueryImpl(query._repo, query._path, newParams, \r\n /*orderByCalled=*/ true);\r\n };\r\n return QueryOrderByKeyConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a new `QueryConstraint` that orders by the key.\r\n *\r\n * Sorts the results of a query by their (ascending) key values.\r\n *\r\n * You can read more about `orderByKey()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\r\n */\r\nfunction orderByKey() {\r\n return new QueryOrderByKeyConstraint();\r\n}\r\nvar QueryOrderByPriorityConstraint = /** @class */ (function (_super) {\r\n __extends(QueryOrderByPriorityConstraint, _super);\r\n function QueryOrderByPriorityConstraint() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n QueryOrderByPriorityConstraint.prototype._apply = function (query) {\r\n validateNoPreviousOrderByCall(query, 'orderByPriority');\r\n var newParams = queryParamsOrderBy(query._queryParams, PRIORITY_INDEX);\r\n validateQueryEndpoints(newParams);\r\n return new QueryImpl(query._repo, query._path, newParams, \r\n /*orderByCalled=*/ true);\r\n };\r\n return QueryOrderByPriorityConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a new `QueryConstraint` that orders by priority.\r\n *\r\n * Applications need not use priority but can order collections by\r\n * ordinary properties (see\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}\r\n * for alternatives to priority.\r\n */\r\nfunction orderByPriority() {\r\n return new QueryOrderByPriorityConstraint();\r\n}\r\nvar QueryOrderByValueConstraint = /** @class */ (function (_super) {\r\n __extends(QueryOrderByValueConstraint, _super);\r\n function QueryOrderByValueConstraint() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n QueryOrderByValueConstraint.prototype._apply = function (query) {\r\n validateNoPreviousOrderByCall(query, 'orderByValue');\r\n var newParams = queryParamsOrderBy(query._queryParams, VALUE_INDEX);\r\n validateQueryEndpoints(newParams);\r\n return new QueryImpl(query._repo, query._path, newParams, \r\n /*orderByCalled=*/ true);\r\n };\r\n return QueryOrderByValueConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a new `QueryConstraint` that orders by value.\r\n *\r\n * If the children of a query are all scalar values (string, number, or\r\n * boolean), you can order the results by their (ascending) values.\r\n *\r\n * You can read more about `orderByValue()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\r\n */\r\nfunction orderByValue() {\r\n return new QueryOrderByValueConstraint();\r\n}\r\nvar QueryEqualToValueConstraint = /** @class */ (function (_super) {\r\n __extends(QueryEqualToValueConstraint, _super);\r\n function QueryEqualToValueConstraint(_value, _key) {\r\n var _this = _super.call(this) || this;\r\n _this._value = _value;\r\n _this._key = _key;\r\n return _this;\r\n }\r\n QueryEqualToValueConstraint.prototype._apply = function (query) {\r\n validateFirebaseDataArg('equalTo', this._value, query._path, false);\r\n if (query._queryParams.hasStart()) {\r\n throw new Error('equalTo: Starting point was already set (by another call to startAt/startAfter or ' +\r\n 'equalTo).');\r\n }\r\n if (query._queryParams.hasEnd()) {\r\n throw new Error('equalTo: Ending point was already set (by another call to endAt/endBefore or ' +\r\n 'equalTo).');\r\n }\r\n return new QueryEndAtConstraint(this._value, this._key)._apply(new QueryStartAtConstraint(this._value, this._key)._apply(query));\r\n };\r\n return QueryEqualToValueConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a `QueryConstraint` that includes children that match the specified\r\n * value.\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The optional key argument can be used to further limit the range of the\r\n * query. If it is specified, then children that have exactly the specified\r\n * value must also have exactly the specified key as their key name. This can be\r\n * used to filter result sets with many matches for the same value.\r\n *\r\n * You can read more about `equalTo()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param value - The value to match for. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to start at, among the children with the\r\n * previously specified priority. This argument is only allowed if ordering by\r\n * child, value, or priority.\r\n */\r\nfunction equalTo(value, key) {\r\n validateKey('equalTo', 'key', key, true);\r\n return new QueryEqualToValueConstraint(value, key);\r\n}\r\n/**\r\n * Creates a new immutable instance of `Query` that is extended to also include\r\n * additional query constraints.\r\n *\r\n * @param query - The Query instance to use as a base for the new constraints.\r\n * @param queryConstraints - The list of `QueryConstraint`s to apply.\r\n * @throws if any of the provided query constraints cannot be combined with the\r\n * existing or new constraints.\r\n */\r\nfunction query(query) {\r\n var e_1, _a;\r\n var queryConstraints = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n queryConstraints[_i - 1] = arguments[_i];\r\n }\r\n var queryImpl = getModularInstance(query);\r\n try {\r\n for (var queryConstraints_1 = __values(queryConstraints), queryConstraints_1_1 = queryConstraints_1.next(); !queryConstraints_1_1.done; queryConstraints_1_1 = queryConstraints_1.next()) {\r\n var constraint = queryConstraints_1_1.value;\r\n queryImpl = constraint._apply(queryImpl);\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (queryConstraints_1_1 && !queryConstraints_1_1.done && (_a = queryConstraints_1.return)) _a.call(queryConstraints_1);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n return queryImpl;\r\n}\r\n/**\r\n * Define reference constructor in various modules\r\n *\r\n * We are doing this here to avoid several circular\r\n * dependency issues\r\n */\r\nsyncPointSetReferenceConstructor(ReferenceImpl);\r\nsyncTreeSetReferenceConstructor(ReferenceImpl);\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * This variable is also defined in the firebase node.js admin SDK. Before\r\n * modifying this definition, consult the definition in:\r\n *\r\n * https://github.com/firebase/firebase-admin-node\r\n *\r\n * and make sure the two are consistent.\r\n */\r\nvar FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST';\r\n/**\r\n * Creates and caches Repo instances.\r\n */\r\nvar repos = {};\r\n/**\r\n * If true, new Repos will be created to use ReadonlyRestClient (for testing purposes).\r\n */\r\nvar useRestClient = false;\r\n/**\r\n * Update an existing repo in place to point to a new host/port.\r\n */\r\nfunction repoManagerApplyEmulatorSettings(repo, host, port, tokenProvider) {\r\n repo.repoInfo_ = new RepoInfo(host + \":\" + port, \r\n /* secure= */ false, repo.repoInfo_.namespace, repo.repoInfo_.webSocketOnly, repo.repoInfo_.nodeAdmin, repo.repoInfo_.persistenceKey, repo.repoInfo_.includeNamespaceInQueryParams);\r\n if (tokenProvider) {\r\n repo.authTokenProvider_ = tokenProvider;\r\n }\r\n}\r\n/**\r\n * This function should only ever be called to CREATE a new database instance.\r\n * @internal\r\n */\r\nfunction repoManagerDatabaseFromApp(app, authProvider, appCheckProvider, url, nodeAdmin) {\r\n var dbUrl = url || app.options.databaseURL;\r\n if (dbUrl === undefined) {\r\n if (!app.options.projectId) {\r\n fatal(\"Can't determine Firebase Database URL. Be sure to include \" +\r\n ' a Project ID when calling firebase.initializeApp().');\r\n }\r\n log('Using default host for project ', app.options.projectId);\r\n dbUrl = app.options.projectId + \"-default-rtdb.firebaseio.com\";\r\n }\r\n var parsedUrl = parseRepoInfo(dbUrl, nodeAdmin);\r\n var repoInfo = parsedUrl.repoInfo;\r\n var isEmulator;\r\n var dbEmulatorHost = undefined;\r\n if (typeof process !== 'undefined') {\r\n dbEmulatorHost = process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR];\r\n }\r\n if (dbEmulatorHost) {\r\n isEmulator = true;\r\n dbUrl = \"http://\" + dbEmulatorHost + \"?ns=\" + repoInfo.namespace;\r\n parsedUrl = parseRepoInfo(dbUrl, nodeAdmin);\r\n repoInfo = parsedUrl.repoInfo;\r\n }\r\n else {\r\n isEmulator = !parsedUrl.repoInfo.secure;\r\n }\r\n var authTokenProvider = nodeAdmin && isEmulator\r\n ? new EmulatorTokenProvider(EmulatorTokenProvider.OWNER)\r\n : new FirebaseAuthTokenProvider(app.name, app.options, authProvider);\r\n validateUrl('Invalid Firebase Database URL', parsedUrl);\r\n if (!pathIsEmpty(parsedUrl.path)) {\r\n fatal('Database URL must point to the root of a Firebase Database ' +\r\n '(not including a child path).');\r\n }\r\n var repo = repoManagerCreateRepo(repoInfo, app, authTokenProvider, new AppCheckTokenProvider(app.name, appCheckProvider));\r\n return new Database$1(repo, app);\r\n}\r\n/**\r\n * Remove the repo and make sure it is disconnected.\r\n *\r\n */\r\nfunction repoManagerDeleteRepo(repo, appName) {\r\n var appRepos = repos[appName];\r\n // This should never happen...\r\n if (!appRepos || appRepos[repo.key] !== repo) {\r\n fatal(\"Database \" + appName + \"(\" + repo.repoInfo_ + \") has already been deleted.\");\r\n }\r\n repoInterrupt(repo);\r\n delete appRepos[repo.key];\r\n}\r\n/**\r\n * Ensures a repo doesn't already exist and then creates one using the\r\n * provided app.\r\n *\r\n * @param repoInfo - The metadata about the Repo\r\n * @returns The Repo object for the specified server / repoName.\r\n */\r\nfunction repoManagerCreateRepo(repoInfo, app, authTokenProvider, appCheckProvider) {\r\n var appRepos = repos[app.name];\r\n if (!appRepos) {\r\n appRepos = {};\r\n repos[app.name] = appRepos;\r\n }\r\n var repo = appRepos[repoInfo.toURLString()];\r\n if (repo) {\r\n fatal('Database initialized multiple times. Please make sure the format of the database URL matches with each database() call.');\r\n }\r\n repo = new Repo(repoInfo, useRestClient, authTokenProvider, appCheckProvider);\r\n appRepos[repoInfo.toURLString()] = repo;\r\n return repo;\r\n}\r\n/**\r\n * Forces us to use ReadonlyRestClient instead of PersistentConnection for new Repos.\r\n */\r\nfunction repoManagerForceRestClient(forceRestClient) {\r\n useRestClient = forceRestClient;\r\n}\r\n/**\r\n * Class representing a Firebase Realtime Database.\r\n */\r\nvar Database$1 = /** @class */ (function () {\r\n /** @hideconstructor */\r\n function Database(_repoInternal, \r\n /** The FirebaseApp associated with this Realtime Database instance. */\r\n app) {\r\n this._repoInternal = _repoInternal;\r\n this.app = app;\r\n /** Represents a database instance. */\r\n this['type'] = 'database';\r\n /** Track if the instance has been used (root or repo accessed) */\r\n this._instanceStarted = false;\r\n }\r\n Object.defineProperty(Database.prototype, \"_repo\", {\r\n get: function () {\r\n if (!this._instanceStarted) {\r\n repoStart(this._repoInternal, this.app.options.appId, this.app.options['databaseAuthVariableOverride']);\r\n this._instanceStarted = true;\r\n }\r\n return this._repoInternal;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(Database.prototype, \"_root\", {\r\n get: function () {\r\n if (!this._rootInternal) {\r\n this._rootInternal = new ReferenceImpl(this._repo, newEmptyPath());\r\n }\r\n return this._rootInternal;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Database.prototype._delete = function () {\r\n if (this._rootInternal !== null) {\r\n repoManagerDeleteRepo(this._repo, this.app.name);\r\n this._repoInternal = null;\r\n this._rootInternal = null;\r\n }\r\n return Promise.resolve();\r\n };\r\n Database.prototype._checkNotDeleted = function (apiName) {\r\n if (this._rootInternal === null) {\r\n fatal('Cannot call ' + apiName + ' on a deleted database.');\r\n }\r\n };\r\n return Database;\r\n}());\r\n/**\r\n * Modify the provided instance to communicate with the Realtime Database\r\n * emulator.\r\n *\r\n *

Note: This method must be called before performing any other operation.\r\n *\r\n * @param db - The instance to modify.\r\n * @param host - The emulator host (ex: localhost)\r\n * @param port - The emulator port (ex: 8080)\r\n * @param options.mockUserToken - the mock auth token to use for unit testing Security Rules\r\n */\r\nfunction connectDatabaseEmulator(db, host, port, options) {\r\n if (options === void 0) { options = {}; }\r\n db = getModularInstance(db);\r\n db._checkNotDeleted('useEmulator');\r\n if (db._instanceStarted) {\r\n fatal('Cannot call useEmulator() after instance has already been initialized.');\r\n }\r\n var repo = db._repoInternal;\r\n var tokenProvider = undefined;\r\n if (repo.repoInfo_.nodeAdmin) {\r\n if (options.mockUserToken) {\r\n fatal('mockUserToken is not supported by the Admin SDK. For client access with mock users, please use the \"firebase\" package instead of \"firebase-admin\".');\r\n }\r\n tokenProvider = new EmulatorTokenProvider(EmulatorTokenProvider.OWNER);\r\n }\r\n else if (options.mockUserToken) {\r\n var token = typeof options.mockUserToken === 'string'\r\n ? options.mockUserToken\r\n : createMockUserToken(options.mockUserToken, db.app.options.projectId);\r\n tokenProvider = new EmulatorTokenProvider(token);\r\n }\r\n // Modify the repo to apply emulator settings\r\n repoManagerApplyEmulatorSettings(repo, host, port, tokenProvider);\r\n}\r\n/**\r\n * Disconnects from the server (all Database operations will be completed\r\n * offline).\r\n *\r\n * The client automatically maintains a persistent connection to the Database\r\n * server, which will remain active indefinitely and reconnect when\r\n * disconnected. However, the `goOffline()` and `goOnline()` methods may be used\r\n * to control the client connection in cases where a persistent connection is\r\n * undesirable.\r\n *\r\n * While offline, the client will no longer receive data updates from the\r\n * Database. However, all Database operations performed locally will continue to\r\n * immediately fire events, allowing your application to continue behaving\r\n * normally. Additionally, each operation performed locally will automatically\r\n * be queued and retried upon reconnection to the Database server.\r\n *\r\n * To reconnect to the Database and begin receiving remote events, see\r\n * `goOnline()`.\r\n *\r\n * @param db - The instance to disconnect.\r\n */\r\nfunction goOffline(db) {\r\n db = getModularInstance(db);\r\n db._checkNotDeleted('goOffline');\r\n repoInterrupt(db._repo);\r\n}\r\n/**\r\n * Reconnects to the server and synchronizes the offline Database state\r\n * with the server state.\r\n *\r\n * This method should be used after disabling the active connection with\r\n * `goOffline()`. Once reconnected, the client will transmit the proper data\r\n * and fire the appropriate events so that your client \"catches up\"\r\n * automatically.\r\n *\r\n * @param db - The instance to reconnect.\r\n */\r\nfunction goOnline(db) {\r\n db = getModularInstance(db);\r\n db._checkNotDeleted('goOnline');\r\n repoResume(db._repo);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar SERVER_TIMESTAMP = {\r\n '.sv': 'timestamp'\r\n};\r\n/**\r\n * Returns a placeholder value for auto-populating the current timestamp (time\r\n * since the Unix epoch, in milliseconds) as determined by the Firebase\r\n * servers.\r\n */\r\nfunction serverTimestamp() {\r\n return SERVER_TIMESTAMP;\r\n}\r\n/**\r\n * Returns a placeholder value that can be used to atomically increment the\r\n * current database value by the provided delta.\r\n *\r\n * @param delta - the amount to modify the current value atomically.\r\n * @returns A placeholder value for modifying data atomically server-side.\r\n */\r\nfunction increment(delta) {\r\n return {\r\n '.sv': {\r\n 'increment': delta\r\n }\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A type for the resolve value of Firebase.transaction.\r\n */\r\nvar TransactionResult$1 = /** @class */ (function () {\r\n /** @hideconstructor */\r\n function TransactionResult(\r\n /** Whether the transaction was successfully committed. */\r\n committed, \r\n /** The resulting data snapshot. */\r\n snapshot) {\r\n this.committed = committed;\r\n this.snapshot = snapshot;\r\n }\r\n /** Returns a JSON-serializable representation of this object. */\r\n TransactionResult.prototype.toJSON = function () {\r\n return { committed: this.committed, snapshot: this.snapshot.toJSON() };\r\n };\r\n return TransactionResult;\r\n}());\r\n/**\r\n * Atomically modifies the data at this location.\r\n *\r\n * Atomically modify the data at this location. Unlike a normal `set()`, which\r\n * just overwrites the data regardless of its previous value, `transaction()` is\r\n * used to modify the existing value to a new value, ensuring there are no\r\n * conflicts with other clients writing to the same location at the same time.\r\n *\r\n * To accomplish this, you pass `runTransaction()` an update function which is\r\n * used to transform the current value into a new value. If another client\r\n * writes to the location before your new value is successfully written, your\r\n * update function will be called again with the new current value, and the\r\n * write will be retried. This will happen repeatedly until your write succeeds\r\n * without conflict or you abort the transaction by not returning a value from\r\n * your update function.\r\n *\r\n * Note: Modifying data with `set()` will cancel any pending transactions at\r\n * that location, so extreme care should be taken if mixing `set()` and\r\n * `transaction()` to update the same data.\r\n *\r\n * Note: When using transactions with Security and Firebase Rules in place, be\r\n * aware that a client needs `.read` access in addition to `.write` access in\r\n * order to perform a transaction. This is because the client-side nature of\r\n * transactions requires the client to read the data in order to transactionally\r\n * update it.\r\n *\r\n * @param ref - The location to atomically modify.\r\n * @param transactionUpdate - A developer-supplied function which will be passed\r\n * the current data stored at this location (as a JavaScript object). The\r\n * function should return the new value it would like written (as a JavaScript\r\n * object). If `undefined` is returned (i.e. you return with no arguments) the\r\n * transaction will be aborted and the data at this location will not be\r\n * modified.\r\n * @param options - An options object to configure transactions.\r\n * @returns A Promise that can optionally be used instead of the onComplete\r\n * callback to handle success and failure.\r\n */\r\nfunction runTransaction(ref, \r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntransactionUpdate, options) {\r\n var _a;\r\n ref = getModularInstance(ref);\r\n validateWritablePath('Reference.transaction', ref._path);\r\n if (ref.key === '.length' || ref.key === '.keys') {\r\n throw ('Reference.transaction failed: ' + ref.key + ' is a read-only object.');\r\n }\r\n var applyLocally = (_a = options === null || options === void 0 ? void 0 : options.applyLocally) !== null && _a !== void 0 ? _a : true;\r\n var deferred = new Deferred();\r\n var promiseComplete = function (error, committed, node) {\r\n var dataSnapshot = null;\r\n if (error) {\r\n deferred.reject(error);\r\n }\r\n else {\r\n dataSnapshot = new DataSnapshot$1(node, new ReferenceImpl(ref._repo, ref._path), PRIORITY_INDEX);\r\n deferred.resolve(new TransactionResult$1(committed, dataSnapshot));\r\n }\r\n };\r\n // Add a watch to make sure we get server updates.\r\n var unwatcher = onValue(ref, function () { });\r\n repoStartTransaction(ref._repo, ref._path, transactionUpdate, promiseComplete, unwatcher, applyLocally);\r\n return deferred.promise;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar OnDisconnect = /** @class */ (function () {\r\n function OnDisconnect(_delegate) {\r\n this._delegate = _delegate;\r\n }\r\n OnDisconnect.prototype.cancel = function (onComplete) {\r\n validateArgCount('OnDisconnect.cancel', 0, 1, arguments.length);\r\n validateCallback('OnDisconnect.cancel', 'onComplete', onComplete, true);\r\n var result = this._delegate.cancel();\r\n if (onComplete) {\r\n result.then(function () { return onComplete(null); }, function (error) { return onComplete(error); });\r\n }\r\n return result;\r\n };\r\n OnDisconnect.prototype.remove = function (onComplete) {\r\n validateArgCount('OnDisconnect.remove', 0, 1, arguments.length);\r\n validateCallback('OnDisconnect.remove', 'onComplete', onComplete, true);\r\n var result = this._delegate.remove();\r\n if (onComplete) {\r\n result.then(function () { return onComplete(null); }, function (error) { return onComplete(error); });\r\n }\r\n return result;\r\n };\r\n OnDisconnect.prototype.set = function (value, onComplete) {\r\n validateArgCount('OnDisconnect.set', 1, 2, arguments.length);\r\n validateCallback('OnDisconnect.set', 'onComplete', onComplete, true);\r\n var result = this._delegate.set(value);\r\n if (onComplete) {\r\n result.then(function () { return onComplete(null); }, function (error) { return onComplete(error); });\r\n }\r\n return result;\r\n };\r\n OnDisconnect.prototype.setWithPriority = function (value, priority, onComplete) {\r\n validateArgCount('OnDisconnect.setWithPriority', 2, 3, arguments.length);\r\n validateCallback('OnDisconnect.setWithPriority', 'onComplete', onComplete, true);\r\n var result = this._delegate.setWithPriority(value, priority);\r\n if (onComplete) {\r\n result.then(function () { return onComplete(null); }, function (error) { return onComplete(error); });\r\n }\r\n return result;\r\n };\r\n OnDisconnect.prototype.update = function (objectToMerge, onComplete) {\r\n validateArgCount('OnDisconnect.update', 1, 2, arguments.length);\r\n if (Array.isArray(objectToMerge)) {\r\n var newObjectToMerge = {};\r\n for (var i = 0; i < objectToMerge.length; ++i) {\r\n newObjectToMerge['' + i] = objectToMerge[i];\r\n }\r\n objectToMerge = newObjectToMerge;\r\n warn('Passing an Array to firebase.database.onDisconnect().update() is deprecated. Use set() if you want to overwrite the ' +\r\n 'existing data, or an Object with integer keys if you really do want to only update some of the children.');\r\n }\r\n validateCallback('OnDisconnect.update', 'onComplete', onComplete, true);\r\n var result = this._delegate.update(objectToMerge);\r\n if (onComplete) {\r\n result.then(function () { return onComplete(null); }, function (error) { return onComplete(error); });\r\n }\r\n return result;\r\n };\r\n return OnDisconnect;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar TransactionResult = /** @class */ (function () {\r\n /**\r\n * A type for the resolve value of Firebase.transaction.\r\n */\r\n function TransactionResult(committed, snapshot) {\r\n this.committed = committed;\r\n this.snapshot = snapshot;\r\n }\r\n // Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary\r\n // for end-users\r\n TransactionResult.prototype.toJSON = function () {\r\n validateArgCount('TransactionResult.toJSON', 0, 1, arguments.length);\r\n return { committed: this.committed, snapshot: this.snapshot.toJSON() };\r\n };\r\n return TransactionResult;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/* eslint-enable @typescript-eslint/no-explicit-any */\r\n/**\r\n * Class representing a firebase data snapshot. It wraps a SnapshotNode and\r\n * surfaces the public methods (val, forEach, etc.) we want to expose.\r\n */\r\nvar DataSnapshot = /** @class */ (function () {\r\n function DataSnapshot(_database, _delegate) {\r\n this._database = _database;\r\n this._delegate = _delegate;\r\n }\r\n /**\r\n * Retrieves the snapshot contents as JSON. Returns null if the snapshot is\r\n * empty.\r\n *\r\n * @returns JSON representation of the DataSnapshot contents, or null if empty.\r\n */\r\n DataSnapshot.prototype.val = function () {\r\n validateArgCount('DataSnapshot.val', 0, 0, arguments.length);\r\n return this._delegate.val();\r\n };\r\n /**\r\n * Returns the snapshot contents as JSON, including priorities of node. Suitable for exporting\r\n * the entire node contents.\r\n * @returns JSON representation of the DataSnapshot contents, or null if empty.\r\n */\r\n DataSnapshot.prototype.exportVal = function () {\r\n validateArgCount('DataSnapshot.exportVal', 0, 0, arguments.length);\r\n return this._delegate.exportVal();\r\n };\r\n // Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary\r\n // for end-users\r\n DataSnapshot.prototype.toJSON = function () {\r\n // Optional spacer argument is unnecessary because we're depending on recursion rather than stringifying the content\r\n validateArgCount('DataSnapshot.toJSON', 0, 1, arguments.length);\r\n return this._delegate.toJSON();\r\n };\r\n /**\r\n * Returns whether the snapshot contains a non-null value.\r\n *\r\n * @returns Whether the snapshot contains a non-null value, or is empty.\r\n */\r\n DataSnapshot.prototype.exists = function () {\r\n validateArgCount('DataSnapshot.exists', 0, 0, arguments.length);\r\n return this._delegate.exists();\r\n };\r\n /**\r\n * Returns a DataSnapshot of the specified child node's contents.\r\n *\r\n * @param path - Path to a child.\r\n * @returns DataSnapshot for child node.\r\n */\r\n DataSnapshot.prototype.child = function (path) {\r\n validateArgCount('DataSnapshot.child', 0, 1, arguments.length);\r\n // Ensure the childPath is a string (can be a number)\r\n path = String(path);\r\n validatePathString('DataSnapshot.child', 'path', path, false);\r\n return new DataSnapshot(this._database, this._delegate.child(path));\r\n };\r\n /**\r\n * Returns whether the snapshot contains a child at the specified path.\r\n *\r\n * @param path - Path to a child.\r\n * @returns Whether the child exists.\r\n */\r\n DataSnapshot.prototype.hasChild = function (path) {\r\n validateArgCount('DataSnapshot.hasChild', 1, 1, arguments.length);\r\n validatePathString('DataSnapshot.hasChild', 'path', path, false);\r\n return this._delegate.hasChild(path);\r\n };\r\n /**\r\n * Returns the priority of the object, or null if no priority was set.\r\n *\r\n * @returns The priority.\r\n */\r\n DataSnapshot.prototype.getPriority = function () {\r\n validateArgCount('DataSnapshot.getPriority', 0, 0, arguments.length);\r\n return this._delegate.priority;\r\n };\r\n /**\r\n * Iterates through child nodes and calls the specified action for each one.\r\n *\r\n * @param action - Callback function to be called\r\n * for each child.\r\n * @returns True if forEach was canceled by action returning true for\r\n * one of the child nodes.\r\n */\r\n DataSnapshot.prototype.forEach = function (action) {\r\n var _this = this;\r\n validateArgCount('DataSnapshot.forEach', 1, 1, arguments.length);\r\n validateCallback('DataSnapshot.forEach', 'action', action, false);\r\n return this._delegate.forEach(function (expDataSnapshot) {\r\n return action(new DataSnapshot(_this._database, expDataSnapshot));\r\n });\r\n };\r\n /**\r\n * Returns whether this DataSnapshot has children.\r\n * @returns True if the DataSnapshot contains 1 or more child nodes.\r\n */\r\n DataSnapshot.prototype.hasChildren = function () {\r\n validateArgCount('DataSnapshot.hasChildren', 0, 0, arguments.length);\r\n return this._delegate.hasChildren();\r\n };\r\n Object.defineProperty(DataSnapshot.prototype, \"key\", {\r\n get: function () {\r\n return this._delegate.key;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n /**\r\n * Returns the number of children for this DataSnapshot.\r\n * @returns The number of children that this DataSnapshot contains.\r\n */\r\n DataSnapshot.prototype.numChildren = function () {\r\n validateArgCount('DataSnapshot.numChildren', 0, 0, arguments.length);\r\n return this._delegate.size;\r\n };\r\n /**\r\n * @returns The Firebase reference for the location this snapshot's data came\r\n * from.\r\n */\r\n DataSnapshot.prototype.getRef = function () {\r\n validateArgCount('DataSnapshot.ref', 0, 0, arguments.length);\r\n return new Reference(this._database, this._delegate.ref);\r\n };\r\n Object.defineProperty(DataSnapshot.prototype, \"ref\", {\r\n get: function () {\r\n return this.getRef();\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n return DataSnapshot;\r\n}());\r\n/**\r\n * A Query represents a filter to be applied to a firebase location. This object purely represents the\r\n * query expression (and exposes our public API to build the query). The actual query logic is in ViewBase.js.\r\n *\r\n * Since every Firebase reference is a query, Firebase inherits from this object.\r\n */\r\nvar Query = /** @class */ (function () {\r\n function Query(database, _delegate) {\r\n this.database = database;\r\n this._delegate = _delegate;\r\n }\r\n Query.prototype.on = function (eventType, callback, cancelCallbackOrContext, context) {\r\n var _this = this;\r\n var _a;\r\n validateArgCount('Query.on', 2, 4, arguments.length);\r\n validateCallback('Query.on', 'callback', callback, false);\r\n var ret = Query.getCancelAndContextArgs_('Query.on', cancelCallbackOrContext, context);\r\n var valueCallback = function (expSnapshot, previousChildName) {\r\n callback.call(ret.context, new DataSnapshot(_this.database, expSnapshot), previousChildName);\r\n };\r\n valueCallback.userCallback = callback;\r\n valueCallback.context = ret.context;\r\n var cancelCallback = (_a = ret.cancel) === null || _a === void 0 ? void 0 : _a.bind(ret.context);\r\n switch (eventType) {\r\n case 'value':\r\n onValue(this._delegate, valueCallback, cancelCallback);\r\n return callback;\r\n case 'child_added':\r\n onChildAdded(this._delegate, valueCallback, cancelCallback);\r\n return callback;\r\n case 'child_removed':\r\n onChildRemoved(this._delegate, valueCallback, cancelCallback);\r\n return callback;\r\n case 'child_changed':\r\n onChildChanged(this._delegate, valueCallback, cancelCallback);\r\n return callback;\r\n case 'child_moved':\r\n onChildMoved(this._delegate, valueCallback, cancelCallback);\r\n return callback;\r\n default:\r\n throw new Error(errorPrefix('Query.on', 'eventType') +\r\n 'must be a valid event type = \"value\", \"child_added\", \"child_removed\", ' +\r\n '\"child_changed\", or \"child_moved\".');\r\n }\r\n };\r\n Query.prototype.off = function (eventType, callback, context) {\r\n validateArgCount('Query.off', 0, 3, arguments.length);\r\n validateEventType('Query.off', eventType, true);\r\n validateCallback('Query.off', 'callback', callback, true);\r\n validateContextObject('Query.off', 'context', context, true);\r\n if (callback) {\r\n var valueCallback = function () { };\r\n valueCallback.userCallback = callback;\r\n valueCallback.context = context;\r\n off(this._delegate, eventType, valueCallback);\r\n }\r\n else {\r\n off(this._delegate, eventType);\r\n }\r\n };\r\n /**\r\n * Get the server-value for this query, or return a cached value if not connected.\r\n */\r\n Query.prototype.get = function () {\r\n var _this = this;\r\n return get(this._delegate).then(function (expSnapshot) {\r\n return new DataSnapshot(_this.database, expSnapshot);\r\n });\r\n };\r\n /**\r\n * Attaches a listener, waits for the first event, and then removes the listener\r\n */\r\n Query.prototype.once = function (eventType, callback, failureCallbackOrContext, context) {\r\n var _this = this;\r\n validateArgCount('Query.once', 1, 4, arguments.length);\r\n validateCallback('Query.once', 'callback', callback, true);\r\n var ret = Query.getCancelAndContextArgs_('Query.once', failureCallbackOrContext, context);\r\n var deferred = new Deferred();\r\n var valueCallback = function (expSnapshot, previousChildName) {\r\n var result = new DataSnapshot(_this.database, expSnapshot);\r\n if (callback) {\r\n callback.call(ret.context, result, previousChildName);\r\n }\r\n deferred.resolve(result);\r\n };\r\n valueCallback.userCallback = callback;\r\n valueCallback.context = ret.context;\r\n var cancelCallback = function (error) {\r\n if (ret.cancel) {\r\n ret.cancel.call(ret.context, error);\r\n }\r\n deferred.reject(error);\r\n };\r\n switch (eventType) {\r\n case 'value':\r\n onValue(this._delegate, valueCallback, cancelCallback, {\r\n onlyOnce: true\r\n });\r\n break;\r\n case 'child_added':\r\n onChildAdded(this._delegate, valueCallback, cancelCallback, {\r\n onlyOnce: true\r\n });\r\n break;\r\n case 'child_removed':\r\n onChildRemoved(this._delegate, valueCallback, cancelCallback, {\r\n onlyOnce: true\r\n });\r\n break;\r\n case 'child_changed':\r\n onChildChanged(this._delegate, valueCallback, cancelCallback, {\r\n onlyOnce: true\r\n });\r\n break;\r\n case 'child_moved':\r\n onChildMoved(this._delegate, valueCallback, cancelCallback, {\r\n onlyOnce: true\r\n });\r\n break;\r\n default:\r\n throw new Error(errorPrefix('Query.once', 'eventType') +\r\n 'must be a valid event type = \"value\", \"child_added\", \"child_removed\", ' +\r\n '\"child_changed\", or \"child_moved\".');\r\n }\r\n return deferred.promise;\r\n };\r\n /**\r\n * Set a limit and anchor it to the start of the window.\r\n */\r\n Query.prototype.limitToFirst = function (limit) {\r\n validateArgCount('Query.limitToFirst', 1, 1, arguments.length);\r\n return new Query(this.database, query(this._delegate, limitToFirst(limit)));\r\n };\r\n /**\r\n * Set a limit and anchor it to the end of the window.\r\n */\r\n Query.prototype.limitToLast = function (limit) {\r\n validateArgCount('Query.limitToLast', 1, 1, arguments.length);\r\n return new Query(this.database, query(this._delegate, limitToLast(limit)));\r\n };\r\n /**\r\n * Given a child path, return a new query ordered by the specified grandchild path.\r\n */\r\n Query.prototype.orderByChild = function (path) {\r\n validateArgCount('Query.orderByChild', 1, 1, arguments.length);\r\n return new Query(this.database, query(this._delegate, orderByChild(path)));\r\n };\r\n /**\r\n * Return a new query ordered by the KeyIndex\r\n */\r\n Query.prototype.orderByKey = function () {\r\n validateArgCount('Query.orderByKey', 0, 0, arguments.length);\r\n return new Query(this.database, query(this._delegate, orderByKey()));\r\n };\r\n /**\r\n * Return a new query ordered by the PriorityIndex\r\n */\r\n Query.prototype.orderByPriority = function () {\r\n validateArgCount('Query.orderByPriority', 0, 0, arguments.length);\r\n return new Query(this.database, query(this._delegate, orderByPriority()));\r\n };\r\n /**\r\n * Return a new query ordered by the ValueIndex\r\n */\r\n Query.prototype.orderByValue = function () {\r\n validateArgCount('Query.orderByValue', 0, 0, arguments.length);\r\n return new Query(this.database, query(this._delegate, orderByValue()));\r\n };\r\n Query.prototype.startAt = function (value, name) {\r\n if (value === void 0) { value = null; }\r\n validateArgCount('Query.startAt', 0, 2, arguments.length);\r\n return new Query(this.database, query(this._delegate, startAt(value, name)));\r\n };\r\n Query.prototype.startAfter = function (value, name) {\r\n if (value === void 0) { value = null; }\r\n validateArgCount('Query.startAfter', 0, 2, arguments.length);\r\n return new Query(this.database, query(this._delegate, startAfter(value, name)));\r\n };\r\n Query.prototype.endAt = function (value, name) {\r\n if (value === void 0) { value = null; }\r\n validateArgCount('Query.endAt', 0, 2, arguments.length);\r\n return new Query(this.database, query(this._delegate, endAt(value, name)));\r\n };\r\n Query.prototype.endBefore = function (value, name) {\r\n if (value === void 0) { value = null; }\r\n validateArgCount('Query.endBefore', 0, 2, arguments.length);\r\n return new Query(this.database, query(this._delegate, endBefore(value, name)));\r\n };\r\n /**\r\n * Load the selection of children with exactly the specified value, and, optionally,\r\n * the specified name.\r\n */\r\n Query.prototype.equalTo = function (value, name) {\r\n validateArgCount('Query.equalTo', 1, 2, arguments.length);\r\n return new Query(this.database, query(this._delegate, equalTo(value, name)));\r\n };\r\n /**\r\n * @returns URL for this location.\r\n */\r\n Query.prototype.toString = function () {\r\n validateArgCount('Query.toString', 0, 0, arguments.length);\r\n return this._delegate.toString();\r\n };\r\n // Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary\r\n // for end-users.\r\n Query.prototype.toJSON = function () {\r\n // An optional spacer argument is unnecessary for a string.\r\n validateArgCount('Query.toJSON', 0, 1, arguments.length);\r\n return this._delegate.toJSON();\r\n };\r\n /**\r\n * Return true if this query and the provided query are equivalent; otherwise, return false.\r\n */\r\n Query.prototype.isEqual = function (other) {\r\n validateArgCount('Query.isEqual', 1, 1, arguments.length);\r\n if (!(other instanceof Query)) {\r\n var error = 'Query.isEqual failed: First argument must be an instance of firebase.database.Query.';\r\n throw new Error(error);\r\n }\r\n return this._delegate.isEqual(other._delegate);\r\n };\r\n /**\r\n * Helper used by .on and .once to extract the context and or cancel arguments.\r\n * @param fnName - The function name (on or once)\r\n *\r\n */\r\n Query.getCancelAndContextArgs_ = function (fnName, cancelOrContext, context) {\r\n var ret = { cancel: undefined, context: undefined };\r\n if (cancelOrContext && context) {\r\n ret.cancel = cancelOrContext;\r\n validateCallback(fnName, 'cancel', ret.cancel, true);\r\n ret.context = context;\r\n validateContextObject(fnName, 'context', ret.context, true);\r\n }\r\n else if (cancelOrContext) {\r\n // we have either a cancel callback or a context.\r\n if (typeof cancelOrContext === 'object' && cancelOrContext !== null) {\r\n // it's a context!\r\n ret.context = cancelOrContext;\r\n }\r\n else if (typeof cancelOrContext === 'function') {\r\n ret.cancel = cancelOrContext;\r\n }\r\n else {\r\n throw new Error(errorPrefix(fnName, 'cancelOrContext') +\r\n ' must either be a cancel callback or a context object.');\r\n }\r\n }\r\n return ret;\r\n };\r\n Object.defineProperty(Query.prototype, \"ref\", {\r\n get: function () {\r\n return new Reference(this.database, new ReferenceImpl(this._delegate._repo, this._delegate._path));\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n return Query;\r\n}());\r\nvar Reference = /** @class */ (function (_super) {\r\n __extends(Reference, _super);\r\n /**\r\n * Call options:\r\n * new Reference(Repo, Path) or\r\n * new Reference(url: string, string|RepoManager)\r\n *\r\n * Externally - this is the firebase.database.Reference type.\r\n */\r\n function Reference(database, _delegate) {\r\n var _this = _super.call(this, database, new QueryImpl(_delegate._repo, _delegate._path, new QueryParams(), false)) || this;\r\n _this.database = database;\r\n _this._delegate = _delegate;\r\n return _this;\r\n }\r\n /** @returns {?string} */\r\n Reference.prototype.getKey = function () {\r\n validateArgCount('Reference.key', 0, 0, arguments.length);\r\n return this._delegate.key;\r\n };\r\n Reference.prototype.child = function (pathString) {\r\n validateArgCount('Reference.child', 1, 1, arguments.length);\r\n if (typeof pathString === 'number') {\r\n pathString = String(pathString);\r\n }\r\n return new Reference(this.database, child(this._delegate, pathString));\r\n };\r\n /** @returns {?Reference} */\r\n Reference.prototype.getParent = function () {\r\n validateArgCount('Reference.parent', 0, 0, arguments.length);\r\n var parent = this._delegate.parent;\r\n return parent ? new Reference(this.database, parent) : null;\r\n };\r\n /** @returns {!Reference} */\r\n Reference.prototype.getRoot = function () {\r\n validateArgCount('Reference.root', 0, 0, arguments.length);\r\n return new Reference(this.database, this._delegate.root);\r\n };\r\n Reference.prototype.set = function (newVal, onComplete) {\r\n validateArgCount('Reference.set', 1, 2, arguments.length);\r\n validateCallback('Reference.set', 'onComplete', onComplete, true);\r\n var result = set(this._delegate, newVal);\r\n if (onComplete) {\r\n result.then(function () { return onComplete(null); }, function (error) { return onComplete(error); });\r\n }\r\n return result;\r\n };\r\n Reference.prototype.update = function (values, onComplete) {\r\n validateArgCount('Reference.update', 1, 2, arguments.length);\r\n if (Array.isArray(values)) {\r\n var newObjectToMerge = {};\r\n for (var i = 0; i < values.length; ++i) {\r\n newObjectToMerge['' + i] = values[i];\r\n }\r\n values = newObjectToMerge;\r\n warn('Passing an Array to Firebase.update() is deprecated. ' +\r\n 'Use set() if you want to overwrite the existing data, or ' +\r\n 'an Object with integer keys if you really do want to ' +\r\n 'only update some of the children.');\r\n }\r\n validateWritablePath('Reference.update', this._delegate._path);\r\n validateCallback('Reference.update', 'onComplete', onComplete, true);\r\n var result = update(this._delegate, values);\r\n if (onComplete) {\r\n result.then(function () { return onComplete(null); }, function (error) { return onComplete(error); });\r\n }\r\n return result;\r\n };\r\n Reference.prototype.setWithPriority = function (newVal, newPriority, onComplete) {\r\n validateArgCount('Reference.setWithPriority', 2, 3, arguments.length);\r\n validateCallback('Reference.setWithPriority', 'onComplete', onComplete, true);\r\n var result = setWithPriority(this._delegate, newVal, newPriority);\r\n if (onComplete) {\r\n result.then(function () { return onComplete(null); }, function (error) { return onComplete(error); });\r\n }\r\n return result;\r\n };\r\n Reference.prototype.remove = function (onComplete) {\r\n validateArgCount('Reference.remove', 0, 1, arguments.length);\r\n validateCallback('Reference.remove', 'onComplete', onComplete, true);\r\n var result = remove(this._delegate);\r\n if (onComplete) {\r\n result.then(function () { return onComplete(null); }, function (error) { return onComplete(error); });\r\n }\r\n return result;\r\n };\r\n Reference.prototype.transaction = function (transactionUpdate, onComplete, applyLocally) {\r\n var _this = this;\r\n validateArgCount('Reference.transaction', 1, 3, arguments.length);\r\n validateCallback('Reference.transaction', 'transactionUpdate', transactionUpdate, false);\r\n validateCallback('Reference.transaction', 'onComplete', onComplete, true);\r\n validateBoolean('Reference.transaction', 'applyLocally', applyLocally, true);\r\n var result = runTransaction(this._delegate, transactionUpdate, {\r\n applyLocally: applyLocally\r\n }).then(function (transactionResult) {\r\n return new TransactionResult(transactionResult.committed, new DataSnapshot(_this.database, transactionResult.snapshot));\r\n });\r\n if (onComplete) {\r\n result.then(function (transactionResult) {\r\n return onComplete(null, transactionResult.committed, transactionResult.snapshot);\r\n }, function (error) { return onComplete(error, false, null); });\r\n }\r\n return result;\r\n };\r\n Reference.prototype.setPriority = function (priority, onComplete) {\r\n validateArgCount('Reference.setPriority', 1, 2, arguments.length);\r\n validateCallback('Reference.setPriority', 'onComplete', onComplete, true);\r\n var result = setPriority(this._delegate, priority);\r\n if (onComplete) {\r\n result.then(function () { return onComplete(null); }, function (error) { return onComplete(error); });\r\n }\r\n return result;\r\n };\r\n Reference.prototype.push = function (value, onComplete) {\r\n var _this = this;\r\n validateArgCount('Reference.push', 0, 2, arguments.length);\r\n validateCallback('Reference.push', 'onComplete', onComplete, true);\r\n var expPromise = push(this._delegate, value);\r\n var promise = expPromise.then(function (expRef) { return new Reference(_this.database, expRef); });\r\n if (onComplete) {\r\n promise.then(function () { return onComplete(null); }, function (error) { return onComplete(error); });\r\n }\r\n var result = new Reference(this.database, expPromise);\r\n result.then = promise.then.bind(promise);\r\n result.catch = promise.catch.bind(promise, undefined);\r\n return result;\r\n };\r\n Reference.prototype.onDisconnect = function () {\r\n validateWritablePath('Reference.onDisconnect', this._delegate._path);\r\n return new OnDisconnect(new OnDisconnect$1(this._delegate._repo, this._delegate._path));\r\n };\r\n Object.defineProperty(Reference.prototype, \"key\", {\r\n get: function () {\r\n return this.getKey();\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"parent\", {\r\n get: function () {\r\n return this.getParent();\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"root\", {\r\n get: function () {\r\n return this.getRoot();\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n return Reference;\r\n}(Query));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Class representing a firebase database.\r\n */\r\nvar Database = /** @class */ (function () {\r\n /**\r\n * The constructor should not be called by users of our public API.\r\n */\r\n function Database(_delegate, app) {\r\n var _this = this;\r\n this._delegate = _delegate;\r\n this.app = app;\r\n this.INTERNAL = {\r\n delete: function () { return _this._delegate._delete(); }\r\n };\r\n }\r\n /**\r\n * Modify this instance to communicate with the Realtime Database emulator.\r\n *\r\n *

Note: This method must be called before performing any other operation.\r\n *\r\n * @param host - the emulator host (ex: localhost)\r\n * @param port - the emulator port (ex: 8080)\r\n * @param options.mockUserToken - the mock auth token to use for unit testing Security Rules\r\n */\r\n Database.prototype.useEmulator = function (host, port, options) {\r\n if (options === void 0) { options = {}; }\r\n connectDatabaseEmulator(this._delegate, host, port, options);\r\n };\r\n Database.prototype.ref = function (path) {\r\n validateArgCount('database.ref', 0, 1, arguments.length);\r\n if (path instanceof Reference) {\r\n var childRef = refFromURL(this._delegate, path.toString());\r\n return new Reference(this, childRef);\r\n }\r\n else {\r\n var childRef = ref(this._delegate, path);\r\n return new Reference(this, childRef);\r\n }\r\n };\r\n /**\r\n * Returns a reference to the root or the path specified in url.\r\n * We throw a exception if the url is not in the same domain as the\r\n * current repo.\r\n * @returns Firebase reference.\r\n */\r\n Database.prototype.refFromURL = function (url) {\r\n var apiName = 'database.refFromURL';\r\n validateArgCount(apiName, 1, 1, arguments.length);\r\n var childRef = refFromURL(this._delegate, url);\r\n return new Reference(this, childRef);\r\n };\r\n // Make individual repo go offline.\r\n Database.prototype.goOffline = function () {\r\n validateArgCount('database.goOffline', 0, 0, arguments.length);\r\n return goOffline(this._delegate);\r\n };\r\n Database.prototype.goOnline = function () {\r\n validateArgCount('database.goOnline', 0, 0, arguments.length);\r\n return goOnline(this._delegate);\r\n };\r\n Database.ServerValue = {\r\n TIMESTAMP: serverTimestamp(),\r\n increment: function (delta) { return increment(delta); }\r\n };\r\n return Database;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * INTERNAL methods for internal-use only (tests, etc.).\r\n *\r\n * Customers shouldn't use these or else should be aware that they could break at any time.\r\n */\r\nvar forceLongPolling = function () {\r\n WebSocketConnection.forceDisallow();\r\n BrowserPollConnection.forceAllow();\r\n};\r\nvar forceWebSockets = function () {\r\n BrowserPollConnection.forceDisallow();\r\n};\r\n/* Used by App Manager */\r\nvar isWebSocketsAvailable = function () {\r\n return WebSocketConnection['isAvailable']();\r\n};\r\nvar setSecurityDebugCallback = function (ref, callback) {\r\n var connection = ref._delegate._repo.persistentConnection_;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n connection.securityDebugCallback_ = callback;\r\n};\r\nvar stats = function (ref, showDelta) {\r\n repoStats(ref._delegate._repo, showDelta);\r\n};\r\nvar statsIncrementCounter = function (ref, metric) {\r\n repoStatsIncrementCounter(ref._delegate._repo, metric);\r\n};\r\nvar dataUpdateCount = function (ref) {\r\n return ref._delegate._repo.dataUpdateCount;\r\n};\r\nvar interceptServerData = function (ref, callback) {\r\n return repoInterceptServerData(ref._delegate._repo, callback);\r\n};\r\n/**\r\n * Used by console to create a database based on the app,\r\n * passed database URL and a custom auth implementation.\r\n *\r\n * @param app - A valid FirebaseApp-like object\r\n * @param url - A valid Firebase databaseURL\r\n * @param version - custom version e.g. firebase-admin version\r\n * @param customAuthImpl - custom auth implementation\r\n */\r\nfunction initStandalone(_a) {\r\n var app = _a.app, url = _a.url, version = _a.version, customAuthImpl = _a.customAuthImpl, namespace = _a.namespace, _b = _a.nodeAdmin, nodeAdmin = _b === void 0 ? false : _b;\r\n setSDKVersion(version);\r\n /**\r\n * ComponentContainer('database-standalone') is just a placeholder that doesn't perform\r\n * any actual function.\r\n */\r\n var authProvider = new Provider('auth-internal', new ComponentContainer('database-standalone'));\r\n authProvider.setComponent(new Component('auth-internal', function () { return customAuthImpl; }, \"PRIVATE\" /* PRIVATE */));\r\n return {\r\n instance: new Database(repoManagerDatabaseFromApp(app, authProvider, \r\n /* appCheckProvider= */ undefined, url, nodeAdmin), app),\r\n namespace: namespace\r\n };\r\n}\n\nvar INTERNAL = /*#__PURE__*/Object.freeze({\n __proto__: null,\n forceLongPolling: forceLongPolling,\n forceWebSockets: forceWebSockets,\n isWebSocketsAvailable: isWebSocketsAvailable,\n setSecurityDebugCallback: setSecurityDebugCallback,\n stats: stats,\n statsIncrementCounter: statsIncrementCounter,\n dataUpdateCount: dataUpdateCount,\n interceptServerData: interceptServerData,\n initStandalone: initStandalone\n});\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar DataConnection = PersistentConnection;\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nPersistentConnection.prototype.simpleListen = function (pathString, onComplete) {\r\n this.sendRequest('q', { p: pathString }, onComplete);\r\n};\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nPersistentConnection.prototype.echo = function (data, onEcho) {\r\n this.sendRequest('echo', { d: data }, onEcho);\r\n};\r\n// RealTimeConnection properties that we use in tests.\r\nvar RealTimeConnection = Connection;\r\nvar hijackHash = function (newHash) {\r\n var oldPut = PersistentConnection.prototype.put;\r\n PersistentConnection.prototype.put = function (pathString, data, onComplete, hash) {\r\n if (hash !== undefined) {\r\n hash = newHash();\r\n }\r\n oldPut.call(this, pathString, data, onComplete, hash);\r\n };\r\n return function () {\r\n PersistentConnection.prototype.put = oldPut;\r\n };\r\n};\r\nvar ConnectionTarget = RepoInfo;\r\nvar queryIdentifier = function (query) {\r\n return query._delegate._queryIdentifier;\r\n};\r\n/**\r\n * Forces the RepoManager to create Repos that use ReadonlyRestClient instead of PersistentConnection.\r\n */\r\nvar forceRestClient = function (forceRestClient) {\r\n repoManagerForceRestClient(forceRestClient);\r\n};\n\nvar TEST_ACCESS = /*#__PURE__*/Object.freeze({\n __proto__: null,\n DataConnection: DataConnection,\n RealTimeConnection: RealTimeConnection,\n hijackHash: hijackHash,\n ConnectionTarget: ConnectionTarget,\n queryIdentifier: queryIdentifier,\n forceRestClient: forceRestClient\n});\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar ServerValue = Database.ServerValue;\r\nfunction registerDatabase(instance) {\r\n // set SDK_VERSION\r\n setSDKVersion(instance.SDK_VERSION);\r\n // Register the Database Service with the 'firebase' namespace.\r\n var namespace = instance.INTERNAL.registerComponent(new Component('database', function (container, _a) {\r\n var url = _a.instanceIdentifier;\r\n /* Dependencies */\r\n // getImmediate for FirebaseApp will always succeed\r\n var app = container.getProvider('app').getImmediate();\r\n var authProvider = container.getProvider('auth-internal');\r\n var appCheckProvider = container.getProvider('app-check-internal');\r\n return new Database(repoManagerDatabaseFromApp(app, authProvider, appCheckProvider, url), app);\r\n }, \"PUBLIC\" /* PUBLIC */)\r\n .setServiceProps(\r\n // firebase.database namespace properties\r\n {\r\n Reference: Reference,\r\n Query: Query,\r\n Database: Database,\r\n DataSnapshot: DataSnapshot,\r\n enableLogging: enableLogging,\r\n INTERNAL: INTERNAL,\r\n ServerValue: ServerValue,\r\n TEST_ACCESS: TEST_ACCESS\r\n })\r\n .setMultipleInstances(true));\r\n instance.registerVersion(name, version);\r\n if (isNodeSdk()) {\r\n module.exports = namespace;\r\n }\r\n}\r\nregisterDatabase(firebase);\n\nexport { DataSnapshot, Database, OnDisconnect, Query, Reference, ServerValue, enableLogging, registerDatabase };\n//# sourceMappingURL=index.esm.js.map\n"],"names":["SDK_VERSION","setSDKVersion","version","DOMStorageWrapper","domStorage_","this","prefix_","prototype","set","key","value","removeItem","prefixedName_","setItem","stringify","get","storedVal","getItem","jsonEval","remove","name","toString","MemoryStorage","cache_","isInMemoryStorage","contains","createStoragefor","domStorageName","window","domStorage","e","PersistentStorage","SessionStorage","logClient","Logger","LUIDGenerator","id","sha1","str","utf8Bytes","stringToByteArray","Sha1","update","sha1Bytes","digest","base64","buildLogMessage_","varArgs","_i","arguments","length","message","i","arg","Array","isArray","apply","logger","firstLog_","enableLogging","logger_","persistent","assert","logLevel","LogLevel","log","bind","logWrapper","prefix","__spreadArray","__read","error","fatal","Error","warn","isInvalidJSONNumber","data","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","MIN_NAME","MAX_NAME","nameCompare","a","b","aAsInt","tryParseInt","bAsInt","stringCompare","requireKey","obj","ObjectToUniqueKey","keys","k","push","sort","splitStringBySize","segsize","len","dataSegs","c","substring","each","fn","hasOwnProperty","doubleToIEEE754String","v","s","f","ln","bias","Infinity","Math","abs","pow","min","floor","LN2","round","bits","reverse","join","hexByteString","hexByte","parseInt","substr","toLowerCase","INTEGER_REGEXP_","RegExp","INTEGER_32_MIN","INTEGER_32_MAX","test","intVal","exceptionGuard","setTimeout","stack","setTimeoutNonBlocking","time","timeout","AppCheckTokenProvider","appName_","appCheckProvider","_this","appCheck","getImmediate","optional","then","getToken","forceRefresh","Promise","resolve","reject","addTokenChangeListener","listener","_a","addTokenListener","notifyForInvalidToken","FirebaseAuthTokenProvider","firebaseOptions_","authProvider_","auth_","onInit","auth","catch","code","addAuthTokenListener","removeTokenChangeListener","removeAuthTokenListener","errorMessage","EmulatorTokenProvider","accessToken","OWNER","PROTOCOL_VERSION","FORGE_DOMAIN_RE","WEBSOCKET","LONG_POLLING","RepoInfo","host","secure","namespace","webSocketOnly","nodeAdmin","persistenceKey","includeNamespaceInQueryParams","_host","_domain","indexOf","internalHost","isCacheableHost","isCustomHost","Object","defineProperty","newHost","enumerable","configurable","toURLString","protocol","query","repoInfoConnectionURL","repoInfo","type","params","connURL","repoInfoNeedsQueryParam","pairs","StatsCollection","counters_","incrementCounter","amount","deepCopy","collections","reporters","statsManagerGetCollection","hashString","PacketReceiver","onMessage_","pendingResponses","currentResponseNum","closeAfterResponse","onClose","closeAfter","responseNum","callback","handleResponse","requestNum","_loop_1","toProcess","this_1","_loop_2","FIREBASE_LONGPOLL_START_PARAM","FIREBASE_LONGPOLL_CLOSE_COMMAND","BrowserPollConnection","connId","applicationId","appCheckToken","authToken","transportSessionId","lastSessionId","bytesSent","bytesReceived","everConnected_","log_","stats_","urlFn","open","onMessage","onDisconnect","curSegmentNum","onDisconnect_","myPacketOrderer","isClosed_","connectTimeoutTimer_","onClosed_","isNodeSdk","document","readyState","called_1","wrappedFn_1","body","addEventListener","attachEvent","executeWhenDOMReady","scriptTagHolder","FirebaseIFrameScriptHolder","args","command","arg1","arg2","incrementIncomingBytes_","clearTimeout","password","sendNewPolls","pN","urlParams","random","uniqueCallbackIdentifier","location","hostname","connectURL","addTag","start","startLongPoll","addDisconnectPingFrame","forceAllow","forceAllow_","forceDisallow","forceDisallow_","isAvailable","createElement","href","Windows","UI","markConnectionHealthy","shutdown_","close","myDisconnFrame","removeChild","send","dataStr","base64data","base64Encode","MAX_URL_DATA_SIZE","enqueueSegment","pw","src","style","display","appendChild","commandCB","onMessageCB","outstandingRequests","Set","pendingSegs","currentSerial","myIFrame","createIFrame_","script","domain","iframeContents","doc","write","iframe","contentWindow","contentDocument","alive","innerHTML","myID","myPW","newRequest_","size","theURL","curDataString","d","theSeg","shift","seg","ts","addLongPollTag_","segnum","totalsegs","url","serial","add","doNewRequest","delete","keepaliveTimeout","loadCB","doNodeLongPoll","newScript_1","async","onload","onreadystatechange","rstate","parentNode","onerror","WebSocketImpl","MozWebSocket","WebSocket","WebSocketConnection","keepaliveTimer","frames","totalFrames","connectionURL_","device","options","headers","process","platform","env","proxy","origin","mySock","onopen","onclose","onmessage","m","handleIncomingFrame","isOldAndroid","navigator","userAgent","oldAndroidMatch","match","parseFloat","previouslyFailed","appendFrame_","fullMess","jsonMess","handleNewFrameCount_","frameCount","extractFrameCount_","isNaN","mess","resetKeepAlive","remainingData","sendString_","String","clearInterval","setInterval","responsesRequiredToBeHealthy","healthyTimeout","TransportManager","initTransports_","e_1","isWebSocketsAvailable","isSkipPollConnection","transports_","transports","_b","__values","ALL_TRANSPORTS","_c","next","done","transport","e_1_1","return","call","initialTransport","upgradeTransport","Connection","repoInfo_","applicationId_","appCheckToken_","authToken_","onReady_","onKill_","connectionCount","pendingDataMessages","state_","transportManager_","start_","conn","conn_","nextTransportId_","primaryResponsesRequired_","onMessageReceived","connReceiver_","onConnectionLost","disconnReceiver_","tx_","rx_","secondaryConn_","isHealthy_","healthyTimeoutMS","healthyTimeout_","everConnected","onConnectionLost_","onSecondaryConnectionLost_","onPrimaryMessageReceived_","onSecondaryMessageReceived_","sendRequest","dataMsg","msg","t","sendData_","tryCleanupConnection","onSecondaryControl_","controlData","cmd","upgradeIfSecondaryHealthy_","secondaryResponsesRequired_","parsedData","layer","proceedWithUpgrade_","onControl_","onDataMessage_","onPrimaryResponse_","payload","onHandshake_","onConnectionShutdown_","onReset_","sendPingOnPrimaryIfNecessary_","handshake","timestamp","h","sessionId","onConnectionEstablished_","tryStartUpgrade_","startUpgrade_","closeConnections_","reason","ServerActions","put","pathString","onComplete","hash","merge","refreshAuthToken","token","refreshAppCheckToken","onDisconnectPut","onDisconnectMerge","onDisconnectCancel","reportStats","stats","EventEmitter","allowedEvents_","listeners_","trigger","eventType","listeners","context","on","validateEventType_","eventData","getInitialEvent","off","splice","find","et","OnlineMonitor","_super","online_","isMobileCordova","__extends","getInstance","currentlyOnline","Path","pathOrString","pieceNum","pieces_","split","copyTo","pieceNum_","newEmptyPath","pathGetFront","path","pathGetLength","pathPopFront","pathGetBack","pathSlice","begin","slice","pathParent","pieces","pathChild","childPathObj","childPieces","pathIsEmpty","newRelativePath","outerPath","innerPath","outer","inner","pathCompare","left","right","leftKeys","rightKeys","cmp","pathEquals","other","j","pathContains","ValidationPath","errorPrefix_","parts_","byteLength_","max","stringLength","validationPathCheckValid","validationPath","validationPathToErrorString","__EMPTY_NODE","MAX_NODE$2","VisibilityMonitor","hidden","visibilityChange","visible_","visible","RECONNECT_MIN_DELAY","PersistentConnection","onDataUpdate_","onConnectStatus_","onServerInfoUpdate_","authTokenProvider_","appCheckTokenProvider_","authOverride_","nextPersistentConnectionId_","interruptReasons_","listens","Map","outstandingPuts_","outstandingGets_","outstandingPutCount_","outstandingGetCount_","onDisconnectRequestQueue_","connected_","reconnectDelay_","maxReconnectDelay_","securityDebugCallback_","establishConnectionTimer_","requestCBHash_","requestNumber_","realtime_","forceTokenRefresh_","invalidAuthTokenCount_","invalidAppCheckTokenCount_","firstConnection_","lastConnectionAttemptTime_","lastConnectionEstablishedTime_","onVisible_","onOnline_","action","onResponse","curReqNum","r","initConnection_","deferred","Deferred","request","p","_path","q","_queryObject","outstandingGet","index","undefined","sendGet_","promise","listen","currentHashFn","tag","queryId","_queryIdentifier","has","_queryParams","isDefault","loadsAllData","listenSpec","hashFn","sendListen_","req","status","warnOnListenWarnings_","removeListen_","warnings","safeGet","indexSpec","getIndex","indexPath","tryAuth","reduceReconnectDelayIfAdminCredential_","credential","isAdmin","tryAppCheck","token_1","authMethod","isValidFormat","requestData","cred","res","onAuthRevoked_","onAppCheckRevoked_","unlisten","sendUnlisten_","queryObj","sendOnDisconnect_","response","putInternal","sendPut_","queued","result","errorReason","reqNum","onDataPush_","onListenRevoked_","onSecurityDebugPacket_","Date","getTime","handleTimestamp_","sendConnectStats_","restoreState_","scheduleConnect_","establishConnection_","online","onRealtimeDisconnect_","cancelSentTransactions_","shouldReconnect_","timeSinceLastConnectAttempt","reconnectDelay","__awaiter","onDataMessage","onReady","onDisconnect_1","canceled_1","connection_1","closeFn","sendRequestFn","error_1","__generator","label","nextConnectionId_","trys","all","sent","interrupt","resume","isEmpty","delta","serverTimeOffset","map","normalizedPathString","statusCode","explanation","console","replace","e_2","values","_d","queries","_e","_f","e_2_1","clientName","isReactNative","NamedNode","node","Wrap","Index","getCompare","compare","indexedValueChanged","oldNode","newNode","oldWrapped","newWrapped","minPost","MIN","KeyIndex","val","isDefinedOn","assertionError","maxPost","makePost","indexValue","KEY_INDEX","SortedMapIterator","startKey","comparator","isReverse_","resultGenerator_","nodeStack_","getNext","pop","hasNext","peek","LLRBNode","color","RED","SortedMap","EMPTY_NODE","copy","count","inorderTraversal","reverseTraversal","min_","minKey","maxKey","insert","n","fixUp_","removeMin_","isRed_","moveRedLeft_","smallest","rotateRight_","moveRedRight_","rotateLeft_","colorFlip_","nl","nr","checkMaxDepth_","blackDepth","check_","BLACK","LLRBEmptyNode","comparator_","root_","getPredecessorKey","rightParent","getIterator","resultGenerator","getIteratorFrom","getReverseIteratorFrom","getReverseIterator","NAME_ONLY_COMPARATOR","NAME_COMPARATOR","__childrenNodeConstructor","nodeFromJSON$1","MAX_NODE$1","priorityHashText","priority","validatePriorityNode","priorityNode","isLeafNode","getPriority","LeafNode","value_","priorityNode_","lazyHash_","updatePriority","newPriorityNode","getImmediateChild","childName","getChild","hasChild","getPredecessorChildName","childNode","updateImmediateChild","newChildNode","updateChild","front","numChildren","forEachChild","exportFormat","getValue","toHash","compareTo","compareToLeafNode_","otherLeaf","otherLeafType","thisLeafType","otherIndex","VALUE_TYPE_ORDER","thisIndex","withIndex","isIndexed","equals","_defaultIndexMap","PriorityIndex","aPriority","bPriority","indexCmp","PRIORITY_INDEX","LOG_2","Base12Num","num","current_","mask","bits_","nextBitIsOne","buildChildSet","childList","keyFn","mapSortFn","buildBalancedTree","low","high","namedNode","middle","root","base12","buildPennant","chunkSize","childTree","attachPennant","pennant","isOne","buildFrom12Array","fallbackObject","IndexMap","indexes_","indexSet_","indexKey","sortedMap","hasIndex","indexDefinition","addIndex","existingChildren","newIndex","sawIndexedValue","iter","indexName","newIndexSet","__assign","newIndexes","addToIndexes","indexedChildren","existingSnap","newChildren","removeFromIndexes","ChildrenNode","children_","indexMap_","Default","child","newIndexMap","newPriority","newImmediateChild","numKeys","allIntegerKeys","array","toHash_1","childHash","idx","resolveIndex_","predecessor","getFirstChildName","getFirstChild","getLastChildName","getLastChild","wrappedNode","startPost","iterator","endPost","MAX_NODE","otherChildrenNode","thisIter","otherIter","thisCurrent","otherCurrent","MaxNode","defineProperties","MAX","setMaxNode","nodeFromJSON","json","node_1","childData","children_1","childrenHavePriority_1","childSet","sortedChildSet","setNodeFromJSON","PathIndex","indexPath_","extractChild","snap","aChild","bChild","valueNode","ValueIndex","VALUE_INDEX","PUSH_CHARS","nextPushId","lastPushTime","lastRandChars","now","duplicateTime","timeStampChars","charAt","successor","keyAsInt","i_1","source","sourcePlusOne","repeat","changeValue","snapshotNode","changeChildAdded","changeChildRemoved","changeChildChanged","oldSnap","IndexedFilter","index_","newChild","affectedPath","optChangeAccumulator","oldChild","trackChildChange","updateFullNode","newSnap","filtersNodes","getIndexedFilter","RangedFilter","indexedFilter_","startPost_","getStartPost_","endPost_","getEndPost_","getStartPost","getEndPost","matches","filtered","self","hasStart","startName","getIndexStartName","getIndexStartValue","hasEnd","endName","getIndexEndName","getIndexEndValue","LimitedFilter","rangedFilter_","limit_","getLimit","reverse_","isViewFromLeft","fullLimitUpdateChild_","indexCompare_1","foundStartPost","childKey","childSnap","changeAccumulator","indexCmp_1","oldEventCache","newChildNamedNode","windowBoundary","inRange","oldChildSnap","nextChild","getChildAfterChild","compareNext","newEventCache","QueryParams","limitSet_","startSet_","startNameSet_","startAfterSet_","endSet_","endNameSet_","endBeforeSet_","viewFrom_","indexStartValue_","indexStartName_","indexEndValue_","indexEndName_","hasStartAfter","hasEndBefore","hasLimit","hasAnchoredLimit","queryParamsStartAt","queryParams","newParams","queryParamsEndAt","queryParamsOrderBy","queryParamsToRestQueryStringParameters","orderBy","qs","queryParamsGetQueryObject","viewFrom","ReadonlyRestClient","listens_","getListenId_","listenId","thisListen","queryStringParameters","restRequest_","querystring","xhr","XMLHttpRequest","responseText","SnapshotHolder","rootNode_","getNode","updateSnapshot","newSnapshotNode","newSparseSnapshotTree","children","sparseSnapshotTreeRemember","sparseSnapshotTree","clear","sparseSnapshotTreeForget","tree","sparseSnapshotTreeForEachTree","prefixPath","func","forEach","sparseSnapshotTreeForEachChild","OperationType","StatsListener","collection_","last_","newStats","stat","StatsReporter","collection","server_","statsToReport_","statsListener_","reportStats_","reportedStats","haveStatsToReport","newOperationSourceServerTaggedQuery","fromUser","fromServer","tagged","emptyChildrenSingleton","AckUserWrite","affectedTree","revert","ACK_USER_WRITE","operationForChild","subtree","ListenComplete","LISTEN_COMPLETE","Overwrite","OVERWRITE","Merge","MERGE","CacheNode","node_","fullyInitialized_","filtered_","isFullyInitialized","isFiltered","isCompleteForPath","isCompleteForChild","EventGenerator","query_","eventGeneratorGenerateEventsForType","eventGenerator","events","changes","registrations","eventCache","filteredChanges","filter","change","aWrapped","bWrapped","eventGeneratorCompareChanges","materializedChange","prevName","eventGeneratorMaterializeSingleChange","registration","respondsTo","createEvent","newViewCache","serverCache","viewCacheUpdateEventSnap","viewCache","eventSnap","complete","viewCacheUpdateServerSnap","serverSnap","viewCacheGetCompleteEventSnap","viewCacheGetCompleteServerSnap","ImmutableTree","fromObject","childPath","findRootMostMatchingPathAndValue","relativePath","predicate","childExistingPathAndValue","findRootMostValueAndPath","toSet","setTree","newTree","fold","fold_","pathSoFar","accum","findOnPath","findOnPath_","pathToFollow","foreachOnPath","foreachOnPath_","currentRelativePath","foreach","foreach_","foreachChild","CompoundWrite","writeTree_","empty","compoundWriteAddWrite","compoundWrite","rootmost","rootMostPath","newWriteTree","compoundWriteAddWrites","updates","newWrite","compoundWriteRemoveWrite","compoundWriteHasCompleteWrite","compoundWriteGetCompleteNode","compoundWriteGetCompleteChildren","compoundWriteChildCompoundWrite","shadowingNode","compoundWriteIsEmpty","compoundWriteApply","applySubtreeWrite","writeTree","priorityWrite_1","writeTreeChildWrites","newWriteTreeRef","writeTreeRemoveWrite","writeId","allWrites","findIndex","writeToRemove","removedWriteWasVisible","removedWriteOverlapsWithOtherWrites","currentWrite","writeTreeRecordContainsPath_","visibleWrites","writeTreeLayerTree_","writeTreeDefaultFilter_","lastWriteId","writeTreeResetTree_","writeRecord","writes","treeRoot","writePath","deepNode","writeTreeCalcCompleteEventCache","treePath","completeServerCache","writeIdsToExclude","includeHiddenWrites","subMerge","writeTreeRefCalcCompleteEventCache","writeTreeRef","writeTreeRefCalcCompleteEventChildren","completeServerChildren","completeChildren","topLevelSet","merge_1","writeTreeCalcCompleteEventChildren","writeTreeRefCalcEventCacheAfterServerOverwrite","existingEventSnap","existingServerSnap","childMerge","writeTreeCalcEventCacheAfterServerOverwrite","writeTreeRefShadowingWrite","writeTreeShadowingWrite","writeTreeRefCalcIndexedSlice","completeServerData","toIterate","nodes","writeTreeCalcIndexedSlice","writeTreeRefCalcCompleteChild","existingServerCache","writeTreeCalcCompleteChild","writeTreeRefChild","ChildChangeAccumulator","changeMap","oldChange","oldType","getChanges","from","NO_COMPLETE_CHILD_SOURCE","NoCompleteChildSource_","getCompleteChild","WriteTreeCompleteChildSource","writes_","viewCache_","optCompleteServerCache_","serverNode","viewProcessorApplyOperation","viewProcessor","oldViewCache","operation","writesCache","completeCache","filterServerNode","accumulator","overwrite","viewProcessorApplyUserOverwrite","viewProcessorApplyServerOverwrite","changedChildren","curViewCache","viewProcessorCacheHasChild","viewProcessorApplyUserMerge","viewProcessorApplyServerMerge","ackUserWrite","serverChildren","viewProcessorRevertUserWrite","ackPath","changedChildren_1","changedChildren_2","mergePath","serverCachePath","viewProcessorAckUserWrite","oldServerNode","viewProcessorGenerateEventCacheAfterServerEvent","viewProcessorListenComplete","isLeafOrEmpty","oldCompleteSnap","viewProcessorMaybeAddValueEvent","changePath","oldEventSnap","completeEventChildren","completeNode","oldEventNode","updatedPriority","childChangePath","newEventChild","eventChildUpdate","changedSnap","newServerCache","oldServerSnap","serverFilter","newServerNode","viewProcessorApplyMerge","viewMergeTree","childMergeTree","isUnknownDeepMerge","referenceConstructor$1","View","initialViewCache","eventRegistrations_","indexFilter","processor_","newViewProcessor","initialServerCache","initialEventCache","eventGenerator_","viewGetCompleteServerCache","view","cache","viewIsEmpty","viewRemoveEventRegistration","eventRegistration","cancelError","cancelEvents","path_1","maybeEvent","createCancelEvent","remaining","existing","hasAnyCallback","concat","viewApplyOperation","viewGenerateEventsForChanges_","eventRegistrations","moves","eventGeneratorGenerateEventsForChanges","referenceConstructor","SyncPoint","views","syncPointApplyOperation","syncPoint","optCompleteServerCache","syncPointGetView","serverCacheComplete","eventCacheComplete","syncPointAddEventRegistration","viewAddEventRegistration","initialChanges","viewGetInitialEvents","syncPointRemoveEventRegistration","removed","hadCompleteView","syncPointHasCompleteView","entries","viewQueryId","_repo","syncPointGetQueryViews","e_3","e_3_1","syncPointGetCompleteServerCache","e_4","e_4_1","syncPointViewForQuery","syncPointGetCompleteView","syncPointViewExistsForQuery","e_5","e_5_1","syncTreeNextQueryTag_","SyncTree","listenProvider_","syncPointTree_","pendingWriteTree_","tagToQueryMap","queryToTagMap","syncTreeApplyUserOverwrite","syncTree","newData","writeTreeAddOverwrite","syncTreeApplyOperationToSyncPoints_","syncTreeApplyUserMerge","writeTreeAddMerge","changeTree","syncTreeAckUserWrite","record","writeTreeGetWrite","affectedTree_1","syncTreeApplyServerOverwrite","syncTreeRemoveEventRegistration","maybeSyncPoint","removedAndEvents","removingDefault","covered","parentSyncPoint","newViews","maybeChildSyncPoint","childMap","views_1","_key","childViews","syncTreeCollectDistinctViewsForSubTree_","newQuery","syncTreeCreateListenerForView_","startListening","syncTreeQueryForListening_","syncTreeTagForQuery_","stopListening","queryToRemove","tagToRemove","syncTreeMakeQueryKey_","removedQuery","removedQueryKey","removedQueryTag","syncTreeRemoveTags_","syncTreeAddEventRegistration","foundAncestorDefaultView","pathToSyncPoint","sp","childSyncPoint","viewAlreadyExists","queryKey","queriesToStop","queries_1","childQueries","queryToStop","syncTreeSetupListener_","syncTreeCalcCompleteEventCache","syncTreeGetServerValue","serverCacheNode","viewGetCompleteNode","syncTreeApplyOperationHelper_","syncPointTree","syncTreeApplyOperationDescendantsHelper_","childOperation","childServerCache","childWritesCache","viewGetServerCache","syncTreeQueryKeyForTag_","syncTreeParseQueryKey_","queryPath","syncTreeApplyTaggedOperation_","syncTreeApplyTaggedListenComplete","syncTreeApplyListenComplete","toUpperCase","errorForServerCode","splitIndex","ExistingValueProvider","DeferredValueProvider","syncTree_","path_","resolveDeferredLeafValue","existingVal","serverValues","resolveScalarDeferredValue","resolveComplexDeferredValue","JSON","op","unused","existingNode","resolveDeferredValueTree","resolveDeferredValue","resolveDeferredValueSnapshot","rawPri","leafNode","childrenNode","Tree","parent","childCount","treeSubTree","pathObj","treeGetValue","treeSetValue","treeUpdateParents","treeHasChildren","treeForEachChild","treeForEachDescendant","includeSelf","childrenFirst","treeGetPath","childEmpty","treeIsEmpty","childExists","treeUpdateChild","INVALID_KEY_REGEX_","INVALID_PATH_REGEX_","MAX_LEAF_SIZE_","isValidKey","isValidPathString","isValidPriority","validateFirebaseDataArg","fnName","validateFirebaseData","errorPrefix","hasDotValue_1","hasActualChild_1","validationPathPush","last","validationPathPop","validateFirebaseMergeDataArg","errorPrefix$1","mergePaths","curPath","prevPath","validateFirebaseMergePaths","validatePriority","validateEventType","validateKey","argumentName","validatePathString","validateWritablePath","validateUrl","parsedUrl","isValidRootPathString","validateBoolean","bool","EventQueue","eventLists_","recursionDepth_","eventQueueQueueEvents","eventQueue","eventDataList","currList","getPath","eventQueueRaiseEventsAtPath","eventQueueRaiseQueuedEventsMatchingPredicate","eventPath","eventQueueRaiseEventsForChangedPath","changedPath","sentAll","eventList","eventListRaise","eventFn","getEventRunner","INTERRUPT_REASON","Repo","forceRestClient_","appCheckProvider_","dataUpdateCount","eventQueue_","nextWriteId_","interceptServerDataCallback_","transactionQueueTree_","persistentConnection_","repoStart","repo","appId","authOverride","search","isMerge","repoOnDataUpdate","repoOnConnectStatus","connectStatus","repoUpdateInfo","repoOnServerInfoUpdate","statsReporter_","creatorFunction","statsManagerGetOrCreateReporter","infoData_","infoSyncTree_","infoEvents","serverSyncTree_","repoServerTime","offset","repoGenerateServerValues","taggedChildren","raw","syncTreeApplyTaggedQueryMerge","taggedSnap","syncTreeApplyTaggedQueryOverwrite","syncTreeApplyServerMerge","repoRerunTransactions","repoLog","resolvedOnDisconnectTree","resolved","repoAbortTransactions","repoRunOnDisconnectEvents","repoGetNextWriteId","repoSetWithPriority","newVal","newNodeUnresolved","success","clearEvents","repoCallOnCompleteCallback","repoOnDisconnectCancel","repoOnDisconnectSet","repoRemoveEventCallbackForQuery","repoInterrupt","repoGetLatestState","excludeSets","repoSendReadyTransactions","repoPruneCompletedTransactionsBelowNode","queue","repoBuildTransactionQueue","every","transaction","setsToIgnore","txn","currentWriteId","latestState","snapToSend","latestHash","retryCount","currentOutputSnapshotRaw","dataToSend","pathToSend","callbacks","currentOutputSnapshotResolved","unwatcher","abortReason","repoSendTransactionQueue","rootMostTransactionNode","repoGetAncestorTransactionNode","abortTransaction","currentNode","currentInputSnapshot","newDataNode","oldWriteId","newNodeResolved","applyLocally","repoRerunTransactionQueue","transactionNode","transactionQueue","repoAggregateTransactionQueuesForNode","order","nodeQueue","to","treeForEachAncestor","repoAbortTransactionsOnNode","lastSent","parseRepoInfo","dataURL","parseDatabaseURL","scheme","subdomain","port","colonInd","slashInd","questionMarkInd","pathStringDecoded","piece","decodeURIComponent","decodePath","queryString","results","segment","kv","decodeQuery","hostWithoutPort","dotInd","DataEvent","snapshot","ref","getEventType","exportVal","CancelEvent","CallbackContext","snapshotCallback","cancelCallback","onValue","expDataSnapshot","previousChildName","onCancel","hasCancelCallback","userCallback","OnDisconnect$1","OnDisconnect","cancel","wrapCallback","setWithPriority","repoOnDisconnectSetWithPriority","childrenToMerge","repoOnDisconnectUpdate","QueryImpl","_orderByCalled","ReferenceImpl","isEqual","getModularInstance","sameRepo","samePath","sameQueryIdentifier","toJSON","encodeURIComponent","pathToUrlEncodedString","validateNoPreviousOrderByCall","validateQueryEndpoints","startNode","endNode","tooManyArgsError","wrongArgTypeError","validateLimit","parentPath","DataSnapshot$1","DataSnapshot","_node","_index","childRef","exists","hasChildren","db","_checkNotDeleted","_root","refFromURL","parsedURL","thennablePushRef","pushRef","setPriority","changedKey","changedValue","writeId_1","repoUpdate","cached","err","repoGetValue","ValueEventRegistration","callbackContext","ChildEventRegistration","eventToCheck","cancelCallbackOrListenOptions","onlyOnce","userCallback_1","onceCallback","dataSnapshot","container","repoAddEventCallbackForQuery","onChildAdded","onChildChanged","onChildMoved","onChildRemoved","expCallback","QueryConstraint","QueryEndAtConstraint","_value","_apply","endAt","QueryEndBeforeConstraint","queryParamsEndBefore","endBefore","QueryStartAtConstraint","startAt","QueryStartAfterConstraint","queryParamsStartAfter","startAfter","QueryLimitToFirstConstraint","_limit","newLimit","queryParamsLimitToFirst","limitToFirst","limit","QueryLimitToLastConstraint","queryParamsLimitToLast","limitToLast","QueryOrderByChildConstraint","parsedPath","orderByChild","QueryOrderByKeyConstraint","orderByKey","QueryOrderByPriorityConstraint","orderByPriority","QueryOrderByValueConstraint","orderByValue","QueryEqualToValueConstraint","equalTo","queryConstraints","queryImpl","queryConstraints_1","queryConstraints_1_1","constraint","syncPointSetReferenceConstructor","syncTreeSetReferenceConstructor","repos","useRestClient","repoManagerDatabaseFromApp","app","authProvider","dbUrl","databaseURL","projectId","isEmulator","dbEmulatorHost","authTokenProvider","appRepos","repoManagerCreateRepo","Database$1","Database","_repoInternal","_instanceStarted","_rootInternal","_delete","appName","repoManagerDeleteRepo","apiName","connectDatabaseEmulator","tokenProvider","mockUserToken","createMockUserToken","repoManagerApplyEmulatorSettings","goOffline","goOnline","SERVER_TIMESTAMP","TransactionResult$1","TransactionResult","committed","runTransaction","transactionUpdate","currentState","queueNode","priorityForNode","repoStartTransaction","_delegate","validateArgCount","validateCallback","objectToMerge","newObjectToMerge","_database","getRef","Reference","Query","database","cancelCallbackOrContext","ret","getCancelAndContextArgs_","valueCallback","expSnapshot","validateContextObject","once","failureCallbackOrContext","cancelOrContext","getKey","getParent","getRoot","transactionResult","expPromise","expRef","INTERNAL","useEmulator","ServerValue","TIMESTAMP","increment","freeze","__proto__","forceLongPolling","forceWebSockets","setSecurityDebugCallback","showDelta","longestName","reduce","previousValue","currentValue","paddedStat","repoStats","statsIncrementCounter","metric","reporter","repoStatsIncrementCounter","interceptServerData","repoInterceptServerData","initStandalone","customAuthImpl","Provider","ComponentContainer","setComponent","Component","instance","DataConnection","simpleListen","echo","onEcho","RealTimeConnection","ConnectionTarget","TEST_ACCESS","hijackHash","newHash","oldPut","queryIdentifier","forceRestClient","repoManagerForceRestClient","registerComponent","instanceIdentifier","getProvider","setServiceProps","setMultipleInstances","registerVersion","module","exports","registerDatabase"],"sourceRoot":""}