VUE_GabenParadise/node_modules/@firebase/database/dist/index.esm.js.map

1 line
910 KiB
Plaintext

{"version":3,"file":"index.esm.js","sources":["../src/core/storage/DOMStorageWrapper.ts","../src/core/storage/MemoryStorage.ts","../src/core/storage/storage.ts","../src/core/util/util.ts","../src/core/util/Path.ts","../src/realtime/Constants.ts","../src/core/RepoInfo.ts","../src/core/util/libs/parser.ts","../src/core/util/validation.ts","../src/api/onDisconnect.ts","../src/api/TransactionResult.ts","../src/core/util/NextPushId.ts","../src/core/snap/Node.ts","../src/core/snap/indexes/Index.ts","../src/core/snap/indexes/KeyIndex.ts","../src/core/snap/snap.ts","../src/core/snap/LeafNode.ts","../src/core/snap/indexes/PriorityIndex.ts","../src/core/util/SortedMap.ts","../src/core/snap/childSet.ts","../src/core/snap/IndexMap.ts","../src/core/snap/comparators.ts","../src/core/snap/ChildrenNode.ts","../src/core/snap/nodeFromJSON.ts","../src/core/snap/indexes/ValueIndex.ts","../src/core/snap/indexes/PathIndex.ts","../src/api/DataSnapshot.ts","../src/core/view/Event.ts","../src/core/view/EventRegistration.ts","../src/api/Query.ts","../src/core/util/ServerValues.ts","../src/core/SparseSnapshotTree.ts","../src/core/operation/Operation.ts","../src/core/operation/AckUserWrite.ts","../src/core/util/ImmutableTree.ts","../src/core/operation/ListenComplete.ts","../src/core/operation/Overwrite.ts","../src/core/operation/Merge.ts","../src/core/view/CacheNode.ts","../src/core/view/ViewCache.ts","../src/core/view/Change.ts","../src/core/view/filter/IndexedFilter.ts","../src/core/view/ChildChangeAccumulator.ts","../src/core/view/CompleteChildSource.ts","../src/core/view/ViewProcessor.ts","../src/core/view/EventGenerator.ts","../src/core/view/View.ts","../src/core/SyncPoint.ts","../src/core/CompoundWrite.ts","../src/core/WriteTree.ts","../src/core/SyncTree.ts","../src/core/SnapshotHolder.ts","../src/core/AuthTokenProvider.ts","../src/core/stats/StatsCollection.ts","../src/core/stats/StatsManager.ts","../src/core/stats/StatsListener.ts","../src/core/stats/StatsReporter.ts","../src/core/view/EventQueue.ts","../src/core/util/EventEmitter.ts","../src/core/util/VisibilityMonitor.ts","../src/core/util/OnlineMonitor.ts","../src/realtime/polling/PacketReceiver.ts","../src/realtime/BrowserPollConnection.ts","../src/core/version.ts","../src/realtime/WebSocketConnection.ts","../src/realtime/TransportManager.ts","../src/realtime/Connection.ts","../src/core/ServerActions.ts","../src/core/PersistentConnection.ts","../src/core/ReadonlyRestClient.ts","../src/core/Repo.ts","../src/core/view/filter/RangedFilter.ts","../src/core/view/filter/LimitedFilter.ts","../src/core/view/QueryParams.ts","../src/api/Reference.ts","../src/core/util/Tree.ts","../src/core/Repo_transaction.ts","../src/core/RepoManager.ts","../src/api/Database.ts","../src/api/internal.ts","../src/api/test_access.ts","../index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { jsonEval, stringify } from '@firebase/util';\n\n/**\n * Wraps a DOM Storage object and:\n * - automatically encode objects as JSON strings before storing them to allow us to store arbitrary types.\n * - prefixes names with \"firebase:\" to avoid collisions with app data.\n *\n * We automatically (see storage.js) create two such wrappers, one for sessionStorage,\n * and one for localStorage.\n *\n * @constructor\n */\nexport class DOMStorageWrapper {\n // Use a prefix to avoid collisions with other stuff saved by the app.\n private prefix_ = 'firebase:';\n\n /**\n * @param {Storage} domStorage_ The underlying storage object (e.g. localStorage or sessionStorage)\n */\n constructor(private domStorage_: Storage) {}\n\n /**\n * @param {string} key The key to save the value under\n * @param {?Object} value The value being stored, or null to remove the key.\n */\n set(key: string, value: unknown | null) {\n if (value == null) {\n this.domStorage_.removeItem(this.prefixedName_(key));\n } else {\n this.domStorage_.setItem(this.prefixedName_(key), stringify(value));\n }\n }\n\n /**\n * @param {string} key\n * @return {*} The value that was stored under this key, or null\n */\n get(key: string): unknown {\n const storedVal = this.domStorage_.getItem(this.prefixedName_(key));\n if (storedVal == null) {\n return null;\n } else {\n return jsonEval(storedVal);\n }\n }\n\n /**\n * @param {string} key\n */\n remove(key: string) {\n this.domStorage_.removeItem(this.prefixedName_(key));\n }\n\n isInMemoryStorage: boolean;\n\n /**\n * @param {string} name\n * @return {string}\n */\n prefixedName_(name: string): string {\n return this.prefix_ + name;\n }\n\n toString(): string {\n return this.domStorage_.toString();\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { contains } from '@firebase/util';\n\n/**\n * An in-memory storage implementation that matches the API of DOMStorageWrapper\n * (TODO: create interface for both to implement).\n *\n * @constructor\n */\nexport class MemoryStorage {\n private cache_: { [k: string]: unknown } = {};\n\n set(key: string, value: unknown | null) {\n if (value == null) {\n delete this.cache_[key];\n } else {\n this.cache_[key] = value;\n }\n }\n\n get(key: string): unknown {\n if (contains(this.cache_, key)) {\n return this.cache_[key];\n }\n return null;\n }\n\n remove(key: string) {\n delete this.cache_[key];\n }\n\n isInMemoryStorage = true;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DOMStorageWrapper } from './DOMStorageWrapper';\nimport { MemoryStorage } from './MemoryStorage';\n\ndeclare const window: Window;\n\n/**\n * Helper to create a DOMStorageWrapper or else fall back to MemoryStorage.\n * TODO: Once MemoryStorage and DOMStorageWrapper have a shared interface this method annotation should change\n * to reflect this type\n *\n * @param {string} domStorageName Name of the underlying storage object\n * (e.g. 'localStorage' or 'sessionStorage').\n * @return {?} Turning off type information until a common interface is defined.\n */\nconst createStoragefor = function(\n domStorageName: string\n): DOMStorageWrapper | MemoryStorage {\n try {\n // NOTE: just accessing \"localStorage\" or \"window['localStorage']\" may throw a security exception,\n // so it must be inside the try/catch.\n if (\n typeof window !== 'undefined' &&\n typeof window[domStorageName] !== 'undefined'\n ) {\n // Need to test cache. Just because it's here doesn't mean it works\n const domStorage = window[domStorageName];\n domStorage.setItem('firebase:sentinel', 'cache');\n domStorage.removeItem('firebase:sentinel');\n return new DOMStorageWrapper(domStorage);\n }\n } catch (e) {}\n\n // Failed to create wrapper. Just return in-memory storage.\n // TODO: log?\n return new MemoryStorage();\n};\n\n/** A storage object that lasts across sessions */\nexport const PersistentStorage = createStoragefor('localStorage');\n\n/** A storage object that only lasts one session */\nexport const SessionStorage = createStoragefor('sessionStorage');\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Query } from '../../api/Query';\nimport {\n assert,\n base64,\n Sha1,\n stringToByteArray,\n stringify,\n isNodeSdk\n} from '@firebase/util';\nimport { SessionStorage } from '../storage/storage';\nimport { Logger, LogLevel } from '@firebase/logger';\n\ndeclare const window: Window;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndeclare const Windows: any;\n\nconst logClient = new Logger('@firebase/database');\n\n/**\n * Returns a locally-unique ID (generated by just incrementing up from 0 each time its called).\n * @type {function(): number} Generated ID.\n */\nexport const LUIDGenerator: () => number = (function() {\n let id = 1;\n return function() {\n return id++;\n };\n})();\n\n/**\n * Sha1 hash of the input string\n * @param {!string} str The string to hash\n * @return {!string} The resulting hash\n */\nexport const sha1 = function(str: string): string {\n const utf8Bytes = stringToByteArray(str);\n const sha1 = new Sha1();\n sha1.update(utf8Bytes);\n const sha1Bytes = sha1.digest();\n return base64.encodeByteArray(sha1Bytes);\n};\n\n/**\n * @param {...*} varArgs\n * @return {string}\n * @private\n */\nconst buildLogMessage_ = function(...varArgs: unknown[]): string {\n let message = '';\n for (let i = 0; i < varArgs.length; i++) {\n const arg = varArgs[i];\n if (\n Array.isArray(arg) ||\n (arg &&\n typeof arg === 'object' &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (arg as any).length === 'number')\n ) {\n message += buildLogMessage_.apply(null, arg);\n } else if (typeof arg === 'object') {\n message += stringify(arg);\n } else {\n message += arg;\n }\n message += ' ';\n }\n\n return message;\n};\n\n/**\n * Use this for all debug messages in Firebase.\n * @type {?function(string)}\n */\nexport let logger: ((a: string) => void) | null = null;\n\n/**\n * Flag to check for log availability on first log message\n * @type {boolean}\n * @private\n */\nlet firstLog_ = true;\n\n/**\n * The implementation of Firebase.enableLogging (defined here to break dependencies)\n * @param {boolean|?function(string)} logger_ A flag to turn on logging, or a custom logger\n * @param {boolean=} persistent Whether or not to persist logging settings across refreshes\n */\nexport const enableLogging = function(\n logger_?: boolean | ((a: string) => void) | null,\n persistent?: boolean\n) {\n assert(\n !persistent || logger_ === true || logger_ === false,\n \"Can't turn on custom loggers persistently.\"\n );\n if (logger_ === true) {\n logClient.logLevel = LogLevel.VERBOSE;\n logger = logClient.log.bind(logClient);\n if (persistent) {\n SessionStorage.set('logging_enabled', true);\n }\n } else if (typeof logger_ === 'function') {\n logger = logger_;\n } else {\n logger = null;\n SessionStorage.remove('logging_enabled');\n }\n};\n\n/**\n *\n * @param {...(string|Arguments)} varArgs\n */\nexport const log = function(...varArgs: unknown[]) {\n if (firstLog_ === true) {\n firstLog_ = false;\n if (logger === null && SessionStorage.get('logging_enabled') === true) {\n enableLogging(true);\n }\n }\n\n if (logger) {\n const message = buildLogMessage_.apply(null, varArgs);\n logger(message);\n }\n};\n\n/**\n * @param {!string} prefix\n * @return {function(...[*])}\n */\nexport const logWrapper = function(\n prefix: string\n): (...varArgs: unknown[]) => void {\n return function(...varArgs: unknown[]) {\n log(prefix, ...varArgs);\n };\n};\n\n/**\n * @param {...string} varArgs\n */\nexport const error = function(...varArgs: string[]) {\n const message = 'FIREBASE INTERNAL ERROR: ' + buildLogMessage_(...varArgs);\n logClient.error(message);\n};\n\n/**\n * @param {...string} varArgs\n */\nexport const fatal = function(...varArgs: string[]) {\n const message = `FIREBASE FATAL ERROR: ${buildLogMessage_(...varArgs)}`;\n logClient.error(message);\n throw new Error(message);\n};\n\n/**\n * @param {...*} varArgs\n */\nexport const warn = function(...varArgs: unknown[]) {\n const message = 'FIREBASE WARNING: ' + buildLogMessage_(...varArgs);\n logClient.warn(message);\n};\n\n/**\n * Logs a warning if the containing page uses https. Called when a call to new Firebase\n * does not use https.\n */\nexport const warnIfPageIsSecure = function() {\n // Be very careful accessing browser globals. Who knows what may or may not exist.\n if (\n typeof window !== 'undefined' &&\n window.location &&\n window.location.protocol &&\n window.location.protocol.indexOf('https:') !== -1\n ) {\n warn(\n 'Insecure Firebase access from a secure page. ' +\n 'Please use https in calls to new Firebase().'\n );\n }\n};\n\n/**\n * @param {!String} methodName\n */\nexport const warnAboutUnsupportedMethod = function(methodName: string) {\n warn(\n methodName +\n ' is unsupported and will likely change soon. ' +\n 'Please do not use.'\n );\n};\n\n/**\n * Returns true if data is NaN, or +/- Infinity.\n * @param {*} data\n * @return {boolean}\n */\nexport const isInvalidJSONNumber = function(data: unknown): boolean {\n return (\n typeof data === 'number' &&\n (data !== data || // NaN\n data === Number.POSITIVE_INFINITY ||\n data === Number.NEGATIVE_INFINITY)\n );\n};\n\n/**\n * @param {function()} fn\n */\nexport const executeWhenDOMReady = function(fn: () => void) {\n if (isNodeSdk() || document.readyState === 'complete') {\n fn();\n } else {\n // Modeled after jQuery. Try DOMContentLoaded and onreadystatechange (which\n // fire before onload), but fall back to onload.\n\n let called = false;\n const wrappedFn = function() {\n if (!document.body) {\n setTimeout(wrappedFn, Math.floor(10));\n return;\n }\n\n if (!called) {\n called = true;\n fn();\n }\n };\n\n if (document.addEventListener) {\n document.addEventListener('DOMContentLoaded', wrappedFn, false);\n // fallback to onload.\n window.addEventListener('load', wrappedFn, false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } else if ((document as any).attachEvent) {\n // IE.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (document as any).attachEvent('onreadystatechange', () => {\n if (document.readyState === 'complete') {\n wrappedFn();\n }\n });\n // fallback to onload.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window as any).attachEvent('onload', wrappedFn);\n\n // jQuery has an extra hack for IE that we could employ (based on\n // http://javascript.nwbox.com/IEContentLoaded/) But it looks really old.\n // I'm hoping we don't need it.\n }\n }\n};\n\n/**\n * Minimum key name. Invalid for actual data, used as a marker to sort before any valid names\n * @type {!string}\n */\nexport const MIN_NAME = '[MIN_NAME]';\n\n/**\n * Maximum key name. Invalid for actual data, used as a marker to sort above any valid names\n * @type {!string}\n */\nexport const MAX_NAME = '[MAX_NAME]';\n\n/**\n * Compares valid Firebase key names, plus min and max name\n * @param {!string} a\n * @param {!string} b\n * @return {!number}\n */\nexport const nameCompare = function(a: string, b: string): number {\n if (a === b) {\n return 0;\n } else if (a === MIN_NAME || b === MAX_NAME) {\n return -1;\n } else if (b === MIN_NAME || a === MAX_NAME) {\n return 1;\n } else {\n const aAsInt = tryParseInt(a),\n bAsInt = tryParseInt(b);\n\n if (aAsInt !== null) {\n if (bAsInt !== null) {\n return aAsInt - bAsInt === 0 ? a.length - b.length : aAsInt - bAsInt;\n } else {\n return -1;\n }\n } else if (bAsInt !== null) {\n return 1;\n } else {\n return a < b ? -1 : 1;\n }\n }\n};\n\n/**\n * @param {!string} a\n * @param {!string} b\n * @return {!number} comparison result.\n */\nexport const stringCompare = function(a: string, b: string): number {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else {\n return 1;\n }\n};\n\n/**\n * @param {string} key\n * @param {Object} obj\n * @return {*}\n */\nexport const requireKey = function(\n key: string,\n obj: { [k: string]: unknown }\n): unknown {\n if (obj && key in obj) {\n return obj[key];\n } else {\n throw new Error(\n 'Missing required key (' + key + ') in object: ' + stringify(obj)\n );\n }\n};\n\n/**\n * @param {*} obj\n * @return {string}\n */\nexport const ObjectToUniqueKey = function(obj: unknown): string {\n if (typeof obj !== 'object' || obj === null) {\n return stringify(obj);\n }\n\n const keys = [];\n // eslint-disable-next-line guard-for-in\n for (const k in obj) {\n keys.push(k);\n }\n\n // Export as json, but with the keys sorted.\n keys.sort();\n let key = '{';\n for (let i = 0; i < keys.length; i++) {\n if (i !== 0) {\n key += ',';\n }\n key += stringify(keys[i]);\n key += ':';\n key += ObjectToUniqueKey(obj[keys[i]]);\n }\n\n key += '}';\n return key;\n};\n\n/**\n * Splits a string into a number of smaller segments of maximum size\n * @param {!string} str The string\n * @param {!number} segsize The maximum number of chars in the string.\n * @return {Array.<string>} The string, split into appropriately-sized chunks\n */\nexport const splitStringBySize = function(\n str: string,\n segsize: number\n): string[] {\n const len = str.length;\n\n if (len <= segsize) {\n return [str];\n }\n\n const dataSegs = [];\n for (let c = 0; c < len; c += segsize) {\n if (c + segsize > len) {\n dataSegs.push(str.substring(c, len));\n } else {\n dataSegs.push(str.substring(c, c + segsize));\n }\n }\n return dataSegs;\n};\n\n/**\n * Apply a function to each (key, value) pair in an object or\n * apply a function to each (index, value) pair in an array\n * @param obj The object or array to iterate over\n * @param fn The function to apply\n */\nexport function each(obj: object, fn: (k: string, v: unknown) => void) {\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n fn(key, obj[key]);\n }\n }\n}\n\n/**\n * Like goog.bind, but doesn't bother to create a closure if opt_context is null/undefined.\n * @param {function(*)} callback Callback function.\n * @param {?Object=} context Optional context to bind to.\n * @return {function(*)}\n */\nexport const bindCallback = function(\n callback: (a: unknown) => void,\n context?: object | null\n): Function {\n return context ? callback.bind(context) : callback;\n};\n\n/**\n * Borrowed from http://hg.secondlife.com/llsd/src/tip/js/typedarray.js (MIT License)\n * I made one modification at the end and removed the NaN / Infinity\n * handling (since it seemed broken [caused an overflow] and we don't need it). See MJL comments.\n * @param {!number} v A double\n * @return {string}\n */\nexport const doubleToIEEE754String = function(v: number): string {\n assert(!isInvalidJSONNumber(v), 'Invalid JSON number'); // MJL\n\n const ebits = 11,\n fbits = 52;\n const bias = (1 << (ebits - 1)) - 1;\n let s, e, f, ln, i;\n\n // Compute sign, exponent, fraction\n // Skip NaN / Infinity handling --MJL.\n if (v === 0) {\n e = 0;\n f = 0;\n s = 1 / v === -Infinity ? 1 : 0;\n } else {\n s = v < 0;\n v = Math.abs(v);\n\n if (v >= Math.pow(2, 1 - bias)) {\n // Normalized\n ln = Math.min(Math.floor(Math.log(v) / Math.LN2), bias);\n e = ln + bias;\n f = Math.round(v * Math.pow(2, fbits - ln) - Math.pow(2, fbits));\n } else {\n // Denormalized\n e = 0;\n f = Math.round(v / Math.pow(2, 1 - bias - fbits));\n }\n }\n\n // Pack sign, exponent, fraction\n const bits = [];\n for (i = fbits; i; i -= 1) {\n bits.push(f % 2 ? 1 : 0);\n f = Math.floor(f / 2);\n }\n for (i = ebits; i; i -= 1) {\n bits.push(e % 2 ? 1 : 0);\n e = Math.floor(e / 2);\n }\n bits.push(s ? 1 : 0);\n bits.reverse();\n const str = bits.join('');\n\n // Return the data as a hex string. --MJL\n let hexByteString = '';\n for (i = 0; i < 64; i += 8) {\n let hexByte = parseInt(str.substr(i, 8), 2).toString(16);\n if (hexByte.length === 1) {\n hexByte = '0' + hexByte;\n }\n hexByteString = hexByteString + hexByte;\n }\n return hexByteString.toLowerCase();\n};\n\n/**\n * Used to detect if we're in a Chrome content script (which executes in an\n * isolated environment where long-polling doesn't work).\n * @return {boolean}\n */\nexport const isChromeExtensionContentScript = function(): boolean {\n return !!(\n typeof window === 'object' &&\n window['chrome'] &&\n window['chrome']['extension'] &&\n !/^chrome/.test(window.location.href)\n );\n};\n\n/**\n * Used to detect if we're in a Windows 8 Store app.\n * @return {boolean}\n */\nexport const isWindowsStoreApp = function(): boolean {\n // Check for the presence of a couple WinRT globals\n return typeof Windows === 'object' && typeof Windows.UI === 'object';\n};\n\n/**\n * Converts a server error code to a Javascript Error\n * @param {!string} code\n * @param {!Query} query\n * @return {Error}\n */\nexport const errorForServerCode = function(code: string, query: Query): Error {\n let reason = 'Unknown Error';\n if (code === 'too_big') {\n reason =\n 'The data requested exceeds the maximum size ' +\n 'that can be accessed with a single request.';\n } else if (code === 'permission_denied') {\n reason = \"Client doesn't have permission to access the desired data.\";\n } else if (code === 'unavailable') {\n reason = 'The service is unavailable';\n }\n\n const error = new Error(\n code + ' at ' + query.path.toString() + ': ' + reason\n );\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).code = code.toUpperCase();\n return error;\n};\n\n/**\n * Used to test for integer-looking strings\n * @type {RegExp}\n * @private\n */\nexport const INTEGER_REGEXP_ = new RegExp('^-?(0*)\\\\d{1,10}$');\n\n/**\n * If the string contains a 32-bit integer, return it. Else return null.\n * @param {!string} str\n * @return {?number}\n */\nexport const tryParseInt = function(str: string): number | null {\n if (INTEGER_REGEXP_.test(str)) {\n const intVal = Number(str);\n if (intVal >= -2147483648 && intVal <= 2147483647) {\n return intVal;\n }\n }\n return null;\n};\n\n/**\n * Helper to run some code but catch any exceptions and re-throw them later.\n * Useful for preventing user callbacks from breaking internal code.\n *\n * Re-throwing the exception from a setTimeout is a little evil, but it's very\n * convenient (we don't have to try to figure out when is a safe point to\n * re-throw it), and the behavior seems reasonable:\n *\n * * If you aren't pausing on exceptions, you get an error in the console with\n * the correct stack trace.\n * * If you're pausing on all exceptions, the debugger will pause on your\n * exception and then again when we rethrow it.\n * * If you're only pausing on uncaught exceptions, the debugger will only pause\n * on us re-throwing it.\n *\n * @param {!function()} fn The code to guard.\n */\nexport const exceptionGuard = function(fn: () => void) {\n try {\n fn();\n } catch (e) {\n // Re-throw exception when it's safe.\n setTimeout(() => {\n // It used to be that \"throw e\" would result in a good console error with\n // relevant context, but as of Chrome 39, you just get the firebase.js\n // file/line number where we re-throw it, which is useless. So we log\n // e.stack explicitly.\n const stack = e.stack || '';\n warn('Exception was thrown by user callback.', stack);\n throw e;\n }, Math.floor(0));\n }\n};\n\n/**\n * Helper function to safely call opt_callback with the specified arguments. It:\n * 1. Turns into a no-op if opt_callback is null or undefined.\n * 2. Wraps the call inside exceptionGuard to prevent exceptions from breaking our state.\n *\n * @param {?Function=} callback Optional onComplete callback.\n * @param {...*} varArgs Arbitrary args to be passed to opt_onComplete\n */\nexport const callUserCallback = function(\n callback?: Function | null,\n ...varArgs: unknown[]\n) {\n if (typeof callback === 'function') {\n exceptionGuard(() => {\n callback(...varArgs);\n });\n }\n};\n\n/**\n * @return {boolean} true if we think we're currently being crawled.\n */\nexport const beingCrawled = function(): boolean {\n const userAgent =\n (typeof window === 'object' &&\n window['navigator'] &&\n window['navigator']['userAgent']) ||\n '';\n\n // For now we whitelist the most popular crawlers. We should refine this to be the set of crawlers we\n // believe to support JavaScript/AJAX rendering.\n // NOTE: Google Webmaster Tools doesn't really belong, but their \"This is how a visitor to your website\n // would have seen the page\" is flaky if we don't treat it as a crawler.\n return (\n userAgent.search(\n /googlebot|google webmaster tools|bingbot|yahoo! slurp|baiduspider|yandexbot|duckduckbot/i\n ) >= 0\n );\n};\n\n/**\n * Export a property of an object using a getter function.\n *\n * @param {!Object} object\n * @param {string} name\n * @param {!function(): *} fnGet\n */\nexport const exportPropGetter = function(\n object: object,\n name: string,\n fnGet: () => unknown\n) {\n Object.defineProperty(object, name, { get: fnGet });\n};\n\n/**\n * Same as setTimeout() except on Node.JS it will /not/ prevent the process from exiting.\n *\n * It is removed with clearTimeout() as normal.\n *\n * @param {Function} fn Function to run.\n * @param {number} time Milliseconds to wait before running.\n * @return {number|Object} The setTimeout() return value.\n */\nexport const setTimeoutNonBlocking = function(\n fn: Function,\n time: number\n): number | object {\n const timeout: number | object = setTimeout(fn, time);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof timeout === 'object' && (timeout as any)['unref']) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (timeout as any)['unref']();\n }\n return timeout;\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { nameCompare } from './util';\nimport { stringLength } from '@firebase/util';\n/**\n * An immutable object representing a parsed path. It's immutable so that you\n * can pass them around to other functions without worrying about them changing\n * it.\n */\n\nexport class Path {\n private pieces_: string[];\n private pieceNum_: number;\n\n /**\n * Singleton to represent an empty path\n *\n * @const\n */\n static get Empty() {\n return new Path('');\n }\n\n /**\n * @param {string|Array.<string>} pathOrString Path string to parse,\n * or another path, or the raw tokens array\n * @param {number=} pieceNum\n */\n constructor(pathOrString: string | string[], pieceNum?: number) {\n if (pieceNum === void 0) {\n this.pieces_ = (pathOrString as string).split('/');\n\n // Remove empty pieces.\n let copyTo = 0;\n for (let i = 0; i < this.pieces_.length; i++) {\n if (this.pieces_[i].length > 0) {\n this.pieces_[copyTo] = this.pieces_[i];\n copyTo++;\n }\n }\n this.pieces_.length = copyTo;\n\n this.pieceNum_ = 0;\n } else {\n this.pieces_ = pathOrString as string[];\n this.pieceNum_ = pieceNum;\n }\n }\n\n getFront(): string | null {\n if (this.pieceNum_ >= this.pieces_.length) {\n return null;\n }\n\n return this.pieces_[this.pieceNum_];\n }\n\n /**\n * @return {number} The number of segments in this path\n */\n getLength(): number {\n return this.pieces_.length - this.pieceNum_;\n }\n\n /**\n * @return {!Path}\n */\n popFront(): Path {\n let pieceNum = this.pieceNum_;\n if (pieceNum < this.pieces_.length) {\n pieceNum++;\n }\n return new Path(this.pieces_, pieceNum);\n }\n\n /**\n * @return {?string}\n */\n getBack(): string | null {\n if (this.pieceNum_ < this.pieces_.length) {\n return this.pieces_[this.pieces_.length - 1];\n }\n\n return null;\n }\n\n toString(): string {\n let pathString = '';\n for (let i = this.pieceNum_; i < this.pieces_.length; i++) {\n if (this.pieces_[i] !== '') {\n pathString += '/' + this.pieces_[i];\n }\n }\n\n return pathString || '/';\n }\n\n toUrlEncodedString(): string {\n let pathString = '';\n for (let i = this.pieceNum_; i < this.pieces_.length; i++) {\n if (this.pieces_[i] !== '') {\n pathString += '/' + encodeURIComponent(String(this.pieces_[i]));\n }\n }\n\n return pathString || '/';\n }\n\n /**\n * Shallow copy of the parts of the path.\n *\n * @param {number=} begin\n * @return {!Array<string>}\n */\n slice(begin: number = 0): string[] {\n return this.pieces_.slice(this.pieceNum_ + begin);\n }\n\n /**\n * @return {?Path}\n */\n parent(): Path | null {\n if (this.pieceNum_ >= this.pieces_.length) {\n return null;\n }\n\n const pieces = [];\n for (let i = this.pieceNum_; i < this.pieces_.length - 1; i++) {\n pieces.push(this.pieces_[i]);\n }\n\n return new Path(pieces, 0);\n }\n\n /**\n * @param {string|!Path} childPathObj\n * @return {!Path}\n */\n child(childPathObj: string | Path): Path {\n const pieces = [];\n for (let i = this.pieceNum_; i < this.pieces_.length; i++) {\n pieces.push(this.pieces_[i]);\n }\n\n if (childPathObj instanceof Path) {\n for (\n let i = childPathObj.pieceNum_;\n i < childPathObj.pieces_.length;\n i++\n ) {\n pieces.push(childPathObj.pieces_[i]);\n }\n } else {\n const childPieces = childPathObj.split('/');\n for (let i = 0; i < childPieces.length; i++) {\n if (childPieces[i].length > 0) {\n pieces.push(childPieces[i]);\n }\n }\n }\n\n return new Path(pieces, 0);\n }\n\n /**\n * @return {boolean} True if there are no segments in this path\n */\n isEmpty(): boolean {\n return this.pieceNum_ >= this.pieces_.length;\n }\n\n /**\n * @param {!Path} outerPath\n * @param {!Path} innerPath\n * @return {!Path} The path from outerPath to innerPath\n */\n static relativePath(outerPath: Path, innerPath: Path): Path {\n const outer = outerPath.getFront(),\n inner = innerPath.getFront();\n if (outer === null) {\n return innerPath;\n } else if (outer === inner) {\n return Path.relativePath(outerPath.popFront(), innerPath.popFront());\n } else {\n throw new Error(\n 'INTERNAL ERROR: innerPath (' +\n innerPath +\n ') is not within ' +\n 'outerPath (' +\n outerPath +\n ')'\n );\n }\n }\n\n /**\n * @param {!Path} left\n * @param {!Path} right\n * @return {number} -1, 0, 1 if left is less, equal, or greater than the right.\n */\n static comparePaths(left: Path, right: Path): number {\n const leftKeys = left.slice();\n const rightKeys = right.slice();\n for (let i = 0; i < leftKeys.length && i < rightKeys.length; i++) {\n const cmp = nameCompare(leftKeys[i], rightKeys[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n if (leftKeys.length === rightKeys.length) {\n return 0;\n }\n return leftKeys.length < rightKeys.length ? -1 : 1;\n }\n\n /**\n *\n * @param {Path} other\n * @return {boolean} true if paths are the same.\n */\n equals(other: Path): boolean {\n if (this.getLength() !== other.getLength()) {\n return false;\n }\n\n for (\n let i = this.pieceNum_, j = other.pieceNum_;\n i <= this.pieces_.length;\n i++, j++\n ) {\n if (this.pieces_[i] !== other.pieces_[j]) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n *\n * @param {!Path} other\n * @return {boolean} True if this path is a parent (or the same as) other\n */\n contains(other: Path): boolean {\n let i = this.pieceNum_;\n let j = other.pieceNum_;\n if (this.getLength() > other.getLength()) {\n return false;\n }\n while (i < this.pieces_.length) {\n if (this.pieces_[i] !== other.pieces_[j]) {\n return false;\n }\n ++i;\n ++j;\n }\n return true;\n }\n} // end Path\n\n/**\n * Dynamic (mutable) path used to count path lengths.\n *\n * This class is used to efficiently check paths for valid\n * length (in UTF8 bytes) and depth (used in path validation).\n *\n * Throws Error exception if path is ever invalid.\n *\n * The definition of a path always begins with '/'.\n */\nexport class ValidationPath {\n /** @type {!Array<string>} */\n private parts_: string[];\n /** @type {number} Initialize to number of '/' chars needed in path. */\n private byteLength_: number;\n\n /**\n * @param {!Path} path Initial Path.\n * @param {string} errorPrefix_ Prefix for any error messages.\n */\n constructor(path: Path, private errorPrefix_: string) {\n /** @type {!Array<string>} */\n this.parts_ = path.slice();\n /** @type {number} Initialize to number of '/' chars needed in path. */\n this.byteLength_ = Math.max(1, this.parts_.length);\n\n for (let i = 0; i < this.parts_.length; i++) {\n this.byteLength_ += stringLength(this.parts_[i]);\n }\n this.checkValid_();\n }\n\n /** @const {number} Maximum key depth. */\n static get MAX_PATH_DEPTH() {\n return 32;\n }\n\n /** @const {number} Maximum number of (UTF8) bytes in a Firebase path. */\n static get MAX_PATH_LENGTH_BYTES() {\n return 768;\n }\n\n /** @param {string} child */\n push(child: string) {\n // Count the needed '/'\n if (this.parts_.length > 0) {\n this.byteLength_ += 1;\n }\n this.parts_.push(child);\n this.byteLength_ += stringLength(child);\n this.checkValid_();\n }\n\n pop() {\n const last = this.parts_.pop();\n this.byteLength_ -= stringLength(last);\n // Un-count the previous '/'\n if (this.parts_.length > 0) {\n this.byteLength_ -= 1;\n }\n }\n\n private checkValid_() {\n if (this.byteLength_ > ValidationPath.MAX_PATH_LENGTH_BYTES) {\n throw new Error(\n this.errorPrefix_ +\n 'has a key path longer than ' +\n ValidationPath.MAX_PATH_LENGTH_BYTES +\n ' bytes (' +\n this.byteLength_ +\n ').'\n );\n }\n if (this.parts_.length > ValidationPath.MAX_PATH_DEPTH) {\n throw new Error(\n this.errorPrefix_ +\n 'path specified exceeds the maximum depth that can be written (' +\n ValidationPath.MAX_PATH_DEPTH +\n ') or object contains a cycle ' +\n this.toErrorString()\n );\n }\n }\n\n /**\n * String for use in error messages - uses '.' notation for path.\n *\n * @return {string}\n */\n toErrorString(): string {\n if (this.parts_.length === 0) {\n return '';\n }\n return \"in property '\" + this.parts_.join('.') + \"'\";\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const PROTOCOL_VERSION = '5';\n\nexport const VERSION_PARAM = 'v';\n\nexport const TRANSPORT_SESSION_PARAM = 's';\n\nexport const REFERER_PARAM = 'r';\n\nexport const FORGE_REF = 'f';\n\nexport const FORGE_DOMAIN = 'firebaseio.com';\n\nexport const LAST_SESSION_PARAM = 'ls';\n\nexport const WEBSOCKET = 'websocket';\n\nexport const LONG_POLLING = 'long_polling';\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\nimport { PersistentStorage } from './storage/storage';\nimport { LONG_POLLING, WEBSOCKET } from '../realtime/Constants';\nimport { each } from './util/util';\n\n/**\n * A class that holds metadata about a Repo object\n *\n * @constructor\n */\nexport class RepoInfo {\n host: string;\n domain: string;\n internalHost: string;\n\n /**\n * @param {string} host Hostname portion of the url for the repo\n * @param {boolean} secure Whether or not this repo is accessed over ssl\n * @param {string} namespace The namespace represented by the repo\n * @param {boolean} webSocketOnly Whether to prefer websockets over all other transports (used by Nest).\n * @param {string=} persistenceKey Override the default session persistence storage key\n */\n constructor(\n host: string,\n public secure: boolean,\n public namespace: string,\n public webSocketOnly: boolean,\n public persistenceKey: string = '',\n public includeNamespaceInQueryParams: boolean = false\n ) {\n this.host = host.toLowerCase();\n this.domain = this.host.substr(this.host.indexOf('.') + 1);\n this.internalHost =\n (PersistentStorage.get('host:' + host) as string) || this.host;\n }\n\n needsQueryParam(): boolean {\n return (\n this.host !== this.internalHost ||\n this.isCustomHost() ||\n this.includeNamespaceInQueryParams\n );\n }\n\n isCacheableHost(): boolean {\n return this.internalHost.substr(0, 2) === 's-';\n }\n\n isDemoHost() {\n return this.domain === 'firebaseio-demo.com';\n }\n\n isCustomHost() {\n return (\n this.domain !== 'firebaseio.com' && this.domain !== 'firebaseio-demo.com'\n );\n }\n\n updateHost(newHost: string) {\n if (newHost !== this.internalHost) {\n this.internalHost = newHost;\n if (this.isCacheableHost()) {\n PersistentStorage.set('host:' + this.host, this.internalHost);\n }\n }\n }\n\n /**\n * Returns the websocket URL for this repo\n * @param {string} type of connection\n * @param {Object} params list\n * @return {string} The URL for this repo\n */\n connectionURL(type: string, params: { [k: string]: string }): string {\n assert(typeof type === 'string', 'typeof type must == string');\n assert(typeof params === 'object', 'typeof params must == object');\n\n let connURL: string;\n if (type === WEBSOCKET) {\n connURL =\n (this.secure ? 'wss://' : 'ws://') + this.internalHost + '/.ws?';\n } else if (type === LONG_POLLING) {\n connURL =\n (this.secure ? 'https://' : 'http://') + this.internalHost + '/.lp?';\n } else {\n throw new Error('Unknown connection type: ' + type);\n }\n if (this.needsQueryParam()) {\n params['ns'] = this.namespace;\n }\n\n const pairs: string[] = [];\n\n each(params, (key: string, value: string) => {\n pairs.push(key + '=' + value);\n });\n\n return connURL + pairs.join('&');\n }\n\n /** @return {string} */\n toString(): string {\n let str = this.toURLString();\n if (this.persistenceKey) {\n str += '<' + this.persistenceKey + '>';\n }\n return str;\n }\n\n /** @return {string} */\n toURLString(): string {\n return (this.secure ? 'https://' : 'http://') + this.host;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Path } from '../Path';\nimport { RepoInfo } from '../../RepoInfo';\nimport { warnIfPageIsSecure, warn, fatal } from '../util';\n\n/**\n * @param {!string} pathString\n * @return {string}\n */\nfunction decodePath(pathString: string): string {\n let pathStringDecoded = '';\n const pieces = pathString.split('/');\n for (let i = 0; i < pieces.length; i++) {\n if (pieces[i].length > 0) {\n let piece = pieces[i];\n try {\n piece = decodeURIComponent(piece.replace(/\\+/g, ' '));\n } catch (e) {}\n pathStringDecoded += '/' + piece;\n }\n }\n return pathStringDecoded;\n}\n\n/**\n * @param {!string} queryString\n * @return {!{[key:string]:string}} key value hash\n */\nfunction decodeQuery(queryString: string): { [key: string]: string } {\n const results = {};\n if (queryString.charAt(0) === '?') {\n queryString = queryString.substring(1);\n }\n for (const segment of queryString.split('&')) {\n if (segment.length === 0) {\n continue;\n }\n const kv = segment.split('=');\n if (kv.length === 2) {\n results[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1]);\n } else {\n warn(`Invalid query segment '${segment}' in query '${queryString}'`);\n }\n }\n return results;\n}\n\n/**\n *\n * @param {!string} dataURL\n * @return {{repoInfo: !RepoInfo, path: !Path}}\n */\nexport const parseRepoInfo = function(\n dataURL: string\n): { repoInfo: RepoInfo; path: Path } {\n const parsedUrl = parseDatabaseURL(dataURL),\n namespace = parsedUrl.namespace;\n\n if (parsedUrl.domain === 'firebase.com') {\n fatal(\n parsedUrl.host +\n ' is no longer supported. ' +\n 'Please use <YOUR FIREBASE>.firebaseio.com instead'\n );\n }\n\n // Catch common error of uninitialized namespace value.\n if (\n (!namespace || namespace === 'undefined') &&\n parsedUrl.domain !== 'localhost'\n ) {\n fatal(\n 'Cannot parse Firebase url. Please use https://<YOUR FIREBASE>.firebaseio.com'\n );\n }\n\n if (!parsedUrl.secure) {\n warnIfPageIsSecure();\n }\n\n const webSocketOnly = parsedUrl.scheme === 'ws' || parsedUrl.scheme === 'wss';\n\n return {\n repoInfo: new RepoInfo(\n parsedUrl.host,\n parsedUrl.secure,\n namespace,\n webSocketOnly,\n /*persistenceKey=*/ '',\n /*includeNamespaceInQueryParams=*/ namespace !== parsedUrl.subdomain\n ),\n path: new Path(parsedUrl.pathString)\n };\n};\n\n/**\n *\n * @param {!string} dataURL\n * @return {{host: string, port: number, domain: string, subdomain: string, secure: boolean, scheme: string, pathString: string, namespace: string}}\n */\nexport const parseDatabaseURL = function(\n dataURL: string\n): {\n host: string;\n port: number;\n domain: string;\n subdomain: string;\n secure: boolean;\n scheme: string;\n pathString: string;\n namespace: string;\n} {\n // Default to empty strings in the event of a malformed string.\n let host = '',\n domain = '',\n subdomain = '',\n pathString = '',\n namespace = '';\n\n // Always default to SSL, unless otherwise specified.\n let secure = true,\n scheme = 'https',\n port = 443;\n\n // Don't do any validation here. The caller is responsible for validating the result of parsing.\n if (typeof dataURL === 'string') {\n // Parse scheme.\n let colonInd = dataURL.indexOf('//');\n if (colonInd >= 0) {\n scheme = dataURL.substring(0, colonInd - 1);\n dataURL = dataURL.substring(colonInd + 2);\n }\n\n // Parse host, path, and query string.\n let slashInd = dataURL.indexOf('/');\n if (slashInd === -1) {\n slashInd = dataURL.length;\n }\n let questionMarkInd = dataURL.indexOf('?');\n if (questionMarkInd === -1) {\n questionMarkInd = dataURL.length;\n }\n host = dataURL.substring(0, Math.min(slashInd, questionMarkInd));\n if (slashInd < questionMarkInd) {\n // For pathString, questionMarkInd will always come after slashInd\n pathString = decodePath(dataURL.substring(slashInd, questionMarkInd));\n }\n const queryParams = decodeQuery(\n dataURL.substring(Math.min(dataURL.length, questionMarkInd))\n );\n\n // If we have a port, use scheme for determining if it's secure.\n colonInd = host.indexOf(':');\n if (colonInd >= 0) {\n secure = scheme === 'https' || scheme === 'wss';\n port = parseInt(host.substring(colonInd + 1), 10);\n } else {\n colonInd = host.length;\n }\n\n const hostWithoutPort = host.slice(0, colonInd);\n if (hostWithoutPort.toLowerCase() === 'localhost') {\n domain = 'localhost';\n } else if (hostWithoutPort.split('.').length <= 2) {\n domain = hostWithoutPort;\n } else {\n // Interpret the subdomain of a 3 or more component URL as the namespace name.\n const dotInd = host.indexOf('.');\n subdomain = host.substring(0, dotInd).toLowerCase();\n domain = host.substring(dotInd + 1);\n // Normalize namespaces to lowercase to share storage / connection.\n namespace = subdomain;\n }\n // Always treat the value of the `ns` as the namespace name if it is present.\n if ('ns' in queryParams) {\n namespace = queryParams['ns'];\n }\n }\n\n return {\n host,\n port,\n domain,\n subdomain,\n secure,\n scheme,\n pathString,\n namespace\n };\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Path, ValidationPath } from './Path';\nimport {\n contains,\n safeGet,\n errorPrefix as errorPrefixFxn,\n stringLength\n} from '@firebase/util';\nimport { isInvalidJSONNumber, each } from './util';\n\nimport { RepoInfo } from '../RepoInfo';\n\n/**\n * True for invalid Firebase keys\n * @type {RegExp}\n * @private\n */\nexport const INVALID_KEY_REGEX_ = /[\\[\\].#$\\/\\u0000-\\u001F\\u007F]/;\n\n/**\n * True for invalid Firebase paths.\n * Allows '/' in paths.\n * @type {RegExp}\n * @private\n */\nexport const INVALID_PATH_REGEX_ = /[\\[\\].#$\\u0000-\\u001F\\u007F]/;\n\n/**\n * Maximum number of characters to allow in leaf value\n * @type {number}\n * @private\n */\nexport const MAX_LEAF_SIZE_ = 10 * 1024 * 1024;\n\n/**\n * @param {*} key\n * @return {boolean}\n */\nexport const isValidKey = function(key: unknown): boolean {\n return (\n typeof key === 'string' && key.length !== 0 && !INVALID_KEY_REGEX_.test(key)\n );\n};\n\n/**\n * @param {string} pathString\n * @return {boolean}\n */\nexport const isValidPathString = function(pathString: string): boolean {\n return (\n typeof pathString === 'string' &&\n pathString.length !== 0 &&\n !INVALID_PATH_REGEX_.test(pathString)\n );\n};\n\n/**\n * @param {string} pathString\n * @return {boolean}\n */\nexport const isValidRootPathString = function(pathString: string): boolean {\n if (pathString) {\n // Allow '/.info/' at the beginning.\n pathString = pathString.replace(/^\\/*\\.info(\\/|$)/, '/');\n }\n\n return isValidPathString(pathString);\n};\n\n/**\n * @param {*} priority\n * @return {boolean}\n */\nexport const isValidPriority = function(priority: unknown): boolean {\n return (\n priority === null ||\n typeof priority === 'string' ||\n (typeof priority === 'number' && !isInvalidJSONNumber(priority)) ||\n (priority &&\n typeof priority === 'object' &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n contains(priority as any, '.sv'))\n );\n};\n\n/**\n * Pre-validate a datum passed as an argument to Firebase function.\n *\n * @param {string} fnName\n * @param {number} argumentNumber\n * @param {*} data\n * @param {!Path} path\n * @param {boolean} optional\n */\nexport const validateFirebaseDataArg = function(\n fnName: string,\n argumentNumber: number,\n data: unknown,\n path: Path,\n optional: boolean\n) {\n if (optional && data === undefined) {\n return;\n }\n\n validateFirebaseData(\n errorPrefixFxn(fnName, argumentNumber, optional),\n data,\n path\n );\n};\n\n/**\n * Validate a data object client-side before sending to server.\n *\n * @param {string} errorPrefix\n * @param {*} data\n * @param {!Path|!ValidationPath} path_\n */\nexport const validateFirebaseData = function(\n errorPrefix: string,\n data: unknown,\n path_: Path | ValidationPath\n) {\n const path =\n path_ instanceof Path ? new ValidationPath(path_, errorPrefix) : path_;\n\n if (data === undefined) {\n throw new Error(errorPrefix + 'contains undefined ' + path.toErrorString());\n }\n if (typeof data === 'function') {\n throw new Error(\n errorPrefix +\n 'contains a function ' +\n path.toErrorString() +\n ' with contents = ' +\n data.toString()\n );\n }\n if (isInvalidJSONNumber(data)) {\n throw new Error(\n errorPrefix + 'contains ' + data.toString() + ' ' + path.toErrorString()\n );\n }\n\n // Check max leaf size, but try to avoid the utf8 conversion if we can.\n if (\n typeof data === 'string' &&\n data.length > MAX_LEAF_SIZE_ / 3 &&\n stringLength(data) > MAX_LEAF_SIZE_\n ) {\n throw new Error(\n errorPrefix +\n 'contains a string greater than ' +\n MAX_LEAF_SIZE_ +\n ' utf8 bytes ' +\n path.toErrorString() +\n \" ('\" +\n data.substring(0, 50) +\n \"...')\"\n );\n }\n\n // TODO = Perf = Consider combining the recursive validation of keys into NodeFromJSON\n // to save extra walking of large objects.\n if (data && typeof data === 'object') {\n let hasDotValue = false;\n let hasActualChild = false;\n each(data, (key: string, value: unknown) => {\n if (key === '.value') {\n hasDotValue = true;\n } else if (key !== '.priority' && key !== '.sv') {\n hasActualChild = true;\n if (!isValidKey(key)) {\n throw new Error(\n errorPrefix +\n ' contains an invalid key (' +\n key +\n ') ' +\n path.toErrorString() +\n '. Keys must be non-empty strings ' +\n 'and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"'\n );\n }\n }\n\n path.push(key);\n validateFirebaseData(errorPrefix, value, path);\n path.pop();\n });\n\n if (hasDotValue && hasActualChild) {\n throw new Error(\n errorPrefix +\n ' contains \".value\" child ' +\n path.toErrorString() +\n ' in addition to actual children.'\n );\n }\n }\n};\n\n/**\n * Pre-validate paths passed in the firebase function.\n *\n * @param {string} errorPrefix\n * @param {Array<!Path>} mergePaths\n */\nexport const validateFirebaseMergePaths = function(\n errorPrefix: string,\n mergePaths: Path[]\n) {\n let i, curPath;\n for (i = 0; i < mergePaths.length; i++) {\n curPath = mergePaths[i];\n const keys = curPath.slice();\n for (let j = 0; j < keys.length; j++) {\n if (keys[j] === '.priority' && j === keys.length - 1) {\n // .priority is OK\n } else if (!isValidKey(keys[j])) {\n throw new Error(\n errorPrefix +\n 'contains an invalid key (' +\n keys[j] +\n ') in path ' +\n curPath.toString() +\n '. Keys must be non-empty strings ' +\n 'and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"'\n );\n }\n }\n }\n\n // Check that update keys are not descendants of each other.\n // We rely on the property that sorting guarantees that ancestors come\n // right before descendants.\n mergePaths.sort(Path.comparePaths);\n let prevPath: Path | null = null;\n for (i = 0; i < mergePaths.length; i++) {\n curPath = mergePaths[i];\n if (prevPath !== null && prevPath.contains(curPath)) {\n throw new Error(\n errorPrefix +\n 'contains a path ' +\n prevPath.toString() +\n ' that is ancestor of another path ' +\n curPath.toString()\n );\n }\n prevPath = curPath;\n }\n};\n\n/**\n * pre-validate an object passed as an argument to firebase function (\n * must be an object - e.g. for firebase.update()).\n *\n * @param {string} fnName\n * @param {number} argumentNumber\n * @param {*} data\n * @param {!Path} path\n * @param {boolean} optional\n */\nexport const validateFirebaseMergeDataArg = function(\n fnName: string,\n argumentNumber: number,\n data: unknown,\n path: Path,\n optional: boolean\n) {\n if (optional && data === undefined) {\n return;\n }\n\n const errorPrefix = errorPrefixFxn(fnName, argumentNumber, optional);\n\n if (!(data && typeof data === 'object') || Array.isArray(data)) {\n throw new Error(\n errorPrefix + ' must be an object containing the children to replace.'\n );\n }\n\n const mergePaths: Path[] = [];\n each(data, (key: string, value: unknown) => {\n const curPath = new Path(key);\n validateFirebaseData(errorPrefix, value, path.child(curPath));\n if (curPath.getBack() === '.priority') {\n if (!isValidPriority(value)) {\n throw new Error(\n errorPrefix +\n \"contains an invalid value for '\" +\n curPath.toString() +\n \"', which must be a valid \" +\n 'Firebase priority (a string, finite number, server value, or null).'\n );\n }\n }\n mergePaths.push(curPath);\n });\n validateFirebaseMergePaths(errorPrefix, mergePaths);\n};\n\nexport const validatePriority = function(\n fnName: string,\n argumentNumber: number,\n priority: unknown,\n optional: boolean\n) {\n if (optional && priority === undefined) {\n return;\n }\n if (isInvalidJSONNumber(priority)) {\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, optional) +\n 'is ' +\n priority.toString() +\n ', but must be a valid Firebase priority (a string, finite number, ' +\n 'server value, or null).'\n );\n }\n // Special case to allow importing data with a .sv.\n if (!isValidPriority(priority)) {\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, optional) +\n 'must be a valid Firebase priority ' +\n '(a string, finite number, server value, or null).'\n );\n }\n};\n\nexport const validateEventType = function(\n fnName: string,\n argumentNumber: number,\n eventType: string,\n optional: boolean\n) {\n if (optional && eventType === undefined) {\n return;\n }\n\n switch (eventType) {\n case 'value':\n case 'child_added':\n case 'child_removed':\n case 'child_changed':\n case 'child_moved':\n break;\n default:\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, optional) +\n 'must be a valid event type = \"value\", \"child_added\", \"child_removed\", ' +\n '\"child_changed\", or \"child_moved\".'\n );\n }\n};\n\nexport const validateKey = function(\n fnName: string,\n argumentNumber: number,\n key: string,\n optional: boolean\n) {\n if (optional && key === undefined) {\n return;\n }\n if (!isValidKey(key)) {\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, optional) +\n 'was an invalid key = \"' +\n key +\n '\". Firebase keys must be non-empty strings and ' +\n 'can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\").'\n );\n }\n};\n\nexport const validatePathString = function(\n fnName: string,\n argumentNumber: number,\n pathString: string,\n optional: boolean\n) {\n if (optional && pathString === undefined) {\n return;\n }\n\n if (!isValidPathString(pathString)) {\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, optional) +\n 'was an invalid path = \"' +\n pathString +\n '\". Paths must be non-empty strings and ' +\n 'can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\"'\n );\n }\n};\n\nexport const validateRootPathString = function(\n fnName: string,\n argumentNumber: number,\n pathString: string,\n optional: boolean\n) {\n if (pathString) {\n // Allow '/.info/' at the beginning.\n pathString = pathString.replace(/^\\/*\\.info(\\/|$)/, '/');\n }\n\n validatePathString(fnName, argumentNumber, pathString, optional);\n};\n\nexport const validateWritablePath = function(fnName: string, path: Path) {\n if (path.getFront() === '.info') {\n throw new Error(fnName + \" failed = Can't modify data under /.info/\");\n }\n};\n\nexport const validateUrl = function(\n fnName: string,\n argumentNumber: number,\n parsedUrl: { repoInfo: RepoInfo; path: Path }\n) {\n // TODO = Validate server better.\n const pathString = parsedUrl.path.toString();\n if (\n !(typeof parsedUrl.repoInfo.host === 'string') ||\n parsedUrl.repoInfo.host.length === 0 ||\n (!isValidKey(parsedUrl.repoInfo.namespace) &&\n parsedUrl.repoInfo.host.split(':')[0] !== 'localhost') ||\n (pathString.length !== 0 && !isValidRootPathString(pathString))\n ) {\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, false) +\n 'must be a valid firebase URL and ' +\n 'the path can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\".'\n );\n }\n};\n\nexport const validateCredential = function(\n fnName: string,\n argumentNumber: number,\n cred: unknown,\n optional: boolean\n) {\n if (optional && cred === undefined) {\n return;\n }\n if (!(typeof cred === 'string')) {\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, optional) +\n 'must be a valid credential (a string).'\n );\n }\n};\n\nexport const validateBoolean = function(\n fnName: string,\n argumentNumber: number,\n bool: unknown,\n optional: boolean\n) {\n if (optional && bool === undefined) {\n return;\n }\n if (typeof bool !== 'boolean') {\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, optional) + 'must be a boolean.'\n );\n }\n};\n\nexport const validateString = function(\n fnName: string,\n argumentNumber: number,\n string: unknown,\n optional: boolean\n) {\n if (optional && string === undefined) {\n return;\n }\n if (!(typeof string === 'string')) {\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, optional) +\n 'must be a valid string.'\n );\n }\n};\n\nexport const validateObject = function(\n fnName: string,\n argumentNumber: number,\n obj: unknown,\n optional: boolean\n) {\n if (optional && obj === undefined) {\n return;\n }\n if (!(obj && typeof obj === 'object') || obj === null) {\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, optional) +\n 'must be a valid object.'\n );\n }\n};\n\nexport const validateObjectContainsKey = function(\n fnName: string,\n argumentNumber: number,\n obj: unknown,\n key: string,\n optional: boolean,\n optType?: string\n) {\n const objectContainsKey =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj && typeof obj === 'object' && contains(obj as any, key);\n\n if (!objectContainsKey) {\n if (optional) {\n return;\n } else {\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, optional) +\n 'must contain the key \"' +\n key +\n '\"'\n );\n }\n }\n\n if (optType) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const val = safeGet(obj as any, key);\n if (\n (optType === 'number' && !(typeof val === 'number')) ||\n (optType === 'string' && !(typeof val === 'string')) ||\n (optType === 'boolean' && !(typeof val === 'boolean')) ||\n (optType === 'function' && !(typeof val === 'function')) ||\n (optType === 'object' && !(typeof val === 'object') && val)\n ) {\n if (optional) {\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, optional) +\n 'contains invalid value for key \"' +\n key +\n '\" (must be of type \"' +\n optType +\n '\")'\n );\n } else {\n throw new Error(\n errorPrefixFxn(fnName, argumentNumber, optional) +\n 'must contain the key \"' +\n key +\n '\" with type \"' +\n optType +\n '\"'\n );\n }\n }\n }\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { validateArgCount, validateCallback, Deferred } from '@firebase/util';\nimport {\n validateWritablePath,\n validateFirebaseDataArg,\n validatePriority,\n validateFirebaseMergeDataArg\n} from '../core/util/validation';\nimport { warn } from '../core/util/util';\n\nimport { Repo } from '../core/Repo';\nimport { Path } from '../core/util/Path';\nimport { Indexable } from '../core/util/misc';\n\n/**\n * @constructor\n */\nexport class OnDisconnect {\n /**\n * @param {!Repo} repo_\n * @param {!Path} path_\n */\n constructor(private repo_: Repo, private path_: Path) {}\n\n /**\n * @param {function(?Error)=} onComplete\n * @return {!firebase.Promise}\n */\n cancel(onComplete?: (a: Error | null) => void): Promise<void> {\n validateArgCount('OnDisconnect.cancel', 0, 1, arguments.length);\n validateCallback('OnDisconnect.cancel', 1, onComplete, true);\n const deferred = new Deferred<void>();\n this.repo_.onDisconnectCancel(\n this.path_,\n deferred.wrapCallback(onComplete)\n );\n return deferred.promise;\n }\n\n /**\n * @param {function(?Error)=} onComplete\n * @return {!firebase.Promise}\n */\n remove(onComplete?: (a: Error | null) => void): Promise<void> {\n validateArgCount('OnDisconnect.remove', 0, 1, arguments.length);\n validateWritablePath('OnDisconnect.remove', this.path_);\n validateCallback('OnDisconnect.remove', 1, onComplete, true);\n const deferred = new Deferred<void>();\n this.repo_.onDisconnectSet(\n this.path_,\n null,\n deferred.wrapCallback(onComplete)\n );\n return deferred.promise;\n }\n\n /**\n * @param {*} value\n * @param {function(?Error)=} onComplete\n * @return {!firebase.Promise}\n */\n set(value: unknown, onComplete?: (a: Error | null) => void): Promise<void> {\n validateArgCount('OnDisconnect.set', 1, 2, arguments.length);\n validateWritablePath('OnDisconnect.set', this.path_);\n validateFirebaseDataArg('OnDisconnect.set', 1, value, this.path_, false);\n validateCallback('OnDisconnect.set', 2, onComplete, true);\n const deferred = new Deferred<void>();\n this.repo_.onDisconnectSet(\n this.path_,\n value,\n deferred.wrapCallback(onComplete)\n );\n return deferred.promise;\n }\n\n /**\n * @param {*} value\n * @param {number|string|null} priority\n * @param {function(?Error)=} onComplete\n * @return {!firebase.Promise}\n */\n setWithPriority(\n value: unknown,\n priority: number | string | null,\n onComplete?: (a: Error | null) => void\n ): Promise<void> {\n validateArgCount('OnDisconnect.setWithPriority', 2, 3, arguments.length);\n validateWritablePath('OnDisconnect.setWithPriority', this.path_);\n validateFirebaseDataArg(\n 'OnDisconnect.setWithPriority',\n 1,\n value,\n this.path_,\n false\n );\n validatePriority('OnDisconnect.setWithPriority', 2, priority, false);\n validateCallback('OnDisconnect.setWithPriority', 3, onComplete, true);\n\n const deferred = new Deferred<void>();\n this.repo_.onDisconnectSetWithPriority(\n this.path_,\n value,\n priority,\n deferred.wrapCallback(onComplete)\n );\n return deferred.promise;\n }\n\n /**\n * @param {!Object} objectToMerge\n * @param {function(?Error)=} onComplete\n * @return {!firebase.Promise}\n */\n update(\n objectToMerge: Indexable,\n onComplete?: (a: Error | null) => void\n ): Promise<void> {\n validateArgCount('OnDisconnect.update', 1, 2, arguments.length);\n validateWritablePath('OnDisconnect.update', this.path_);\n if (Array.isArray(objectToMerge)) {\n const newObjectToMerge: { [k: string]: unknown } = {};\n for (let i = 0; i < objectToMerge.length; ++i) {\n newObjectToMerge['' + i] = objectToMerge[i];\n }\n objectToMerge = newObjectToMerge;\n warn(\n 'Passing an Array to firebase.database.onDisconnect().update() is deprecated. Use set() if you want to overwrite the ' +\n 'existing data, or an Object with integer keys if you really do want to only update some of the children.'\n );\n }\n validateFirebaseMergeDataArg(\n 'OnDisconnect.update',\n 1,\n objectToMerge,\n this.path_,\n false\n );\n validateCallback('OnDisconnect.update', 2, onComplete, true);\n const deferred = new Deferred<void>();\n this.repo_.onDisconnectUpdate(\n this.path_,\n objectToMerge,\n deferred.wrapCallback(onComplete)\n );\n return deferred.promise;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DataSnapshot } from './DataSnapshot';\nimport { validateArgCount } from '@firebase/util';\n\nexport class TransactionResult {\n /**\n * A type for the resolve value of Firebase.transaction.\n * @constructor\n * @dict\n * @param {boolean} committed\n * @param {DataSnapshot} snapshot\n */\n constructor(public committed: boolean, public snapshot: DataSnapshot) {}\n\n // Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary\n // for end-users\n toJSON(): object {\n validateArgCount('TransactionResult.toJSON', 0, 1, arguments.length);\n return { committed: this.committed, snapshot: this.snapshot.toJSON() };\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\n/**\n * Fancy ID generator that creates 20-character string identifiers with the\n * following properties:\n *\n * 1. They're based on timestamp so that they sort *after* any existing ids.\n * 2. They contain 72-bits of random data after the timestamp so that IDs won't\n * collide with other clients' IDs.\n * 3. They sort *lexicographically* (so the timestamp is converted to characters\n * that will sort properly).\n * 4. They're monotonically increasing. Even if you generate more than one in\n * the same timestamp, the latter ones will sort after the former ones. We do\n * this by using the previous random bits but \"incrementing\" them by 1 (only\n * in the case of a timestamp collision).\n */\nexport const nextPushId = (function() {\n // Modeled after base64 web-safe chars, but ordered by ASCII.\n const PUSH_CHARS =\n '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';\n\n // Timestamp of last push, used to prevent local collisions if you push twice\n // in one ms.\n let lastPushTime = 0;\n\n // We generate 72-bits of randomness which get turned into 12 characters and\n // appended to the timestamp to prevent collisions with other clients. We\n // store the last characters we generated because in the event of a collision,\n // we'll use those same characters except \"incremented\" by one.\n const lastRandChars: number[] = [];\n\n return function(now: number) {\n const duplicateTime = now === lastPushTime;\n lastPushTime = now;\n\n let i;\n const timeStampChars = new Array(8);\n for (i = 7; i >= 0; i--) {\n timeStampChars[i] = PUSH_CHARS.charAt(now % 64);\n // NOTE: Can't use << here because javascript will convert to int and lose\n // the upper bits.\n now = Math.floor(now / 64);\n }\n assert(now === 0, 'Cannot push at time == 0');\n\n let id = timeStampChars.join('');\n\n if (!duplicateTime) {\n for (i = 0; i < 12; i++) {\n lastRandChars[i] = Math.floor(Math.random() * 64);\n }\n } else {\n // If the timestamp hasn't changed since last push, use the same random\n // number, except incremented by 1.\n for (i = 11; i >= 0 && lastRandChars[i] === 63; i--) {\n lastRandChars[i] = 0;\n }\n lastRandChars[i]++;\n }\n for (i = 0; i < 12; i++) {\n id += PUSH_CHARS.charAt(lastRandChars[i]);\n }\n assert(id.length === 20, 'nextPushId: Length should be 20.');\n\n return id;\n };\n})();\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Path } from '../util/Path';\nimport { Index } from './indexes/Index';\n\n/**\n * Node is an interface defining the common functionality for nodes in\n * a DataSnapshot.\n *\n * @interface\n */\nexport interface Node {\n /**\n * Whether this node is a leaf node.\n * @return {boolean} Whether this is a leaf node.\n */\n isLeafNode(): boolean;\n\n /**\n * Gets the priority of the node.\n * @return {!Node} The priority of the node.\n */\n getPriority(): Node;\n\n /**\n * Returns a duplicate node with the new priority.\n * @param {!Node} newPriorityNode New priority to set for the node.\n * @return {!Node} Node with new priority.\n */\n updatePriority(newPriorityNode: Node): Node;\n\n /**\n * Returns the specified immediate child, or null if it doesn't exist.\n * @param {string} childName The name of the child to retrieve.\n * @return {!Node} The retrieved child, or an empty node.\n */\n getImmediateChild(childName: string): Node;\n\n /**\n * Returns a child by path, or null if it doesn't exist.\n * @param {!Path} path The path of the child to retrieve.\n * @return {!Node} The retrieved child or an empty node.\n */\n getChild(path: Path): Node;\n\n /**\n * Returns the name of the child immediately prior to the specified childNode, or null.\n * @param {!string} childName The name of the child to find the predecessor of.\n * @param {!Node} childNode The node to find the predecessor of.\n * @param {!Index} index The index to use to determine the predecessor\n * @return {?string} The name of the predecessor child, or null if childNode is the first child.\n */\n getPredecessorChildName(\n childName: string,\n childNode: Node,\n index: Index\n ): string | null;\n\n /**\n * Returns a duplicate node, with the specified immediate child updated.\n * Any value in the node will be removed.\n * @param {string} childName The name of the child to update.\n * @param {!Node} newChildNode The new child node\n * @return {!Node} The updated node.\n */\n updateImmediateChild(childName: string, newChildNode: Node): Node;\n\n /**\n * Returns a duplicate node, with the specified child updated. Any value will\n * be removed.\n * @param {!Path} path The path of the child to update.\n * @param {!Node} newChildNode The new child node, which may be an empty node\n * @return {!Node} The updated node.\n */\n updateChild(path: Path, newChildNode: Node): Node;\n\n /**\n * True if the immediate child specified exists\n * @param {!string} childName\n * @return {boolean}\n */\n hasChild(childName: string): boolean;\n\n /**\n * @return {boolean} True if this node has no value or children.\n */\n isEmpty(): boolean;\n\n /**\n * @return {number} The number of children of this node.\n */\n numChildren(): number;\n\n /**\n * Calls action for each child.\n * @param {!Index} index\n * @param {function(string, !Node)} action Action to be called for\n * each child. It's passed the child name and the child node.\n * @return {*} The first truthy value return by action, or the last falsey one\n */\n forEachChild(index: Index, action: (a: string, b: Node) => void): unknown;\n\n /**\n * @param exportFormat True for export format (also wire protocol format).\n * @return Value of this node as JSON.\n */\n val(exportFormat?: boolean): unknown;\n\n /**\n * @return {string} hash representing the node contents.\n */\n hash(): string;\n\n /**\n * @param {!Node} other Another node\n * @return {!number} -1 for less than, 0 for equal, 1 for greater than other\n */\n compareTo(other: Node): number;\n\n /**\n * @param {!Node} other\n * @return {boolean} Whether or not this snapshot equals other\n */\n equals(other: Node): boolean;\n\n /**\n * @param {!Index} indexDefinition\n * @return {!Node} This node, with the specified index now available\n */\n withIndex(indexDefinition: Index): Node;\n\n /**\n * @param {!Index} indexDefinition\n * @return {boolean}\n */\n isIndexed(indexDefinition: Index): boolean;\n}\n\n/**\n *\n * @param {!string} name\n * @param {!Node} node\n * @constructor\n * @struct\n */\nexport class NamedNode {\n constructor(public name: string, public node: Node) {}\n\n /**\n *\n * @param {!string} name\n * @param {!Node} node\n * @return {NamedNode}\n */\n static Wrap(name: string, node: Node) {\n return new NamedNode(name, node);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Node, NamedNode } from '../Node';\nimport { MIN_NAME, MAX_NAME } from '../../util/util';\nimport { Comparator } from '../../util/SortedMap';\n\n/**\n *\n * @constructor\n */\nexport abstract class Index {\n /**\n * @param {!NamedNode} a\n * @param {!NamedNode} b\n * @return {number}\n */\n abstract compare(a: NamedNode, b: NamedNode): number;\n\n /**\n * @param {!Node} node\n * @return {boolean}\n */\n abstract isDefinedOn(node: Node): boolean;\n\n /**\n * @return {function(!NamedNode, !NamedNode):number} A standalone comparison function for\n * this index\n */\n getCompare(): Comparator<NamedNode> {\n return this.compare.bind(this);\n }\n\n /**\n * Given a before and after value for a node, determine if the indexed value has changed. Even if they are different,\n * it's possible that the changes are isolated to parts of the snapshot that are not indexed.\n *\n * @param {!Node} oldNode\n * @param {!Node} newNode\n * @return {boolean} True if the portion of the snapshot being indexed changed between oldNode and newNode\n */\n indexedValueChanged(oldNode: Node, newNode: Node): boolean {\n const oldWrapped = new NamedNode(MIN_NAME, oldNode);\n const newWrapped = new NamedNode(MIN_NAME, newNode);\n return this.compare(oldWrapped, newWrapped) !== 0;\n }\n\n /**\n * @return {!NamedNode} a node wrapper that will sort equal to or less than\n * any other node wrapper, using this index\n */\n minPost(): NamedNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MIN;\n }\n\n /**\n * @return {!NamedNode} a node wrapper that will sort greater than or equal to\n * any other node wrapper, using this index\n */\n abstract maxPost(): NamedNode;\n\n /**\n * @param {*} indexValue\n * @param {string} name\n * @return {!NamedNode}\n */\n abstract makePost(indexValue: unknown, name: string): NamedNode;\n\n /**\n * @return {!string} String representation for inclusion in a query spec\n */\n abstract toString(): string;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Index } from './Index';\nimport { Node, NamedNode } from '../Node';\nimport { nameCompare, MAX_NAME } from '../../util/util';\nimport { assert, assertionError } from '@firebase/util';\nimport { ChildrenNode } from '../ChildrenNode';\n\nlet __EMPTY_NODE: ChildrenNode;\n\nexport class KeyIndex extends Index {\n static get __EMPTY_NODE() {\n return __EMPTY_NODE;\n }\n\n static set __EMPTY_NODE(val) {\n __EMPTY_NODE = val;\n }\n\n /**\n * @inheritDoc\n */\n compare(a: NamedNode, b: NamedNode): number {\n return nameCompare(a.name, b.name);\n }\n\n /**\n * @inheritDoc\n */\n isDefinedOn(node: Node): boolean {\n // We could probably return true here (since every node has a key), but it's never called\n // so just leaving unimplemented for now.\n throw assertionError('KeyIndex.isDefinedOn not expected to be called.');\n }\n\n /**\n * @inheritDoc\n */\n indexedValueChanged(oldNode: Node, newNode: Node): boolean {\n return false; // The key for a node never changes.\n }\n\n /**\n * @inheritDoc\n */\n minPost() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MIN;\n }\n\n /**\n * @inheritDoc\n */\n maxPost(): NamedNode {\n // TODO: This should really be created once and cached in a static property, but\n // NamedNode isn't defined yet, so I can't use it in a static. Bleh.\n return new NamedNode(MAX_NAME, __EMPTY_NODE);\n }\n\n /**\n * @param {*} indexValue\n * @param {string} name\n * @return {!NamedNode}\n */\n makePost(indexValue: string, name: string): NamedNode {\n assert(\n typeof indexValue === 'string',\n 'KeyIndex indexValue must always be a string.'\n );\n // We just use empty node, but it'll never be compared, since our comparator only looks at name.\n return new NamedNode(indexValue, __EMPTY_NODE);\n }\n\n /**\n * @return {!string} String representation for inclusion in a query spec\n */\n toString(): string {\n return '.key';\n }\n}\n\nexport const KEY_INDEX = new KeyIndex();\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, contains } from '@firebase/util';\nimport { doubleToIEEE754String } from '../util/util';\n\nimport { Node } from './Node';\nimport { Indexable } from '../util/misc';\n\nlet MAX_NODE: Node;\n\nexport function setMaxNode(val: Node) {\n MAX_NODE = val;\n}\n\n/**\n * @param {(!string|!number)} priority\n * @return {!string}\n */\nexport const priorityHashText = function(priority: string | number): string {\n if (typeof priority === 'number') {\n return 'number:' + doubleToIEEE754String(priority);\n } else {\n return 'string:' + priority;\n }\n};\n\n/**\n * Validates that a priority snapshot Node is valid.\n *\n * @param {!Node} priorityNode\n */\nexport const validatePriorityNode = function(priorityNode: Node) {\n if (priorityNode.isLeafNode()) {\n const val = priorityNode.val();\n assert(\n typeof val === 'string' ||\n typeof val === 'number' ||\n (typeof val === 'object' && contains(val as Indexable, '.sv')),\n 'Priority must be a string or number.'\n );\n } else {\n assert(\n priorityNode === MAX_NODE || priorityNode.isEmpty(),\n 'priority of unexpected type.'\n );\n }\n // Don't call getPriority() on MAX_NODE to avoid hitting assertion.\n assert(\n priorityNode === MAX_NODE || priorityNode.getPriority().isEmpty(),\n \"Priority nodes can't have a priority of their own.\"\n );\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\nimport { doubleToIEEE754String, sha1 } from '../util/util';\nimport { priorityHashText, validatePriorityNode } from './snap';\nimport { Node } from './Node';\nimport { Path } from '../util/Path';\nimport { Index } from './indexes/Index';\nimport { ChildrenNodeConstructor } from './ChildrenNode';\nimport { Indexable } from '../util/misc';\n\nlet __childrenNodeConstructor: ChildrenNodeConstructor;\n\n/**\n * LeafNode is a class for storing leaf nodes in a DataSnapshot. It\n * implements Node and stores the value of the node (a string,\n * number, or boolean) accessible via getValue().\n */\nexport class LeafNode implements Node {\n static set __childrenNodeConstructor(val: ChildrenNodeConstructor) {\n __childrenNodeConstructor = val;\n }\n\n static get __childrenNodeConstructor() {\n return __childrenNodeConstructor;\n }\n\n /**\n * The sort order for comparing leaf nodes of different types. If two leaf nodes have\n * the same type, the comparison falls back to their value\n * @type {Array.<!string>}\n * @const\n */\n static VALUE_TYPE_ORDER = ['object', 'boolean', 'number', 'string'];\n\n private lazyHash_: string | null = null;\n\n /**\n * @implements {Node}\n * @param {!(string|number|boolean|Object)} value_ The value to store in this leaf node.\n * The object type is possible in the event of a deferred value\n * @param {!Node=} priorityNode_ The priority of this node.\n */\n constructor(\n private readonly value_: string | number | boolean | Indexable,\n private priorityNode_: Node = LeafNode.__childrenNodeConstructor.EMPTY_NODE\n ) {\n assert(\n this.value_ !== undefined && this.value_ !== null,\n \"LeafNode shouldn't be created with null/undefined value.\"\n );\n\n validatePriorityNode(this.priorityNode_);\n }\n\n /** @inheritDoc */\n isLeafNode(): boolean {\n return true;\n }\n\n /** @inheritDoc */\n getPriority(): Node {\n return this.priorityNode_;\n }\n\n /** @inheritDoc */\n updatePriority(newPriorityNode: Node): Node {\n return new LeafNode(this.value_, newPriorityNode);\n }\n\n /** @inheritDoc */\n getImmediateChild(childName: string): Node {\n // Hack to treat priority as a regular child\n if (childName === '.priority') {\n return this.priorityNode_;\n } else {\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE;\n }\n }\n\n /** @inheritDoc */\n getChild(path: Path): Node {\n if (path.isEmpty()) {\n return this;\n } else if (path.getFront() === '.priority') {\n return this.priorityNode_;\n } else {\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE;\n }\n }\n\n /**\n * @inheritDoc\n */\n hasChild(): boolean {\n return false;\n }\n\n /** @inheritDoc */\n getPredecessorChildName(childName: string, childNode: Node): null {\n return null;\n }\n\n /** @inheritDoc */\n updateImmediateChild(childName: string, newChildNode: Node): Node {\n if (childName === '.priority') {\n return this.updatePriority(newChildNode);\n } else if (newChildNode.isEmpty() && childName !== '.priority') {\n return this;\n } else {\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE.updateImmediateChild(\n childName,\n newChildNode\n ).updatePriority(this.priorityNode_);\n }\n }\n\n /** @inheritDoc */\n updateChild(path: Path, newChildNode: Node): Node {\n const front = path.getFront();\n if (front === null) {\n return newChildNode;\n } else if (newChildNode.isEmpty() && front !== '.priority') {\n return this;\n } else {\n assert(\n front !== '.priority' || path.getLength() === 1,\n '.priority must be the last token in a path'\n );\n\n return this.updateImmediateChild(\n front,\n LeafNode.__childrenNodeConstructor.EMPTY_NODE.updateChild(\n path.popFront(),\n newChildNode\n )\n );\n }\n }\n\n /** @inheritDoc */\n isEmpty(): boolean {\n return false;\n }\n\n /** @inheritDoc */\n numChildren(): number {\n return 0;\n }\n\n /** @inheritDoc */\n forEachChild(index: Index, action: (s: string, n: Node) => void): boolean {\n return false;\n }\n\n /**\n * @inheritDoc\n */\n val(exportFormat?: boolean): {} {\n if (exportFormat && !this.getPriority().isEmpty()) {\n return {\n '.value': this.getValue(),\n '.priority': this.getPriority().val()\n };\n } else {\n return this.getValue();\n }\n }\n\n /** @inheritDoc */\n hash(): string {\n if (this.lazyHash_ === null) {\n let toHash = '';\n if (!this.priorityNode_.isEmpty()) {\n toHash +=\n 'priority:' +\n priorityHashText(this.priorityNode_.val() as number | string) +\n ':';\n }\n\n const type = typeof this.value_;\n toHash += type + ':';\n if (type === 'number') {\n toHash += doubleToIEEE754String(this.value_ as number);\n } else {\n toHash += this.value_;\n }\n this.lazyHash_ = sha1(toHash);\n }\n return this.lazyHash_;\n }\n\n /**\n * Returns the value of the leaf node.\n * @return {Object|string|number|boolean} The value of the node.\n */\n getValue(): Indexable | string | number | boolean {\n return this.value_;\n }\n\n /**\n * @inheritDoc\n */\n compareTo(other: Node): number {\n if (other === LeafNode.__childrenNodeConstructor.EMPTY_NODE) {\n return 1;\n } else if (other instanceof LeafNode.__childrenNodeConstructor) {\n return -1;\n } else {\n assert(other.isLeafNode(), 'Unknown node type');\n return this.compareToLeafNode_(other as LeafNode);\n }\n }\n\n /**\n * Comparison specifically for two leaf nodes\n * @param {!LeafNode} otherLeaf\n * @return {!number}\n * @private\n */\n private compareToLeafNode_(otherLeaf: LeafNode): number {\n const otherLeafType = typeof otherLeaf.value_;\n const thisLeafType = typeof this.value_;\n const otherIndex = LeafNode.VALUE_TYPE_ORDER.indexOf(otherLeafType);\n const thisIndex = LeafNode.VALUE_TYPE_ORDER.indexOf(thisLeafType);\n assert(otherIndex >= 0, 'Unknown leaf type: ' + otherLeafType);\n assert(thisIndex >= 0, 'Unknown leaf type: ' + thisLeafType);\n if (otherIndex === thisIndex) {\n // Same type, compare values\n if (thisLeafType === 'object') {\n // Deferred value nodes are all equal, but we should also never get to this point...\n return 0;\n } else {\n // Note that this works because true > false, all others are number or string comparisons\n if (this.value_ < otherLeaf.value_) {\n return -1;\n } else if (this.value_ === otherLeaf.value_) {\n return 0;\n } else {\n return 1;\n }\n }\n } else {\n return thisIndex - otherIndex;\n }\n }\n\n /**\n * @inheritDoc\n */\n withIndex(): Node {\n return this;\n }\n\n /**\n * @inheritDoc\n */\n isIndexed(): boolean {\n return true;\n }\n\n /**\n * @inheritDoc\n */\n equals(other: Node): boolean {\n /**\n * @inheritDoc\n */\n if (other === this) {\n return true;\n } else if (other.isLeafNode()) {\n const otherLeaf = other as LeafNode;\n return (\n this.value_ === otherLeaf.value_ &&\n this.priorityNode_.equals(otherLeaf.priorityNode_)\n );\n } else {\n return false;\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Index } from './Index';\nimport { nameCompare, MAX_NAME } from '../../util/util';\nimport { NamedNode, Node } from '../Node';\nimport { LeafNode } from '../LeafNode';\n\nlet nodeFromJSON: (a: unknown) => Node;\nlet MAX_NODE: Node;\n\nexport function setNodeFromJSON(val: (a: unknown) => Node) {\n nodeFromJSON = val;\n}\n\nexport function setMaxNode(val: Node) {\n MAX_NODE = val;\n}\n\n/**\n * @constructor\n * @extends {Index}\n * @private\n */\nexport class PriorityIndex extends Index {\n /**\n * @inheritDoc\n */\n compare(a: NamedNode, b: NamedNode): number {\n const aPriority = a.node.getPriority();\n const bPriority = b.node.getPriority();\n const indexCmp = aPriority.compareTo(bPriority);\n if (indexCmp === 0) {\n return nameCompare(a.name, b.name);\n } else {\n return indexCmp;\n }\n }\n\n /**\n * @inheritDoc\n */\n isDefinedOn(node: Node): boolean {\n return !node.getPriority().isEmpty();\n }\n\n /**\n * @inheritDoc\n */\n indexedValueChanged(oldNode: Node, newNode: Node): boolean {\n return !oldNode.getPriority().equals(newNode.getPriority());\n }\n\n /**\n * @inheritDoc\n */\n minPost(): NamedNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MIN;\n }\n\n /**\n * @inheritDoc\n */\n maxPost(): NamedNode {\n return new NamedNode(MAX_NAME, new LeafNode('[PRIORITY-POST]', MAX_NODE));\n }\n\n /**\n * @param {*} indexValue\n * @param {string} name\n * @return {!NamedNode}\n */\n makePost(indexValue: unknown, name: string): NamedNode {\n const priorityNode = nodeFromJSON(indexValue);\n return new NamedNode(name, new LeafNode('[PRIORITY-POST]', priorityNode));\n }\n\n /**\n * @return {!string} String representation for inclusion in a query spec\n */\n toString(): string {\n return '.priority';\n }\n}\n\nexport const PRIORITY_INDEX = new PriorityIndex();\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Implementation of an immutable SortedMap using a Left-leaning\n * Red-Black Tree, adapted from the implementation in Mugs\n * (http://mads379.github.com/mugs/) by Mads Hartmann Jensen\n * (mads379@gmail.com).\n *\n * Original paper on Left-leaning Red-Black Trees:\n * http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf\n *\n * Invariant 1: No red node has a red child\n * Invariant 2: Every leaf path has the same number of black nodes\n * Invariant 3: Only the left child can be red (left leaning)\n */\n\n// TODO: There are some improvements I'd like to make to improve memory / perf:\n// * Create two prototypes, LLRedNode and LLBlackNode, instead of storing a\n// color property in every node.\n// TODO: It would also be good (and possibly necessary) to create a base\n// interface for LLRBNode and LLRBEmptyNode.\n\nexport type Comparator<K> = (key1: K, key2: K) => number;\n\n/**\n * An iterator over an LLRBNode.\n */\nexport class SortedMapIterator<K, V, T> {\n /** @private\n * @type {Array.<!LLRBNode>}\n */\n private nodeStack_: Array<LLRBNode<K, V> | LLRBEmptyNode<K, V>> = [];\n\n /**\n * @template K, V, T\n * @param {LLRBNode|LLRBEmptyNode} node Node to iterate.\n * @param {?K} startKey\n * @param {function(K, K): number} comparator\n * @param {boolean} isReverse_ Whether or not to iterate in reverse\n * @param {(function(K, V):T)=} resultGenerator_\n */\n constructor(\n node: LLRBNode<K, V> | LLRBEmptyNode<K, V>,\n startKey: K | null,\n comparator: Comparator<K>,\n private isReverse_: boolean,\n private resultGenerator_: ((k: K, v: V) => T) | null = null\n ) {\n let cmp = 1;\n while (!node.isEmpty()) {\n node = node as LLRBNode<K, V>;\n cmp = startKey ? comparator(node.key, startKey) : 1;\n // flip the comparison if we're going in reverse\n if (isReverse_) {\n cmp *= -1;\n }\n\n if (cmp < 0) {\n // This node is less than our start key. ignore it\n if (this.isReverse_) {\n node = node.left;\n } else {\n node = node.right;\n }\n } else if (cmp === 0) {\n // This node is exactly equal to our start key. Push it on the stack, but stop iterating;\n this.nodeStack_.push(node);\n break;\n } else {\n // This node is greater than our start key, add it to the stack and move to the next one\n this.nodeStack_.push(node);\n if (this.isReverse_) {\n node = node.right;\n } else {\n node = node.left;\n }\n }\n }\n }\n\n getNext(): T {\n if (this.nodeStack_.length === 0) {\n return null;\n }\n\n let node = this.nodeStack_.pop();\n let result: T;\n if (this.resultGenerator_) {\n result = this.resultGenerator_(node.key, node.value);\n } else {\n result = ({ key: node.key, value: node.value } as unknown) as T;\n }\n\n if (this.isReverse_) {\n node = node.left;\n while (!node.isEmpty()) {\n this.nodeStack_.push(node);\n node = node.right;\n }\n } else {\n node = node.right;\n while (!node.isEmpty()) {\n this.nodeStack_.push(node);\n node = node.left;\n }\n }\n\n return result;\n }\n\n hasNext(): boolean {\n return this.nodeStack_.length > 0;\n }\n\n peek(): T {\n if (this.nodeStack_.length === 0) {\n return null;\n }\n\n const node = this.nodeStack_[this.nodeStack_.length - 1];\n if (this.resultGenerator_) {\n return this.resultGenerator_(node.key, node.value);\n } else {\n return ({ key: node.key, value: node.value } as unknown) as T;\n }\n }\n}\n\n/**\n * Represents a node in a Left-leaning Red-Black tree.\n */\nexport class LLRBNode<K, V> {\n color: boolean;\n left: LLRBNode<K, V> | LLRBEmptyNode<K, V>;\n right: LLRBNode<K, V> | LLRBEmptyNode<K, V>;\n\n /**\n * @template K, V\n * @param {!K} key Key associated with this node.\n * @param {!V} value Value associated with this node.\n * @param {?boolean} color Whether this node is red.\n * @param {?(LLRBNode|LLRBEmptyNode)=} left Left child.\n * @param {?(LLRBNode|LLRBEmptyNode)=} right Right child.\n */\n constructor(\n public key: K,\n public value: V,\n color: boolean | null,\n left?: LLRBNode<K, V> | LLRBEmptyNode<K, V> | null,\n right?: LLRBNode<K, V> | LLRBEmptyNode<K, V> | null\n ) {\n this.color = color != null ? color : LLRBNode.RED;\n this.left =\n left != null ? left : (SortedMap.EMPTY_NODE as LLRBEmptyNode<K, V>);\n this.right =\n right != null ? right : (SortedMap.EMPTY_NODE as LLRBEmptyNode<K, V>);\n }\n\n static RED = true;\n static BLACK = false;\n\n /**\n * Returns a copy of the current node, optionally replacing pieces of it.\n *\n * @param {?K} key New key for the node, or null.\n * @param {?V} value New value for the node, or null.\n * @param {?boolean} color New color for the node, or null.\n * @param {?LLRBNode|LLRBEmptyNode} left New left child for the node, or null.\n * @param {?LLRBNode|LLRBEmptyNode} right New right child for the node, or null.\n * @return {!LLRBNode} The node copy.\n */\n copy(\n key: K | null,\n value: V | null,\n color: boolean | null,\n left: LLRBNode<K, V> | LLRBEmptyNode<K, V> | null,\n right: LLRBNode<K, V> | LLRBEmptyNode<K, V> | null\n ): LLRBNode<K, V> {\n return new LLRBNode(\n key != null ? key : this.key,\n value != null ? value : this.value,\n color != null ? color : this.color,\n left != null ? left : this.left,\n right != null ? right : this.right\n );\n }\n\n /**\n * @return {number} The total number of nodes in the tree.\n */\n count(): number {\n return this.left.count() + 1 + this.right.count();\n }\n\n /**\n * @return {boolean} True if the tree is empty.\n */\n isEmpty(): boolean {\n return false;\n }\n\n /**\n * Traverses the tree in key order and calls the specified action function\n * for each node.\n *\n * @param {function(!K, !V):*} action Callback function to be called for each\n * node. If it returns true, traversal is aborted.\n * @return {*} The first truthy value returned by action, or the last falsey\n * value returned by action\n */\n inorderTraversal(action: (k: K, v: V) => unknown): boolean {\n return (\n this.left.inorderTraversal(action) ||\n !!action(this.key, this.value) ||\n this.right.inorderTraversal(action)\n );\n }\n\n /**\n * Traverses the tree in reverse key order and calls the specified action function\n * for each node.\n *\n * @param {function(!Object, !Object)} action Callback function to be called for each\n * node. If it returns true, traversal is aborted.\n * @return {*} True if traversal was aborted.\n */\n reverseTraversal(action: (k: K, v: V) => void): boolean {\n return (\n this.right.reverseTraversal(action) ||\n action(this.key, this.value) ||\n this.left.reverseTraversal(action)\n );\n }\n\n /**\n * @return {!Object} The minimum node in the tree.\n * @private\n */\n private min_(): LLRBNode<K, V> {\n if (this.left.isEmpty()) {\n return this;\n } else {\n return (this.left as LLRBNode<K, V>).min_();\n }\n }\n\n /**\n * @return {!K} The maximum key in the tree.\n */\n minKey(): K {\n return this.min_().key;\n }\n\n /**\n * @return {!K} The maximum key in the tree.\n */\n maxKey(): K {\n if (this.right.isEmpty()) {\n return this.key;\n } else {\n return this.right.maxKey();\n }\n }\n\n /**\n *\n * @param {!Object} key Key to insert.\n * @param {!Object} value Value to insert.\n * @param {Comparator} comparator Comparator.\n * @return {!LLRBNode} New tree, with the key/value added.\n */\n insert(key: K, value: V, comparator: Comparator<K>): LLRBNode<K, V> {\n let n: LLRBNode<K, V> = this;\n const cmp = comparator(key, n.key);\n if (cmp < 0) {\n n = n.copy(null, null, null, n.left.insert(key, value, comparator), null);\n } else if (cmp === 0) {\n n = n.copy(null, value, null, null, null);\n } else {\n n = n.copy(\n null,\n null,\n null,\n null,\n n.right.insert(key, value, comparator)\n );\n }\n return n.fixUp_();\n }\n\n /**\n * @private\n * @return {!LLRBNode|LLRBEmptyNode} New tree, with the minimum key removed.\n */\n private removeMin_(): LLRBNode<K, V> | LLRBEmptyNode<K, V> {\n if (this.left.isEmpty()) {\n return SortedMap.EMPTY_NODE as LLRBEmptyNode<K, V>;\n }\n let n: LLRBNode<K, V> = this;\n if (!n.left.isRed_() && !n.left.left.isRed_()) {\n n = n.moveRedLeft_();\n }\n n = n.copy(null, null, null, (n.left as LLRBNode<K, V>).removeMin_(), null);\n return n.fixUp_();\n }\n\n /**\n * @param {!Object} key The key of the item to remove.\n * @param {Comparator} comparator Comparator.\n * @return {!LLRBNode|LLRBEmptyNode} New tree, with the specified item removed.\n */\n remove(\n key: K,\n comparator: Comparator<K>\n ): LLRBNode<K, V> | LLRBEmptyNode<K, V> {\n let n, smallest;\n n = this;\n if (comparator(key, n.key) < 0) {\n if (!n.left.isEmpty() && !n.left.isRed_() && !n.left.left.isRed_()) {\n n = n.moveRedLeft_();\n }\n n = n.copy(null, null, null, n.left.remove(key, comparator), null);\n } else {\n if (n.left.isRed_()) {\n n = n.rotateRight_();\n }\n if (!n.right.isEmpty() && !n.right.isRed_() && !n.right.left.isRed_()) {\n n = n.moveRedRight_();\n }\n if (comparator(key, n.key) === 0) {\n if (n.right.isEmpty()) {\n return SortedMap.EMPTY_NODE as LLRBEmptyNode<K, V>;\n } else {\n smallest = (n.right as LLRBNode<K, V>).min_();\n n = n.copy(\n smallest.key,\n smallest.value,\n null,\n null,\n (n.right as LLRBNode<K, V>).removeMin_()\n );\n }\n }\n n = n.copy(null, null, null, null, n.right.remove(key, comparator));\n }\n return n.fixUp_();\n }\n\n /**\n * @private\n * @return {boolean} Whether this is a RED node.\n */\n isRed_(): boolean {\n return this.color;\n }\n\n /**\n * @private\n * @return {!LLRBNode} New tree after performing any needed rotations.\n */\n private fixUp_(): LLRBNode<K, V> {\n let n: LLRBNode<K, V> = this;\n if (n.right.isRed_() && !n.left.isRed_()) {\n n = n.rotateLeft_();\n }\n if (n.left.isRed_() && n.left.left.isRed_()) {\n n = n.rotateRight_();\n }\n if (n.left.isRed_() && n.right.isRed_()) {\n n = n.colorFlip_();\n }\n return n;\n }\n\n /**\n * @private\n * @return {!LLRBNode} New tree, after moveRedLeft.\n */\n private moveRedLeft_(): LLRBNode<K, V> {\n let n = this.colorFlip_();\n if (n.right.left.isRed_()) {\n n = n.copy(\n null,\n null,\n null,\n null,\n (n.right as LLRBNode<K, V>).rotateRight_()\n );\n n = n.rotateLeft_();\n n = n.colorFlip_();\n }\n return n;\n }\n\n /**\n * @private\n * @return {!LLRBNode} New tree, after moveRedRight.\n */\n private moveRedRight_(): LLRBNode<K, V> {\n let n = this.colorFlip_();\n if (n.left.left.isRed_()) {\n n = n.rotateRight_();\n n = n.colorFlip_();\n }\n return n;\n }\n\n /**\n * @private\n * @return {!LLRBNode} New tree, after rotateLeft.\n */\n private rotateLeft_(): LLRBNode<K, V> {\n const nl = this.copy(null, null, LLRBNode.RED, null, this.right.left);\n return this.right.copy(null, null, this.color, nl, null) as LLRBNode<K, V>;\n }\n\n /**\n * @private\n * @return {!LLRBNode} New tree, after rotateRight.\n */\n private rotateRight_(): LLRBNode<K, V> {\n const nr = this.copy(null, null, LLRBNode.RED, this.left.right, null);\n return this.left.copy(null, null, this.color, null, nr) as LLRBNode<K, V>;\n }\n\n /**\n * @private\n * @return {!LLRBNode} New tree, after colorFlip.\n */\n private colorFlip_(): LLRBNode<K, V> {\n const left = this.left.copy(null, null, !this.left.color, null, null);\n const right = this.right.copy(null, null, !this.right.color, null, null);\n return this.copy(null, null, !this.color, left, right);\n }\n\n /**\n * For testing.\n *\n * @private\n * @return {boolean} True if all is well.\n */\n private checkMaxDepth_(): boolean {\n const blackDepth = this.check_();\n return Math.pow(2.0, blackDepth) <= this.count() + 1;\n }\n\n /**\n * @private\n * @return {number} Not sure what this returns exactly. :-).\n */\n check_(): number {\n if (this.isRed_() && this.left.isRed_()) {\n throw new Error(\n 'Red node has red child(' + this.key + ',' + this.value + ')'\n );\n }\n if (this.right.isRed_()) {\n throw new Error(\n 'Right child of (' + this.key + ',' + this.value + ') is red'\n );\n }\n const blackDepth = this.left.check_();\n if (blackDepth !== this.right.check_()) {\n throw new Error('Black depths differ');\n } else {\n return blackDepth + (this.isRed_() ? 0 : 1);\n }\n }\n}\n\n/**\n * Represents an empty node (a leaf node in the Red-Black Tree).\n */\nexport class LLRBEmptyNode<K, V> {\n key: K;\n value: V;\n left: LLRBNode<K, V> | LLRBEmptyNode<K, V>;\n right: LLRBNode<K, V> | LLRBEmptyNode<K, V>;\n color: boolean;\n\n /**\n * Returns a copy of the current node.\n *\n * @return {!LLRBEmptyNode} The node copy.\n */\n copy(\n key: K | null,\n value: V | null,\n color: boolean | null,\n left: LLRBNode<K, V> | LLRBEmptyNode<K, V> | null,\n right: LLRBNode<K, V> | LLRBEmptyNode<K, V> | null\n ): LLRBEmptyNode<K, V> {\n return this;\n }\n\n /**\n * Returns a copy of the tree, with the specified key/value added.\n *\n * @param {!K} key Key to be added.\n * @param {!V} value Value to be added.\n * @param {Comparator} comparator Comparator.\n * @return {!LLRBNode} New tree, with item added.\n */\n insert(key: K, value: V, comparator: Comparator<K>): LLRBNode<K, V> {\n return new LLRBNode(key, value, null);\n }\n\n /**\n * Returns a copy of the tree, with the specified key removed.\n *\n * @param {!K} key The key to remove.\n * @param {Comparator} comparator Comparator.\n * @return {!LLRBEmptyNode} New tree, with item removed.\n */\n remove(key: K, comparator: Comparator<K>): LLRBEmptyNode<K, V> {\n return this;\n }\n\n /**\n * @return {number} The total number of nodes in the tree.\n */\n count(): number {\n return 0;\n }\n\n /**\n * @return {boolean} True if the tree is empty.\n */\n isEmpty(): boolean {\n return true;\n }\n\n /**\n * Traverses the tree in key order and calls the specified action function\n * for each node.\n *\n * @param {function(!K, !V):*} action Callback function to be called for each\n * node. If it returns true, traversal is aborted.\n * @return {boolean} True if traversal was aborted.\n */\n inorderTraversal(action: (k: K, v: V) => unknown): boolean {\n return false;\n }\n\n /**\n * Traverses the tree in reverse key order and calls the specified action function\n * for each node.\n *\n * @param {function(!K, !V)} action Callback function to be called for each\n * node. If it returns true, traversal is aborted.\n * @return {boolean} True if traversal was aborted.\n */\n reverseTraversal(action: (k: K, v: V) => void): boolean {\n return false;\n }\n\n /**\n * @return {null}\n */\n minKey(): null {\n return null;\n }\n\n /**\n * @return {null}\n */\n maxKey(): null {\n return null;\n }\n\n /**\n * @private\n * @return {number} Not sure what this returns exactly. :-).\n */\n check_(): number {\n return 0;\n }\n\n /**\n * @private\n * @return {boolean} Whether this node is red.\n */\n isRed_() {\n return false;\n }\n}\n\n/**\n * An immutable sorted map implementation, based on a Left-leaning Red-Black\n * tree.\n */\nexport class SortedMap<K, V> {\n /**\n * Always use the same empty node, to reduce memory.\n * @const\n */\n static EMPTY_NODE = new LLRBEmptyNode();\n\n /**\n * @template K, V\n * @param {function(K, K):number} comparator_ Key comparator.\n * @param {LLRBNode=} root_ (Optional) Root node for the map.\n */\n constructor(\n private comparator_: Comparator<K>,\n private root_:\n | LLRBNode<K, V>\n | LLRBEmptyNode<K, V> = SortedMap.EMPTY_NODE as LLRBEmptyNode<K, V>\n ) {}\n\n /**\n * Returns a copy of the map, with the specified key/value added or replaced.\n * (TODO: We should perhaps rename this method to 'put')\n *\n * @param {!K} key Key to be added.\n * @param {!V} value Value to be added.\n * @return {!SortedMap.<K, V>} New map, with item added.\n */\n insert(key: K, value: V): SortedMap<K, V> {\n return new SortedMap(\n this.comparator_,\n this.root_\n .insert(key, value, this.comparator_)\n .copy(null, null, LLRBNode.BLACK, null, null)\n );\n }\n\n /**\n * Returns a copy of the map, with the specified key removed.\n *\n * @param {!K} key The key to remove.\n * @return {!SortedMap.<K, V>} New map, with item removed.\n */\n remove(key: K): SortedMap<K, V> {\n return new SortedMap(\n this.comparator_,\n this.root_\n .remove(key, this.comparator_)\n .copy(null, null, LLRBNode.BLACK, null, null)\n );\n }\n\n /**\n * Returns the value of the node with the given key, or null.\n *\n * @param {!K} key The key to look up.\n * @return {?V} The value of the node with the given key, or null if the\n * key doesn't exist.\n */\n get(key: K): V | null {\n let cmp;\n let node = this.root_;\n while (!node.isEmpty()) {\n cmp = this.comparator_(key, node.key);\n if (cmp === 0) {\n return node.value;\n } else if (cmp < 0) {\n node = node.left;\n } else if (cmp > 0) {\n node = node.right;\n }\n }\n return null;\n }\n\n /**\n * Returns the key of the item *before* the specified key, or null if key is the first item.\n * @param {K} key The key to find the predecessor of\n * @return {?K} The predecessor key.\n */\n getPredecessorKey(key: K): K | null {\n let cmp,\n node = this.root_,\n rightParent = null;\n while (!node.isEmpty()) {\n cmp = this.comparator_(key, node.key);\n if (cmp === 0) {\n if (!node.left.isEmpty()) {\n node = node.left;\n while (!node.right.isEmpty()) {\n node = node.right;\n }\n return node.key;\n } else if (rightParent) {\n return rightParent.key;\n } else {\n return null; // first item.\n }\n } else if (cmp < 0) {\n node = node.left;\n } else if (cmp > 0) {\n rightParent = node;\n node = node.right;\n }\n }\n\n throw new Error(\n 'Attempted to find predecessor key for a nonexistent key. What gives?'\n );\n }\n\n /**\n * @return {boolean} True if the map is empty.\n */\n isEmpty(): boolean {\n return this.root_.isEmpty();\n }\n\n /**\n * @return {number} The total number of nodes in the map.\n */\n count(): number {\n return this.root_.count();\n }\n\n /**\n * @return {?K} The minimum key in the map.\n */\n minKey(): K | null {\n return this.root_.minKey();\n }\n\n /**\n * @return {?K} The maximum key in the map.\n */\n maxKey(): K | null {\n return this.root_.maxKey();\n }\n\n /**\n * Traverses the map in key order and calls the specified action function\n * for each key/value pair.\n *\n * @param {function(!K, !V):*} action Callback function to be called\n * for each key/value pair. If action returns true, traversal is aborted.\n * @return {*} The first truthy value returned by action, or the last falsey\n * value returned by action\n */\n inorderTraversal(action: (k: K, v: V) => unknown): boolean {\n return this.root_.inorderTraversal(action);\n }\n\n /**\n * Traverses the map in reverse key order and calls the specified action function\n * for each key/value pair.\n *\n * @param {function(!Object, !Object)} action Callback function to be called\n * for each key/value pair. If action returns true, traversal is aborted.\n * @return {*} True if the traversal was aborted.\n */\n reverseTraversal(action: (k: K, v: V) => void): boolean {\n return this.root_.reverseTraversal(action);\n }\n\n /**\n * Returns an iterator over the SortedMap.\n * @template T\n * @param {(function(K, V):T)=} resultGenerator\n * @return {SortedMapIterator.<K, V, T>} The iterator.\n */\n getIterator<T>(\n resultGenerator?: (k: K, v: V) => T\n ): SortedMapIterator<K, V, T> {\n return new SortedMapIterator(\n this.root_,\n null,\n this.comparator_,\n false,\n resultGenerator\n );\n }\n\n getIteratorFrom<T>(\n key: K,\n resultGenerator?: (k: K, v: V) => T\n ): SortedMapIterator<K, V, T> {\n return new SortedMapIterator(\n this.root_,\n key,\n this.comparator_,\n false,\n resultGenerator\n );\n }\n\n getReverseIteratorFrom<T>(\n key: K,\n resultGenerator?: (k: K, v: V) => T\n ): SortedMapIterator<K, V, T> {\n return new SortedMapIterator(\n this.root_,\n key,\n this.comparator_,\n true,\n resultGenerator\n );\n }\n\n getReverseIterator<T>(\n resultGenerator?: (k: K, v: V) => T\n ): SortedMapIterator<K, V, T> {\n return new SortedMapIterator(\n this.root_,\n null,\n this.comparator_,\n true,\n resultGenerator\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LLRBNode, SortedMap } from '../util/SortedMap';\n\nimport { NamedNode } from './Node';\n\nconst LOG_2 = Math.log(2);\n\n/**\n * @constructor\n */\nclass Base12Num {\n count: number;\n private current_: number;\n private bits_: number;\n\n /**\n * @param {number} length\n */\n constructor(length: number) {\n const logBase2 = (num: number) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parseInt((Math.log(num) / LOG_2) as any, 10);\n const bitMask = (bits: number) => parseInt(Array(bits + 1).join('1'), 2);\n this.count = logBase2(length + 1);\n this.current_ = this.count - 1;\n const mask = bitMask(this.count);\n this.bits_ = (length + 1) & mask;\n }\n\n /**\n * @return {boolean}\n */\n nextBitIsOne(): boolean {\n //noinspection JSBitwiseOperatorUsage\n const result = !(this.bits_ & (0x1 << this.current_));\n this.current_--;\n return result;\n }\n}\n\n/**\n * Takes a list of child nodes and constructs a SortedSet using the given comparison\n * function\n *\n * Uses the algorithm described in the paper linked here:\n * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.46.1458\n *\n * @template K, V\n * @param {Array.<!NamedNode>} childList Unsorted list of children\n * @param {function(!NamedNode, !NamedNode):number} cmp The comparison method to be used\n * @param {(function(NamedNode):K)=} keyFn An optional function to extract K from a node wrapper, if K's\n * type is not NamedNode\n * @param {(function(K, K):number)=} mapSortFn An optional override for comparator used by the generated sorted map\n * @return {SortedMap.<K, V>}\n */\nexport const buildChildSet = function<K, V>(\n childList: NamedNode[],\n cmp: (a: NamedNode, b: NamedNode) => number,\n keyFn?: (a: NamedNode) => K,\n mapSortFn?: (a: K, b: K) => number\n): SortedMap<K, V> {\n childList.sort(cmp);\n\n const buildBalancedTree = function(\n low: number,\n high: number\n ): LLRBNode<K, V> | null {\n const length = high - low;\n let namedNode: NamedNode;\n let key: K;\n if (length === 0) {\n return null;\n } else if (length === 1) {\n namedNode = childList[low];\n key = keyFn ? keyFn(namedNode) : ((namedNode as unknown) as K);\n return new LLRBNode(\n key,\n (namedNode.node as unknown) as V,\n LLRBNode.BLACK,\n null,\n null\n );\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const middle = parseInt((length / 2) as any, 10) + low;\n const left = buildBalancedTree(low, middle);\n const right = buildBalancedTree(middle + 1, high);\n namedNode = childList[middle];\n key = keyFn ? keyFn(namedNode) : ((namedNode as unknown) as K);\n return new LLRBNode(\n key,\n (namedNode.node as unknown) as V,\n LLRBNode.BLACK,\n left,\n right\n );\n }\n };\n\n const buildFrom12Array = function(base12: Base12Num): LLRBNode<K, V> {\n let node: LLRBNode<K, V> = null;\n let root = null;\n let index = childList.length;\n\n const buildPennant = function(chunkSize: number, color: boolean) {\n const low = index - chunkSize;\n const high = index;\n index -= chunkSize;\n const childTree = buildBalancedTree(low + 1, high);\n const namedNode = childList[low];\n const key: K = keyFn ? keyFn(namedNode) : ((namedNode as unknown) as K);\n attachPennant(\n new LLRBNode(\n key,\n (namedNode.node as unknown) as V,\n color,\n null,\n childTree\n )\n );\n };\n\n const attachPennant = function(pennant: LLRBNode<K, V>) {\n if (node) {\n node.left = pennant;\n node = pennant;\n } else {\n root = pennant;\n node = pennant;\n }\n };\n\n for (let i = 0; i < base12.count; ++i) {\n const isOne = base12.nextBitIsOne();\n // The number of nodes taken in each slice is 2^(arr.length - (i + 1))\n const chunkSize = Math.pow(2, base12.count - (i + 1));\n if (isOne) {\n buildPennant(chunkSize, LLRBNode.BLACK);\n } else {\n // current == 2\n buildPennant(chunkSize, LLRBNode.BLACK);\n buildPennant(chunkSize, LLRBNode.RED);\n }\n }\n return root;\n };\n\n const base12 = new Base12Num(childList.length);\n const root = buildFrom12Array(base12);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new SortedMap<K, V>(mapSortFn || (cmp as any), root);\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, contains, map, safeGet } from '@firebase/util';\nimport { buildChildSet } from './childSet';\n\nimport { NamedNode, Node } from './Node';\nimport { PRIORITY_INDEX } from './indexes/PriorityIndex';\nimport { KEY_INDEX } from './indexes/KeyIndex';\nimport { SortedMap } from '../util/SortedMap';\nimport { Index } from './indexes/Index';\n\nlet _defaultIndexMap: IndexMap;\n\nconst fallbackObject = {};\n\nexport class IndexMap {\n /**\n * The default IndexMap for nodes without a priority\n */\n static get Default(): IndexMap {\n assert(\n fallbackObject && PRIORITY_INDEX,\n 'ChildrenNode.ts has not been loaded'\n );\n _defaultIndexMap =\n _defaultIndexMap ||\n new IndexMap(\n { '.priority': fallbackObject },\n { '.priority': PRIORITY_INDEX }\n );\n return _defaultIndexMap;\n }\n\n constructor(\n private indexes_: {\n [k: string]: SortedMap<NamedNode, Node> | /*FallbackType*/ object;\n },\n private indexSet_: { [k: string]: Index }\n ) {}\n\n get(indexKey: string): SortedMap<NamedNode, Node> | null {\n const sortedMap = safeGet(this.indexes_, indexKey);\n if (!sortedMap) {\n throw new Error('No index defined for ' + indexKey);\n }\n\n if (sortedMap instanceof SortedMap) {\n return sortedMap;\n } else {\n // The index exists, but it falls back to just name comparison. Return null so that the calling code uses the\n // regular child map\n return null;\n }\n }\n\n hasIndex(indexDefinition: Index): boolean {\n return contains(this.indexSet_, indexDefinition.toString());\n }\n\n addIndex(\n indexDefinition: Index,\n existingChildren: SortedMap<string, Node>\n ): IndexMap {\n assert(\n indexDefinition !== KEY_INDEX,\n \"KeyIndex always exists and isn't meant to be added to the IndexMap.\"\n );\n const childList = [];\n let sawIndexedValue = false;\n const iter = existingChildren.getIterator(NamedNode.Wrap);\n let next = iter.getNext();\n while (next) {\n sawIndexedValue =\n sawIndexedValue || indexDefinition.isDefinedOn(next.node);\n childList.push(next);\n next = iter.getNext();\n }\n let newIndex;\n if (sawIndexedValue) {\n newIndex = buildChildSet(childList, indexDefinition.getCompare());\n } else {\n newIndex = fallbackObject;\n }\n const indexName = indexDefinition.toString();\n const newIndexSet = { ...this.indexSet_ };\n newIndexSet[indexName] = indexDefinition;\n const newIndexes = { ...this.indexes_ };\n newIndexes[indexName] = newIndex;\n return new IndexMap(newIndexes, newIndexSet);\n }\n\n /**\n * Ensure that this node is properly tracked in any indexes that we're maintaining\n */\n addToIndexes(\n namedNode: NamedNode,\n existingChildren: SortedMap<string, Node>\n ): IndexMap {\n const newIndexes = map(\n this.indexes_,\n (indexedChildren: SortedMap<NamedNode, Node>, indexName: string) => {\n const index = safeGet(this.indexSet_, indexName);\n assert(index, 'Missing index implementation for ' + indexName);\n if (indexedChildren === fallbackObject) {\n // Check to see if we need to index everything\n if (index.isDefinedOn(namedNode.node)) {\n // We need to build this index\n const childList = [];\n const iter = existingChildren.getIterator(NamedNode.Wrap);\n let next = iter.getNext();\n while (next) {\n if (next.name !== namedNode.name) {\n childList.push(next);\n }\n next = iter.getNext();\n }\n childList.push(namedNode);\n return buildChildSet(childList, index.getCompare());\n } else {\n // No change, this remains a fallback\n return fallbackObject;\n }\n } else {\n const existingSnap = existingChildren.get(namedNode.name);\n let newChildren = indexedChildren;\n if (existingSnap) {\n newChildren = newChildren.remove(\n new NamedNode(namedNode.name, existingSnap)\n );\n }\n return newChildren.insert(namedNode, namedNode.node);\n }\n }\n );\n return new IndexMap(newIndexes, this.indexSet_);\n }\n\n /**\n * Create a new IndexMap instance with the given value removed\n */\n removeFromIndexes(\n namedNode: NamedNode,\n existingChildren: SortedMap<string, Node>\n ): IndexMap {\n const newIndexes = map(\n this.indexes_,\n (indexedChildren: SortedMap<NamedNode, Node>) => {\n if (indexedChildren === fallbackObject) {\n // This is the fallback. Just return it, nothing to do in this case\n return indexedChildren;\n } else {\n const existingSnap = existingChildren.get(namedNode.name);\n if (existingSnap) {\n return indexedChildren.remove(\n new NamedNode(namedNode.name, existingSnap)\n );\n } else {\n // No record of this child\n return indexedChildren;\n }\n }\n }\n );\n return new IndexMap(newIndexes, this.indexSet_);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { nameCompare } from '../util/util';\nimport { NamedNode } from './Node';\n\nexport function NAME_ONLY_COMPARATOR(left: NamedNode, right: NamedNode) {\n return nameCompare(left.name, right.name);\n}\n\nexport function NAME_COMPARATOR(left: string, right: string) {\n return nameCompare(left, right);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\nimport { sha1, MAX_NAME, MIN_NAME } from '../util/util';\nimport { SortedMap, SortedMapIterator } from '../util/SortedMap';\nimport { Node, NamedNode } from './Node';\nimport { validatePriorityNode, priorityHashText, setMaxNode } from './snap';\nimport {\n PRIORITY_INDEX,\n setMaxNode as setPriorityMaxNode\n} from './indexes/PriorityIndex';\nimport { KEY_INDEX, KeyIndex } from './indexes/KeyIndex';\nimport { IndexMap } from './IndexMap';\nimport { LeafNode } from './LeafNode';\nimport { NAME_COMPARATOR } from './comparators';\nimport { Index } from './indexes/Index';\nimport { Path } from '../util/Path';\n\nexport interface ChildrenNodeConstructor {\n new (\n children_: SortedMap<string, Node>,\n priorityNode_: Node | null,\n indexMap_: IndexMap\n ): ChildrenNode;\n EMPTY_NODE: ChildrenNode;\n}\n\n// TODO: For memory savings, don't store priorityNode_ if it's empty.\n\nlet EMPTY_NODE: ChildrenNode;\n\n/**\n * ChildrenNode is a class for storing internal nodes in a DataSnapshot\n * (i.e. nodes with children). It implements Node and stores the\n * list of children in the children property, sorted by child name.\n *\n * @constructor\n * @implements {Node}\n */\nexport class ChildrenNode implements Node {\n private lazyHash_: string | null = null;\n\n static get EMPTY_NODE(): ChildrenNode {\n return (\n EMPTY_NODE ||\n (EMPTY_NODE = new ChildrenNode(\n new SortedMap<string, Node>(NAME_COMPARATOR),\n null,\n IndexMap.Default\n ))\n );\n }\n\n /**\n *\n * @param {!SortedMap.<string, !Node>} children_ List of children\n * of this node..\n * @param {?Node} priorityNode_ The priority of this node (as a snapshot node).\n * @param {!IndexMap} indexMap_\n */\n constructor(\n private readonly children_: SortedMap<string, Node>,\n private readonly priorityNode_: Node | null,\n private indexMap_: IndexMap\n ) {\n /**\n * Note: The only reason we allow null priority is for EMPTY_NODE, since we can't use\n * EMPTY_NODE as the priority of EMPTY_NODE. We might want to consider making EMPTY_NODE its own\n * class instead of an empty ChildrenNode.\n */\n if (this.priorityNode_) {\n validatePriorityNode(this.priorityNode_);\n }\n\n if (this.children_.isEmpty()) {\n assert(\n !this.priorityNode_ || this.priorityNode_.isEmpty(),\n 'An empty node cannot have a priority'\n );\n }\n }\n\n /** @inheritDoc */\n isLeafNode(): boolean {\n return false;\n }\n\n /** @inheritDoc */\n getPriority(): Node {\n return this.priorityNode_ || EMPTY_NODE;\n }\n\n /** @inheritDoc */\n updatePriority(newPriorityNode: Node): Node {\n if (this.children_.isEmpty()) {\n // Don't allow priorities on empty nodes\n return this;\n } else {\n return new ChildrenNode(this.children_, newPriorityNode, this.indexMap_);\n }\n }\n\n /** @inheritDoc */\n getImmediateChild(childName: string): Node {\n // Hack to treat priority as a regular child\n if (childName === '.priority') {\n return this.getPriority();\n } else {\n const child = this.children_.get(childName);\n return child === null ? EMPTY_NODE : child;\n }\n }\n\n /** @inheritDoc */\n getChild(path: Path): Node {\n const front = path.getFront();\n if (front === null) {\n return this;\n }\n\n return this.getImmediateChild(front).getChild(path.popFront());\n }\n\n /** @inheritDoc */\n hasChild(childName: string): boolean {\n return this.children_.get(childName) !== null;\n }\n\n /** @inheritDoc */\n updateImmediateChild(childName: string, newChildNode: Node): Node {\n assert(newChildNode, 'We should always be passing snapshot nodes');\n if (childName === '.priority') {\n return this.updatePriority(newChildNode);\n } else {\n const namedNode = new NamedNode(childName, newChildNode);\n let newChildren, newIndexMap;\n if (newChildNode.isEmpty()) {\n newChildren = this.children_.remove(childName);\n newIndexMap = this.indexMap_.removeFromIndexes(\n namedNode,\n this.children_\n );\n } else {\n newChildren = this.children_.insert(childName, newChildNode);\n newIndexMap = this.indexMap_.addToIndexes(namedNode, this.children_);\n }\n\n const newPriority = newChildren.isEmpty()\n ? EMPTY_NODE\n : this.priorityNode_;\n return new ChildrenNode(newChildren, newPriority, newIndexMap);\n }\n }\n\n /** @inheritDoc */\n updateChild(path: Path, newChildNode: Node): Node {\n const front = path.getFront();\n if (front === null) {\n return newChildNode;\n } else {\n assert(\n path.getFront() !== '.priority' || path.getLength() === 1,\n '.priority must be the last token in a path'\n );\n const newImmediateChild = this.getImmediateChild(front).updateChild(\n path.popFront(),\n newChildNode\n );\n return this.updateImmediateChild(front, newImmediateChild);\n }\n }\n\n /** @inheritDoc */\n isEmpty(): boolean {\n return this.children_.isEmpty();\n }\n\n /** @inheritDoc */\n numChildren(): number {\n return this.children_.count();\n }\n\n /**\n * @private\n * @type {RegExp}\n */\n private static INTEGER_REGEXP_ = /^(0|[1-9]\\d*)$/;\n\n /** @inheritDoc */\n val(exportFormat?: boolean): object {\n if (this.isEmpty()) {\n return null;\n }\n\n const obj: { [k: string]: unknown } = {};\n let numKeys = 0,\n maxKey = 0,\n allIntegerKeys = true;\n this.forEachChild(PRIORITY_INDEX, (key: string, childNode: Node) => {\n obj[key] = childNode.val(exportFormat);\n\n numKeys++;\n if (allIntegerKeys && ChildrenNode.INTEGER_REGEXP_.test(key)) {\n maxKey = Math.max(maxKey, Number(key));\n } else {\n allIntegerKeys = false;\n }\n });\n\n if (!exportFormat && allIntegerKeys && maxKey < 2 * numKeys) {\n // convert to array.\n const array: unknown[] = [];\n // eslint-disable-next-line guard-for-in\n for (const key in obj) {\n array[(key as unknown) as number] = obj[key];\n }\n\n return array;\n } else {\n if (exportFormat && !this.getPriority().isEmpty()) {\n obj['.priority'] = this.getPriority().val();\n }\n return obj;\n }\n }\n\n /** @inheritDoc */\n hash(): string {\n if (this.lazyHash_ === null) {\n let toHash = '';\n if (!this.getPriority().isEmpty()) {\n toHash +=\n 'priority:' +\n priorityHashText(this.getPriority().val() as string | number) +\n ':';\n }\n\n this.forEachChild(PRIORITY_INDEX, (key, childNode) => {\n const childHash = childNode.hash();\n if (childHash !== '') {\n toHash += ':' + key + ':' + childHash;\n }\n });\n\n this.lazyHash_ = toHash === '' ? '' : sha1(toHash);\n }\n return this.lazyHash_;\n }\n\n /** @inheritDoc */\n getPredecessorChildName(\n childName: string,\n childNode: Node,\n index: Index\n ): string {\n const idx = this.resolveIndex_(index);\n if (idx) {\n const predecessor = idx.getPredecessorKey(\n new NamedNode(childName, childNode)\n );\n return predecessor ? predecessor.name : null;\n } else {\n return this.children_.getPredecessorKey(childName);\n }\n }\n\n /**\n * @param {!Index} indexDefinition\n * @return {?string}\n */\n getFirstChildName(indexDefinition: Index): string | null {\n const idx = this.resolveIndex_(indexDefinition);\n if (idx) {\n const minKey = idx.minKey();\n return minKey && minKey.name;\n } else {\n return this.children_.minKey();\n }\n }\n\n /**\n * @param {!Index} indexDefinition\n * @return {?NamedNode}\n */\n getFirstChild(indexDefinition: Index): NamedNode | null {\n const minKey = this.getFirstChildName(indexDefinition);\n if (minKey) {\n return new NamedNode(minKey, this.children_.get(minKey));\n } else {\n return null;\n }\n }\n\n /**\n * Given an index, return the key name of the largest value we have, according to that index\n * @param {!Index} indexDefinition\n * @return {?string}\n */\n getLastChildName(indexDefinition: Index): string | null {\n const idx = this.resolveIndex_(indexDefinition);\n if (idx) {\n const maxKey = idx.maxKey();\n return maxKey && maxKey.name;\n } else {\n return this.children_.maxKey();\n }\n }\n\n /**\n * @param {!Index} indexDefinition\n * @return {?NamedNode}\n */\n getLastChild(indexDefinition: Index): NamedNode | null {\n const maxKey = this.getLastChildName(indexDefinition);\n if (maxKey) {\n return new NamedNode(maxKey, this.children_.get(maxKey));\n } else {\n return null;\n }\n }\n\n /**\n * @inheritDoc\n */\n forEachChild(\n index: Index,\n action: (key: string, node: Node) => boolean | void\n ): boolean {\n const idx = this.resolveIndex_(index);\n if (idx) {\n return idx.inorderTraversal(wrappedNode => {\n return action(wrappedNode.name, wrappedNode.node);\n });\n } else {\n return this.children_.inorderTraversal(action);\n }\n }\n\n /**\n * @param {!Index} indexDefinition\n * @return {SortedMapIterator}\n */\n getIterator(\n indexDefinition: Index\n ): SortedMapIterator<string | NamedNode, Node, NamedNode> {\n return this.getIteratorFrom(indexDefinition.minPost(), indexDefinition);\n }\n\n /**\n *\n * @param {!NamedNode} startPost\n * @param {!Index} indexDefinition\n * @return {!SortedMapIterator}\n */\n getIteratorFrom(\n startPost: NamedNode,\n indexDefinition: Index\n ): SortedMapIterator<string | NamedNode, Node, NamedNode> {\n const idx = this.resolveIndex_(indexDefinition);\n if (idx) {\n return idx.getIteratorFrom(startPost, key => key);\n } else {\n const iterator = this.children_.getIteratorFrom(\n startPost.name,\n NamedNode.Wrap\n );\n let next = iterator.peek();\n while (next != null && indexDefinition.compare(next, startPost) < 0) {\n iterator.getNext();\n next = iterator.peek();\n }\n return iterator;\n }\n }\n\n /**\n * @param {!Index} indexDefinition\n * @return {!SortedMapIterator}\n */\n getReverseIterator(\n indexDefinition: Index\n ): SortedMapIterator<string | NamedNode, Node, NamedNode> {\n return this.getReverseIteratorFrom(\n indexDefinition.maxPost(),\n indexDefinition\n );\n }\n\n /**\n * @param {!NamedNode} endPost\n * @param {!Index} indexDefinition\n * @return {!SortedMapIterator}\n */\n getReverseIteratorFrom(\n endPost: NamedNode,\n indexDefinition: Index\n ): SortedMapIterator<string | NamedNode, Node, NamedNode> {\n const idx = this.resolveIndex_(indexDefinition);\n if (idx) {\n return idx.getReverseIteratorFrom(endPost, key => {\n return key;\n });\n } else {\n const iterator = this.children_.getReverseIteratorFrom(\n endPost.name,\n NamedNode.Wrap\n );\n let next = iterator.peek();\n while (next != null && indexDefinition.compare(next, endPost) > 0) {\n iterator.getNext();\n next = iterator.peek();\n }\n return iterator;\n }\n }\n\n /**\n * @inheritDoc\n */\n compareTo(other: ChildrenNode): number {\n if (this.isEmpty()) {\n if (other.isEmpty()) {\n return 0;\n } else {\n return -1;\n }\n } else if (other.isLeafNode() || other.isEmpty()) {\n return 1;\n } else if (other === MAX_NODE) {\n return -1;\n } else {\n // Must be another node with children.\n return 0;\n }\n }\n\n /**\n * @inheritDoc\n */\n withIndex(indexDefinition: Index): Node {\n if (\n indexDefinition === KEY_INDEX ||\n this.indexMap_.hasIndex(indexDefinition)\n ) {\n return this;\n } else {\n const newIndexMap = this.indexMap_.addIndex(\n indexDefinition,\n this.children_\n );\n return new ChildrenNode(this.children_, this.priorityNode_, newIndexMap);\n }\n }\n\n /**\n * @inheritDoc\n */\n isIndexed(index: Index): boolean {\n return index === KEY_INDEX || this.indexMap_.hasIndex(index);\n }\n\n /**\n * @inheritDoc\n */\n equals(other: Node): boolean {\n if (other === this) {\n return true;\n } else if (other.isLeafNode()) {\n return false;\n } else {\n const otherChildrenNode = other as ChildrenNode;\n if (!this.getPriority().equals(otherChildrenNode.getPriority())) {\n return false;\n } else if (\n this.children_.count() === otherChildrenNode.children_.count()\n ) {\n const thisIter = this.getIterator(PRIORITY_INDEX);\n const otherIter = otherChildrenNode.getIterator(PRIORITY_INDEX);\n let thisCurrent = thisIter.getNext();\n let otherCurrent = otherIter.getNext();\n while (thisCurrent && otherCurrent) {\n if (\n thisCurrent.name !== otherCurrent.name ||\n !thisCurrent.node.equals(otherCurrent.node)\n ) {\n return false;\n }\n thisCurrent = thisIter.getNext();\n otherCurrent = otherIter.getNext();\n }\n return thisCurrent === null && otherCurrent === null;\n } else {\n return false;\n }\n }\n }\n\n /**\n * Returns a SortedMap ordered by index, or null if the default (by-key) ordering can be used\n * instead.\n *\n * @private\n * @param {!Index} indexDefinition\n * @return {?SortedMap.<NamedNode, Node>}\n */\n private resolveIndex_(\n indexDefinition: Index\n ): SortedMap<NamedNode, Node> | null {\n if (indexDefinition === KEY_INDEX) {\n return null;\n } else {\n return this.indexMap_.get(indexDefinition.toString());\n }\n }\n}\n\n/**\n * @constructor\n * @extends {ChildrenNode}\n * @private\n */\nexport class MaxNode extends ChildrenNode {\n constructor() {\n super(\n new SortedMap<string, Node>(NAME_COMPARATOR),\n ChildrenNode.EMPTY_NODE,\n IndexMap.Default\n );\n }\n\n compareTo(other: Node): number {\n if (other === this) {\n return 0;\n } else {\n return 1;\n }\n }\n\n equals(other: Node): boolean {\n // Not that we every compare it, but MAX_NODE is only ever equal to itself\n return other === this;\n }\n\n getPriority(): MaxNode {\n return this;\n }\n\n getImmediateChild(childName: string): ChildrenNode {\n return ChildrenNode.EMPTY_NODE;\n }\n\n isEmpty(): boolean {\n return false;\n }\n}\n\n/**\n * Marker that will sort higher than any other snapshot.\n * @type {!MAX_NODE}\n * @const\n */\nexport const MAX_NODE = new MaxNode();\n\n/**\n * Document NamedNode extensions\n */\ndeclare module './Node' {\n interface NamedNode {\n MIN: NamedNode;\n MAX: NamedNode;\n }\n}\n\nObject.defineProperties(NamedNode, {\n MIN: {\n value: new NamedNode(MIN_NAME, ChildrenNode.EMPTY_NODE)\n },\n MAX: {\n value: new NamedNode(MAX_NAME, MAX_NODE)\n }\n});\n\n/**\n * Reference Extensions\n */\nKeyIndex.__EMPTY_NODE = ChildrenNode.EMPTY_NODE;\nLeafNode.__childrenNodeConstructor = ChildrenNode;\nsetMaxNode(MAX_NODE);\nsetPriorityMaxNode(MAX_NODE);\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ChildrenNode } from './ChildrenNode';\nimport { LeafNode } from './LeafNode';\nimport { NamedNode, Node } from './Node';\nimport { contains, assert } from '@firebase/util';\n\nimport { buildChildSet } from './childSet';\nimport { NAME_COMPARATOR, NAME_ONLY_COMPARATOR } from './comparators';\nimport { IndexMap } from './IndexMap';\nimport { PRIORITY_INDEX, setNodeFromJSON } from './indexes/PriorityIndex';\nimport { SortedMap } from '../util/SortedMap';\nimport { each } from '../util/util';\nimport { Indexable } from '../util/misc';\n\nconst USE_HINZE = true;\n\n/**\n * Constructs a snapshot node representing the passed JSON and returns it.\n * @param {*} json JSON to create a node for.\n * @param {?string|?number=} priority Optional priority to use. This will be ignored if the\n * passed JSON contains a .priority property.\n * @return {!Node}\n */\nexport function nodeFromJSON(\n json: unknown | null,\n priority: unknown = null\n): Node {\n if (json === null) {\n return ChildrenNode.EMPTY_NODE;\n }\n\n if (typeof json === 'object' && '.priority' in json) {\n priority = json['.priority'];\n }\n\n assert(\n priority === null ||\n typeof priority === 'string' ||\n typeof priority === 'number' ||\n (typeof priority === 'object' && '.sv' in (priority as object)),\n 'Invalid priority type found: ' + typeof priority\n );\n\n if (typeof json === 'object' && '.value' in json && json['.value'] !== null) {\n json = json['.value'];\n }\n\n // Valid leaf nodes include non-objects or server-value wrapper objects\n if (typeof json !== 'object' || '.sv' in json) {\n const jsonLeaf = json as string | number | boolean | Indexable;\n return new LeafNode(jsonLeaf, nodeFromJSON(priority));\n }\n\n if (!(json instanceof Array) && USE_HINZE) {\n const children: NamedNode[] = [];\n let childrenHavePriority = false;\n const hinzeJsonObj = json;\n each(hinzeJsonObj, (key, child) => {\n if (key.substring(0, 1) !== '.') {\n // Ignore metadata nodes\n const childNode = nodeFromJSON(child);\n if (!childNode.isEmpty()) {\n childrenHavePriority =\n childrenHavePriority || !childNode.getPriority().isEmpty();\n children.push(new NamedNode(key, childNode));\n }\n }\n });\n\n if (children.length === 0) {\n return ChildrenNode.EMPTY_NODE;\n }\n\n const childSet = buildChildSet(\n children,\n NAME_ONLY_COMPARATOR,\n namedNode => namedNode.name,\n NAME_COMPARATOR\n ) as SortedMap<string, Node>;\n if (childrenHavePriority) {\n const sortedChildSet = buildChildSet(\n children,\n PRIORITY_INDEX.getCompare()\n );\n return new ChildrenNode(\n childSet,\n nodeFromJSON(priority),\n new IndexMap(\n { '.priority': sortedChildSet },\n { '.priority': PRIORITY_INDEX }\n )\n );\n } else {\n return new ChildrenNode(\n childSet,\n nodeFromJSON(priority),\n IndexMap.Default\n );\n }\n } else {\n let node: Node = ChildrenNode.EMPTY_NODE;\n each(json, (key: string, childData: unknown) => {\n if (contains(json as object, key)) {\n if (key.substring(0, 1) !== '.') {\n // ignore metadata nodes.\n const childNode = nodeFromJSON(childData);\n if (childNode.isLeafNode() || !childNode.isEmpty()) {\n node = node.updateImmediateChild(key, childNode);\n }\n }\n }\n });\n\n return node.updatePriority(nodeFromJSON(priority));\n }\n}\n\nsetNodeFromJSON(nodeFromJSON);\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Index } from './Index';\nimport { NamedNode, Node } from '../Node';\nimport { nameCompare } from '../../util/util';\nimport { nodeFromJSON } from '../nodeFromJSON';\n\n/**\n * @constructor\n * @extends {Index}\n * @private\n */\nexport class ValueIndex extends Index {\n /**\n * @inheritDoc\n */\n compare(a: NamedNode, b: NamedNode): number {\n const indexCmp = a.node.compareTo(b.node);\n if (indexCmp === 0) {\n return nameCompare(a.name, b.name);\n } else {\n return indexCmp;\n }\n }\n\n /**\n * @inheritDoc\n */\n isDefinedOn(node: Node): boolean {\n return true;\n }\n\n /**\n * @inheritDoc\n */\n indexedValueChanged(oldNode: Node, newNode: Node): boolean {\n return !oldNode.equals(newNode);\n }\n\n /**\n * @inheritDoc\n */\n minPost(): NamedNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MIN;\n }\n\n /**\n * @inheritDoc\n */\n maxPost(): NamedNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MAX;\n }\n\n /**\n * @param {*} indexValue\n * @param {string} name\n * @return {!NamedNode}\n */\n makePost(indexValue: object, name: string): NamedNode {\n const valueNode = nodeFromJSON(indexValue);\n return new NamedNode(name, valueNode);\n }\n\n /**\n * @return {!string} String representation for inclusion in a query spec\n */\n toString(): string {\n return '.value';\n }\n}\n\nexport const VALUE_INDEX = new ValueIndex();\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\nimport { nameCompare, MAX_NAME } from '../../util/util';\nimport { Index } from './Index';\nimport { ChildrenNode, MAX_NODE } from '../ChildrenNode';\nimport { NamedNode, Node } from '../Node';\nimport { nodeFromJSON } from '../nodeFromJSON';\nimport { Path } from '../../util/Path';\n\n/**\n * @param {!Path} indexPath\n * @constructor\n * @extends {Index}\n */\nexport class PathIndex extends Index {\n constructor(private indexPath_: Path) {\n super();\n\n assert(\n !indexPath_.isEmpty() && indexPath_.getFront() !== '.priority',\n \"Can't create PathIndex with empty path or .priority key\"\n );\n }\n\n /**\n * @param {!Node} snap\n * @return {!Node}\n * @protected\n */\n protected extractChild(snap: Node): Node {\n return snap.getChild(this.indexPath_);\n }\n\n /**\n * @inheritDoc\n */\n isDefinedOn(node: Node): boolean {\n return !node.getChild(this.indexPath_).isEmpty();\n }\n\n /**\n * @inheritDoc\n */\n compare(a: NamedNode, b: NamedNode): number {\n const aChild = this.extractChild(a.node);\n const bChild = this.extractChild(b.node);\n const indexCmp = aChild.compareTo(bChild);\n if (indexCmp === 0) {\n return nameCompare(a.name, b.name);\n } else {\n return indexCmp;\n }\n }\n\n /**\n * @inheritDoc\n */\n makePost(indexValue: object, name: string): NamedNode {\n const valueNode = nodeFromJSON(indexValue);\n const node = ChildrenNode.EMPTY_NODE.updateChild(\n this.indexPath_,\n valueNode\n );\n return new NamedNode(name, node);\n }\n\n /**\n * @inheritDoc\n */\n maxPost(): NamedNode {\n const node = ChildrenNode.EMPTY_NODE.updateChild(this.indexPath_, MAX_NODE);\n return new NamedNode(MAX_NAME, node);\n }\n\n /**\n * @inheritDoc\n */\n toString(): string {\n return this.indexPath_.slice().join('/');\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { validateArgCount, validateCallback } from '@firebase/util';\nimport { validatePathString } from '../core/util/validation';\nimport { Path } from '../core/util/Path';\nimport { PRIORITY_INDEX } from '../core/snap/indexes/PriorityIndex';\nimport { Node } from '../core/snap/Node';\nimport { Reference } from './Reference';\nimport { Index } from '../core/snap/indexes/Index';\nimport { ChildrenNode } from '../core/snap/ChildrenNode';\n\n/**\n * Class representing a firebase data snapshot. It wraps a SnapshotNode and\n * surfaces the public methods (val, forEach, etc.) we want to expose.\n */\nexport class DataSnapshot {\n /**\n * @param {!Node} node_ A SnapshotNode to wrap.\n * @param {!Reference} ref_ The ref of the location this snapshot came from.\n * @param {!Index} index_ The iteration order for this snapshot\n */\n constructor(\n private readonly node_: Node,\n private readonly ref_: Reference,\n private readonly index_: Index\n ) {}\n\n /**\n * Retrieves the snapshot contents as JSON. Returns null if the snapshot is\n * empty.\n *\n * @return {*} JSON representation of the DataSnapshot contents, or null if empty.\n */\n val(): unknown {\n validateArgCount('DataSnapshot.val', 0, 0, arguments.length);\n return this.node_.val();\n }\n\n /**\n * Returns the snapshot contents as JSON, including priorities of node. Suitable for exporting\n * the entire node contents.\n * @return {*} JSON representation of the DataSnapshot contents, or null if empty.\n */\n exportVal(): unknown {\n validateArgCount('DataSnapshot.exportVal', 0, 0, arguments.length);\n return this.node_.val(true);\n }\n\n // Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary\n // for end-users\n toJSON(): unknown {\n // Optional spacer argument is unnecessary because we're depending on recursion rather than stringifying the content\n validateArgCount('DataSnapshot.toJSON', 0, 1, arguments.length);\n return this.exportVal();\n }\n\n /**\n * Returns whether the snapshot contains a non-null value.\n *\n * @return {boolean} Whether the snapshot contains a non-null value, or is empty.\n */\n exists(): boolean {\n validateArgCount('DataSnapshot.exists', 0, 0, arguments.length);\n return !this.node_.isEmpty();\n }\n\n /**\n * Returns a DataSnapshot of the specified child node's contents.\n *\n * @param {!string} childPathString Path to a child.\n * @return {!DataSnapshot} DataSnapshot for child node.\n */\n child(childPathString: string): DataSnapshot {\n validateArgCount('DataSnapshot.child', 0, 1, arguments.length);\n // Ensure the childPath is a string (can be a number)\n childPathString = String(childPathString);\n validatePathString('DataSnapshot.child', 1, childPathString, false);\n\n const childPath = new Path(childPathString);\n const childRef = this.ref_.child(childPath);\n return new DataSnapshot(\n this.node_.getChild(childPath),\n childRef,\n PRIORITY_INDEX\n );\n }\n\n /**\n * Returns whether the snapshot contains a child at the specified path.\n *\n * @param {!string} childPathString Path to a child.\n * @return {boolean} Whether the child exists.\n */\n hasChild(childPathString: string): boolean {\n validateArgCount('DataSnapshot.hasChild', 1, 1, arguments.length);\n validatePathString('DataSnapshot.hasChild', 1, childPathString, false);\n\n const childPath = new Path(childPathString);\n return !this.node_.getChild(childPath).isEmpty();\n }\n\n /**\n * Returns the priority of the object, or null if no priority was set.\n *\n * @return {string|number|null} The priority.\n */\n getPriority(): string | number | null {\n validateArgCount('DataSnapshot.getPriority', 0, 0, arguments.length);\n\n // typecast here because we never return deferred values or internal priorities (MAX_PRIORITY)\n return this.node_.getPriority().val() as string | number | null;\n }\n\n /**\n * Iterates through child nodes and calls the specified action for each one.\n *\n * @param {function(!DataSnapshot)} action Callback function to be called\n * for each child.\n * @return {boolean} True if forEach was canceled by action returning true for\n * one of the child nodes.\n */\n forEach(action: (d: DataSnapshot) => boolean | void): boolean {\n validateArgCount('DataSnapshot.forEach', 1, 1, arguments.length);\n validateCallback('DataSnapshot.forEach', 1, action, false);\n\n if (this.node_.isLeafNode()) {\n return false;\n }\n\n const childrenNode = this.node_ as ChildrenNode;\n // Sanitize the return value to a boolean. ChildrenNode.forEachChild has a weird return type...\n return !!childrenNode.forEachChild(this.index_, (key, node) => {\n return action(\n new DataSnapshot(node, this.ref_.child(key), PRIORITY_INDEX)\n );\n });\n }\n\n /**\n * Returns whether this DataSnapshot has children.\n * @return {boolean} True if the DataSnapshot contains 1 or more child nodes.\n */\n hasChildren(): boolean {\n validateArgCount('DataSnapshot.hasChildren', 0, 0, arguments.length);\n\n if (this.node_.isLeafNode()) {\n return false;\n } else {\n return !this.node_.isEmpty();\n }\n }\n\n get key() {\n return this.ref_.getKey();\n }\n\n /**\n * Returns the number of children for this DataSnapshot.\n * @return {number} The number of children that this DataSnapshot contains.\n */\n numChildren(): number {\n validateArgCount('DataSnapshot.numChildren', 0, 0, arguments.length);\n\n return this.node_.numChildren();\n }\n\n /**\n * @return {Reference} The Firebase reference for the location this snapshot's data came from.\n */\n getRef(): Reference {\n validateArgCount('DataSnapshot.ref', 0, 0, arguments.length);\n\n return this.ref_;\n }\n\n get ref() {\n return this.getRef();\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringify } from '@firebase/util';\nimport { Path } from '../util/Path';\nimport { EventRegistration } from './EventRegistration';\nimport { DataSnapshot } from '../../api/DataSnapshot';\n\n/**\n * Encapsulates the data needed to raise an event\n * @interface\n */\nexport interface Event {\n /**\n * @return {!Path}\n */\n getPath(): Path;\n\n /**\n * @return {!string}\n */\n getEventType(): string;\n\n /**\n * @return {!function()}\n */\n getEventRunner(): () => void;\n\n /**\n * @return {!string}\n */\n toString(): string;\n}\n\nexport type EventType =\n | 'value'\n | ' child_added'\n | ' child_changed'\n | ' child_moved'\n | ' child_removed';\n\n/**\n * Encapsulates the data needed to raise an event\n * @implements {Event}\n */\nexport class DataEvent implements Event {\n /**\n * @param {!string} eventType One of: value, child_added, child_changed, child_moved, child_removed\n * @param {!EventRegistration} eventRegistration The function to call to with the event data. User provided\n * @param {!DataSnapshot} snapshot The data backing the event\n * @param {?string=} prevName Optional, the name of the previous child for child_* events.\n */\n constructor(\n public eventType: EventType,\n public eventRegistration: EventRegistration,\n public snapshot: DataSnapshot,\n public prevName?: string | null\n ) {}\n\n /**\n * @inheritDoc\n */\n getPath(): Path {\n const ref = this.snapshot.getRef();\n if (this.eventType === 'value') {\n return ref.path;\n } else {\n return ref.getParent().path;\n }\n }\n\n /**\n * @inheritDoc\n */\n getEventType(): string {\n return this.eventType;\n }\n\n /**\n * @inheritDoc\n */\n getEventRunner(): () => void {\n return this.eventRegistration.getEventRunner(this);\n }\n\n /**\n * @inheritDoc\n */\n toString(): string {\n return (\n this.getPath().toString() +\n ':' +\n this.eventType +\n ':' +\n stringify(this.snapshot.exportVal())\n );\n }\n}\n\nexport class CancelEvent implements Event {\n /**\n * @param {EventRegistration} eventRegistration\n * @param {Error} error\n * @param {!Path} path\n */\n constructor(\n public eventRegistration: EventRegistration,\n public error: Error,\n public path: Path\n ) {}\n\n /**\n * @inheritDoc\n */\n getPath(): Path {\n return this.path;\n }\n\n /**\n * @inheritDoc\n */\n getEventType(): string {\n return 'cancel';\n }\n\n /**\n * @inheritDoc\n */\n getEventRunner(): () => void {\n return this.eventRegistration.getEventRunner(this);\n }\n\n /**\n * @inheritDoc\n */\n toString(): string {\n return this.path.toString() + ':cancel';\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DataSnapshot } from '../../api/DataSnapshot';\nimport { DataEvent, CancelEvent, Event, EventType } from './Event';\nimport { contains, assert } from '@firebase/util';\n\nimport { Path } from '../util/Path';\nimport { Change } from './Change';\nimport { Query } from '../../api/Query';\n\n/**\n * An EventRegistration is basically an event type ('value', 'child_added', etc.) and a callback\n * to be notified of that type of event.\n *\n * That said, it can also contain a cancel callback to be notified if the event is canceled. And\n * currently, this code is organized around the idea that you would register multiple child_ callbacks\n * together, as a single EventRegistration. Though currently we don't do that.\n */\nexport interface EventRegistration {\n /**\n * True if this container has a callback to trigger for this event type\n * @param {!string} eventType\n * @return {boolean}\n */\n respondsTo(eventType: string): boolean;\n\n /**\n * @param {!Change} change\n * @param {!Query} query\n * @return {!Event}\n */\n createEvent(change: Change, query: Query): Event;\n\n /**\n * Given event data, return a function to trigger the user's callback\n * @param {!Event} eventData\n * @return {function()}\n */\n getEventRunner(eventData: Event): () => void;\n\n /**\n * @param {!Error} error\n * @param {!Path} path\n * @return {?CancelEvent}\n */\n createCancelEvent(error: Error, path: Path): CancelEvent | null;\n\n /**\n * @param {!EventRegistration} other\n * @return {boolean}\n */\n matches(other: EventRegistration): boolean;\n\n /**\n * False basically means this is a \"dummy\" callback container being used as a sentinel\n * to remove all callback containers of a particular type. (e.g. if the user does\n * ref.off('value') without specifying a specific callback).\n *\n * (TODO: Rework this, since it's hacky)\n *\n * @return {boolean}\n */\n hasAnyCallback(): boolean;\n}\n\n/**\n * Represents registration for 'value' events.\n */\nexport class ValueEventRegistration implements EventRegistration {\n /**\n * @param {?function(!DataSnapshot)} callback_\n * @param {?function(Error)} cancelCallback_\n * @param {?Object} context_\n */\n constructor(\n private callback_: ((d: DataSnapshot) => void) | null,\n private cancelCallback_: ((e: Error) => void) | null,\n private context_: {} | null\n ) {}\n\n /**\n * @inheritDoc\n */\n respondsTo(eventType: string): boolean {\n return eventType === 'value';\n }\n\n /**\n * @inheritDoc\n */\n createEvent(change: Change, query: Query): DataEvent {\n const index = query.getQueryParams().getIndex();\n return new DataEvent(\n 'value',\n this,\n new DataSnapshot(change.snapshotNode, query.getRef(), index)\n );\n }\n\n /**\n * @inheritDoc\n */\n getEventRunner(eventData: CancelEvent | DataEvent): () => void {\n const ctx = this.context_;\n if (eventData.getEventType() === 'cancel') {\n assert(\n this.cancelCallback_,\n 'Raising a cancel event on a listener with no cancel callback'\n );\n const cancelCB = this.cancelCallback_;\n return function() {\n // We know that error exists, we checked above that this is a cancel event\n cancelCB.call(ctx, (eventData as CancelEvent).error);\n };\n } else {\n const cb = this.callback_;\n return function() {\n cb.call(ctx, (eventData as DataEvent).snapshot);\n };\n }\n }\n\n /**\n * @inheritDoc\n */\n createCancelEvent(error: Error, path: Path): CancelEvent | null {\n if (this.cancelCallback_) {\n return new CancelEvent(this, error, path);\n } else {\n return null;\n }\n }\n\n /**\n * @inheritDoc\n */\n matches(other: EventRegistration): boolean {\n if (!(other instanceof ValueEventRegistration)) {\n return false;\n } else if (!other.callback_ || !this.callback_) {\n // If no callback specified, we consider it to match any callback.\n return true;\n } else {\n return (\n other.callback_ === this.callback_ && other.context_ === this.context_\n );\n }\n }\n\n /**\n * @inheritDoc\n */\n hasAnyCallback(): boolean {\n return this.callback_ !== null;\n }\n}\n\n/**\n * Represents the registration of 1 or more child_xxx events.\n *\n * Currently, it is always exactly 1 child_xxx event, but the idea is we might let you\n * register a group of callbacks together in the future.\n *\n * @constructor\n * @implements {EventRegistration}\n */\nexport class ChildEventRegistration implements EventRegistration {\n /**\n * @param {?Object.<string, function(!DataSnapshot, ?string=)>} callbacks_\n * @param {?function(Error)} cancelCallback_\n * @param {Object=} context_\n */\n constructor(\n private callbacks_: {\n [k: string]: (d: DataSnapshot, s?: string | null) => void;\n } | null,\n private cancelCallback_: ((e: Error) => void) | null,\n private context_?: {}\n ) {}\n\n /**\n * @inheritDoc\n */\n respondsTo(eventType: string): boolean {\n let eventToCheck =\n eventType === 'children_added' ? 'child_added' : eventType;\n eventToCheck =\n eventToCheck === 'children_removed' ? 'child_removed' : eventToCheck;\n return contains(this.callbacks_, eventToCheck);\n }\n\n /**\n * @inheritDoc\n */\n createCancelEvent(error: Error, path: Path): CancelEvent | null {\n if (this.cancelCallback_) {\n return new CancelEvent(this, error, path);\n } else {\n return null;\n }\n }\n\n /**\n * @inheritDoc\n */\n createEvent(change: Change, query: Query): DataEvent {\n assert(change.childName != null, 'Child events should have a childName.');\n const ref = query.getRef().child(/** @type {!string} */ change.childName);\n const index = query.getQueryParams().getIndex();\n return new DataEvent(\n change.type as EventType,\n this,\n new DataSnapshot(change.snapshotNode, ref, index),\n change.prevName\n );\n }\n\n /**\n * @inheritDoc\n */\n getEventRunner(eventData: CancelEvent | DataEvent): () => void {\n const ctx = this.context_;\n if (eventData.getEventType() === 'cancel') {\n assert(\n this.cancelCallback_,\n 'Raising a cancel event on a listener with no cancel callback'\n );\n const cancelCB = this.cancelCallback_;\n return function() {\n // We know that error exists, we checked above that this is a cancel event\n cancelCB.call(ctx, (eventData as CancelEvent).error);\n };\n } else {\n const cb = this.callbacks_[(eventData as DataEvent).eventType];\n return function() {\n cb.call(\n ctx,\n (eventData as DataEvent).snapshot,\n (eventData as DataEvent).prevName\n );\n };\n }\n }\n\n /**\n * @inheritDoc\n */\n matches(other: EventRegistration): boolean {\n if (other instanceof ChildEventRegistration) {\n if (!this.callbacks_ || !other.callbacks_) {\n return true;\n } else if (this.context_ === other.context_) {\n const otherKeys = Object.keys(other.callbacks_);\n const thisKeys = Object.keys(this.callbacks_);\n const otherCount = otherKeys.length;\n const thisCount = thisKeys.length;\n if (otherCount === thisCount) {\n // If count is 1, do an exact match on eventType, if either is defined but null, it's a match.\n // If event types don't match, not a match\n // If count is not 1, exact match across all\n\n if (otherCount === 1) {\n const otherKey = otherKeys[0];\n const thisKey = thisKeys[0];\n return (\n thisKey === otherKey &&\n (!other.callbacks_[otherKey] ||\n !this.callbacks_[thisKey] ||\n other.callbacks_[otherKey] === this.callbacks_[thisKey])\n );\n } else {\n // Exact match on each key.\n return thisKeys.every(\n eventType =>\n other.callbacks_[eventType] === this.callbacks_[eventType]\n );\n }\n }\n }\n }\n\n return false;\n }\n\n /**\n * @inheritDoc\n */\n hasAnyCallback(): boolean {\n return this.callbacks_ !== null;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n assert,\n errorPrefix,\n validateArgCount,\n validateCallback,\n validateContextObject,\n Deferred\n} from '@firebase/util';\nimport { KEY_INDEX } from '../core/snap/indexes/KeyIndex';\nimport { PRIORITY_INDEX } from '../core/snap/indexes/PriorityIndex';\nimport { VALUE_INDEX } from '../core/snap/indexes/ValueIndex';\nimport { PathIndex } from '../core/snap/indexes/PathIndex';\nimport { MIN_NAME, MAX_NAME, ObjectToUniqueKey } from '../core/util/util';\nimport { Path } from '../core/util/Path';\nimport {\n isValidPriority,\n validateEventType,\n validatePathString,\n validateFirebaseDataArg,\n validateKey\n} from '../core/util/validation';\n\nimport {\n ValueEventRegistration,\n ChildEventRegistration,\n EventRegistration\n} from '../core/view/EventRegistration';\n\nimport { Repo } from '../core/Repo';\nimport { QueryParams } from '../core/view/QueryParams';\nimport { Reference } from './Reference';\nimport { DataSnapshot } from './DataSnapshot';\n\nlet __referenceConstructor: new (repo: Repo, path: Path) => Query;\n\nexport interface SnapshotCallback {\n (a: DataSnapshot, b?: string | null): unknown;\n}\n\n/**\n * A Query represents a filter to be applied to a firebase location. This object purely represents the\n * query expression (and exposes our public API to build the query). The actual query logic is in ViewBase.js.\n *\n * Since every Firebase reference is a query, Firebase inherits from this object.\n */\nexport class Query {\n static set __referenceConstructor(val) {\n __referenceConstructor = val;\n }\n\n static get __referenceConstructor() {\n assert(__referenceConstructor, 'Reference.ts has not been loaded');\n return __referenceConstructor;\n }\n\n constructor(\n public repo: Repo,\n public path: Path,\n private queryParams_: QueryParams,\n private orderByCalled_: boolean\n ) {}\n\n /**\n * Validates start/end values for queries.\n * @param {!QueryParams} params\n * @private\n */\n private static validateQueryEndpoints_(params: QueryParams) {\n let startNode = null;\n let endNode = null;\n if (params.hasStart()) {\n startNode = params.getIndexStartValue();\n }\n if (params.hasEnd()) {\n endNode = params.getIndexEndValue();\n }\n\n if (params.getIndex() === KEY_INDEX) {\n const tooManyArgsError =\n 'Query: When ordering by key, you may only pass one argument to ' +\n 'startAt(), endAt(), or equalTo().';\n const wrongArgTypeError =\n 'Query: When ordering by key, the argument passed to startAt(), endAt(),' +\n 'or equalTo() must be a string.';\n if (params.hasStart()) {\n const startName = params.getIndexStartName();\n if (startName !== MIN_NAME) {\n throw new Error(tooManyArgsError);\n } else if (typeof startNode !== 'string') {\n throw new Error(wrongArgTypeError);\n }\n }\n if (params.hasEnd()) {\n const endName = params.getIndexEndName();\n if (endName !== MAX_NAME) {\n throw new Error(tooManyArgsError);\n } else if (typeof endNode !== 'string') {\n throw new Error(wrongArgTypeError);\n }\n }\n } else if (params.getIndex() === PRIORITY_INDEX) {\n if (\n (startNode != null && !isValidPriority(startNode)) ||\n (endNode != null && !isValidPriority(endNode))\n ) {\n throw new Error(\n 'Query: When ordering by priority, the first argument passed to startAt(), ' +\n 'endAt(), or equalTo() must be a valid priority value (null, a number, or a string).'\n );\n }\n } else {\n assert(\n params.getIndex() instanceof PathIndex ||\n params.getIndex() === VALUE_INDEX,\n 'unknown index type.'\n );\n if (\n (startNode != null && typeof startNode === 'object') ||\n (endNode != null && typeof endNode === 'object')\n ) {\n throw new Error(\n 'Query: First argument passed to startAt(), endAt(), or equalTo() cannot be ' +\n 'an object.'\n );\n }\n }\n }\n\n /**\n * Validates that limit* has been called with the correct combination of parameters\n * @param {!QueryParams} params\n * @private\n */\n private static validateLimit_(params: QueryParams) {\n if (\n params.hasStart() &&\n params.hasEnd() &&\n params.hasLimit() &&\n !params.hasAnchoredLimit()\n ) {\n throw new Error(\n \"Query: Can't combine startAt(), endAt(), and limit(). Use limitToFirst() or limitToLast() instead.\"\n );\n }\n }\n\n /**\n * Validates that no other order by call has been made\n * @param {!string} fnName\n * @private\n */\n private validateNoPreviousOrderByCall_(fnName: string) {\n if (this.orderByCalled_ === true) {\n throw new Error(fnName + \": You can't combine multiple orderBy calls.\");\n }\n }\n\n /**\n * @return {!QueryParams}\n */\n getQueryParams(): QueryParams {\n return this.queryParams_;\n }\n\n /**\n * @return {!Reference}\n */\n getRef(): Reference {\n validateArgCount('Query.ref', 0, 0, arguments.length);\n // This is a slight hack. We cannot goog.require('fb.api.Firebase'), since Firebase requires fb.api.Query.\n // However, we will always export 'Firebase' to the global namespace, so it's guaranteed to exist by the time this\n // method gets called.\n return new Query.__referenceConstructor(this.repo, this.path) as Reference;\n }\n\n /**\n * @param {!string} eventType\n * @param {!function(DataSnapshot, string=)} callback\n * @param {(function(Error)|Object)=} cancelCallbackOrContext\n * @param {Object=} context\n * @return {!function(DataSnapshot, string=)}\n */\n on(\n eventType: string,\n callback: SnapshotCallback,\n cancelCallbackOrContext?: ((a: Error) => unknown) | object | null,\n context?: object | null\n ): SnapshotCallback {\n validateArgCount('Query.on', 2, 4, arguments.length);\n validateEventType('Query.on', 1, eventType, false);\n validateCallback('Query.on', 2, callback, false);\n\n const ret = Query.getCancelAndContextArgs_(\n 'Query.on',\n cancelCallbackOrContext,\n context\n );\n\n if (eventType === 'value') {\n this.onValueEvent(callback, ret.cancel, ret.context);\n } else {\n const callbacks: { [k: string]: typeof callback } = {};\n callbacks[eventType] = callback;\n this.onChildEvent(callbacks, ret.cancel, ret.context);\n }\n return callback;\n }\n\n /**\n * @param {!function(!DataSnapshot)} callback\n * @param {?function(Error)} cancelCallback\n * @param {?Object} context\n * @protected\n */\n protected onValueEvent(\n callback: (a: DataSnapshot) => void,\n cancelCallback: ((a: Error) => void) | null,\n context: object | null\n ) {\n const container = new ValueEventRegistration(\n callback,\n cancelCallback || null,\n context || null\n );\n this.repo.addEventCallbackForQuery(this, container);\n }\n\n /**\n * @param {!Object.<string, !function(!DataSnapshot, ?string)>} callbacks\n * @param {?function(Error)} cancelCallback\n * @param {?Object} context\n * @protected\n */\n onChildEvent(\n callbacks: { [k: string]: SnapshotCallback },\n cancelCallback: ((a: Error) => unknown) | null,\n context: object | null\n ) {\n const container = new ChildEventRegistration(\n callbacks,\n cancelCallback,\n context\n );\n this.repo.addEventCallbackForQuery(this, container);\n }\n\n /**\n * @param {string=} eventType\n * @param {(function(!DataSnapshot, ?string=))=} callback\n * @param {Object=} context\n */\n off(\n eventType?: string,\n callback?: SnapshotCallback,\n context?: object | null\n ): void {\n validateArgCount('Query.off', 0, 3, arguments.length);\n validateEventType('Query.off', 1, eventType, true);\n validateCallback('Query.off', 2, callback, true);\n validateContextObject('Query.off', 3, context, true);\n\n let container: EventRegistration | null = null;\n let callbacks: { [k: string]: typeof callback } | null = null;\n if (eventType === 'value') {\n const valueCallback = callback || null;\n container = new ValueEventRegistration(\n valueCallback,\n null,\n context || null\n );\n } else if (eventType) {\n if (callback) {\n callbacks = {};\n callbacks[eventType] = callback;\n }\n container = new ChildEventRegistration(callbacks, null, context || null);\n }\n this.repo.removeEventCallbackForQuery(this, container);\n }\n\n /**\n * Attaches a listener, waits for the first event, and then removes the listener\n * @param {!string} eventType\n * @param {!function(!DataSnapshot, string=)} userCallback\n * @param failureCallbackOrContext\n * @param context\n * @return {!firebase.Promise}\n */\n once(\n eventType: string,\n userCallback?: SnapshotCallback,\n failureCallbackOrContext?: ((a: Error) => void) | object | null,\n context?: object | null\n ): Promise<DataSnapshot> {\n validateArgCount('Query.once', 1, 4, arguments.length);\n validateEventType('Query.once', 1, eventType, false);\n validateCallback('Query.once', 2, userCallback, true);\n\n const ret = Query.getCancelAndContextArgs_(\n 'Query.once',\n failureCallbackOrContext,\n context\n );\n\n // TODO: Implement this more efficiently (in particular, use 'get' wire protocol for 'value' event)\n // TODO: consider actually wiring the callbacks into the promise. We cannot do this without a breaking change\n // because the API currently expects callbacks will be called synchronously if the data is cached, but this is\n // against the Promise specification.\n let firstCall = true;\n const deferred = new Deferred<DataSnapshot>();\n\n // A dummy error handler in case a user wasn't expecting promises\n deferred.promise.catch(() => {});\n\n const onceCallback = (snapshot: DataSnapshot) => {\n // NOTE: Even though we unsubscribe, we may get called multiple times if a single action (e.g. set() with JSON)\n // triggers multiple events (e.g. child_added or child_changed).\n if (firstCall) {\n firstCall = false;\n this.off(eventType, onceCallback);\n\n if (userCallback) {\n userCallback.bind(ret.context)(snapshot);\n }\n deferred.resolve(snapshot);\n }\n };\n\n this.on(\n eventType,\n onceCallback,\n /*cancel=*/ err => {\n this.off(eventType, onceCallback);\n\n if (ret.cancel) {\n ret.cancel.bind(ret.context)(err);\n }\n deferred.reject(err);\n }\n );\n return deferred.promise;\n }\n\n /**\n * Set a limit and anchor it to the start of the window.\n * @param {!number} limit\n * @return {!Query}\n */\n limitToFirst(limit: number): Query {\n validateArgCount('Query.limitToFirst', 1, 1, arguments.length);\n if (\n typeof limit !== 'number' ||\n Math.floor(limit) !== limit ||\n limit <= 0\n ) {\n throw new Error(\n 'Query.limitToFirst: First argument must be a positive integer.'\n );\n }\n if (this.queryParams_.hasLimit()) {\n throw new Error(\n 'Query.limitToFirst: Limit was already set (by another call to limit, ' +\n 'limitToFirst, or limitToLast).'\n );\n }\n\n return new Query(\n this.repo,\n this.path,\n this.queryParams_.limitToFirst(limit),\n this.orderByCalled_\n );\n }\n\n /**\n * Set a limit and anchor it to the end of the window.\n * @param {!number} limit\n * @return {!Query}\n */\n limitToLast(limit: number): Query {\n validateArgCount('Query.limitToLast', 1, 1, arguments.length);\n if (\n typeof limit !== 'number' ||\n Math.floor(limit) !== limit ||\n limit <= 0\n ) {\n throw new Error(\n 'Query.limitToLast: First argument must be a positive integer.'\n );\n }\n if (this.queryParams_.hasLimit()) {\n throw new Error(\n 'Query.limitToLast: Limit was already set (by another call to limit, ' +\n 'limitToFirst, or limitToLast).'\n );\n }\n\n return new Query(\n this.repo,\n this.path,\n this.queryParams_.limitToLast(limit),\n this.orderByCalled_\n );\n }\n\n /**\n * Given a child path, return a new query ordered by the specified grandchild path.\n * @param {!string} path\n * @return {!Query}\n */\n orderByChild(path: string): Query {\n validateArgCount('Query.orderByChild', 1, 1, arguments.length);\n if (path === '$key') {\n throw new Error(\n 'Query.orderByChild: \"$key\" is invalid. Use Query.orderByKey() instead.'\n );\n } else if (path === '$priority') {\n throw new Error(\n 'Query.orderByChild: \"$priority\" is invalid. Use Query.orderByPriority() instead.'\n );\n } else if (path === '$value') {\n throw new Error(\n 'Query.orderByChild: \"$value\" is invalid. Use Query.orderByValue() instead.'\n );\n }\n validatePathString('Query.orderByChild', 1, path, false);\n this.validateNoPreviousOrderByCall_('Query.orderByChild');\n const parsedPath = new Path(path);\n if (parsedPath.isEmpty()) {\n throw new Error(\n 'Query.orderByChild: cannot pass in empty path. Use Query.orderByValue() instead.'\n );\n }\n const index = new PathIndex(parsedPath);\n const newParams = this.queryParams_.orderBy(index);\n Query.validateQueryEndpoints_(newParams);\n\n return new Query(this.repo, this.path, newParams, /*orderByCalled=*/ true);\n }\n\n /**\n * Return a new query ordered by the KeyIndex\n * @return {!Query}\n */\n orderByKey(): Query {\n validateArgCount('Query.orderByKey', 0, 0, arguments.length);\n this.validateNoPreviousOrderByCall_('Query.orderByKey');\n const newParams = this.queryParams_.orderBy(KEY_INDEX);\n Query.validateQueryEndpoints_(newParams);\n return new Query(this.repo, this.path, newParams, /*orderByCalled=*/ true);\n }\n\n /**\n * Return a new query ordered by the PriorityIndex\n * @return {!Query}\n */\n orderByPriority(): Query {\n validateArgCount('Query.orderByPriority', 0, 0, arguments.length);\n this.validateNoPreviousOrderByCall_('Query.orderByPriority');\n const newParams = this.queryParams_.orderBy(PRIORITY_INDEX);\n Query.validateQueryEndpoints_(newParams);\n return new Query(this.repo, this.path, newParams, /*orderByCalled=*/ true);\n }\n\n /**\n * Return a new query ordered by the ValueIndex\n * @return {!Query}\n */\n orderByValue(): Query {\n validateArgCount('Query.orderByValue', 0, 0, arguments.length);\n this.validateNoPreviousOrderByCall_('Query.orderByValue');\n const newParams = this.queryParams_.orderBy(VALUE_INDEX);\n Query.validateQueryEndpoints_(newParams);\n return new Query(this.repo, this.path, newParams, /*orderByCalled=*/ true);\n }\n\n /**\n * @param {number|string|boolean|null} value\n * @param {?string=} name\n * @return {!Query}\n */\n startAt(\n value: number | string | boolean | null = null,\n name?: string | null\n ): Query {\n validateArgCount('Query.startAt', 0, 2, arguments.length);\n validateFirebaseDataArg('Query.startAt', 1, value, this.path, true);\n validateKey('Query.startAt', 2, name, true);\n\n const newParams = this.queryParams_.startAt(value, name);\n Query.validateLimit_(newParams);\n Query.validateQueryEndpoints_(newParams);\n if (this.queryParams_.hasStart()) {\n throw new Error(\n 'Query.startAt: Starting point was already set (by another call to startAt ' +\n 'or equalTo).'\n );\n }\n\n // Calling with no params tells us to start at the beginning.\n if (value === undefined) {\n value = null;\n name = null;\n }\n return new Query(this.repo, this.path, newParams, this.orderByCalled_);\n }\n\n /**\n * @param {number|string|boolean|null} value\n * @param {?string=} name\n * @return {!Query}\n */\n endAt(\n value: number | string | boolean | null = null,\n name?: string | null\n ): Query {\n validateArgCount('Query.endAt', 0, 2, arguments.length);\n validateFirebaseDataArg('Query.endAt', 1, value, this.path, true);\n validateKey('Query.endAt', 2, name, true);\n\n const newParams = this.queryParams_.endAt(value, name);\n Query.validateLimit_(newParams);\n Query.validateQueryEndpoints_(newParams);\n if (this.queryParams_.hasEnd()) {\n throw new Error(\n 'Query.endAt: Ending point was already set (by another call to endAt or ' +\n 'equalTo).'\n );\n }\n\n return new Query(this.repo, this.path, newParams, this.orderByCalled_);\n }\n\n /**\n * Load the selection of children with exactly the specified value, and, optionally,\n * the specified name.\n * @param {number|string|boolean|null} value\n * @param {string=} name\n * @return {!Query}\n */\n equalTo(value: number | string | boolean | null, name?: string) {\n validateArgCount('Query.equalTo', 1, 2, arguments.length);\n validateFirebaseDataArg('Query.equalTo', 1, value, this.path, false);\n validateKey('Query.equalTo', 2, name, true);\n if (this.queryParams_.hasStart()) {\n throw new Error(\n 'Query.equalTo: Starting point was already set (by another call to startAt or ' +\n 'equalTo).'\n );\n }\n if (this.queryParams_.hasEnd()) {\n throw new Error(\n 'Query.equalTo: Ending point was already set (by another call to endAt or ' +\n 'equalTo).'\n );\n }\n return this.startAt(value, name).endAt(value, name);\n }\n\n /**\n * @return {!string} URL for this location.\n */\n toString(): string {\n validateArgCount('Query.toString', 0, 0, arguments.length);\n\n return this.repo.toString() + this.path.toUrlEncodedString();\n }\n\n // Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary\n // for end-users.\n toJSON() {\n // An optional spacer argument is unnecessary for a string.\n validateArgCount('Query.toJSON', 0, 1, arguments.length);\n return this.toString();\n }\n\n /**\n * An object representation of the query parameters used by this Query.\n * @return {!Object}\n */\n queryObject(): object {\n return this.queryParams_.getQueryObject();\n }\n\n /**\n * @return {!string}\n */\n queryIdentifier(): string {\n const obj = this.queryObject();\n const id = ObjectToUniqueKey(obj);\n return id === '{}' ? 'default' : id;\n }\n\n /**\n * Return true if this query and the provided query are equivalent; otherwise, return false.\n * @param {Query} other\n * @return {boolean}\n */\n isEqual(other: Query): boolean {\n validateArgCount('Query.isEqual', 1, 1, arguments.length);\n if (!(other instanceof Query)) {\n const error =\n 'Query.isEqual failed: First argument must be an instance of firebase.database.Query.';\n throw new Error(error);\n }\n\n const sameRepo = this.repo === other.repo;\n const samePath = this.path.equals(other.path);\n const sameQueryIdentifier =\n this.queryIdentifier() === other.queryIdentifier();\n\n return sameRepo && samePath && sameQueryIdentifier;\n }\n\n /**\n * Helper used by .on and .once to extract the context and or cancel arguments.\n * @param {!string} fnName The function name (on or once)\n * @param {(function(Error)|Object)=} cancelOrContext\n * @param {Object=} context\n * @return {{cancel: ?function(Error), context: ?Object}}\n * @private\n */\n private static getCancelAndContextArgs_(\n fnName: string,\n cancelOrContext?: ((a: Error) => void) | object | null,\n context?: object | null\n ): { cancel: ((a: Error) => void) | null; context: object | null } {\n const ret: {\n cancel: ((a: Error) => void) | null;\n context: object | null;\n } = { cancel: null, context: null };\n if (cancelOrContext && context) {\n ret.cancel = cancelOrContext as (a: Error) => void;\n validateCallback(fnName, 3, ret.cancel, true);\n\n ret.context = context;\n validateContextObject(fnName, 4, ret.context, true);\n } else if (cancelOrContext) {\n // we have either a cancel callback or a context.\n if (typeof cancelOrContext === 'object' && cancelOrContext !== null) {\n // it's a context!\n ret.context = cancelOrContext;\n } else if (typeof cancelOrContext === 'function') {\n ret.cancel = cancelOrContext as (a: Error) => void;\n } else {\n throw new Error(\n errorPrefix(fnName, 3, true) +\n ' must either be a cancel callback or a context object.'\n );\n }\n }\n return ret;\n }\n\n get ref(): Reference {\n return this.getRef();\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\nimport { Path } from './Path';\nimport { SparseSnapshotTree } from '../SparseSnapshotTree';\nimport { LeafNode } from '../snap/LeafNode';\nimport { nodeFromJSON } from '../snap/nodeFromJSON';\nimport { PRIORITY_INDEX } from '../snap/indexes/PriorityIndex';\nimport { Node } from '../snap/Node';\nimport { ChildrenNode } from '../snap/ChildrenNode';\nimport { SyncTree } from '../SyncTree';\nimport { Indexable } from './misc';\n\n/* It's critical for performance that we do not calculate actual values from a SyncTree\n * unless and until the value is needed. Because we expose both a SyncTree and Node\n * version of deferred value resolution, we ned a wrapper class that will let us share\n * code.\n *\n * @see https://github.com/firebase/firebase-js-sdk/issues/2487\n */\ninterface ValueProvider {\n getImmediateChild(childName: string): ValueProvider;\n node(): Node;\n}\n\nclass ExistingValueProvider implements ValueProvider {\n constructor(readonly node_: Node) {}\n\n getImmediateChild(childName: string): ValueProvider {\n const child = this.node_.getImmediateChild(childName);\n return new ExistingValueProvider(child);\n }\n\n node(): Node {\n return this.node_;\n }\n}\n\nclass DeferredValueProvider implements ValueProvider {\n private syncTree_: SyncTree;\n private path_: Path;\n\n constructor(syncTree: SyncTree, path: Path) {\n this.syncTree_ = syncTree;\n this.path_ = path;\n }\n\n getImmediateChild(childName: string): ValueProvider {\n const childPath = this.path_.child(childName);\n return new DeferredValueProvider(this.syncTree_, childPath);\n }\n\n node(): Node {\n return this.syncTree_.calcCompleteEventCache(this.path_);\n }\n}\n\n/**\n * Generate placeholders for deferred values.\n * @param {?Object} values\n * @return {!Object}\n */\nexport const generateWithValues = function(\n values: {\n [k: string]: unknown;\n } | null\n): { [k: string]: unknown } {\n values = values || {};\n values['timestamp'] = values['timestamp'] || new Date().getTime();\n return values;\n};\n\n/**\n * Value to use when firing local events. When writing server values, fire\n * local events with an approximate value, otherwise return value as-is.\n * @param {(Object|string|number|boolean)} value\n * @param {!Object} serverValues\n * @return {!(string|number|boolean)}\n */\nexport const resolveDeferredLeafValue = function(\n value: { [k: string]: unknown } | string | number | boolean,\n existingVal: ValueProvider,\n serverValues: { [k: string]: unknown }\n): string | number | boolean {\n if (!value || typeof value !== 'object') {\n return value as string | number | boolean;\n }\n assert('.sv' in value, 'Unexpected leaf node or priority contents');\n\n if (typeof value['.sv'] === 'string') {\n return resolveScalarDeferredValue(value['.sv'], existingVal, serverValues);\n } else if (typeof value['.sv'] === 'object') {\n return resolveComplexDeferredValue(value['.sv'], existingVal, serverValues);\n } else {\n assert(false, 'Unexpected server value: ' + JSON.stringify(value, null, 2));\n }\n};\n\nconst resolveScalarDeferredValue = function(\n op: string,\n existing: ValueProvider,\n serverValues: { [k: string]: unknown }\n): string | number | boolean {\n switch (op) {\n case 'timestamp':\n return serverValues['timestamp'] as string | number | boolean;\n default:\n assert(false, 'Unexpected server value: ' + op);\n }\n};\n\nconst resolveComplexDeferredValue = function(\n op: object,\n existing: ValueProvider,\n unused: { [k: string]: unknown }\n): string | number | boolean {\n if (!op.hasOwnProperty('increment')) {\n assert(false, 'Unexpected server value: ' + JSON.stringify(op, null, 2));\n }\n const delta = op['increment'];\n if (typeof delta !== 'number') {\n assert(false, 'Unexpected increment value: ' + delta);\n }\n\n const existingNode = existing.node();\n assert(\n existingNode !== null && typeof existingNode !== 'undefined',\n 'Expected ChildrenNode.EMPTY_NODE for nulls'\n );\n\n // Incrementing a non-number sets the value to the incremented amount\n if (!existingNode.isLeafNode()) {\n return delta;\n }\n\n const leaf = existingNode as LeafNode;\n const existingVal = leaf.getValue();\n if (typeof existingVal !== 'number') {\n return delta;\n }\n\n // No need to do over/underflow arithmetic here because JS only handles floats under the covers\n return existingVal + delta;\n};\n\n/**\n * Recursively replace all deferred values and priorities in the tree with the\n * specified generated replacement values.\n * @param {!Path} path path to which write is relative\n * @param {!Node} node new data written at path\n * @param {!SyncTree} syncTree current data\n * @param {!Object} serverValues\n * @return {!SparseSnapshotTree}\n */\nexport const resolveDeferredValueTree = function(\n path: Path,\n node: Node,\n syncTree: SyncTree,\n serverValues: Indexable\n): Node {\n return resolveDeferredValue(\n node,\n new DeferredValueProvider(syncTree, path),\n serverValues\n );\n};\n\n/**\n * Recursively replace all deferred values and priorities in the node with the\n * specified generated replacement values. If there are no server values in the node,\n * it'll be returned as-is.\n * @param {!Node} node\n * @param {!Object} serverValues\n * @return {!Node}\n */\nexport const resolveDeferredValueSnapshot = function(\n node: Node,\n existing: Node,\n serverValues: Indexable\n): Node {\n return resolveDeferredValue(\n node,\n new ExistingValueProvider(existing),\n serverValues\n );\n};\n\nfunction resolveDeferredValue(\n node: Node,\n existingVal: ValueProvider,\n serverValues: Indexable\n): Node {\n const rawPri = node.getPriority().val() as\n | Indexable\n | boolean\n | null\n | number\n | string;\n const priority = resolveDeferredLeafValue(\n rawPri,\n existingVal.getImmediateChild('.priority'),\n serverValues\n );\n let newNode: Node;\n\n if (node.isLeafNode()) {\n const leafNode = node as LeafNode;\n const value = resolveDeferredLeafValue(\n leafNode.getValue(),\n existingVal,\n serverValues\n );\n if (\n value !== leafNode.getValue() ||\n priority !== leafNode.getPriority().val()\n ) {\n return new LeafNode(value, nodeFromJSON(priority));\n } else {\n return node;\n }\n } else {\n const childrenNode = node as ChildrenNode;\n newNode = childrenNode;\n if (priority !== childrenNode.getPriority().val()) {\n newNode = newNode.updatePriority(new LeafNode(priority));\n }\n childrenNode.forEachChild(PRIORITY_INDEX, (childName, childNode) => {\n const newChildNode = resolveDeferredValue(\n childNode,\n existingVal.getImmediateChild(childName),\n serverValues\n );\n if (newChildNode !== childNode) {\n newNode = newNode.updateImmediateChild(childName, newChildNode);\n }\n });\n return newNode;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Path } from './util/Path';\nimport { PRIORITY_INDEX } from './snap/indexes/PriorityIndex';\nimport { Node } from './snap/Node';\n\n/**\n * Helper class to store a sparse set of snapshots.\n */\nexport class SparseSnapshotTree {\n private value: Node | null = null;\n\n private readonly children: Map<string, SparseSnapshotTree> = new Map();\n\n /**\n * Gets the node stored at the given path if one exists.\n *\n * @param path Path to look up snapshot for.\n * @return The retrieved node, or null.\n */\n find(path: Path): Node | null {\n if (this.value != null) {\n return this.value.getChild(path);\n } else if (!path.isEmpty() && this.children.size > 0) {\n const childKey = path.getFront();\n path = path.popFront();\n if (this.children.has(childKey)) {\n const childTree = this.children.get(childKey);\n return childTree.find(path);\n } else {\n return null;\n }\n } else {\n return null;\n }\n }\n\n /**\n * Stores the given node at the specified path. If there is already a node\n * at a shallower path, it merges the new data into that snapshot node.\n *\n * @param path Path to look up snapshot for.\n * @param data The new data, or null.\n */\n remember(path: Path, data: Node) {\n if (path.isEmpty()) {\n this.value = data;\n this.children.clear();\n } else if (this.value !== null) {\n this.value = this.value.updateChild(path, data);\n } else {\n const childKey = path.getFront();\n if (!this.children.has(childKey)) {\n this.children.set(childKey, new SparseSnapshotTree());\n }\n\n const child = this.children.get(childKey);\n path = path.popFront();\n child.remember(path, data);\n }\n }\n\n /**\n * Purge the data at path from the cache.\n *\n * @param path Path to look up snapshot for.\n * @return True if this node should now be removed.\n */\n forget(path: Path): boolean {\n if (path.isEmpty()) {\n this.value = null;\n this.children.clear();\n return true;\n } else {\n if (this.value !== null) {\n if (this.value.isLeafNode()) {\n // We're trying to forget a node that doesn't exist\n return false;\n } else {\n const value = this.value;\n this.value = null;\n\n const self = this;\n value.forEachChild(PRIORITY_INDEX, (key, tree) => {\n self.remember(new Path(key), tree);\n });\n\n return this.forget(path);\n }\n } else if (this.children.size > 0) {\n const childKey = path.getFront();\n path = path.popFront();\n if (this.children.has(childKey)) {\n const safeToRemove = this.children.get(childKey).forget(path);\n if (safeToRemove) {\n this.children.delete(childKey);\n }\n }\n\n return this.children.size === 0;\n } else {\n return true;\n }\n }\n }\n\n /**\n * Recursively iterates through all of the stored tree and calls the\n * callback on each one.\n *\n * @param prefixPath Path to look up node for.\n * @param func The function to invoke for each tree.\n */\n forEachTree(prefixPath: Path, func: (a: Path, b: Node) => unknown) {\n if (this.value !== null) {\n func(prefixPath, this.value);\n } else {\n this.forEachChild((key, tree) => {\n const path = new Path(prefixPath.toString() + '/' + key);\n tree.forEachTree(path, func);\n });\n }\n }\n\n /**\n * Iterates through each immediate child and triggers the callback.\n *\n * @param func The function to invoke for each child.\n */\n forEachChild(func: (a: string, b: SparseSnapshotTree) => void) {\n this.children.forEach((tree, key) => {\n func(key, tree);\n });\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\nimport { Path } from '../util/Path';\n\n/**\n *\n * @enum\n */\nexport enum OperationType {\n OVERWRITE,\n MERGE,\n ACK_USER_WRITE,\n LISTEN_COMPLETE\n}\n\n/**\n * @interface\n */\nexport interface Operation {\n /**\n * @type {!OperationSource}\n */\n source: OperationSource;\n\n /**\n * @type {!OperationType}\n */\n type: OperationType;\n\n /**\n * @type {!Path}\n */\n path: Path;\n\n /**\n * @param {string} childName\n * @return {?Operation}\n */\n operationForChild(childName: string): Operation | null;\n}\n\n/**\n * @param {boolean} fromUser\n * @param {boolean} fromServer\n * @param {?string} queryId\n * @param {boolean} tagged\n * @constructor\n */\nexport class OperationSource {\n constructor(\n public fromUser: boolean,\n public fromServer: boolean,\n public queryId: string | null,\n public tagged: boolean\n ) {\n assert(!tagged || fromServer, 'Tagged queries must be from server.');\n }\n /**\n * @const\n * @type {!OperationSource}\n */\n static User = new OperationSource(\n /*fromUser=*/ true,\n false,\n null,\n /*tagged=*/ false\n );\n\n /**\n * @const\n * @type {!OperationSource}\n */\n static Server = new OperationSource(\n false,\n /*fromServer=*/ true,\n null,\n /*tagged=*/ false\n );\n\n /**\n * @param {string} queryId\n * @return {!OperationSource}\n */\n static forServerTaggedQuery = function(queryId: string): OperationSource {\n return new OperationSource(\n false,\n /*fromServer=*/ true,\n queryId,\n /*tagged=*/ true\n );\n };\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\nimport { Path } from '../util/Path';\nimport { Operation, OperationSource, OperationType } from './Operation';\nimport { ImmutableTree } from '../util/ImmutableTree';\n\nexport class AckUserWrite implements Operation {\n /** @inheritDoc */\n type = OperationType.ACK_USER_WRITE;\n\n /** @inheritDoc */\n source = OperationSource.User;\n\n /**\n *\n * @param {!Path} path\n * @param {!ImmutableTree<!boolean>} affectedTree A tree containing true for each affected path. Affected paths can't overlap.\n * @param {!boolean} revert\n */\n constructor(\n /** @inheritDoc */ public path: Path,\n /** @inheritDoc */ public affectedTree: ImmutableTree<boolean>,\n /** @inheritDoc */ public revert: boolean\n ) {}\n\n /**\n * @inheritDoc\n */\n operationForChild(childName: string): AckUserWrite {\n if (!this.path.isEmpty()) {\n assert(\n this.path.getFront() === childName,\n 'operationForChild called for unrelated child.'\n );\n return new AckUserWrite(\n this.path.popFront(),\n this.affectedTree,\n this.revert\n );\n } else if (this.affectedTree.value != null) {\n assert(\n this.affectedTree.children.isEmpty(),\n 'affectedTree should not have overlapping affected paths.'\n );\n // All child locations are affected as well; just return same operation.\n return this;\n } else {\n const childTree = this.affectedTree.subtree(new Path(childName));\n return new AckUserWrite(Path.Empty, childTree, this.revert);\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SortedMap } from './SortedMap';\nimport { Path } from './Path';\nimport { stringCompare, each } from './util';\n\nlet emptyChildrenSingleton: SortedMap<string, ImmutableTree<null>>;\n\n/**\n * Singleton empty children collection.\n *\n * @const\n * @type {!SortedMap.<string, !ImmutableTree.<?>>}\n */\nconst EmptyChildren = (): SortedMap<string, ImmutableTree<null>> => {\n if (!emptyChildrenSingleton) {\n emptyChildrenSingleton = new SortedMap<string, ImmutableTree<null>>(\n stringCompare\n );\n }\n return emptyChildrenSingleton;\n};\n\n/**\n * A tree with immutable elements.\n */\nexport class ImmutableTree<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static Empty = new ImmutableTree<any>(null);\n\n /**\n * @template T\n * @param {!Object.<string, !T>} obj\n * @return {!ImmutableTree.<!T>}\n */\n static fromObject<T>(obj: { [k: string]: T }): ImmutableTree<T> {\n let tree: ImmutableTree<T> = ImmutableTree.Empty;\n each(obj, (childPath: string, childSnap: T) => {\n tree = tree.set(new Path(childPath), childSnap);\n });\n return tree;\n }\n\n /**\n * @template T\n * @param {?T} value\n * @param {SortedMap.<string, !ImmutableTree.<T>>=} children\n */\n constructor(\n public readonly value: T | null,\n public readonly children: SortedMap<\n string,\n ImmutableTree<T>\n > = EmptyChildren()\n ) {}\n\n /**\n * True if the value is empty and there are no children\n * @return {boolean}\n */\n isEmpty(): boolean {\n return this.value === null && this.children.isEmpty();\n }\n\n /**\n * Given a path and predicate, return the first node and the path to that node\n * where the predicate returns true.\n *\n * TODO Do a perf test -- If we're creating a bunch of {path: value:} objects\n * on the way back out, it may be better to pass down a pathSoFar obj.\n *\n * @param {!Path} relativePath The remainder of the path\n * @param {function(T):boolean} predicate The predicate to satisfy to return a\n * node\n * @return {?{path:!Path, value:!T}}\n */\n findRootMostMatchingPathAndValue(\n relativePath: Path,\n predicate: (a: T) => boolean\n ): { path: Path; value: T } | null {\n if (this.value != null && predicate(this.value)) {\n return { path: Path.Empty, value: this.value };\n } else {\n if (relativePath.isEmpty()) {\n return null;\n } else {\n const front = relativePath.getFront();\n const child = this.children.get(front);\n if (child !== null) {\n const childExistingPathAndValue = child.findRootMostMatchingPathAndValue(\n relativePath.popFront(),\n predicate\n );\n if (childExistingPathAndValue != null) {\n const fullPath = new Path(front).child(\n childExistingPathAndValue.path\n );\n return { path: fullPath, value: childExistingPathAndValue.value };\n } else {\n return null;\n }\n } else {\n return null;\n }\n }\n }\n }\n\n /**\n * Find, if it exists, the shortest subpath of the given path that points a defined\n * value in the tree\n * @param {!Path} relativePath\n * @return {?{path: !Path, value: !T}}\n */\n findRootMostValueAndPath(\n relativePath: Path\n ): { path: Path; value: T } | null {\n return this.findRootMostMatchingPathAndValue(relativePath, () => true);\n }\n\n /**\n * @param {!Path} relativePath\n * @return {!ImmutableTree.<T>} The subtree at the given path\n */\n subtree(relativePath: Path): ImmutableTree<T> {\n if (relativePath.isEmpty()) {\n return this;\n } else {\n const front = relativePath.getFront();\n const childTree = this.children.get(front);\n if (childTree !== null) {\n return childTree.subtree(relativePath.popFront());\n } else {\n return ImmutableTree.Empty;\n }\n }\n }\n\n /**\n * Sets a value at the specified path.\n *\n * @param {!Path} relativePath Path to set value at.\n * @param {?T} toSet Value to set.\n * @return {!ImmutableTree.<T>} Resulting tree.\n */\n set(relativePath: Path, toSet: T | null): ImmutableTree<T> {\n if (relativePath.isEmpty()) {\n return new ImmutableTree(toSet, this.children);\n } else {\n const front = relativePath.getFront();\n const child = this.children.get(front) || ImmutableTree.Empty;\n const newChild = child.set(relativePath.popFront(), toSet);\n const newChildren = this.children.insert(front, newChild);\n return new ImmutableTree(this.value, newChildren);\n }\n }\n\n /**\n * Removes the value at the specified path.\n *\n * @param {!Path} relativePath Path to value to remove.\n * @return {!ImmutableTree.<T>} Resulting tree.\n */\n remove(relativePath: Path): ImmutableTree<T> {\n if (relativePath.isEmpty()) {\n if (this.children.isEmpty()) {\n return ImmutableTree.Empty;\n } else {\n return new ImmutableTree(null, this.children);\n }\n } else {\n const front = relativePath.getFront();\n const child = this.children.get(front);\n if (child) {\n const newChild = child.remove(relativePath.popFront());\n let newChildren;\n if (newChild.isEmpty()) {\n newChildren = this.children.remove(front);\n } else {\n newChildren = this.children.insert(front, newChild);\n }\n if (this.value === null && newChildren.isEmpty()) {\n return ImmutableTree.Empty;\n } else {\n return new ImmutableTree(this.value, newChildren);\n }\n } else {\n return this;\n }\n }\n }\n\n /**\n * Gets a value from the tree.\n *\n * @param {!Path} relativePath Path to get value for.\n * @return {?T} Value at path, or null.\n */\n get(relativePath: Path): T | null {\n if (relativePath.isEmpty()) {\n return this.value;\n } else {\n const front = relativePath.getFront();\n const child = this.children.get(front);\n if (child) {\n return child.get(relativePath.popFront());\n } else {\n return null;\n }\n }\n }\n\n /**\n * Replace the subtree at the specified path with the given new tree.\n *\n * @param {!Path} relativePath Path to replace subtree for.\n * @param {!ImmutableTree} newTree New tree.\n * @return {!ImmutableTree} Resulting tree.\n */\n setTree(relativePath: Path, newTree: ImmutableTree<T>): ImmutableTree<T> {\n if (relativePath.isEmpty()) {\n return newTree;\n } else {\n const front = relativePath.getFront();\n const child = this.children.get(front) || ImmutableTree.Empty;\n const newChild = child.setTree(relativePath.popFront(), newTree);\n let newChildren;\n if (newChild.isEmpty()) {\n newChildren = this.children.remove(front);\n } else {\n newChildren = this.children.insert(front, newChild);\n }\n return new ImmutableTree(this.value, newChildren);\n }\n }\n\n /**\n * Performs a depth first fold on this tree. Transforms a tree into a single\n * value, given a function that operates on the path to a node, an optional\n * current value, and a map of child names to folded subtrees\n * @template V\n * @param {function(Path, ?T, Object.<string, V>):V} fn\n * @return {V}\n */\n fold<V>(fn: (path: Path, value: T, children: { [k: string]: V }) => V): V {\n return this.fold_(Path.Empty, fn);\n }\n\n /**\n * Recursive helper for public-facing fold() method\n * @template V\n * @param {!Path} pathSoFar\n * @param {function(Path, ?T, Object.<string, V>):V} fn\n * @return {V}\n * @private\n */\n private fold_<V>(\n pathSoFar: Path,\n fn: (path: Path, value: T | null, children: { [k: string]: V }) => V\n ): V {\n const accum: { [k: string]: V } = {};\n this.children.inorderTraversal(\n (childKey: string, childTree: ImmutableTree<T>) => {\n accum[childKey] = childTree.fold_(pathSoFar.child(childKey), fn);\n }\n );\n return fn(pathSoFar, this.value, accum);\n }\n\n /**\n * Find the first matching value on the given path. Return the result of applying f to it.\n * @template V\n * @param {!Path} path\n * @param {!function(!Path, !T):?V} f\n * @return {?V}\n */\n findOnPath<V>(path: Path, f: (path: Path, value: T) => V | null): V | null {\n return this.findOnPath_(path, Path.Empty, f);\n }\n\n private findOnPath_<V>(\n pathToFollow: Path,\n pathSoFar: Path,\n f: (path: Path, value: T) => V | null\n ): V | null {\n const result = this.value ? f(pathSoFar, this.value) : false;\n if (result) {\n return result;\n } else {\n if (pathToFollow.isEmpty()) {\n return null;\n } else {\n const front = pathToFollow.getFront()!;\n const nextChild = this.children.get(front);\n if (nextChild) {\n return nextChild.findOnPath_(\n pathToFollow.popFront(),\n pathSoFar.child(front),\n f\n );\n } else {\n return null;\n }\n }\n }\n }\n\n /**\n *\n * @param {!Path} path\n * @param {!function(!Path, !T)} f\n * @returns {!ImmutableTree.<T>}\n */\n foreachOnPath(\n path: Path,\n f: (path: Path, value: T) => void\n ): ImmutableTree<T> {\n return this.foreachOnPath_(path, Path.Empty, f);\n }\n\n private foreachOnPath_(\n pathToFollow: Path,\n currentRelativePath: Path,\n f: (path: Path, value: T) => void\n ): ImmutableTree<T> {\n if (pathToFollow.isEmpty()) {\n return this;\n } else {\n if (this.value) {\n f(currentRelativePath, this.value);\n }\n const front = pathToFollow.getFront();\n const nextChild = this.children.get(front);\n if (nextChild) {\n return nextChild.foreachOnPath_(\n pathToFollow.popFront(),\n currentRelativePath.child(front),\n f\n );\n } else {\n return ImmutableTree.Empty;\n }\n }\n }\n\n /**\n * Calls the given function for each node in the tree that has a value.\n *\n * @param {function(!Path, !T)} f A function to be called with\n * the path from the root of the tree to a node, and the value at that node.\n * Called in depth-first order.\n */\n foreach(f: (path: Path, value: T) => void) {\n this.foreach_(Path.Empty, f);\n }\n\n private foreach_(\n currentRelativePath: Path,\n f: (path: Path, value: T) => void\n ) {\n this.children.inorderTraversal((childName, childTree) => {\n childTree.foreach_(currentRelativePath.child(childName), f);\n });\n if (this.value) {\n f(currentRelativePath, this.value);\n }\n }\n\n /**\n *\n * @param {function(string, !T)} f\n */\n foreachChild(f: (name: string, value: T) => void) {\n this.children.inorderTraversal(\n (childName: string, childTree: ImmutableTree<T>) => {\n if (childTree.value) {\n f(childName, childTree.value);\n }\n }\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Path } from '../util/Path';\nimport { Operation, OperationSource, OperationType } from './Operation';\n\n/**\n * @param {!OperationSource} source\n * @param {!Path} path\n * @constructor\n * @implements {Operation}\n */\nexport class ListenComplete implements Operation {\n /** @inheritDoc */\n type = OperationType.LISTEN_COMPLETE;\n\n constructor(public source: OperationSource, public path: Path) {}\n\n operationForChild(childName: string): ListenComplete {\n if (this.path.isEmpty()) {\n return new ListenComplete(this.source, Path.Empty);\n } else {\n return new ListenComplete(this.source, this.path.popFront());\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Operation, OperationSource, OperationType } from './Operation';\nimport { Path } from '../util/Path';\nimport { Node } from '../snap/Node';\n\n/**\n * @param {!OperationSource} source\n * @param {!Path} path\n * @param {!Node} snap\n * @constructor\n * @implements {Operation}\n */\nexport class Overwrite implements Operation {\n /** @inheritDoc */\n type = OperationType.OVERWRITE;\n\n constructor(\n public source: OperationSource,\n public path: Path,\n public snap: Node\n ) {}\n\n operationForChild(childName: string): Overwrite {\n if (this.path.isEmpty()) {\n return new Overwrite(\n this.source,\n Path.Empty,\n this.snap.getImmediateChild(childName)\n );\n } else {\n return new Overwrite(this.source, this.path.popFront(), this.snap);\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Operation, OperationSource, OperationType } from './Operation';\nimport { Overwrite } from './Overwrite';\nimport { Path } from '../util/Path';\nimport { assert } from '@firebase/util';\nimport { ImmutableTree } from '../util/ImmutableTree';\nimport { Node } from '../snap/Node';\n\n/**\n * @param {!OperationSource} source\n * @param {!Path} path\n * @param {!ImmutableTree.<!Node>} children\n * @constructor\n * @implements {Operation}\n */\nexport class Merge implements Operation {\n /** @inheritDoc */\n type = OperationType.MERGE;\n\n constructor(\n /** @inheritDoc */ public source: OperationSource,\n /** @inheritDoc */ public path: Path,\n /** @inheritDoc */ public children: ImmutableTree<Node>\n ) {}\n\n /**\n * @inheritDoc\n */\n operationForChild(childName: string): Operation {\n if (this.path.isEmpty()) {\n const childTree = this.children.subtree(new Path(childName));\n if (childTree.isEmpty()) {\n // This child is unaffected\n return null;\n } else if (childTree.value) {\n // We have a snapshot for the child in question. This becomes an overwrite of the child.\n return new Overwrite(this.source, Path.Empty, childTree.value);\n } else {\n // This is a merge at a deeper level\n return new Merge(this.source, Path.Empty, childTree);\n }\n } else {\n assert(\n this.path.getFront() === childName,\n \"Can't get a merge for a child not on the path of the operation\"\n );\n return new Merge(this.source, this.path.popFront(), this.children);\n }\n }\n\n /**\n * @inheritDoc\n */\n toString(): string {\n return (\n 'Operation(' +\n this.path +\n ': ' +\n this.source.toString() +\n ' merge: ' +\n this.children.toString() +\n ')'\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Node } from '../snap/Node';\nimport { Path } from '../util/Path';\n\n/**\n * A cache node only stores complete children. Additionally it holds a flag whether the node can be considered fully\n * initialized in the sense that we know at one point in time this represented a valid state of the world, e.g.\n * initialized with data from the server, or a complete overwrite by the client. The filtered flag also tracks\n * whether a node potentially had children removed due to a filter.\n */\nexport class CacheNode {\n /**\n * @param {!Node} node_\n * @param {boolean} fullyInitialized_\n * @param {boolean} filtered_\n */\n constructor(\n private node_: Node,\n private fullyInitialized_: boolean,\n private filtered_: boolean\n ) {}\n\n /**\n * Returns whether this node was fully initialized with either server data or a complete overwrite by the client\n * @return {boolean}\n */\n isFullyInitialized(): boolean {\n return this.fullyInitialized_;\n }\n\n /**\n * Returns whether this node is potentially missing children due to a filter applied to the node\n * @return {boolean}\n */\n isFiltered(): boolean {\n return this.filtered_;\n }\n\n /**\n * @param {!Path} path\n * @return {boolean}\n */\n isCompleteForPath(path: Path): boolean {\n if (path.isEmpty()) {\n return this.isFullyInitialized() && !this.filtered_;\n }\n\n const childKey = path.getFront();\n return this.isCompleteForChild(childKey);\n }\n\n /**\n * @param {!string} key\n * @return {boolean}\n */\n isCompleteForChild(key: string): boolean {\n return (\n (this.isFullyInitialized() && !this.filtered_) || this.node_.hasChild(key)\n );\n }\n\n /**\n * @return {!Node}\n */\n getNode(): Node {\n return this.node_;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ChildrenNode } from '../snap/ChildrenNode';\nimport { CacheNode } from './CacheNode';\nimport { Node } from '../snap/Node';\n\n/**\n * Stores the data we have cached for a view.\n *\n * serverSnap is the cached server data, eventSnap is the cached event data (server data plus any local writes).\n *\n * @constructor\n */\nexport class ViewCache {\n /**\n *\n * @param {!CacheNode} eventCache_\n * @param {!CacheNode} serverCache_\n */\n constructor(\n private readonly eventCache_: CacheNode,\n private readonly serverCache_: CacheNode\n ) {}\n\n /**\n * @const\n * @type {ViewCache}\n */\n static Empty = new ViewCache(\n new CacheNode(\n ChildrenNode.EMPTY_NODE,\n /*fullyInitialized=*/ false,\n /*filtered=*/ false\n ),\n new CacheNode(\n ChildrenNode.EMPTY_NODE,\n /*fullyInitialized=*/ false,\n /*filtered=*/ false\n )\n );\n\n /**\n * @param {!Node} eventSnap\n * @param {boolean} complete\n * @param {boolean} filtered\n * @return {!ViewCache}\n */\n updateEventSnap(\n eventSnap: Node,\n complete: boolean,\n filtered: boolean\n ): ViewCache {\n return new ViewCache(\n new CacheNode(eventSnap, complete, filtered),\n this.serverCache_\n );\n }\n\n /**\n * @param {!Node} serverSnap\n * @param {boolean} complete\n * @param {boolean} filtered\n * @return {!ViewCache}\n */\n updateServerSnap(\n serverSnap: Node,\n complete: boolean,\n filtered: boolean\n ): ViewCache {\n return new ViewCache(\n this.eventCache_,\n new CacheNode(serverSnap, complete, filtered)\n );\n }\n\n /**\n * @return {!CacheNode}\n */\n getEventCache(): CacheNode {\n return this.eventCache_;\n }\n\n /**\n * @return {?Node}\n */\n getCompleteEventSnap(): Node | null {\n return this.eventCache_.isFullyInitialized()\n ? this.eventCache_.getNode()\n : null;\n }\n\n /**\n * @return {!CacheNode}\n */\n getServerCache(): CacheNode {\n return this.serverCache_;\n }\n\n /**\n * @return {?Node}\n */\n getCompleteServerSnap(): Node | null {\n return this.serverCache_.isFullyInitialized()\n ? this.serverCache_.getNode()\n : null;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Node } from '../snap/Node';\n\n/**\n * @constructor\n * @struct\n * @param {!string} type The event type\n * @param {!Node} snapshotNode The data\n * @param {string=} childName The name for this child, if it's a child event\n * @param {Node=} oldSnap Used for intermediate processing of child changed events\n * @param {string=} prevName The name for the previous child, if applicable\n */\nexport class Change {\n constructor(\n public type: string,\n public snapshotNode: Node,\n public childName?: string,\n public oldSnap?: Node,\n public prevName?: string | null\n ) {}\n\n /**\n * @param {!Node} snapshot\n * @return {!Change}\n */\n static valueChange(snapshot: Node): Change {\n return new Change(Change.VALUE, snapshot);\n }\n\n /**\n * @param {string} childKey\n * @param {!Node} snapshot\n * @return {!Change}\n */\n static childAddedChange(childKey: string, snapshot: Node): Change {\n return new Change(Change.CHILD_ADDED, snapshot, childKey);\n }\n\n /**\n * @param {string} childKey\n * @param {!Node} snapshot\n * @return {!Change}\n */\n static childRemovedChange(childKey: string, snapshot: Node): Change {\n return new Change(Change.CHILD_REMOVED, snapshot, childKey);\n }\n\n /**\n * @param {string} childKey\n * @param {!Node} newSnapshot\n * @param {!Node} oldSnapshot\n * @return {!Change}\n */\n static childChangedChange(\n childKey: string,\n newSnapshot: Node,\n oldSnapshot: Node\n ): Change {\n return new Change(Change.CHILD_CHANGED, newSnapshot, childKey, oldSnapshot);\n }\n\n /**\n * @param {string} childKey\n * @param {!Node} snapshot\n * @return {!Change}\n */\n static childMovedChange(childKey: string, snapshot: Node): Change {\n return new Change(Change.CHILD_MOVED, snapshot, childKey);\n }\n\n //event types\n /** Event type for a child added */\n static CHILD_ADDED = 'child_added';\n\n /** Event type for a child removed */\n static CHILD_REMOVED = 'child_removed';\n\n /** Event type for a child changed */\n static CHILD_CHANGED = 'child_changed';\n\n /** Event type for a child moved */\n static CHILD_MOVED = 'child_moved';\n\n /** Event type for a value change */\n static VALUE = 'value';\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\nimport { Change } from '../Change';\nimport { ChildrenNode } from '../../snap/ChildrenNode';\nimport { PRIORITY_INDEX } from '../../snap/indexes/PriorityIndex';\nimport { NodeFilter } from './NodeFilter';\nimport { Index } from '../../snap/indexes/Index';\nimport { Path } from '../../util/Path';\nimport { CompleteChildSource } from '../CompleteChildSource';\nimport { ChildChangeAccumulator } from '../ChildChangeAccumulator';\nimport { Node } from '../../snap/Node';\n\n/**\n * Doesn't really filter nodes but applies an index to the node and keeps track of any changes\n *\n * @constructor\n * @implements {NodeFilter}\n * @param {!Index} index\n */\nexport class IndexedFilter implements NodeFilter {\n constructor(private readonly index_: Index) {}\n\n updateChild(\n snap: Node,\n key: string,\n newChild: Node,\n affectedPath: Path,\n source: CompleteChildSource,\n optChangeAccumulator: ChildChangeAccumulator | null\n ): Node {\n assert(\n snap.isIndexed(this.index_),\n 'A node must be indexed if only a child is updated'\n );\n const oldChild = snap.getImmediateChild(key);\n // Check if anything actually changed.\n if (\n oldChild.getChild(affectedPath).equals(newChild.getChild(affectedPath))\n ) {\n // There's an edge case where a child can enter or leave the view because affectedPath was set to null.\n // In this case, affectedPath will appear null in both the old and new snapshots. So we need\n // to avoid treating these cases as \"nothing changed.\"\n if (oldChild.isEmpty() === newChild.isEmpty()) {\n // Nothing changed.\n\n // This assert should be valid, but it's expensive (can dominate perf testing) so don't actually do it.\n //assert(oldChild.equals(newChild), 'Old and new snapshots should be equal.');\n return snap;\n }\n }\n\n if (optChangeAccumulator != null) {\n if (newChild.isEmpty()) {\n if (snap.hasChild(key)) {\n optChangeAccumulator.trackChildChange(\n Change.childRemovedChange(key, oldChild)\n );\n } else {\n assert(\n snap.isLeafNode(),\n 'A child remove without an old child only makes sense on a leaf node'\n );\n }\n } else if (oldChild.isEmpty()) {\n optChangeAccumulator.trackChildChange(\n Change.childAddedChange(key, newChild)\n );\n } else {\n optChangeAccumulator.trackChildChange(\n Change.childChangedChange(key, newChild, oldChild)\n );\n }\n }\n if (snap.isLeafNode() && newChild.isEmpty()) {\n return snap;\n } else {\n // Make sure the node is indexed\n return snap.updateImmediateChild(key, newChild).withIndex(this.index_);\n }\n }\n\n /**\n * @inheritDoc\n */\n updateFullNode(\n oldSnap: Node,\n newSnap: Node,\n optChangeAccumulator: ChildChangeAccumulator | null\n ): Node {\n if (optChangeAccumulator != null) {\n if (!oldSnap.isLeafNode()) {\n oldSnap.forEachChild(PRIORITY_INDEX, (key, childNode) => {\n if (!newSnap.hasChild(key)) {\n optChangeAccumulator.trackChildChange(\n Change.childRemovedChange(key, childNode)\n );\n }\n });\n }\n if (!newSnap.isLeafNode()) {\n newSnap.forEachChild(PRIORITY_INDEX, (key, childNode) => {\n if (oldSnap.hasChild(key)) {\n const oldChild = oldSnap.getImmediateChild(key);\n if (!oldChild.equals(childNode)) {\n optChangeAccumulator.trackChildChange(\n Change.childChangedChange(key, childNode, oldChild)\n );\n }\n } else {\n optChangeAccumulator.trackChildChange(\n Change.childAddedChange(key, childNode)\n );\n }\n });\n }\n }\n return newSnap.withIndex(this.index_);\n }\n\n /**\n * @inheritDoc\n */\n updatePriority(oldSnap: Node, newPriority: Node): Node {\n if (oldSnap.isEmpty()) {\n return ChildrenNode.EMPTY_NODE;\n } else {\n return oldSnap.updatePriority(newPriority);\n }\n }\n\n /**\n * @inheritDoc\n */\n filtersNodes(): boolean {\n return false;\n }\n\n /**\n * @inheritDoc\n */\n getIndexedFilter(): IndexedFilter {\n return this;\n }\n\n /**\n * @inheritDoc\n */\n getIndex(): Index {\n return this.index_;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Change } from './Change';\nimport { assert, assertionError } from '@firebase/util';\n\nexport class ChildChangeAccumulator {\n private readonly changeMap: Map<string, Change> = new Map();\n\n trackChildChange(change: Change) {\n const type = change.type;\n const childKey = change.childName!;\n assert(\n type === Change.CHILD_ADDED ||\n type === Change.CHILD_CHANGED ||\n type === Change.CHILD_REMOVED,\n 'Only child changes supported for tracking'\n );\n assert(\n childKey !== '.priority',\n 'Only non-priority child changes can be tracked.'\n );\n const oldChange = this.changeMap.get(childKey);\n if (oldChange) {\n const oldType = oldChange.type;\n if (type === Change.CHILD_ADDED && oldType === Change.CHILD_REMOVED) {\n this.changeMap.set(\n childKey,\n Change.childChangedChange(\n childKey,\n change.snapshotNode,\n oldChange.snapshotNode\n )\n );\n } else if (\n type === Change.CHILD_REMOVED &&\n oldType === Change.CHILD_ADDED\n ) {\n this.changeMap.delete(childKey);\n } else if (\n type === Change.CHILD_REMOVED &&\n oldType === Change.CHILD_CHANGED\n ) {\n this.changeMap.set(\n childKey,\n Change.childRemovedChange(childKey, oldChange.oldSnap)\n );\n } else if (\n type === Change.CHILD_CHANGED &&\n oldType === Change.CHILD_ADDED\n ) {\n this.changeMap.set(\n childKey,\n Change.childAddedChange(childKey, change.snapshotNode)\n );\n } else if (\n type === Change.CHILD_CHANGED &&\n oldType === Change.CHILD_CHANGED\n ) {\n this.changeMap.set(\n childKey,\n Change.childChangedChange(\n childKey,\n change.snapshotNode,\n oldChange.oldSnap\n )\n );\n } else {\n throw assertionError(\n 'Illegal combination of changes: ' +\n change +\n ' occurred after ' +\n oldChange\n );\n }\n } else {\n this.changeMap.set(childKey, change);\n }\n }\n\n getChanges(): Change[] {\n return Array.from(this.changeMap.values());\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CacheNode } from './CacheNode';\nimport { NamedNode, Node } from '../snap/Node';\nimport { Index } from '../snap/indexes/Index';\nimport { WriteTreeRef } from '../WriteTree';\nimport { ViewCache } from './ViewCache';\n\n/**\n * Since updates to filtered nodes might require nodes to be pulled in from \"outside\" the node, this interface\n * can help to get complete children that can be pulled in.\n * A class implementing this interface takes potentially multiple sources (e.g. user writes, server data from\n * other views etc.) to try it's best to get a complete child that might be useful in pulling into the view.\n *\n * @interface\n */\nexport interface CompleteChildSource {\n /**\n * @param {!string} childKey\n * @return {?Node}\n */\n getCompleteChild(childKey: string): Node | null;\n\n /**\n * @param {!Index} index\n * @param {!NamedNode} child\n * @param {boolean} reverse\n * @return {?NamedNode}\n */\n getChildAfterChild(\n index: Index,\n child: NamedNode,\n reverse: boolean\n ): NamedNode | null;\n}\n\n/**\n * An implementation of CompleteChildSource that never returns any additional children\n *\n * @private\n * @constructor\n * @implements CompleteChildSource\n */\n// eslint-disable-next-line @typescript-eslint/class-name-casing\nexport class NoCompleteChildSource_ implements CompleteChildSource {\n /**\n * @inheritDoc\n */\n getCompleteChild(childKey?: string): Node | null {\n return null;\n }\n\n /**\n * @inheritDoc\n */\n getChildAfterChild(\n index?: Index,\n child?: NamedNode,\n reverse?: boolean\n ): NamedNode | null {\n return null;\n }\n}\n\n/**\n * Singleton instance.\n * @const\n * @type {!CompleteChildSource}\n */\nexport const NO_COMPLETE_CHILD_SOURCE = new NoCompleteChildSource_();\n\n/**\n * An implementation of CompleteChildSource that uses a WriteTree in addition to any other server data or\n * old event caches available to calculate complete children.\n *\n *\n * @implements CompleteChildSource\n */\nexport class WriteTreeCompleteChildSource implements CompleteChildSource {\n /**\n * @param {!WriteTreeRef} writes_\n * @param {!ViewCache} viewCache_\n * @param {?Node} optCompleteServerCache_\n */\n constructor(\n private writes_: WriteTreeRef,\n private viewCache_: ViewCache,\n private optCompleteServerCache_: Node | null = null\n ) {}\n\n /**\n * @inheritDoc\n */\n getCompleteChild(childKey: string): Node | null {\n const node = this.viewCache_.getEventCache();\n if (node.isCompleteForChild(childKey)) {\n return node.getNode().getImmediateChild(childKey);\n } else {\n const serverNode =\n this.optCompleteServerCache_ != null\n ? new CacheNode(this.optCompleteServerCache_, true, false)\n : this.viewCache_.getServerCache();\n return this.writes_.calcCompleteChild(childKey, serverNode);\n }\n }\n\n /**\n * @inheritDoc\n */\n getChildAfterChild(\n index: Index,\n child: NamedNode,\n reverse: boolean\n ): NamedNode | null {\n const completeServerData =\n this.optCompleteServerCache_ != null\n ? this.optCompleteServerCache_\n : this.viewCache_.getCompleteServerSnap();\n const nodes = this.writes_.calcIndexedSlice(\n completeServerData,\n child,\n 1,\n reverse,\n index\n );\n if (nodes.length === 0) {\n return null;\n } else {\n return nodes[0];\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Operation, OperationType } from '../operation/Operation';\nimport { assert, assertionError } from '@firebase/util';\nimport { ChildChangeAccumulator } from './ChildChangeAccumulator';\nimport { Change } from './Change';\nimport { ChildrenNode } from '../snap/ChildrenNode';\nimport { KEY_INDEX } from '../snap/indexes/KeyIndex';\nimport { ImmutableTree } from '../util/ImmutableTree';\nimport { Path } from '../util/Path';\nimport {\n WriteTreeCompleteChildSource,\n NO_COMPLETE_CHILD_SOURCE,\n CompleteChildSource\n} from './CompleteChildSource';\nimport { ViewCache } from './ViewCache';\nimport { NodeFilter } from './filter/NodeFilter';\nimport { WriteTreeRef } from '../WriteTree';\nimport { Overwrite } from '../operation/Overwrite';\nimport { Merge } from '../operation/Merge';\nimport { AckUserWrite } from '../operation/AckUserWrite';\nimport { Node } from '../snap/Node';\n\n/**\n * @constructor\n * @struct\n */\nexport class ProcessorResult {\n /**\n * @param {!ViewCache} viewCache\n * @param {!Array.<!Change>} changes\n */\n constructor(\n public readonly viewCache: ViewCache,\n public readonly changes: Change[]\n ) {}\n}\n\n/**\n * @constructor\n */\nexport class ViewProcessor {\n /**\n * @param {!NodeFilter} filter_\n */\n constructor(private readonly filter_: NodeFilter) {}\n\n /**\n * @param {!ViewCache} viewCache\n */\n assertIndexed(viewCache: ViewCache) {\n assert(\n viewCache\n .getEventCache()\n .getNode()\n .isIndexed(this.filter_.getIndex()),\n 'Event snap not indexed'\n );\n assert(\n viewCache\n .getServerCache()\n .getNode()\n .isIndexed(this.filter_.getIndex()),\n 'Server snap not indexed'\n );\n }\n\n /**\n * @param {!ViewCache} oldViewCache\n * @param {!Operation} operation\n * @param {!WriteTreeRef} writesCache\n * @param {?Node} completeCache\n * @return {!ProcessorResult}\n */\n applyOperation(\n oldViewCache: ViewCache,\n operation: Operation,\n writesCache: WriteTreeRef,\n completeCache: Node | null\n ): ProcessorResult {\n const accumulator = new ChildChangeAccumulator();\n let newViewCache, filterServerNode;\n if (operation.type === OperationType.OVERWRITE) {\n const overwrite = operation as Overwrite;\n if (overwrite.source.fromUser) {\n newViewCache = this.applyUserOverwrite_(\n oldViewCache,\n overwrite.path,\n overwrite.snap,\n writesCache,\n completeCache,\n accumulator\n );\n } else {\n assert(overwrite.source.fromServer, 'Unknown source.');\n // We filter the node if it's a tagged update or the node has been previously filtered and the\n // update is not at the root in which case it is ok (and necessary) to mark the node unfiltered\n // again\n filterServerNode =\n overwrite.source.tagged ||\n (oldViewCache.getServerCache().isFiltered() &&\n !overwrite.path.isEmpty());\n newViewCache = this.applyServerOverwrite_(\n oldViewCache,\n overwrite.path,\n overwrite.snap,\n writesCache,\n completeCache,\n filterServerNode,\n accumulator\n );\n }\n } else if (operation.type === OperationType.MERGE) {\n const merge = operation as Merge;\n if (merge.source.fromUser) {\n newViewCache = this.applyUserMerge_(\n oldViewCache,\n merge.path,\n merge.children,\n writesCache,\n completeCache,\n accumulator\n );\n } else {\n assert(merge.source.fromServer, 'Unknown source.');\n // We filter the node if it's a tagged update or the node has been previously filtered\n filterServerNode =\n merge.source.tagged || oldViewCache.getServerCache().isFiltered();\n newViewCache = this.applyServerMerge_(\n oldViewCache,\n merge.path,\n merge.children,\n writesCache,\n completeCache,\n filterServerNode,\n accumulator\n );\n }\n } else if (operation.type === OperationType.ACK_USER_WRITE) {\n const ackUserWrite = operation as AckUserWrite;\n if (!ackUserWrite.revert) {\n newViewCache = this.ackUserWrite_(\n oldViewCache,\n ackUserWrite.path,\n ackUserWrite.affectedTree,\n writesCache,\n completeCache,\n accumulator\n );\n } else {\n newViewCache = this.revertUserWrite_(\n oldViewCache,\n ackUserWrite.path,\n writesCache,\n completeCache,\n accumulator\n );\n }\n } else if (operation.type === OperationType.LISTEN_COMPLETE) {\n newViewCache = this.listenComplete_(\n oldViewCache,\n operation.path,\n writesCache,\n accumulator\n );\n } else {\n throw assertionError('Unknown operation type: ' + operation.type);\n }\n const changes = accumulator.getChanges();\n ViewProcessor.maybeAddValueEvent_(oldViewCache, newViewCache, changes);\n return new ProcessorResult(newViewCache, changes);\n }\n\n /**\n * @param {!ViewCache} oldViewCache\n * @param {!ViewCache} newViewCache\n * @param {!Array.<!Change>} accumulator\n * @private\n */\n private static maybeAddValueEvent_(\n oldViewCache: ViewCache,\n newViewCache: ViewCache,\n accumulator: Change[]\n ) {\n const eventSnap = newViewCache.getEventCache();\n if (eventSnap.isFullyInitialized()) {\n const isLeafOrEmpty =\n eventSnap.getNode().isLeafNode() || eventSnap.getNode().isEmpty();\n const oldCompleteSnap = oldViewCache.getCompleteEventSnap();\n if (\n accumulator.length > 0 ||\n !oldViewCache.getEventCache().isFullyInitialized() ||\n (isLeafOrEmpty &&\n !eventSnap.getNode().equals(/** @type {!Node} */ oldCompleteSnap)) ||\n !eventSnap\n .getNode()\n .getPriority()\n .equals(oldCompleteSnap.getPriority())\n ) {\n accumulator.push(\n Change.valueChange(\n /** @type {!Node} */ newViewCache.getCompleteEventSnap()\n )\n );\n }\n }\n }\n\n /**\n * @param {!ViewCache} viewCache\n * @param {!Path} changePath\n * @param {!WriteTreeRef} writesCache\n * @param {!CompleteChildSource} source\n * @param {!ChildChangeAccumulator} accumulator\n * @return {!ViewCache}\n * @private\n */\n private generateEventCacheAfterServerEvent_(\n viewCache: ViewCache,\n changePath: Path,\n writesCache: WriteTreeRef,\n source: CompleteChildSource,\n accumulator: ChildChangeAccumulator\n ): ViewCache {\n const oldEventSnap = viewCache.getEventCache();\n if (writesCache.shadowingWrite(changePath) != null) {\n // we have a shadowing write, ignore changes\n return viewCache;\n } else {\n let newEventCache, serverNode;\n if (changePath.isEmpty()) {\n // TODO: figure out how this plays with \"sliding ack windows\"\n assert(\n viewCache.getServerCache().isFullyInitialized(),\n 'If change path is empty, we must have complete server data'\n );\n if (viewCache.getServerCache().isFiltered()) {\n // We need to special case this, because we need to only apply writes to complete children, or\n // we might end up raising events for incomplete children. If the server data is filtered deep\n // writes cannot be guaranteed to be complete\n const serverCache = viewCache.getCompleteServerSnap();\n const completeChildren =\n serverCache instanceof ChildrenNode\n ? serverCache\n : ChildrenNode.EMPTY_NODE;\n const completeEventChildren = writesCache.calcCompleteEventChildren(\n completeChildren\n );\n newEventCache = this.filter_.updateFullNode(\n viewCache.getEventCache().getNode(),\n completeEventChildren,\n accumulator\n );\n } else {\n const completeNode = writesCache.calcCompleteEventCache(\n viewCache.getCompleteServerSnap()\n );\n newEventCache = this.filter_.updateFullNode(\n viewCache.getEventCache().getNode(),\n completeNode,\n accumulator\n );\n }\n } else {\n const childKey = changePath.getFront();\n if (childKey === '.priority') {\n assert(\n changePath.getLength() === 1,\n \"Can't have a priority with additional path components\"\n );\n const oldEventNode = oldEventSnap.getNode();\n serverNode = viewCache.getServerCache().getNode();\n // we might have overwrites for this priority\n const updatedPriority = writesCache.calcEventCacheAfterServerOverwrite(\n changePath,\n oldEventNode,\n serverNode\n );\n if (updatedPriority != null) {\n newEventCache = this.filter_.updatePriority(\n oldEventNode,\n updatedPriority\n );\n } else {\n // priority didn't change, keep old node\n newEventCache = oldEventSnap.getNode();\n }\n } else {\n const childChangePath = changePath.popFront();\n // update child\n let newEventChild;\n if (oldEventSnap.isCompleteForChild(childKey)) {\n serverNode = viewCache.getServerCache().getNode();\n const eventChildUpdate = writesCache.calcEventCacheAfterServerOverwrite(\n changePath,\n oldEventSnap.getNode(),\n serverNode\n );\n if (eventChildUpdate != null) {\n newEventChild = oldEventSnap\n .getNode()\n .getImmediateChild(childKey)\n .updateChild(childChangePath, eventChildUpdate);\n } else {\n // Nothing changed, just keep the old child\n newEventChild = oldEventSnap\n .getNode()\n .getImmediateChild(childKey);\n }\n } else {\n newEventChild = writesCache.calcCompleteChild(\n childKey,\n viewCache.getServerCache()\n );\n }\n if (newEventChild != null) {\n newEventCache = this.filter_.updateChild(\n oldEventSnap.getNode(),\n childKey,\n newEventChild,\n childChangePath,\n source,\n accumulator\n );\n } else {\n // no complete child available or no change\n newEventCache = oldEventSnap.getNode();\n }\n }\n }\n return viewCache.updateEventSnap(\n newEventCache,\n oldEventSnap.isFullyInitialized() || changePath.isEmpty(),\n this.filter_.filtersNodes()\n );\n }\n }\n\n /**\n * @param {!ViewCache} oldViewCache\n * @param {!Path} changePath\n * @param {!Node} changedSnap\n * @param {!WriteTreeRef} writesCache\n * @param {?Node} completeCache\n * @param {boolean} filterServerNode\n * @param {!ChildChangeAccumulator} accumulator\n * @return {!ViewCache}\n * @private\n */\n applyServerOverwrite_(\n oldViewCache: ViewCache,\n changePath: Path,\n changedSnap: Node,\n writesCache: WriteTreeRef,\n completeCache: Node | null,\n filterServerNode: boolean,\n accumulator: ChildChangeAccumulator\n ): ViewCache {\n const oldServerSnap = oldViewCache.getServerCache();\n let newServerCache;\n const serverFilter = filterServerNode\n ? this.filter_\n : this.filter_.getIndexedFilter();\n if (changePath.isEmpty()) {\n newServerCache = serverFilter.updateFullNode(\n oldServerSnap.getNode(),\n changedSnap,\n null\n );\n } else if (serverFilter.filtersNodes() && !oldServerSnap.isFiltered()) {\n // we want to filter the server node, but we didn't filter the server node yet, so simulate a full update\n const newServerNode = oldServerSnap\n .getNode()\n .updateChild(changePath, changedSnap);\n newServerCache = serverFilter.updateFullNode(\n oldServerSnap.getNode(),\n newServerNode,\n null\n );\n } else {\n const childKey = changePath.getFront();\n if (\n !oldServerSnap.isCompleteForPath(changePath) &&\n changePath.getLength() > 1\n ) {\n // We don't update incomplete nodes with updates intended for other listeners\n return oldViewCache;\n }\n const childChangePath = changePath.popFront();\n const childNode = oldServerSnap.getNode().getImmediateChild(childKey);\n const newChildNode = childNode.updateChild(childChangePath, changedSnap);\n if (childKey === '.priority') {\n newServerCache = serverFilter.updatePriority(\n oldServerSnap.getNode(),\n newChildNode\n );\n } else {\n newServerCache = serverFilter.updateChild(\n oldServerSnap.getNode(),\n childKey,\n newChildNode,\n childChangePath,\n NO_COMPLETE_CHILD_SOURCE,\n null\n );\n }\n }\n const newViewCache = oldViewCache.updateServerSnap(\n newServerCache,\n oldServerSnap.isFullyInitialized() || changePath.isEmpty(),\n serverFilter.filtersNodes()\n );\n const source = new WriteTreeCompleteChildSource(\n writesCache,\n newViewCache,\n completeCache\n );\n return this.generateEventCacheAfterServerEvent_(\n newViewCache,\n changePath,\n writesCache,\n source,\n accumulator\n );\n }\n\n /**\n * @param {!ViewCache} oldViewCache\n * @param {!Path} changePath\n * @param {!Node} changedSnap\n * @param {!WriteTreeRef} writesCache\n * @param {?Node} completeCache\n * @param {!ChildChangeAccumulator} accumulator\n * @return {!ViewCache}\n * @private\n */\n applyUserOverwrite_(\n oldViewCache: ViewCache,\n changePath: Path,\n changedSnap: Node,\n writesCache: WriteTreeRef,\n completeCache: Node | null,\n accumulator: ChildChangeAccumulator\n ): ViewCache {\n const oldEventSnap = oldViewCache.getEventCache();\n let newViewCache, newEventCache;\n const source = new WriteTreeCompleteChildSource(\n writesCache,\n oldViewCache,\n completeCache\n );\n if (changePath.isEmpty()) {\n newEventCache = this.filter_.updateFullNode(\n oldViewCache.getEventCache().getNode(),\n changedSnap,\n accumulator\n );\n newViewCache = oldViewCache.updateEventSnap(\n newEventCache,\n true,\n this.filter_.filtersNodes()\n );\n } else {\n const childKey = changePath.getFront();\n if (childKey === '.priority') {\n newEventCache = this.filter_.updatePriority(\n oldViewCache.getEventCache().getNode(),\n changedSnap\n );\n newViewCache = oldViewCache.updateEventSnap(\n newEventCache,\n oldEventSnap.isFullyInitialized(),\n oldEventSnap.isFiltered()\n );\n } else {\n const childChangePath = changePath.popFront();\n const oldChild = oldEventSnap.getNode().getImmediateChild(childKey);\n let newChild;\n if (childChangePath.isEmpty()) {\n // Child overwrite, we can replace the child\n newChild = changedSnap;\n } else {\n const childNode = source.getCompleteChild(childKey);\n if (childNode != null) {\n if (\n childChangePath.getBack() === '.priority' &&\n childNode.getChild(childChangePath.parent()).isEmpty()\n ) {\n // This is a priority update on an empty node. If this node exists on the server, the\n // server will send down the priority in the update, so ignore for now\n newChild = childNode;\n } else {\n newChild = childNode.updateChild(childChangePath, changedSnap);\n }\n } else {\n // There is no complete child node available\n newChild = ChildrenNode.EMPTY_NODE;\n }\n }\n if (!oldChild.equals(newChild)) {\n const newEventSnap = this.filter_.updateChild(\n oldEventSnap.getNode(),\n childKey,\n newChild,\n childChangePath,\n source,\n accumulator\n );\n newViewCache = oldViewCache.updateEventSnap(\n newEventSnap,\n oldEventSnap.isFullyInitialized(),\n this.filter_.filtersNodes()\n );\n } else {\n newViewCache = oldViewCache;\n }\n }\n }\n return newViewCache;\n }\n\n /**\n * @param {!ViewCache} viewCache\n * @param {string} childKey\n * @return {boolean}\n * @private\n */\n private static cacheHasChild_(\n viewCache: ViewCache,\n childKey: string\n ): boolean {\n return viewCache.getEventCache().isCompleteForChild(childKey);\n }\n\n /**\n * @param {!ViewCache} viewCache\n * @param {!Path} path\n * @param {ImmutableTree.<!Node>} changedChildren\n * @param {!WriteTreeRef} writesCache\n * @param {?Node} serverCache\n * @param {!ChildChangeAccumulator} accumulator\n * @return {!ViewCache}\n * @private\n */\n private applyUserMerge_(\n viewCache: ViewCache,\n path: Path,\n changedChildren: ImmutableTree<Node>,\n writesCache: WriteTreeRef,\n serverCache: Node | null,\n accumulator: ChildChangeAccumulator\n ): ViewCache {\n // HACK: In the case of a limit query, there may be some changes that bump things out of the\n // window leaving room for new items. It's important we process these changes first, so we\n // iterate the changes twice, first processing any that affect items currently in view.\n // TODO: I consider an item \"in view\" if cacheHasChild is true, which checks both the server\n // and event snap. I'm not sure if this will result in edge cases when a child is in one but\n // not the other.\n let curViewCache = viewCache;\n changedChildren.foreach((relativePath, childNode) => {\n const writePath = path.child(relativePath);\n if (ViewProcessor.cacheHasChild_(viewCache, writePath.getFront())) {\n curViewCache = this.applyUserOverwrite_(\n curViewCache,\n writePath,\n childNode,\n writesCache,\n serverCache,\n accumulator\n );\n }\n });\n\n changedChildren.foreach((relativePath, childNode) => {\n const writePath = path.child(relativePath);\n if (!ViewProcessor.cacheHasChild_(viewCache, writePath.getFront())) {\n curViewCache = this.applyUserOverwrite_(\n curViewCache,\n writePath,\n childNode,\n writesCache,\n serverCache,\n accumulator\n );\n }\n });\n\n return curViewCache;\n }\n\n /**\n * @param {!Node} node\n * @param {ImmutableTree.<!Node>} merge\n * @return {!Node}\n * @private\n */\n private applyMerge_(node: Node, merge: ImmutableTree<Node>): Node {\n merge.foreach((relativePath, childNode) => {\n node = node.updateChild(relativePath, childNode);\n });\n return node;\n }\n\n /**\n * @param {!ViewCache} viewCache\n * @param {!Path} path\n * @param {!ImmutableTree.<!Node>} changedChildren\n * @param {!WriteTreeRef} writesCache\n * @param {?Node} serverCache\n * @param {boolean} filterServerNode\n * @param {!ChildChangeAccumulator} accumulator\n * @return {!ViewCache}\n * @private\n */\n private applyServerMerge_(\n viewCache: ViewCache,\n path: Path,\n changedChildren: ImmutableTree<Node>,\n writesCache: WriteTreeRef,\n serverCache: Node | null,\n filterServerNode: boolean,\n accumulator: ChildChangeAccumulator\n ): ViewCache {\n // If we don't have a cache yet, this merge was intended for a previously listen in the same location. Ignore it and\n // wait for the complete data update coming soon.\n if (\n viewCache\n .getServerCache()\n .getNode()\n .isEmpty() &&\n !viewCache.getServerCache().isFullyInitialized()\n ) {\n return viewCache;\n }\n\n // HACK: In the case of a limit query, there may be some changes that bump things out of the\n // window leaving room for new items. It's important we process these changes first, so we\n // iterate the changes twice, first processing any that affect items currently in view.\n // TODO: I consider an item \"in view\" if cacheHasChild is true, which checks both the server\n // and event snap. I'm not sure if this will result in edge cases when a child is in one but\n // not the other.\n let curViewCache = viewCache;\n let viewMergeTree;\n if (path.isEmpty()) {\n viewMergeTree = changedChildren;\n } else {\n viewMergeTree = ImmutableTree.Empty.setTree(path, changedChildren);\n }\n const serverNode = viewCache.getServerCache().getNode();\n viewMergeTree.children.inorderTraversal((childKey, childTree) => {\n if (serverNode.hasChild(childKey)) {\n const serverChild = viewCache\n .getServerCache()\n .getNode()\n .getImmediateChild(childKey);\n const newChild = this.applyMerge_(serverChild, childTree);\n curViewCache = this.applyServerOverwrite_(\n curViewCache,\n new Path(childKey),\n newChild,\n writesCache,\n serverCache,\n filterServerNode,\n accumulator\n );\n }\n });\n viewMergeTree.children.inorderTraversal((childKey, childMergeTree) => {\n const isUnknownDeepMerge =\n !viewCache.getServerCache().isCompleteForChild(childKey) &&\n childMergeTree.value == null;\n if (!serverNode.hasChild(childKey) && !isUnknownDeepMerge) {\n const serverChild = viewCache\n .getServerCache()\n .getNode()\n .getImmediateChild(childKey);\n const newChild = this.applyMerge_(serverChild, childMergeTree);\n curViewCache = this.applyServerOverwrite_(\n curViewCache,\n new Path(childKey),\n newChild,\n writesCache,\n serverCache,\n filterServerNode,\n accumulator\n );\n }\n });\n\n return curViewCache;\n }\n\n /**\n * @param {!ViewCache} viewCache\n * @param {!Path} ackPath\n * @param {!ImmutableTree<!boolean>} affectedTree\n * @param {!WriteTreeRef} writesCache\n * @param {?Node} completeCache\n * @param {!ChildChangeAccumulator} accumulator\n * @return {!ViewCache}\n * @private\n */\n private ackUserWrite_(\n viewCache: ViewCache,\n ackPath: Path,\n affectedTree: ImmutableTree<boolean>,\n writesCache: WriteTreeRef,\n completeCache: Node | null,\n accumulator: ChildChangeAccumulator\n ): ViewCache {\n if (writesCache.shadowingWrite(ackPath) != null) {\n return viewCache;\n }\n\n // Only filter server node if it is currently filtered\n const filterServerNode = viewCache.getServerCache().isFiltered();\n\n // Essentially we'll just get our existing server cache for the affected paths and re-apply it as a server update\n // now that it won't be shadowed.\n const serverCache = viewCache.getServerCache();\n if (affectedTree.value != null) {\n // This is an overwrite.\n if (\n (ackPath.isEmpty() && serverCache.isFullyInitialized()) ||\n serverCache.isCompleteForPath(ackPath)\n ) {\n return this.applyServerOverwrite_(\n viewCache,\n ackPath,\n serverCache.getNode().getChild(ackPath),\n writesCache,\n completeCache,\n filterServerNode,\n accumulator\n );\n } else if (ackPath.isEmpty()) {\n // This is a goofy edge case where we are acking data at this location but don't have full data. We\n // should just re-apply whatever we have in our cache as a merge.\n let changedChildren = ImmutableTree.Empty;\n serverCache.getNode().forEachChild(KEY_INDEX, (name, node) => {\n changedChildren = changedChildren.set(new Path(name), node);\n });\n return this.applyServerMerge_(\n viewCache,\n ackPath,\n changedChildren,\n writesCache,\n completeCache,\n filterServerNode,\n accumulator\n );\n } else {\n return viewCache;\n }\n } else {\n // This is a merge.\n let changedChildren = ImmutableTree.Empty;\n affectedTree.foreach((mergePath, value) => {\n const serverCachePath = ackPath.child(mergePath);\n if (serverCache.isCompleteForPath(serverCachePath)) {\n changedChildren = changedChildren.set(\n mergePath,\n serverCache.getNode().getChild(serverCachePath)\n );\n }\n });\n return this.applyServerMerge_(\n viewCache,\n ackPath,\n changedChildren,\n writesCache,\n completeCache,\n filterServerNode,\n accumulator\n );\n }\n }\n\n /**\n * @param {!ViewCache} viewCache\n * @param {!Path} path\n * @param {!WriteTreeRef} writesCache\n * @param {!ChildChangeAccumulator} accumulator\n * @return {!ViewCache}\n * @private\n */\n private listenComplete_(\n viewCache: ViewCache,\n path: Path,\n writesCache: WriteTreeRef,\n accumulator: ChildChangeAccumulator\n ): ViewCache {\n const oldServerNode = viewCache.getServerCache();\n const newViewCache = viewCache.updateServerSnap(\n oldServerNode.getNode(),\n oldServerNode.isFullyInitialized() || path.isEmpty(),\n oldServerNode.isFiltered()\n );\n return this.generateEventCacheAfterServerEvent_(\n newViewCache,\n path,\n writesCache,\n NO_COMPLETE_CHILD_SOURCE,\n accumulator\n );\n }\n\n /**\n * @param {!ViewCache} viewCache\n * @param {!Path} path\n * @param {!WriteTreeRef} writesCache\n * @param {?Node} completeServerCache\n * @param {!ChildChangeAccumulator} accumulator\n * @return {!ViewCache}\n * @private\n */\n private revertUserWrite_(\n viewCache: ViewCache,\n path: Path,\n writesCache: WriteTreeRef,\n completeServerCache: Node | null,\n accumulator: ChildChangeAccumulator\n ): ViewCache {\n let complete;\n if (writesCache.shadowingWrite(path) != null) {\n return viewCache;\n } else {\n const source = new WriteTreeCompleteChildSource(\n writesCache,\n viewCache,\n completeServerCache\n );\n const oldEventCache = viewCache.getEventCache().getNode();\n let newEventCache;\n if (path.isEmpty() || path.getFront() === '.priority') {\n let newNode;\n if (viewCache.getServerCache().isFullyInitialized()) {\n newNode = writesCache.calcCompleteEventCache(\n viewCache.getCompleteServerSnap()\n );\n } else {\n const serverChildren = viewCache.getServerCache().getNode();\n assert(\n serverChildren instanceof ChildrenNode,\n 'serverChildren would be complete if leaf node'\n );\n newNode = writesCache.calcCompleteEventChildren(\n serverChildren as ChildrenNode\n );\n }\n newNode = newNode as Node;\n newEventCache = this.filter_.updateFullNode(\n oldEventCache,\n newNode,\n accumulator\n );\n } else {\n const childKey = path.getFront();\n let newChild = writesCache.calcCompleteChild(\n childKey,\n viewCache.getServerCache()\n );\n if (\n newChild == null &&\n viewCache.getServerCache().isCompleteForChild(childKey)\n ) {\n newChild = oldEventCache.getImmediateChild(childKey);\n }\n if (newChild != null) {\n newEventCache = this.filter_.updateChild(\n oldEventCache,\n childKey,\n newChild,\n path.popFront(),\n source,\n accumulator\n );\n } else if (\n viewCache\n .getEventCache()\n .getNode()\n .hasChild(childKey)\n ) {\n // No complete child available, delete the existing one, if any\n newEventCache = this.filter_.updateChild(\n oldEventCache,\n childKey,\n ChildrenNode.EMPTY_NODE,\n path.popFront(),\n source,\n accumulator\n );\n } else {\n newEventCache = oldEventCache;\n }\n if (\n newEventCache.isEmpty() &&\n viewCache.getServerCache().isFullyInitialized()\n ) {\n // We might have reverted all child writes. Maybe the old event was a leaf node\n complete = writesCache.calcCompleteEventCache(\n viewCache.getCompleteServerSnap()\n );\n if (complete.isLeafNode()) {\n newEventCache = this.filter_.updateFullNode(\n newEventCache,\n complete,\n accumulator\n );\n }\n }\n }\n complete =\n viewCache.getServerCache().isFullyInitialized() ||\n writesCache.shadowingWrite(Path.Empty) != null;\n return viewCache.updateEventSnap(\n newEventCache,\n complete,\n this.filter_.filtersNodes()\n );\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NamedNode, Node } from '../snap/Node';\nimport { Change } from './Change';\nimport { assertionError } from '@firebase/util';\nimport { Query } from '../../api/Query';\nimport { Index } from '../snap/indexes/Index';\nimport { EventRegistration } from './EventRegistration';\nimport { Event } from './Event';\n\n/**\n * An EventGenerator is used to convert \"raw\" changes (Change) as computed by the\n * CacheDiffer into actual events (Event) that can be raised. See generateEventsForChanges()\n * for details.\n *\n * @constructor\n */\nexport class EventGenerator {\n private index_: Index;\n\n /**\n *\n * @param {!Query} query_\n */\n constructor(private query_: Query) {\n /**\n * @private\n * @type {!Index}\n */\n this.index_ = this.query_.getQueryParams().getIndex();\n }\n\n /**\n * Given a set of raw changes (no moved events and prevName not specified yet), and a set of\n * EventRegistrations that should be notified of these changes, generate the actual events to be raised.\n *\n * Notes:\n * - child_moved events will be synthesized at this time for any child_changed events that affect\n * our index.\n * - prevName will be calculated based on the index ordering.\n *\n * @param {!Array.<!Change>} changes\n * @param {!Node} eventCache\n * @param {!Array.<!EventRegistration>} eventRegistrations\n * @return {!Array.<!Event>}\n */\n generateEventsForChanges(\n changes: Change[],\n eventCache: Node,\n eventRegistrations: EventRegistration[]\n ): Event[] {\n const events: Event[] = [];\n const moves: Change[] = [];\n\n changes.forEach(change => {\n if (\n change.type === Change.CHILD_CHANGED &&\n this.index_.indexedValueChanged(\n change.oldSnap as Node,\n change.snapshotNode\n )\n ) {\n moves.push(\n Change.childMovedChange(\n change.childName as string,\n change.snapshotNode\n )\n );\n }\n });\n\n this.generateEventsForType_(\n events,\n Change.CHILD_REMOVED,\n changes,\n eventRegistrations,\n eventCache\n );\n this.generateEventsForType_(\n events,\n Change.CHILD_ADDED,\n changes,\n eventRegistrations,\n eventCache\n );\n this.generateEventsForType_(\n events,\n Change.CHILD_MOVED,\n moves,\n eventRegistrations,\n eventCache\n );\n this.generateEventsForType_(\n events,\n Change.CHILD_CHANGED,\n changes,\n eventRegistrations,\n eventCache\n );\n this.generateEventsForType_(\n events,\n Change.VALUE,\n changes,\n eventRegistrations,\n eventCache\n );\n\n return events;\n }\n\n /**\n * Given changes of a single change type, generate the corresponding events.\n *\n * @param {!Array.<!Event>} events\n * @param {!string} eventType\n * @param {!Array.<!Change>} changes\n * @param {!Array.<!EventRegistration>} registrations\n * @param {!Node} eventCache\n * @private\n */\n private generateEventsForType_(\n events: Event[],\n eventType: string,\n changes: Change[],\n registrations: EventRegistration[],\n eventCache: Node\n ) {\n const filteredChanges = changes.filter(change => change.type === eventType);\n\n filteredChanges.sort(this.compareChanges_.bind(this));\n filteredChanges.forEach(change => {\n const materializedChange = this.materializeSingleChange_(\n change,\n eventCache\n );\n registrations.forEach(registration => {\n if (registration.respondsTo(change.type)) {\n events.push(\n registration.createEvent(materializedChange, this.query_)\n );\n }\n });\n });\n }\n\n /**\n * @param {!Change} change\n * @param {!Node} eventCache\n * @return {!Change}\n * @private\n */\n private materializeSingleChange_(change: Change, eventCache: Node): Change {\n if (change.type === 'value' || change.type === 'child_removed') {\n return change;\n } else {\n change.prevName = eventCache.getPredecessorChildName(\n /** @type {!string} */\n change.childName,\n change.snapshotNode,\n this.index_\n );\n return change;\n }\n }\n\n /**\n * @param {!Change} a\n * @param {!Change} b\n * @return {number}\n * @private\n */\n private compareChanges_(a: Change, b: Change) {\n if (a.childName == null || b.childName == null) {\n throw assertionError('Should only compare child_ events.');\n }\n const aWrapped = new NamedNode(a.childName, a.snapshotNode);\n const bWrapped = new NamedNode(b.childName, b.snapshotNode);\n return this.index_.compare(aWrapped, bWrapped);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { IndexedFilter } from './filter/IndexedFilter';\nimport { ViewProcessor } from './ViewProcessor';\nimport { ChildrenNode } from '../snap/ChildrenNode';\nimport { CacheNode } from './CacheNode';\nimport { ViewCache } from './ViewCache';\nimport { EventGenerator } from './EventGenerator';\nimport { assert } from '@firebase/util';\nimport { Operation, OperationType } from '../operation/Operation';\nimport { Change } from './Change';\nimport { PRIORITY_INDEX } from '../snap/indexes/PriorityIndex';\nimport { Query } from '../../api/Query';\nimport { EventRegistration } from './EventRegistration';\nimport { Node } from '../snap/Node';\nimport { Path } from '../util/Path';\nimport { WriteTreeRef } from '../WriteTree';\nimport { CancelEvent, Event } from './Event';\n\n/**\n * A view represents a specific location and query that has 1 or more event registrations.\n *\n * It does several things:\n * - Maintains the list of event registrations for this location/query.\n * - Maintains a cache of the data visible for this location/query.\n * - Applies new operations (via applyOperation), updates the cache, and based on the event\n * registrations returns the set of events to be raised.\n * @constructor\n */\nexport class View {\n private processor_: ViewProcessor;\n private viewCache_: ViewCache;\n private eventRegistrations_: EventRegistration[] = [];\n private eventGenerator_: EventGenerator;\n\n /**\n *\n * @param {!Query} query_\n * @param {!ViewCache} initialViewCache\n */\n constructor(private query_: Query, initialViewCache: ViewCache) {\n const params = this.query_.getQueryParams();\n\n const indexFilter = new IndexedFilter(params.getIndex());\n const filter = params.getNodeFilter();\n\n /**\n * @type {ViewProcessor}\n * @private\n */\n this.processor_ = new ViewProcessor(filter);\n\n const initialServerCache = initialViewCache.getServerCache();\n const initialEventCache = initialViewCache.getEventCache();\n\n // Don't filter server node with other filter than index, wait for tagged listen\n const serverSnap = indexFilter.updateFullNode(\n ChildrenNode.EMPTY_NODE,\n initialServerCache.getNode(),\n null\n );\n const eventSnap = filter.updateFullNode(\n ChildrenNode.EMPTY_NODE,\n initialEventCache.getNode(),\n null\n );\n const newServerCache = new CacheNode(\n serverSnap,\n initialServerCache.isFullyInitialized(),\n indexFilter.filtersNodes()\n );\n const newEventCache = new CacheNode(\n eventSnap,\n initialEventCache.isFullyInitialized(),\n filter.filtersNodes()\n );\n\n /**\n * @type {!ViewCache}\n * @private\n */\n this.viewCache_ = new ViewCache(newEventCache, newServerCache);\n\n /**\n * @type {!EventGenerator}\n * @private\n */\n this.eventGenerator_ = new EventGenerator(this.query_);\n }\n\n /**\n * @return {!Query}\n */\n getQuery(): Query {\n return this.query_;\n }\n\n /**\n * @return {?Node}\n */\n getServerCache(): Node | null {\n return this.viewCache_.getServerCache().getNode();\n }\n\n /**\n * @param {!Path} path\n * @return {?Node}\n */\n getCompleteServerCache(path: Path): Node | null {\n const cache = this.viewCache_.getCompleteServerSnap();\n if (cache) {\n // If this isn't a \"loadsAllData\" view, then cache isn't actually a complete cache and\n // we need to see if it contains the child we're interested in.\n if (\n this.query_.getQueryParams().loadsAllData() ||\n (!path.isEmpty() && !cache.getImmediateChild(path.getFront()).isEmpty())\n ) {\n return cache.getChild(path);\n }\n }\n return null;\n }\n\n /**\n * @return {boolean}\n */\n isEmpty(): boolean {\n return this.eventRegistrations_.length === 0;\n }\n\n /**\n * @param {!EventRegistration} eventRegistration\n */\n addEventRegistration(eventRegistration: EventRegistration) {\n this.eventRegistrations_.push(eventRegistration);\n }\n\n /**\n * @param {?EventRegistration} eventRegistration If null, remove all callbacks.\n * @param {Error=} cancelError If a cancelError is provided, appropriate cancel events will be returned.\n * @return {!Array.<!Event>} Cancel events, if cancelError was provided.\n */\n removeEventRegistration(\n eventRegistration: EventRegistration | null,\n cancelError?: Error\n ): Event[] {\n const cancelEvents: CancelEvent[] = [];\n if (cancelError) {\n assert(\n eventRegistration == null,\n 'A cancel should cancel all event registrations.'\n );\n const path = this.query_.path;\n this.eventRegistrations_.forEach(registration => {\n cancelError /** @type {!Error} */ = cancelError;\n const maybeEvent = registration.createCancelEvent(cancelError, path);\n if (maybeEvent) {\n cancelEvents.push(maybeEvent);\n }\n });\n }\n\n if (eventRegistration) {\n let remaining = [];\n for (let i = 0; i < this.eventRegistrations_.length; ++i) {\n const existing = this.eventRegistrations_[i];\n if (!existing.matches(eventRegistration)) {\n remaining.push(existing);\n } else if (eventRegistration.hasAnyCallback()) {\n // We're removing just this one\n remaining = remaining.concat(this.eventRegistrations_.slice(i + 1));\n break;\n }\n }\n this.eventRegistrations_ = remaining;\n } else {\n this.eventRegistrations_ = [];\n }\n return cancelEvents;\n }\n\n /**\n * Applies the given Operation, updates our cache, and returns the appropriate events.\n *\n * @param {!Operation} operation\n * @param {!WriteTreeRef} writesCache\n * @param {?Node} completeServerCache\n * @return {!Array.<!Event>}\n */\n applyOperation(\n operation: Operation,\n writesCache: WriteTreeRef,\n completeServerCache: Node | null\n ): Event[] {\n if (\n operation.type === OperationType.MERGE &&\n operation.source.queryId !== null\n ) {\n assert(\n this.viewCache_.getCompleteServerSnap(),\n 'We should always have a full cache before handling merges'\n );\n assert(\n this.viewCache_.getCompleteEventSnap(),\n 'Missing event cache, even though we have a server cache'\n );\n }\n\n const oldViewCache = this.viewCache_;\n const result = this.processor_.applyOperation(\n oldViewCache,\n operation,\n writesCache,\n completeServerCache\n );\n this.processor_.assertIndexed(result.viewCache);\n\n assert(\n result.viewCache.getServerCache().isFullyInitialized() ||\n !oldViewCache.getServerCache().isFullyInitialized(),\n 'Once a server snap is complete, it should never go back'\n );\n\n this.viewCache_ = result.viewCache;\n\n return this.generateEventsForChanges_(\n result.changes,\n result.viewCache.getEventCache().getNode(),\n null\n );\n }\n\n /**\n * @param {!EventRegistration} registration\n * @return {!Array.<!Event>}\n */\n getInitialEvents(registration: EventRegistration): Event[] {\n const eventSnap = this.viewCache_.getEventCache();\n const initialChanges: Change[] = [];\n if (!eventSnap.getNode().isLeafNode()) {\n const eventNode = eventSnap.getNode() as ChildrenNode;\n eventNode.forEachChild(PRIORITY_INDEX, (key, childNode) => {\n initialChanges.push(Change.childAddedChange(key, childNode));\n });\n }\n if (eventSnap.isFullyInitialized()) {\n initialChanges.push(Change.valueChange(eventSnap.getNode()));\n }\n return this.generateEventsForChanges_(\n initialChanges,\n eventSnap.getNode(),\n registration\n );\n }\n\n /**\n * @private\n * @param {!Array.<!Change>} changes\n * @param {!Node} eventCache\n * @param {EventRegistration=} eventRegistration\n * @return {!Array.<!Event>}\n */\n generateEventsForChanges_(\n changes: Change[],\n eventCache: Node,\n eventRegistration?: EventRegistration\n ): Event[] {\n const registrations = eventRegistration\n ? [eventRegistration]\n : this.eventRegistrations_;\n return this.eventGenerator_.generateEventsForChanges(\n changes,\n eventCache,\n registrations\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CacheNode } from './view/CacheNode';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { assert } from '@firebase/util';\nimport { ViewCache } from './view/ViewCache';\nimport { View } from './view/View';\nimport { Operation } from './operation/Operation';\nimport { WriteTreeRef } from './WriteTree';\nimport { Query } from '../api/Query';\nimport { EventRegistration } from './view/EventRegistration';\nimport { Node } from './snap/Node';\nimport { Path } from './util/Path';\nimport { Event } from './view/Event';\nimport { Reference, ReferenceConstructor } from '../api/Reference';\n\nlet __referenceConstructor: ReferenceConstructor;\n\n/**\n * SyncPoint represents a single location in a SyncTree with 1 or more event registrations, meaning we need to\n * maintain 1 or more Views at this location to cache server data and raise appropriate events for server changes\n * and user writes (set, transaction, update).\n *\n * It's responsible for:\n * - Maintaining the set of 1 or more views necessary at this location (a SyncPoint with 0 views should be removed).\n * - Proxying user / server operations to the views as appropriate (i.e. applyServerOverwrite,\n * applyUserOverwrite, etc.)\n */\nexport class SyncPoint {\n static set __referenceConstructor(val: ReferenceConstructor) {\n assert(\n !__referenceConstructor,\n '__referenceConstructor has already been defined'\n );\n __referenceConstructor = val;\n }\n\n static get __referenceConstructor() {\n assert(__referenceConstructor, 'Reference.ts has not been loaded');\n return __referenceConstructor;\n }\n\n /**\n * The Views being tracked at this location in the tree, stored as a map where the key is a\n * queryId and the value is the View for that query.\n *\n * NOTE: This list will be quite small (usually 1, but perhaps 2 or 3; any more is an odd use case).\n */\n private readonly views: Map<string, View> = new Map();\n\n isEmpty(): boolean {\n return this.views.size === 0;\n }\n\n applyOperation(\n operation: Operation,\n writesCache: WriteTreeRef,\n optCompleteServerCache: Node | null\n ): Event[] {\n const queryId = operation.source.queryId;\n if (queryId !== null) {\n const view = this.views.get(queryId);\n assert(view != null, 'SyncTree gave us an op for an invalid query.');\n return view.applyOperation(\n operation,\n writesCache,\n optCompleteServerCache\n );\n } else {\n let events: Event[] = [];\n\n for (const view of this.views.values()) {\n events = events.concat(\n view.applyOperation(operation, writesCache, optCompleteServerCache)\n );\n }\n\n return events;\n }\n }\n\n /**\n * Add an event callback for the specified query.\n *\n * @param {!Query} query\n * @param {!EventRegistration} eventRegistration\n * @param {!WriteTreeRef} writesCache\n * @param {?Node} serverCache Complete server cache, if we have it.\n * @param {boolean} serverCacheComplete\n * @return {!Array.<!Event>} Events to raise.\n */\n addEventRegistration(\n query: Query,\n eventRegistration: EventRegistration,\n writesCache: WriteTreeRef,\n serverCache: Node | null,\n serverCacheComplete: boolean\n ): Event[] {\n const queryId = query.queryIdentifier();\n let view = this.views.get(queryId);\n if (!view) {\n // TODO: make writesCache take flag for complete server node\n let eventCache = writesCache.calcCompleteEventCache(\n serverCacheComplete ? serverCache : null\n );\n let eventCacheComplete = false;\n if (eventCache) {\n eventCacheComplete = true;\n } else if (serverCache instanceof ChildrenNode) {\n eventCache = writesCache.calcCompleteEventChildren(serverCache);\n eventCacheComplete = false;\n } else {\n eventCache = ChildrenNode.EMPTY_NODE;\n eventCacheComplete = false;\n }\n const viewCache = new ViewCache(\n new CacheNode(\n /** @type {!Node} */ eventCache,\n eventCacheComplete,\n false\n ),\n new CacheNode(\n /** @type {!Node} */ serverCache,\n serverCacheComplete,\n false\n )\n );\n view = new View(query, viewCache);\n this.views.set(queryId, view);\n }\n\n // This is guaranteed to exist now, we just created anything that was missing\n view.addEventRegistration(eventRegistration);\n return view.getInitialEvents(eventRegistration);\n }\n\n /**\n * Remove event callback(s). Return cancelEvents if a cancelError is specified.\n *\n * If query is the default query, we'll check all views for the specified eventRegistration.\n * If eventRegistration is null, we'll remove all callbacks for the specified view(s).\n *\n * @param {!Query} query\n * @param {?EventRegistration} eventRegistration If null, remove all callbacks.\n * @param {Error=} cancelError If a cancelError is provided, appropriate cancel events will be returned.\n * @return {{removed:!Array.<!Query>, events:!Array.<!Event>}} removed queries and any cancel events\n */\n removeEventRegistration(\n query: Query,\n eventRegistration: EventRegistration | null,\n cancelError?: Error\n ): { removed: Query[]; events: Event[] } {\n const queryId = query.queryIdentifier();\n const removed: Query[] = [];\n let cancelEvents: Event[] = [];\n const hadCompleteView = this.hasCompleteView();\n if (queryId === 'default') {\n // When you do ref.off(...), we search all views for the registration to remove.\n for (const [viewQueryId, view] of this.views.entries()) {\n cancelEvents = cancelEvents.concat(\n view.removeEventRegistration(eventRegistration, cancelError)\n );\n if (view.isEmpty()) {\n this.views.delete(viewQueryId);\n\n // We'll deal with complete views later.\n if (\n !view\n .getQuery()\n .getQueryParams()\n .loadsAllData()\n ) {\n removed.push(view.getQuery());\n }\n }\n }\n } else {\n // remove the callback from the specific view.\n const view = this.views.get(queryId);\n if (view) {\n cancelEvents = cancelEvents.concat(\n view.removeEventRegistration(eventRegistration, cancelError)\n );\n if (view.isEmpty()) {\n this.views.delete(queryId);\n\n // We'll deal with complete views later.\n if (\n !view\n .getQuery()\n .getQueryParams()\n .loadsAllData()\n ) {\n removed.push(view.getQuery());\n }\n }\n }\n }\n\n if (hadCompleteView && !this.hasCompleteView()) {\n // We removed our last complete view.\n removed.push(\n new SyncPoint.__referenceConstructor(query.repo, query.path)\n );\n }\n\n return { removed, events: cancelEvents };\n }\n\n getQueryViews(): View[] {\n const result = [];\n for (const view of this.views.values()) {\n if (\n !view\n .getQuery()\n .getQueryParams()\n .loadsAllData()\n ) {\n result.push(view);\n }\n }\n return result;\n }\n\n /**\n * @param path The path to the desired complete snapshot\n * @return A complete cache, if it exists\n */\n getCompleteServerCache(path: Path): Node | null {\n let serverCache: Node | null = null;\n for (const view of this.views.values()) {\n serverCache = serverCache || view.getCompleteServerCache(path);\n }\n return serverCache;\n }\n\n viewForQuery(query: Query): View | null {\n const params = query.getQueryParams();\n if (params.loadsAllData()) {\n return this.getCompleteView();\n } else {\n const queryId = query.queryIdentifier();\n return this.views.get(queryId);\n }\n }\n\n viewExistsForQuery(query: Query): boolean {\n return this.viewForQuery(query) != null;\n }\n\n hasCompleteView(): boolean {\n return this.getCompleteView() != null;\n }\n\n getCompleteView(): View | null {\n for (const view of this.views.values()) {\n if (\n view\n .getQuery()\n .getQueryParams()\n .loadsAllData()\n ) {\n return view;\n }\n }\n return null;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ImmutableTree } from './util/ImmutableTree';\nimport { Path } from './util/Path';\nimport { Node, NamedNode } from './snap/Node';\nimport { PRIORITY_INDEX } from './snap/indexes/PriorityIndex';\nimport { assert } from '@firebase/util';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { each } from './util/util';\n\n/**\n * This class holds a collection of writes that can be applied to nodes in unison. It abstracts away the logic with\n * dealing with priority writes and multiple nested writes. At any given path there is only allowed to be one write\n * modifying that path. Any write to an existing path or shadowing an existing path will modify that existing write\n * to reflect the write added.\n */\nexport class CompoundWrite {\n constructor(private writeTree_: ImmutableTree<Node>) {}\n\n static Empty = new CompoundWrite(new ImmutableTree(null));\n\n addWrite(path: Path, node: Node): CompoundWrite {\n if (path.isEmpty()) {\n return new CompoundWrite(new ImmutableTree(node));\n } else {\n const rootmost = this.writeTree_.findRootMostValueAndPath(path);\n if (rootmost != null) {\n const rootMostPath = rootmost.path;\n let value = rootmost.value;\n const relativePath = Path.relativePath(rootMostPath, path);\n value = value.updateChild(relativePath, node);\n return new CompoundWrite(this.writeTree_.set(rootMostPath, value));\n } else {\n const subtree = new ImmutableTree(node);\n const newWriteTree = this.writeTree_.setTree(path, subtree);\n return new CompoundWrite(newWriteTree);\n }\n }\n }\n\n addWrites(path: Path, updates: { [name: string]: Node }): CompoundWrite {\n let newWrite = this as CompoundWrite;\n each(updates, (childKey: string, node: Node) => {\n newWrite = newWrite.addWrite(path.child(childKey), node);\n });\n return newWrite;\n }\n\n /**\n * Will remove a write at the given path and deeper paths. This will <em>not</em> modify a write at a higher\n * location, which must be removed by calling this method with that path.\n *\n * @param path The path at which a write and all deeper writes should be removed\n * @return {!CompoundWrite} The new CompoundWrite with the removed path\n */\n removeWrite(path: Path): CompoundWrite {\n if (path.isEmpty()) {\n return CompoundWrite.Empty;\n } else {\n const newWriteTree = this.writeTree_.setTree(path, ImmutableTree.Empty);\n return new CompoundWrite(newWriteTree);\n }\n }\n\n /**\n * Returns whether this CompoundWrite will fully overwrite a node at a given location and can therefore be\n * considered \"complete\".\n *\n * @param path The path to check for\n * @return Whether there is a complete write at that path\n */\n hasCompleteWrite(path: Path): boolean {\n return this.getCompleteNode(path) != null;\n }\n\n /**\n * Returns a node for a path if and only if the node is a \"complete\" overwrite at that path. This will not aggregate\n * writes from deeper paths, but will return child nodes from a more shallow path.\n *\n * @param path The path to get a complete write\n * @return The node if complete at that path, or null otherwise.\n */\n getCompleteNode(path: Path): Node | null {\n const rootmost = this.writeTree_.findRootMostValueAndPath(path);\n if (rootmost != null) {\n return this.writeTree_\n .get(rootmost.path)\n .getChild(Path.relativePath(rootmost.path, path));\n } else {\n return null;\n }\n }\n\n /**\n * Returns all children that are guaranteed to be a complete overwrite.\n *\n * @return A list of all complete children.\n */\n getCompleteChildren(): NamedNode[] {\n const children: NamedNode[] = [];\n const node = this.writeTree_.value;\n if (node != null) {\n // If it's a leaf node, it has no children; so nothing to do.\n if (!node.isLeafNode()) {\n (node as ChildrenNode).forEachChild(\n PRIORITY_INDEX,\n (childName, childNode) => {\n children.push(new NamedNode(childName, childNode));\n }\n );\n }\n } else {\n this.writeTree_.children.inorderTraversal((childName, childTree) => {\n if (childTree.value != null) {\n children.push(new NamedNode(childName, childTree.value));\n }\n });\n }\n return children;\n }\n\n childCompoundWrite(path: Path): CompoundWrite {\n if (path.isEmpty()) {\n return this;\n } else {\n const shadowingNode = this.getCompleteNode(path);\n if (shadowingNode != null) {\n return new CompoundWrite(new ImmutableTree(shadowingNode));\n } else {\n return new CompoundWrite(this.writeTree_.subtree(path));\n }\n }\n }\n\n /**\n * Returns true if this CompoundWrite is empty and therefore does not modify any nodes.\n * @return Whether this CompoundWrite is empty\n */\n isEmpty(): boolean {\n return this.writeTree_.isEmpty();\n }\n\n /**\n * Applies this CompoundWrite to a node. The node is returned with all writes from this CompoundWrite applied to the\n * node\n * @param node The node to apply this CompoundWrite to\n * @return The node with all writes applied\n */\n apply(node: Node): Node {\n return applySubtreeWrite(Path.Empty, this.writeTree_, node);\n }\n}\n\nfunction applySubtreeWrite(\n relativePath: Path,\n writeTree: ImmutableTree<Node>,\n node: Node\n): Node {\n if (writeTree.value != null) {\n // Since there a write is always a leaf, we're done here\n return node.updateChild(relativePath, writeTree.value);\n } else {\n let priorityWrite = null;\n writeTree.children.inorderTraversal((childKey, childTree) => {\n if (childKey === '.priority') {\n // Apply priorities at the end so we don't update priorities for either empty nodes or forget\n // to apply priorities to empty nodes that are later filled\n assert(\n childTree.value !== null,\n 'Priority writes must always be leaf nodes'\n );\n priorityWrite = childTree.value;\n } else {\n node = applySubtreeWrite(relativePath.child(childKey), childTree, node);\n }\n });\n // If there was a priority write, we only apply it if the node is not empty\n if (!node.getChild(relativePath).isEmpty() && priorityWrite !== null) {\n node = node.updateChild(relativePath.child('.priority'), priorityWrite);\n }\n return node;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { safeGet, assert, assertionError } from '@firebase/util';\n\nimport { Path } from './util/Path';\nimport { CompoundWrite } from './CompoundWrite';\nimport { PRIORITY_INDEX } from './snap/indexes/PriorityIndex';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { NamedNode, Node } from './snap/Node';\nimport { CacheNode } from './view/CacheNode';\nimport { Index } from './snap/indexes/Index';\nimport { each } from './util/util';\n\n/**\n * Defines a single user-initiated write operation. May be the result of a set(), transaction(), or update() call. In\n * the case of a set() or transaction, snap wil be non-null. In the case of an update(), children will be non-null.\n */\nexport interface WriteRecord {\n writeId: number;\n path: Path;\n snap?: Node | null;\n children?: { [k: string]: Node } | null;\n visible: boolean;\n}\n\n/**\n * WriteTree tracks all pending user-initiated writes and has methods to calculate the result of merging them\n * with underlying server data (to create \"event cache\" data). Pending writes are added with addOverwrite()\n * and addMerge(), and removed with removeWrite().\n *\n * @constructor\n */\nexport class WriteTree {\n /**\n * A tree tracking the result of applying all visible writes. This does not include transactions with\n * applyLocally=false or writes that are completely shadowed by other writes.\n *\n * @type {!CompoundWrite}\n * @private\n */\n private visibleWrites_: CompoundWrite = CompoundWrite.Empty;\n\n /**\n * A list of all pending writes, regardless of visibility and shadowed-ness. Used to calculate arbitrary\n * sets of the changed data, such as hidden writes (from transactions) or changes with certain writes excluded (also\n * used by transactions).\n *\n * @type {!Array.<!WriteRecord>}\n * @private\n */\n private allWrites_: WriteRecord[] = [];\n\n private lastWriteId_ = -1;\n\n /**\n * Create a new WriteTreeRef for the given path. For use with a new sync point at the given path.\n *\n * @param {!Path} path\n * @return {!WriteTreeRef}\n */\n childWrites(path: Path): WriteTreeRef {\n return new WriteTreeRef(path, this);\n }\n\n /**\n * Record a new overwrite from user code.\n *\n * @param {!Path} path\n * @param {!Node} snap\n * @param {!number} writeId\n * @param {boolean=} visible This is set to false by some transactions. It should be excluded from event caches\n */\n addOverwrite(path: Path, snap: Node, writeId: number, visible?: boolean) {\n assert(\n writeId > this.lastWriteId_,\n 'Stacking an older write on top of newer ones'\n );\n if (visible === undefined) {\n visible = true;\n }\n this.allWrites_.push({\n path,\n snap,\n writeId,\n visible\n });\n\n if (visible) {\n this.visibleWrites_ = this.visibleWrites_.addWrite(path, snap);\n }\n this.lastWriteId_ = writeId;\n }\n\n /**\n * Record a new merge from user code.\n *\n * @param {!Path} path\n * @param {!Object.<string, !Node>} changedChildren\n * @param {!number} writeId\n */\n addMerge(\n path: Path,\n changedChildren: { [k: string]: Node },\n writeId: number\n ) {\n assert(\n writeId > this.lastWriteId_,\n 'Stacking an older merge on top of newer ones'\n );\n this.allWrites_.push({\n path,\n children: changedChildren,\n writeId,\n visible: true\n });\n\n this.visibleWrites_ = this.visibleWrites_.addWrites(path, changedChildren);\n this.lastWriteId_ = writeId;\n }\n\n /**\n * @param {!number} writeId\n * @return {?WriteRecord}\n */\n getWrite(writeId: number): WriteRecord | null {\n for (let i = 0; i < this.allWrites_.length; i++) {\n const record = this.allWrites_[i];\n if (record.writeId === writeId) {\n return record;\n }\n }\n return null;\n }\n\n /**\n * Remove a write (either an overwrite or merge) that has been successfully acknowledge by the server. Recalculates\n * the tree if necessary. We return true if it may have been visible, meaning views need to reevaluate.\n *\n * @param {!number} writeId\n * @return {boolean} true if the write may have been visible (meaning we'll need to reevaluate / raise\n * events as a result).\n */\n removeWrite(writeId: number): boolean {\n // Note: disabling this check. It could be a transaction that preempted another transaction, and thus was applied\n // out of order.\n //const validClear = revert || this.allWrites_.length === 0 || writeId <= this.allWrites_[0].writeId;\n //assert(validClear, \"Either we don't have this write, or it's the first one in the queue\");\n\n const idx = this.allWrites_.findIndex(s => {\n return s.writeId === writeId;\n });\n assert(idx >= 0, 'removeWrite called with nonexistent writeId.');\n const writeToRemove = this.allWrites_[idx];\n this.allWrites_.splice(idx, 1);\n\n let removedWriteWasVisible = writeToRemove.visible;\n let removedWriteOverlapsWithOtherWrites = false;\n\n let i = this.allWrites_.length - 1;\n\n while (removedWriteWasVisible && i >= 0) {\n const currentWrite = this.allWrites_[i];\n if (currentWrite.visible) {\n if (\n i >= idx &&\n this.recordContainsPath_(currentWrite, writeToRemove.path)\n ) {\n // The removed write was completely shadowed by a subsequent write.\n removedWriteWasVisible = false;\n } else if (writeToRemove.path.contains(currentWrite.path)) {\n // Either we're covering some writes or they're covering part of us (depending on which came first).\n removedWriteOverlapsWithOtherWrites = true;\n }\n }\n i--;\n }\n\n if (!removedWriteWasVisible) {\n return false;\n } else if (removedWriteOverlapsWithOtherWrites) {\n // There's some shadowing going on. Just rebuild the visible writes from scratch.\n this.resetTree_();\n return true;\n } else {\n // There's no shadowing. We can safely just remove the write(s) from visibleWrites.\n if (writeToRemove.snap) {\n this.visibleWrites_ = this.visibleWrites_.removeWrite(\n writeToRemove.path\n );\n } else {\n const children = writeToRemove.children;\n each(children, (childName: string) => {\n this.visibleWrites_ = this.visibleWrites_.removeWrite(\n writeToRemove.path.child(childName)\n );\n });\n }\n return true;\n }\n }\n\n /**\n * Return a complete snapshot for the given path if there's visible write data at that path, else null.\n * No server data is considered.\n *\n * @param {!Path} path\n * @return {?Node}\n */\n getCompleteWriteData(path: Path): Node | null {\n return this.visibleWrites_.getCompleteNode(path);\n }\n\n /**\n * Given optional, underlying server data, and an optional set of constraints (exclude some sets, include hidden\n * writes), attempt to calculate a complete snapshot for the given path\n *\n * @param {!Path} treePath\n * @param {?Node} completeServerCache\n * @param {Array.<number>=} writeIdsToExclude An optional set to be excluded\n * @param {boolean=} includeHiddenWrites Defaults to false, whether or not to layer on writes with visible set to false\n * @return {?Node}\n */\n calcCompleteEventCache(\n treePath: Path,\n completeServerCache: Node | null,\n writeIdsToExclude?: number[],\n includeHiddenWrites?: boolean\n ): Node | null {\n if (!writeIdsToExclude && !includeHiddenWrites) {\n const shadowingNode = this.visibleWrites_.getCompleteNode(treePath);\n if (shadowingNode != null) {\n return shadowingNode;\n } else {\n const subMerge = this.visibleWrites_.childCompoundWrite(treePath);\n if (subMerge.isEmpty()) {\n return completeServerCache;\n } else if (\n completeServerCache == null &&\n !subMerge.hasCompleteWrite(Path.Empty)\n ) {\n // We wouldn't have a complete snapshot, since there's no underlying data and no complete shadow\n return null;\n } else {\n const layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\n return subMerge.apply(layeredCache);\n }\n }\n } else {\n const merge = this.visibleWrites_.childCompoundWrite(treePath);\n if (!includeHiddenWrites && merge.isEmpty()) {\n return completeServerCache;\n } else {\n // If the server cache is null, and we don't have a complete cache, we need to return null\n if (\n !includeHiddenWrites &&\n completeServerCache == null &&\n !merge.hasCompleteWrite(Path.Empty)\n ) {\n return null;\n } else {\n const filter = function(write: WriteRecord) {\n return (\n (write.visible || includeHiddenWrites) &&\n (!writeIdsToExclude ||\n !~writeIdsToExclude.indexOf(write.writeId)) &&\n (write.path.contains(treePath) || treePath.contains(write.path))\n );\n };\n const mergeAtPath = WriteTree.layerTree_(\n this.allWrites_,\n filter,\n treePath\n );\n const layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\n return mergeAtPath.apply(layeredCache);\n }\n }\n }\n }\n\n /**\n * With optional, underlying server data, attempt to return a children node of children that we have complete data for.\n * Used when creating new views, to pre-fill their complete event children snapshot.\n *\n * @param {!Path} treePath\n * @param {?ChildrenNode} completeServerChildren\n * @return {!ChildrenNode}\n */\n calcCompleteEventChildren(\n treePath: Path,\n completeServerChildren: ChildrenNode | null\n ) {\n let completeChildren = ChildrenNode.EMPTY_NODE as Node;\n const topLevelSet = this.visibleWrites_.getCompleteNode(treePath);\n if (topLevelSet) {\n if (!topLevelSet.isLeafNode()) {\n // we're shadowing everything. Return the children.\n topLevelSet.forEachChild(PRIORITY_INDEX, (childName, childSnap) => {\n completeChildren = completeChildren.updateImmediateChild(\n childName,\n childSnap\n );\n });\n }\n return completeChildren;\n } else if (completeServerChildren) {\n // Layer any children we have on top of this\n // We know we don't have a top-level set, so just enumerate existing children\n const merge = this.visibleWrites_.childCompoundWrite(treePath);\n completeServerChildren.forEachChild(\n PRIORITY_INDEX,\n (childName, childNode) => {\n const node = merge\n .childCompoundWrite(new Path(childName))\n .apply(childNode);\n completeChildren = completeChildren.updateImmediateChild(\n childName,\n node\n );\n }\n );\n // Add any complete children we have from the set\n merge.getCompleteChildren().forEach(namedNode => {\n completeChildren = completeChildren.updateImmediateChild(\n namedNode.name,\n namedNode.node\n );\n });\n return completeChildren;\n } else {\n // We don't have anything to layer on top of. Layer on any children we have\n // Note that we can return an empty snap if we have a defined delete\n const merge = this.visibleWrites_.childCompoundWrite(treePath);\n merge.getCompleteChildren().forEach(namedNode => {\n completeChildren = completeChildren.updateImmediateChild(\n namedNode.name,\n namedNode.node\n );\n });\n return completeChildren;\n }\n }\n\n /**\n * Given that the underlying server data has updated, determine what, if anything, needs to be\n * applied to the event cache.\n *\n * Possibilities:\n *\n * 1. No writes are shadowing. Events should be raised, the snap to be applied comes from the server data\n *\n * 2. Some write is completely shadowing. No events to be raised\n *\n * 3. Is partially shadowed. Events\n *\n * Either existingEventSnap or existingServerSnap must exist\n *\n * @param {!Path} treePath\n * @param {!Path} childPath\n * @param {?Node} existingEventSnap\n * @param {?Node} existingServerSnap\n * @return {?Node}\n */\n calcEventCacheAfterServerOverwrite(\n treePath: Path,\n childPath: Path,\n existingEventSnap: Node | null,\n existingServerSnap: Node | null\n ): Node | null {\n assert(\n existingEventSnap || existingServerSnap,\n 'Either existingEventSnap or existingServerSnap must exist'\n );\n const path = treePath.child(childPath);\n if (this.visibleWrites_.hasCompleteWrite(path)) {\n // At this point we can probably guarantee that we're in case 2, meaning no events\n // May need to check visibility while doing the findRootMostValueAndPath call\n return null;\n } else {\n // No complete shadowing. We're either partially shadowing or not shadowing at all.\n const childMerge = this.visibleWrites_.childCompoundWrite(path);\n if (childMerge.isEmpty()) {\n // We're not shadowing at all. Case 1\n return existingServerSnap.getChild(childPath);\n } else {\n // This could be more efficient if the serverNode + updates doesn't change the eventSnap\n // However this is tricky to find out, since user updates don't necessary change the server\n // snap, e.g. priority updates on empty nodes, or deep deletes. Another special case is if the server\n // adds nodes, but doesn't change any existing writes. It is therefore not enough to\n // only check if the updates change the serverNode.\n // Maybe check if the merge tree contains these special cases and only do a full overwrite in that case?\n return childMerge.apply(existingServerSnap.getChild(childPath));\n }\n }\n }\n\n /**\n * Returns a complete child for a given server snap after applying all user writes or null if there is no\n * complete child for this ChildKey.\n *\n * @param {!Path} treePath\n * @param {!string} childKey\n * @param {!CacheNode} existingServerSnap\n * @return {?Node}\n */\n calcCompleteChild(\n treePath: Path,\n childKey: string,\n existingServerSnap: CacheNode\n ): Node | null {\n const path = treePath.child(childKey);\n const shadowingNode = this.visibleWrites_.getCompleteNode(path);\n if (shadowingNode != null) {\n return shadowingNode;\n } else {\n if (existingServerSnap.isCompleteForChild(childKey)) {\n const childMerge = this.visibleWrites_.childCompoundWrite(path);\n return childMerge.apply(\n existingServerSnap.getNode().getImmediateChild(childKey)\n );\n } else {\n return null;\n }\n }\n }\n\n /**\n * Returns a node if there is a complete overwrite for this path. More specifically, if there is a write at\n * a higher path, this will return the child of that write relative to the write and this path.\n * Returns null if there is no write at this path.\n */\n shadowingWrite(path: Path): Node | null {\n return this.visibleWrites_.getCompleteNode(path);\n }\n\n /**\n * This method is used when processing child remove events on a query. If we can, we pull in children that were outside\n * the window, but may now be in the window.\n */\n calcIndexedSlice(\n treePath: Path,\n completeServerData: Node | null,\n startPost: NamedNode,\n count: number,\n reverse: boolean,\n index: Index\n ): NamedNode[] {\n let toIterate: Node;\n const merge = this.visibleWrites_.childCompoundWrite(treePath);\n const shadowingNode = merge.getCompleteNode(Path.Empty);\n if (shadowingNode != null) {\n toIterate = shadowingNode;\n } else if (completeServerData != null) {\n toIterate = merge.apply(completeServerData);\n } else {\n // no children to iterate on\n return [];\n }\n toIterate = toIterate.withIndex(index);\n if (!toIterate.isEmpty() && !toIterate.isLeafNode()) {\n const nodes = [];\n const cmp = index.getCompare();\n const iter = reverse\n ? (toIterate as ChildrenNode).getReverseIteratorFrom(startPost, index)\n : (toIterate as ChildrenNode).getIteratorFrom(startPost, index);\n let next = iter.getNext();\n while (next && nodes.length < count) {\n if (cmp(next, startPost) !== 0) {\n nodes.push(next);\n }\n next = iter.getNext();\n }\n return nodes;\n } else {\n return [];\n }\n }\n\n private recordContainsPath_(writeRecord: WriteRecord, path: Path): boolean {\n if (writeRecord.snap) {\n return writeRecord.path.contains(path);\n } else {\n for (const childName in writeRecord.children) {\n if (\n writeRecord.children.hasOwnProperty(childName) &&\n writeRecord.path.child(childName).contains(path)\n ) {\n return true;\n }\n }\n return false;\n }\n }\n\n /**\n * Re-layer the writes and merges into a tree so we can efficiently calculate event snapshots\n */\n private resetTree_() {\n this.visibleWrites_ = WriteTree.layerTree_(\n this.allWrites_,\n WriteTree.DefaultFilter_,\n Path.Empty\n );\n if (this.allWrites_.length > 0) {\n this.lastWriteId_ = this.allWrites_[this.allWrites_.length - 1].writeId;\n } else {\n this.lastWriteId_ = -1;\n }\n }\n\n /**\n * The default filter used when constructing the tree. Keep everything that's visible.\n */\n private static DefaultFilter_(write: WriteRecord) {\n return write.visible;\n }\n\n /**\n * Static method. Given an array of WriteRecords, a filter for which ones to include, and a path, construct the tree of\n * event data at that path.\n */\n private static layerTree_(\n writes: WriteRecord[],\n filter: (w: WriteRecord) => boolean,\n treeRoot: Path\n ): CompoundWrite {\n let compoundWrite = CompoundWrite.Empty;\n for (let i = 0; i < writes.length; ++i) {\n const write = writes[i];\n // Theory, a later set will either:\n // a) abort a relevant transaction, so no need to worry about excluding it from calculating that transaction\n // b) not be relevant to a transaction (separate branch), so again will not affect the data for that transaction\n if (filter(write)) {\n const writePath = write.path;\n let relativePath;\n if (write.snap) {\n if (treeRoot.contains(writePath)) {\n relativePath = Path.relativePath(treeRoot, writePath);\n compoundWrite = compoundWrite.addWrite(relativePath, write.snap);\n } else if (writePath.contains(treeRoot)) {\n relativePath = Path.relativePath(writePath, treeRoot);\n compoundWrite = compoundWrite.addWrite(\n Path.Empty,\n write.snap.getChild(relativePath)\n );\n } else {\n // There is no overlap between root path and write path, ignore write\n }\n } else if (write.children) {\n if (treeRoot.contains(writePath)) {\n relativePath = Path.relativePath(treeRoot, writePath);\n compoundWrite = compoundWrite.addWrites(\n relativePath,\n write.children\n );\n } else if (writePath.contains(treeRoot)) {\n relativePath = Path.relativePath(writePath, treeRoot);\n if (relativePath.isEmpty()) {\n compoundWrite = compoundWrite.addWrites(\n Path.Empty,\n write.children\n );\n } else {\n const child = safeGet(write.children, relativePath.getFront());\n if (child) {\n // There exists a child in this node that matches the root path\n const deepNode = child.getChild(relativePath.popFront());\n compoundWrite = compoundWrite.addWrite(Path.Empty, deepNode);\n }\n }\n } else {\n // There is no overlap between root path and write path, ignore write\n }\n } else {\n throw assertionError('WriteRecord should have .snap or .children');\n }\n }\n }\n return compoundWrite;\n }\n}\n\n/**\n * A WriteTreeRef wraps a WriteTree and a path, for convenient access to a particular subtree. All of the methods\n * just proxy to the underlying WriteTree.\n *\n * @constructor\n */\nexport class WriteTreeRef {\n /**\n * The path to this particular write tree ref. Used for calling methods on writeTree_ while exposing a simpler\n * interface to callers.\n *\n * @type {!Path}\n * @private\n * @const\n */\n private readonly treePath_: Path;\n\n /**\n * * A reference to the actual tree of write data. All methods are pass-through to the tree, but with the appropriate\n * path prefixed.\n *\n * This lets us make cheap references to points in the tree for sync points without having to copy and maintain all of\n * the data.\n *\n * @type {!WriteTree}\n * @private\n * @const\n */\n private readonly writeTree_: WriteTree;\n\n /**\n * @param {!Path} path\n * @param {!WriteTree} writeTree\n */\n constructor(path: Path, writeTree: WriteTree) {\n this.treePath_ = path;\n this.writeTree_ = writeTree;\n }\n\n /**\n * If possible, returns a complete event cache, using the underlying server data if possible. In addition, can be used\n * to get a cache that includes hidden writes, and excludes arbitrary writes. Note that customizing the returned node\n * can lead to a more expensive calculation.\n *\n * @param {?Node} completeServerCache\n * @param {Array.<number>=} writeIdsToExclude Optional writes to exclude.\n * @param {boolean=} includeHiddenWrites Defaults to false, whether or not to layer on writes with visible set to false\n * @return {?Node}\n */\n calcCompleteEventCache(\n completeServerCache: Node | null,\n writeIdsToExclude?: number[],\n includeHiddenWrites?: boolean\n ): Node | null {\n return this.writeTree_.calcCompleteEventCache(\n this.treePath_,\n completeServerCache,\n writeIdsToExclude,\n includeHiddenWrites\n );\n }\n\n /**\n * If possible, returns a children node containing all of the complete children we have data for. The returned data is a\n * mix of the given server data and write data.\n *\n * @param {?ChildrenNode} completeServerChildren\n * @return {!ChildrenNode}\n */\n calcCompleteEventChildren(\n completeServerChildren: ChildrenNode | null\n ): ChildrenNode {\n return this.writeTree_.calcCompleteEventChildren(\n this.treePath_,\n completeServerChildren\n ) as ChildrenNode;\n }\n\n /**\n * Given that either the underlying server data has updated or the outstanding writes have updated, determine what,\n * if anything, needs to be applied to the event cache.\n *\n * Possibilities:\n *\n * 1. No writes are shadowing. Events should be raised, the snap to be applied comes from the server data\n *\n * 2. Some write is completely shadowing. No events to be raised\n *\n * 3. Is partially shadowed. Events should be raised\n *\n * Either existingEventSnap or existingServerSnap must exist, this is validated via an assert\n *\n * @param {!Path} path\n * @param {?Node} existingEventSnap\n * @param {?Node} existingServerSnap\n * @return {?Node}\n */\n calcEventCacheAfterServerOverwrite(\n path: Path,\n existingEventSnap: Node | null,\n existingServerSnap: Node | null\n ): Node | null {\n return this.writeTree_.calcEventCacheAfterServerOverwrite(\n this.treePath_,\n path,\n existingEventSnap,\n existingServerSnap\n );\n }\n\n /**\n * Returns a node if there is a complete overwrite for this path. More specifically, if there is a write at\n * a higher path, this will return the child of that write relative to the write and this path.\n * Returns null if there is no write at this path.\n *\n * @param {!Path} path\n * @return {?Node}\n */\n shadowingWrite(path: Path): Node | null {\n return this.writeTree_.shadowingWrite(this.treePath_.child(path));\n }\n\n /**\n * This method is used when processing child remove events on a query. If we can, we pull in children that were outside\n * the window, but may now be in the window\n *\n * @param {?Node} completeServerData\n * @param {!NamedNode} startPost\n * @param {!number} count\n * @param {boolean} reverse\n * @param {!Index} index\n * @return {!Array.<!NamedNode>}\n */\n calcIndexedSlice(\n completeServerData: Node | null,\n startPost: NamedNode,\n count: number,\n reverse: boolean,\n index: Index\n ): NamedNode[] {\n return this.writeTree_.calcIndexedSlice(\n this.treePath_,\n completeServerData,\n startPost,\n count,\n reverse,\n index\n );\n }\n\n /**\n * Returns a complete child for a given server snap after applying all user writes or null if there is no\n * complete child for this ChildKey.\n *\n * @param {!string} childKey\n * @param {!CacheNode} existingServerCache\n * @return {?Node}\n */\n calcCompleteChild(\n childKey: string,\n existingServerCache: CacheNode\n ): Node | null {\n return this.writeTree_.calcCompleteChild(\n this.treePath_,\n childKey,\n existingServerCache\n );\n }\n\n /**\n * Return a WriteTreeRef for a child.\n *\n * @param {string} childName\n * @return {!WriteTreeRef}\n */\n child(childName: string): WriteTreeRef {\n return new WriteTreeRef(this.treePath_.child(childName), this.writeTree_);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\nimport { errorForServerCode, each } from './util/util';\nimport { AckUserWrite } from './operation/AckUserWrite';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { ImmutableTree } from './util/ImmutableTree';\nimport { ListenComplete } from './operation/ListenComplete';\nimport { Merge } from './operation/Merge';\nimport { Operation, OperationSource } from './operation/Operation';\nimport { Overwrite } from './operation/Overwrite';\nimport { Path } from './util/Path';\nimport { SyncPoint } from './SyncPoint';\nimport { WriteTree, WriteTreeRef } from './WriteTree';\nimport { Query } from '../api/Query';\nimport { Node } from './snap/Node';\nimport { Event } from './view/Event';\nimport { EventRegistration } from './view/EventRegistration';\nimport { View } from './view/View';\n\n/**\n * @typedef {{\n * startListening: function(\n * !Query,\n * ?number,\n * function():string,\n * function(!string, *):!Array.<!Event>\n * ):!Array.<!Event>,\n *\n * stopListening: function(!Query, ?number)\n * }}\n */\nexport interface ListenProvider {\n startListening(\n query: Query,\n tag: number | null,\n hashFn: () => string,\n onComplete: (a: string, b?: unknown) => Event[]\n ): Event[];\n\n stopListening(a: Query, b: number | null): void;\n}\n\n/**\n * SyncTree is the central class for managing event callback registration, data caching, views\n * (query processing), and event generation. There are typically two SyncTree instances for\n * each Repo, one for the normal Firebase data, and one for the .info data.\n *\n * It has a number of responsibilities, including:\n * - Tracking all user event callbacks (registered via addEventRegistration() and removeEventRegistration()).\n * - Applying and caching data changes for user set(), transaction(), and update() calls\n * (applyUserOverwrite(), applyUserMerge()).\n * - Applying and caching data changes for server data changes (applyServerOverwrite(),\n * applyServerMerge()).\n * - Generating user-facing events for server and user changes (all of the apply* methods\n * return the set of events that need to be raised as a result).\n * - Maintaining the appropriate set of server listens to ensure we are always subscribed\n * to the correct set of paths and queries to satisfy the current set of user event\n * callbacks (listens are started/stopped using the provided listenProvider).\n *\n * NOTE: Although SyncTree tracks event callbacks and calculates events to raise, the actual\n * events are returned to the caller rather than raised synchronously.\n *\n * @constructor\n */\nexport class SyncTree {\n /**\n * Tree of SyncPoints. There's a SyncPoint at any location that has 1 or more views.\n */\n private syncPointTree_: ImmutableTree<SyncPoint> = ImmutableTree.Empty;\n\n /**\n * A tree of all pending user writes (user-initiated set()'s, transaction()'s, update()'s, etc.).\n */\n private pendingWriteTree_ = new WriteTree();\n\n private readonly tagToQueryMap: Map<number, string> = new Map();\n private readonly queryToTagMap: Map<string, number> = new Map();\n\n /**\n * @param {!ListenProvider} listenProvider_ Used by SyncTree to start / stop listening\n * to server data.\n */\n constructor(private listenProvider_: ListenProvider) {}\n\n /**\n * Apply the data changes for a user-generated set() or transaction() call.\n *\n * @return Events to raise.\n */\n applyUserOverwrite(\n path: Path,\n newData: Node,\n writeId: number,\n visible?: boolean\n ): Event[] {\n // Record pending write.\n this.pendingWriteTree_.addOverwrite(path, newData, writeId, visible);\n\n if (!visible) {\n return [];\n } else {\n return this.applyOperationToSyncPoints_(\n new Overwrite(OperationSource.User, path, newData)\n );\n }\n }\n\n /**\n * Apply the data from a user-generated update() call\n *\n * @return Events to raise.\n */\n applyUserMerge(\n path: Path,\n changedChildren: { [k: string]: Node },\n writeId: number\n ): Event[] {\n // Record pending merge.\n this.pendingWriteTree_.addMerge(path, changedChildren, writeId);\n\n const changeTree = ImmutableTree.fromObject(changedChildren);\n\n return this.applyOperationToSyncPoints_(\n new Merge(OperationSource.User, path, changeTree)\n );\n }\n\n /**\n * Acknowledge a pending user write that was previously registered with applyUserOverwrite() or applyUserMerge().\n *\n * @param revert True if the given write failed and needs to be reverted\n * @return Events to raise.\n */\n ackUserWrite(writeId: number, revert: boolean = false) {\n const write = this.pendingWriteTree_.getWrite(writeId);\n const needToReevaluate = this.pendingWriteTree_.removeWrite(writeId);\n if (!needToReevaluate) {\n return [];\n } else {\n let affectedTree = ImmutableTree.Empty;\n if (write.snap != null) {\n // overwrite\n affectedTree = affectedTree.set(Path.Empty, true);\n } else {\n each(write.children, (pathString: string, node: Node) => {\n affectedTree = affectedTree.set(new Path(pathString), node);\n });\n }\n return this.applyOperationToSyncPoints_(\n new AckUserWrite(write.path, affectedTree, revert)\n );\n }\n }\n\n /**\n * Apply new server data for the specified path..\n *\n * @return Events to raise.\n */\n applyServerOverwrite(path: Path, newData: Node): Event[] {\n return this.applyOperationToSyncPoints_(\n new Overwrite(OperationSource.Server, path, newData)\n );\n }\n\n /**\n * Apply new server data to be merged in at the specified path.\n *\n * @return Events to raise.\n */\n applyServerMerge(\n path: Path,\n changedChildren: { [k: string]: Node }\n ): Event[] {\n const changeTree = ImmutableTree.fromObject(changedChildren);\n\n return this.applyOperationToSyncPoints_(\n new Merge(OperationSource.Server, path, changeTree)\n );\n }\n\n /**\n * Apply a listen complete for a query\n *\n * @return Events to raise.\n */\n applyListenComplete(path: Path): Event[] {\n return this.applyOperationToSyncPoints_(\n new ListenComplete(OperationSource.Server, path)\n );\n }\n\n /**\n * Apply new server data for the specified tagged query.\n *\n * @return Events to raise.\n */\n applyTaggedQueryOverwrite(path: Path, snap: Node, tag: number): Event[] {\n const queryKey = this.queryKeyForTag_(tag);\n if (queryKey != null) {\n const r = SyncTree.parseQueryKey_(queryKey);\n const queryPath = r.path,\n queryId = r.queryId;\n const relativePath = Path.relativePath(queryPath, path);\n const op = new Overwrite(\n OperationSource.forServerTaggedQuery(queryId),\n relativePath,\n snap\n );\n return this.applyTaggedOperation_(queryPath, op);\n } else {\n // Query must have been removed already\n return [];\n }\n }\n\n /**\n * Apply server data to be merged in for the specified tagged query.\n *\n * @return Events to raise.\n */\n applyTaggedQueryMerge(\n path: Path,\n changedChildren: { [k: string]: Node },\n tag: number\n ): Event[] {\n const queryKey = this.queryKeyForTag_(tag);\n if (queryKey) {\n const r = SyncTree.parseQueryKey_(queryKey);\n const queryPath = r.path,\n queryId = r.queryId;\n const relativePath = Path.relativePath(queryPath, path);\n const changeTree = ImmutableTree.fromObject(changedChildren);\n const op = new Merge(\n OperationSource.forServerTaggedQuery(queryId),\n relativePath,\n changeTree\n );\n return this.applyTaggedOperation_(queryPath, op);\n } else {\n // We've already removed the query. No big deal, ignore the update\n return [];\n }\n }\n\n /**\n * Apply a listen complete for a tagged query\n *\n * @return Events to raise.\n */\n applyTaggedListenComplete(path: Path, tag: number): Event[] {\n const queryKey = this.queryKeyForTag_(tag);\n if (queryKey) {\n const r = SyncTree.parseQueryKey_(queryKey);\n const queryPath = r.path,\n queryId = r.queryId;\n const relativePath = Path.relativePath(queryPath, path);\n const op = new ListenComplete(\n OperationSource.forServerTaggedQuery(queryId),\n relativePath\n );\n return this.applyTaggedOperation_(queryPath, op);\n } else {\n // We've already removed the query. No big deal, ignore the update\n return [];\n }\n }\n\n /**\n * Add an event callback for the specified query.\n *\n * @return Events to raise.\n */\n addEventRegistration(\n query: Query,\n eventRegistration: EventRegistration\n ): Event[] {\n const path = query.path;\n\n let serverCache: Node | null = null;\n let foundAncestorDefaultView = false;\n // Any covering writes will necessarily be at the root, so really all we need to find is the server cache.\n // Consider optimizing this once there's a better understanding of what actual behavior will be.\n this.syncPointTree_.foreachOnPath(path, (pathToSyncPoint, sp) => {\n const relativePath = Path.relativePath(pathToSyncPoint, path);\n serverCache = serverCache || sp.getCompleteServerCache(relativePath);\n foundAncestorDefaultView =\n foundAncestorDefaultView || sp.hasCompleteView();\n });\n let syncPoint = this.syncPointTree_.get(path);\n if (!syncPoint) {\n syncPoint = new SyncPoint();\n this.syncPointTree_ = this.syncPointTree_.set(path, syncPoint);\n } else {\n foundAncestorDefaultView =\n foundAncestorDefaultView || syncPoint.hasCompleteView();\n serverCache = serverCache || syncPoint.getCompleteServerCache(Path.Empty);\n }\n\n let serverCacheComplete;\n if (serverCache != null) {\n serverCacheComplete = true;\n } else {\n serverCacheComplete = false;\n serverCache = ChildrenNode.EMPTY_NODE;\n const subtree = this.syncPointTree_.subtree(path);\n subtree.foreachChild((childName, childSyncPoint) => {\n const completeCache = childSyncPoint.getCompleteServerCache(Path.Empty);\n if (completeCache) {\n serverCache = serverCache.updateImmediateChild(\n childName,\n completeCache\n );\n }\n });\n }\n\n const viewAlreadyExists = syncPoint.viewExistsForQuery(query);\n if (!viewAlreadyExists && !query.getQueryParams().loadsAllData()) {\n // We need to track a tag for this query\n const queryKey = SyncTree.makeQueryKey_(query);\n assert(\n !this.queryToTagMap.has(queryKey),\n 'View does not exist, but we have a tag'\n );\n const tag = SyncTree.getNextQueryTag_();\n this.queryToTagMap.set(queryKey, tag);\n this.tagToQueryMap.set(tag, queryKey);\n }\n const writesCache = this.pendingWriteTree_.childWrites(path);\n let events = syncPoint.addEventRegistration(\n query,\n eventRegistration,\n writesCache,\n serverCache,\n serverCacheComplete\n );\n if (!viewAlreadyExists && !foundAncestorDefaultView) {\n const view /** @type !View */ = syncPoint.viewForQuery(query);\n events = events.concat(this.setupListener_(query, view));\n }\n return events;\n }\n\n /**\n * Remove event callback(s).\n *\n * If query is the default query, we'll check all queries for the specified eventRegistration.\n * If eventRegistration is null, we'll remove all callbacks for the specified query/queries.\n *\n * @param eventRegistration If null, all callbacks are removed.\n * @param cancelError If a cancelError is provided, appropriate cancel events will be returned.\n * @return Cancel events, if cancelError was provided.\n */\n removeEventRegistration(\n query: Query,\n eventRegistration: EventRegistration | null,\n cancelError?: Error\n ): Event[] {\n // Find the syncPoint first. Then deal with whether or not it has matching listeners\n const path = query.path;\n const maybeSyncPoint = this.syncPointTree_.get(path);\n let cancelEvents: Event[] = [];\n // A removal on a default query affects all queries at that location. A removal on an indexed query, even one without\n // other query constraints, does *not* affect all queries at that location. So this check must be for 'default', and\n // not loadsAllData().\n if (\n maybeSyncPoint &&\n (query.queryIdentifier() === 'default' ||\n maybeSyncPoint.viewExistsForQuery(query))\n ) {\n /**\n * @type {{removed: !Array.<!Query>, events: !Array.<!Event>}}\n */\n const removedAndEvents = maybeSyncPoint.removeEventRegistration(\n query,\n eventRegistration,\n cancelError\n );\n if (maybeSyncPoint.isEmpty()) {\n this.syncPointTree_ = this.syncPointTree_.remove(path);\n }\n const removed = removedAndEvents.removed;\n cancelEvents = removedAndEvents.events;\n // We may have just removed one of many listeners and can short-circuit this whole process\n // We may also not have removed a default listener, in which case all of the descendant listeners should already be\n // properly set up.\n //\n // Since indexed queries can shadow if they don't have other query constraints, check for loadsAllData(), instead of\n // queryId === 'default'\n const removingDefault =\n -1 !==\n removed.findIndex(query => {\n return query.getQueryParams().loadsAllData();\n });\n const covered = this.syncPointTree_.findOnPath(\n path,\n (relativePath, parentSyncPoint) => {\n return parentSyncPoint.hasCompleteView();\n }\n );\n\n if (removingDefault && !covered) {\n const subtree = this.syncPointTree_.subtree(path);\n // There are potentially child listeners. Determine what if any listens we need to send before executing the\n // removal\n if (!subtree.isEmpty()) {\n // We need to fold over our subtree and collect the listeners to send\n const newViews = this.collectDistinctViewsForSubTree_(subtree);\n\n // Ok, we've collected all the listens we need. Set them up.\n for (let i = 0; i < newViews.length; ++i) {\n const view = newViews[i],\n newQuery = view.getQuery();\n const listener = this.createListenerForView_(view);\n this.listenProvider_.startListening(\n SyncTree.queryForListening_(newQuery),\n this.tagForQuery_(newQuery),\n listener.hashFn,\n listener.onComplete\n );\n }\n } else {\n // There's nothing below us, so nothing we need to start listening on\n }\n }\n // If we removed anything and we're not covered by a higher up listen, we need to stop listening on this query\n // The above block has us covered in terms of making sure we're set up on listens lower in the tree.\n // Also, note that if we have a cancelError, it's already been removed at the provider level.\n if (!covered && removed.length > 0 && !cancelError) {\n // If we removed a default, then we weren't listening on any of the other queries here. Just cancel the one\n // default. Otherwise, we need to iterate through and cancel each individual query\n if (removingDefault) {\n // We don't tag default listeners\n const defaultTag: number | null = null;\n this.listenProvider_.stopListening(\n SyncTree.queryForListening_(query),\n defaultTag\n );\n } else {\n removed.forEach((queryToRemove: Query) => {\n const tagToRemove = this.queryToTagMap.get(\n SyncTree.makeQueryKey_(queryToRemove)\n );\n this.listenProvider_.stopListening(\n SyncTree.queryForListening_(queryToRemove),\n tagToRemove\n );\n });\n }\n }\n // Now, clear all of the tags we're tracking for the removed listens\n this.removeTags_(removed);\n } else {\n // No-op, this listener must've been already removed\n }\n return cancelEvents;\n }\n\n /**\n * Returns a complete cache, if we have one, of the data at a particular path. If the location does not have a\n * listener above it, we will get a false \"null\". This shouldn't be a problem because transactions will always\n * have a listener above, and atomic operations would correctly show a jitter of <increment value> ->\n * <incremented total> as the write is applied locally and then acknowledged at the server.\n *\n * Note: this method will *include* hidden writes from transaction with applyLocally set to false.\n *\n * @param path The path to the data we want\n * @param writeIdsToExclude A specific set to be excluded\n */\n calcCompleteEventCache(path: Path, writeIdsToExclude?: number[]): Node {\n const includeHiddenSets = true;\n const writeTree = this.pendingWriteTree_;\n const serverCache = this.syncPointTree_.findOnPath(\n path,\n (pathSoFar, syncPoint) => {\n const relativePath = Path.relativePath(pathSoFar, path);\n const serverCache = syncPoint.getCompleteServerCache(relativePath);\n if (serverCache) {\n return serverCache;\n }\n }\n );\n return writeTree.calcCompleteEventCache(\n path,\n serverCache,\n writeIdsToExclude,\n includeHiddenSets\n );\n }\n\n /**\n * This collapses multiple unfiltered views into a single view, since we only need a single\n * listener for them.\n */\n private collectDistinctViewsForSubTree_(\n subtree: ImmutableTree<SyncPoint>\n ): View[] {\n return subtree.fold<View[]>(\n (relativePath, maybeChildSyncPoint, childMap) => {\n if (maybeChildSyncPoint && maybeChildSyncPoint.hasCompleteView()) {\n const completeView = maybeChildSyncPoint.getCompleteView();\n return [completeView];\n } else {\n // No complete view here, flatten any deeper listens into an array\n let views: View[] = [];\n if (maybeChildSyncPoint) {\n views = maybeChildSyncPoint.getQueryViews();\n }\n each(childMap, (_key: string, childViews: View[]) => {\n views = views.concat(childViews);\n });\n return views;\n }\n }\n );\n }\n\n private removeTags_(queries: Query[]) {\n for (let j = 0; j < queries.length; ++j) {\n const removedQuery = queries[j];\n if (!removedQuery.getQueryParams().loadsAllData()) {\n // We should have a tag for this\n const removedQueryKey = SyncTree.makeQueryKey_(removedQuery);\n const removedQueryTag = this.queryToTagMap.get(removedQueryKey);\n this.queryToTagMap.delete(removedQueryKey);\n this.tagToQueryMap.delete(removedQueryTag);\n }\n }\n }\n\n /**\n * Normalizes a query to a query we send the server for listening\n *\n * @return The normalized query\n */\n private static queryForListening_(query: Query): Query {\n if (\n query.getQueryParams().loadsAllData() &&\n !query.getQueryParams().isDefault()\n ) {\n // We treat queries that load all data as default queries\n // Cast is necessary because ref() technically returns Firebase which is actually fb.api.Firebase which inherits\n // from Query\n return query.getRef()!;\n } else {\n return query;\n }\n }\n\n /**\n * For a given new listen, manage the de-duplication of outstanding subscriptions.\n *\n * @return This method can return events to support synchronous data sources\n */\n private setupListener_(query: Query, view: View): Event[] {\n const path = query.path;\n const tag = this.tagForQuery_(query);\n const listener = this.createListenerForView_(view);\n\n const events = this.listenProvider_.startListening(\n SyncTree.queryForListening_(query),\n tag,\n listener.hashFn,\n listener.onComplete\n );\n\n const subtree = this.syncPointTree_.subtree(path);\n // The root of this subtree has our query. We're here because we definitely need to send a listen for that, but we\n // may need to shadow other listens as well.\n if (tag) {\n assert(\n !subtree.value.hasCompleteView(),\n \"If we're adding a query, it shouldn't be shadowed\"\n );\n } else {\n // Shadow everything at or below this location, this is a default listener.\n const queriesToStop = subtree.fold<Query[]>(\n (relativePath, maybeChildSyncPoint, childMap) => {\n if (\n !relativePath.isEmpty() &&\n maybeChildSyncPoint &&\n maybeChildSyncPoint.hasCompleteView()\n ) {\n return [maybeChildSyncPoint.getCompleteView().getQuery()];\n } else {\n // No default listener here, flatten any deeper queries into an array\n let queries: Query[] = [];\n if (maybeChildSyncPoint) {\n queries = queries.concat(\n maybeChildSyncPoint.getQueryViews().map(view => view.getQuery())\n );\n }\n each(childMap, (_key: string, childQueries: Query[]) => {\n queries = queries.concat(childQueries);\n });\n return queries;\n }\n }\n );\n for (let i = 0; i < queriesToStop.length; ++i) {\n const queryToStop = queriesToStop[i];\n this.listenProvider_.stopListening(\n SyncTree.queryForListening_(queryToStop),\n this.tagForQuery_(queryToStop)\n );\n }\n }\n return events;\n }\n\n private createListenerForView_(\n view: View\n ): { hashFn(): string; onComplete(a: string, b?: unknown): Event[] } {\n const query = view.getQuery();\n const tag = this.tagForQuery_(query);\n\n return {\n hashFn: () => {\n const cache = view.getServerCache() || ChildrenNode.EMPTY_NODE;\n return cache.hash();\n },\n onComplete: (status: string): Event[] => {\n if (status === 'ok') {\n if (tag) {\n return this.applyTaggedListenComplete(query.path, tag);\n } else {\n return this.applyListenComplete(query.path);\n }\n } else {\n // If a listen failed, kill all of the listeners here, not just the one that triggered the error.\n // Note that this may need to be scoped to just this listener if we change permissions on filtered children\n const error = errorForServerCode(status, query);\n return this.removeEventRegistration(\n query,\n /*eventRegistration*/ null,\n error\n );\n }\n }\n };\n }\n\n /**\n * Given a query, computes a \"queryKey\" suitable for use in our queryToTagMap_.\n */\n private static makeQueryKey_(query: Query): string {\n return query.path.toString() + '$' + query.queryIdentifier();\n }\n\n /**\n * Given a queryKey (created by makeQueryKey), parse it back into a path and queryId.\n */\n private static parseQueryKey_(\n queryKey: string\n ): { queryId: string; path: Path } {\n const splitIndex = queryKey.indexOf('$');\n assert(\n splitIndex !== -1 && splitIndex < queryKey.length - 1,\n 'Bad queryKey.'\n );\n return {\n queryId: queryKey.substr(splitIndex + 1),\n path: new Path(queryKey.substr(0, splitIndex))\n };\n }\n\n /**\n * Return the query associated with the given tag, if we have one\n */\n private queryKeyForTag_(tag: number): string | null {\n return this.tagToQueryMap.get(tag);\n }\n\n /**\n * Return the tag associated with the given query.\n */\n private tagForQuery_(query: Query): number | null {\n const queryKey = SyncTree.makeQueryKey_(query);\n return this.queryToTagMap.get(queryKey);\n }\n\n /**\n * Static tracker for next query tag.\n */\n private static nextQueryTag_ = 1;\n\n /**\n * Static accessor for query tags.\n */\n private static getNextQueryTag_(): number {\n return SyncTree.nextQueryTag_++;\n }\n\n /**\n * A helper method to apply tagged operations\n */\n private applyTaggedOperation_(\n queryPath: Path,\n operation: Operation\n ): Event[] {\n const syncPoint = this.syncPointTree_.get(queryPath);\n assert(syncPoint, \"Missing sync point for query tag that we're tracking\");\n const writesCache = this.pendingWriteTree_.childWrites(queryPath);\n return syncPoint.applyOperation(\n operation,\n writesCache,\n /*serverCache=*/ null\n );\n }\n\n /**\n * A helper method that visits all descendant and ancestor SyncPoints, applying the operation.\n *\n * NOTES:\n * - Descendant SyncPoints will be visited first (since we raise events depth-first).\n *\n * - We call applyOperation() on each SyncPoint passing three things:\n * 1. A version of the Operation that has been made relative to the SyncPoint location.\n * 2. A WriteTreeRef of any writes we have cached at the SyncPoint location.\n * 3. A snapshot Node with cached server data, if we have it.\n *\n * - We concatenate all of the events returned by each SyncPoint and return the result.\n */\n private applyOperationToSyncPoints_(operation: Operation): Event[] {\n return this.applyOperationHelper_(\n operation,\n this.syncPointTree_,\n /*serverCache=*/ null,\n this.pendingWriteTree_.childWrites(Path.Empty)\n );\n }\n\n /**\n * Recursive helper for applyOperationToSyncPoints_\n */\n private applyOperationHelper_(\n operation: Operation,\n syncPointTree: ImmutableTree<SyncPoint>,\n serverCache: Node | null,\n writesCache: WriteTreeRef\n ): Event[] {\n if (operation.path.isEmpty()) {\n return this.applyOperationDescendantsHelper_(\n operation,\n syncPointTree,\n serverCache,\n writesCache\n );\n } else {\n const syncPoint = syncPointTree.get(Path.Empty);\n\n // If we don't have cached server data, see if we can get it from this SyncPoint.\n if (serverCache == null && syncPoint != null) {\n serverCache = syncPoint.getCompleteServerCache(Path.Empty);\n }\n\n let events: Event[] = [];\n const childName = operation.path.getFront();\n const childOperation = operation.operationForChild(childName);\n const childTree = syncPointTree.children.get(childName);\n if (childTree && childOperation) {\n const childServerCache = serverCache\n ? serverCache.getImmediateChild(childName)\n : null;\n const childWritesCache = writesCache.child(childName);\n events = events.concat(\n this.applyOperationHelper_(\n childOperation,\n childTree,\n childServerCache,\n childWritesCache\n )\n );\n }\n\n if (syncPoint) {\n events = events.concat(\n syncPoint.applyOperation(operation, writesCache, serverCache)\n );\n }\n\n return events;\n }\n }\n\n /**\n * Recursive helper for applyOperationToSyncPoints_\n */\n private applyOperationDescendantsHelper_(\n operation: Operation,\n syncPointTree: ImmutableTree<SyncPoint>,\n serverCache: Node | null,\n writesCache: WriteTreeRef\n ): Event[] {\n const syncPoint = syncPointTree.get(Path.Empty);\n\n // If we don't have cached server data, see if we can get it from this SyncPoint.\n if (serverCache == null && syncPoint != null) {\n serverCache = syncPoint.getCompleteServerCache(Path.Empty);\n }\n\n let events: Event[] = [];\n syncPointTree.children.inorderTraversal((childName, childTree) => {\n const childServerCache = serverCache\n ? serverCache.getImmediateChild(childName)\n : null;\n const childWritesCache = writesCache.child(childName);\n const childOperation = operation.operationForChild(childName);\n if (childOperation) {\n events = events.concat(\n this.applyOperationDescendantsHelper_(\n childOperation,\n childTree,\n childServerCache,\n childWritesCache\n )\n );\n }\n });\n\n if (syncPoint) {\n events = events.concat(\n syncPoint.applyOperation(operation, writesCache, serverCache)\n );\n }\n\n return events;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { Path } from './util/Path';\nimport { Node } from './snap/Node';\n\n/**\n * Mutable object which basically just stores a reference to the \"latest\" immutable snapshot.\n *\n * @constructor\n */\nexport class SnapshotHolder {\n private rootNode_: Node = ChildrenNode.EMPTY_NODE;\n\n getNode(path: Path): Node {\n return this.rootNode_.getChild(path);\n }\n\n updateSnapshot(path: Path, newSnapshotNode: Node) {\n this.rootNode_ = this.rootNode_.updateChild(path, newSnapshotNode);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseAuthTokenData } from '@firebase/app-types/private';\nimport {\n FirebaseAuthInternal,\n FirebaseAuthInternalName\n} from '@firebase/auth-interop-types';\nimport { Provider } from '@firebase/component';\nimport { log, warn } from './util/util';\nimport { FirebaseApp } from '@firebase/app-types';\n\n/**\n * Abstraction around FirebaseApp's token fetching capabilities.\n */\nexport class AuthTokenProvider {\n private auth_: FirebaseAuthInternal | null = null;\n constructor(\n private app_: FirebaseApp,\n private authProvider_: Provider<FirebaseAuthInternalName>\n ) {\n this.auth_ = authProvider_.getImmediate({ optional: true });\n if (!this.auth_) {\n authProvider_.get().then(auth => (this.auth_ = auth));\n }\n }\n\n /**\n * @param {boolean} forceRefresh\n * @return {!Promise<FirebaseAuthTokenData>}\n */\n getToken(forceRefresh: boolean): Promise<FirebaseAuthTokenData> {\n if (!this.auth_) {\n return Promise.resolve(null);\n }\n\n return this.auth_.getToken(forceRefresh).catch(error => {\n // TODO: Need to figure out all the cases this is raised and whether\n // this makes sense.\n if (error && error.code === 'auth/token-not-initialized') {\n log('Got auth/token-not-initialized error. Treating as null token.');\n return null;\n } else {\n return Promise.reject(error);\n }\n });\n }\n\n addTokenChangeListener(listener: (token: string | null) => void) {\n // TODO: We might want to wrap the listener and call it with no args to\n // avoid a leaky abstraction, but that makes removing the listener harder.\n if (this.auth_) {\n this.auth_.addAuthTokenListener(listener);\n } else {\n setTimeout(() => listener(null), 0);\n this.authProvider_\n .get()\n .then(auth => auth.addAuthTokenListener(listener));\n }\n }\n\n removeTokenChangeListener(listener: (token: string | null) => void) {\n this.authProvider_\n .get()\n .then(auth => auth.removeAuthTokenListener(listener));\n }\n\n notifyForInvalidToken() {\n let errorMessage =\n 'Provided authentication credentials for the app named \"' +\n this.app_.name +\n '\" are invalid. This usually indicates your app was not ' +\n 'initialized correctly. ';\n if ('credential' in this.app_.options) {\n errorMessage +=\n 'Make sure the \"credential\" property provided to initializeApp() ' +\n 'is authorized to access the specified \"databaseURL\" and is from the correct ' +\n 'project.';\n } else if ('serviceAccount' in this.app_.options) {\n errorMessage +=\n 'Make sure the \"serviceAccount\" property provided to initializeApp() ' +\n 'is authorized to access the specified \"databaseURL\" and is from the correct ' +\n 'project.';\n } else {\n errorMessage +=\n 'Make sure the \"apiKey\" and \"databaseURL\" properties provided to ' +\n 'initializeApp() match the values provided for your app at ' +\n 'https://console.firebase.google.com/.';\n }\n warn(errorMessage);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { deepCopy, contains } from '@firebase/util';\n\n/**\n * Tracks a collection of stats.\n *\n * @constructor\n */\nexport class StatsCollection {\n private counters_: { [k: string]: number } = {};\n\n incrementCounter(name: string, amount: number = 1) {\n if (!contains(this.counters_, name)) {\n this.counters_[name] = 0;\n }\n\n this.counters_[name] += amount;\n }\n\n get() {\n return deepCopy(this.counters_);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { StatsCollection } from './StatsCollection';\nimport { RepoInfo } from '../RepoInfo';\n\nexport class StatsManager {\n private static collections_: { [k: string]: StatsCollection } = {};\n private static reporters_: { [k: string]: unknown } = {};\n\n static getCollection(repoInfo: RepoInfo): StatsCollection {\n const hashString = repoInfo.toString();\n\n if (!this.collections_[hashString]) {\n this.collections_[hashString] = new StatsCollection();\n }\n\n return this.collections_[hashString];\n }\n\n static getOrCreateReporter<T>(\n repoInfo: RepoInfo,\n creatorFunction: () => T\n ): T {\n const hashString = repoInfo.toString();\n\n if (!this.reporters_[hashString]) {\n this.reporters_[hashString] = creatorFunction();\n }\n\n return this.reporters_[hashString] as T;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { StatsCollection } from './StatsCollection';\nimport { each } from '../util/util';\n\n/**\n * Returns the delta from the previous call to get stats.\n *\n * @param collection_ The collection to \"listen\" to.\n * @constructor\n */\nexport class StatsListener {\n private last_: { [k: string]: number } | null = null;\n\n constructor(private collection_: StatsCollection) {}\n\n get(): { [k: string]: number } {\n const newStats = this.collection_.get();\n\n const delta = { ...newStats };\n if (this.last_) {\n each(this.last_, (stat: string, value: number) => {\n delta[stat] = delta[stat] - value;\n });\n }\n this.last_ = newStats;\n\n return delta;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { contains } from '@firebase/util';\nimport { setTimeoutNonBlocking, each } from '../util/util';\nimport { StatsListener } from './StatsListener';\nimport { StatsCollection } from './StatsCollection';\nimport { ServerActions } from '../ServerActions';\n\n// Assuming some apps may have a short amount of time on page, and a bulk of firebase operations probably\n// happen on page load, we try to report our first set of stats pretty quickly, but we wait at least 10\n// seconds to try to ensure the Firebase connection is established / settled.\nconst FIRST_STATS_MIN_TIME = 10 * 1000;\nconst FIRST_STATS_MAX_TIME = 30 * 1000;\n\n// We'll continue to report stats on average every 5 minutes.\nconst REPORT_STATS_INTERVAL = 5 * 60 * 1000;\n\n/**\n * @constructor\n */\nexport class StatsReporter {\n private statsListener_: StatsListener;\n private statsToReport_: { [k: string]: boolean } = {};\n\n /**\n * @param collection\n * @param server_\n */\n constructor(collection: StatsCollection, private server_: ServerActions) {\n this.statsListener_ = new StatsListener(collection);\n\n const timeout =\n FIRST_STATS_MIN_TIME +\n (FIRST_STATS_MAX_TIME - FIRST_STATS_MIN_TIME) * Math.random();\n setTimeoutNonBlocking(this.reportStats_.bind(this), Math.floor(timeout));\n }\n\n includeStat(stat: string) {\n this.statsToReport_[stat] = true;\n }\n\n private reportStats_() {\n const stats = this.statsListener_.get();\n const reportedStats: typeof stats = {};\n let haveStatsToReport = false;\n\n each(stats, (stat: string, value: number) => {\n if (value > 0 && contains(this.statsToReport_, stat)) {\n reportedStats[stat] = value;\n haveStatsToReport = true;\n }\n });\n\n if (haveStatsToReport) {\n this.server_.reportStats(reportedStats);\n }\n\n // queue our next run.\n setTimeoutNonBlocking(\n this.reportStats_.bind(this),\n Math.floor(Math.random() * 2 * REPORT_STATS_INTERVAL)\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Path } from '../util/Path';\nimport { log, logger, exceptionGuard } from '../util/util';\nimport { Event } from './Event';\n\n/**\n * The event queue serves a few purposes:\n * 1. It ensures we maintain event order in the face of event callbacks doing operations that result in more\n * events being queued.\n * 2. raiseQueuedEvents() handles being called reentrantly nicely. That is, if in the course of raising events,\n * raiseQueuedEvents() is called again, the \"inner\" call will pick up raising events where the \"outer\" call\n * left off, ensuring that the events are still raised synchronously and in order.\n * 3. You can use raiseEventsAtPath and raiseEventsForChangedPath to ensure only relevant previously-queued\n * events are raised synchronously.\n *\n * NOTE: This can all go away if/when we move to async events.\n *\n * @constructor\n */\nexport class EventQueue {\n /**\n * @private\n * @type {!Array.<EventList>}\n */\n private eventLists_: EventList[] = [];\n\n /**\n * Tracks recursion depth of raiseQueuedEvents_, for debugging purposes.\n * @private\n * @type {!number}\n */\n private recursionDepth_ = 0;\n\n /**\n * @param {!Array.<Event>} eventDataList The new events to queue.\n */\n queueEvents(eventDataList: Event[]) {\n // We group events by path, storing them in a single EventList, to make it easier to skip over them quickly.\n let currList = null;\n for (let i = 0; i < eventDataList.length; i++) {\n const eventData = eventDataList[i];\n const eventPath = eventData.getPath();\n if (currList !== null && !eventPath.equals(currList.getPath())) {\n this.eventLists_.push(currList);\n currList = null;\n }\n\n if (currList === null) {\n currList = new EventList(eventPath);\n }\n\n currList.add(eventData);\n }\n if (currList) {\n this.eventLists_.push(currList);\n }\n }\n\n /**\n * Queues the specified events and synchronously raises all events (including previously queued ones)\n * for the specified path.\n *\n * It is assumed that the new events are all for the specified path.\n *\n * @param {!Path} path The path to raise events for.\n * @param {!Array.<Event>} eventDataList The new events to raise.\n */\n raiseEventsAtPath(path: Path, eventDataList: Event[]) {\n this.queueEvents(eventDataList);\n this.raiseQueuedEventsMatchingPredicate_((eventPath: Path) =>\n eventPath.equals(path)\n );\n }\n\n /**\n * Queues the specified events and synchronously raises all events (including previously queued ones) for\n * locations related to the specified change path (i.e. all ancestors and descendants).\n *\n * It is assumed that the new events are all related (ancestor or descendant) to the specified path.\n *\n * @param {!Path} changedPath The path to raise events for.\n * @param {!Array.<!Event>} eventDataList The events to raise\n */\n raiseEventsForChangedPath(changedPath: Path, eventDataList: Event[]) {\n this.queueEvents(eventDataList);\n\n this.raiseQueuedEventsMatchingPredicate_((eventPath: Path) => {\n return eventPath.contains(changedPath) || changedPath.contains(eventPath);\n });\n }\n\n /**\n * @param {!function(!Path):boolean} predicate\n * @private\n */\n private raiseQueuedEventsMatchingPredicate_(\n predicate: (path: Path) => boolean\n ) {\n this.recursionDepth_++;\n\n let sentAll = true;\n for (let i = 0; i < this.eventLists_.length; i++) {\n const eventList = this.eventLists_[i];\n if (eventList) {\n const eventPath = eventList.getPath();\n if (predicate(eventPath)) {\n this.eventLists_[i].raise();\n this.eventLists_[i] = null;\n } else {\n sentAll = false;\n }\n }\n }\n\n if (sentAll) {\n this.eventLists_ = [];\n }\n\n this.recursionDepth_--;\n }\n}\n\n/**\n * @param {!Path} path\n * @constructor\n */\nexport class EventList {\n /**\n * @type {!Array.<Event>}\n * @private\n */\n private events_: Event[] = [];\n\n constructor(private readonly path_: Path) {}\n\n /**\n * @param {!Event} eventData\n */\n add(eventData: Event) {\n this.events_.push(eventData);\n }\n\n /**\n * Iterates through the list and raises each event\n */\n raise() {\n for (let i = 0; i < this.events_.length; i++) {\n const eventData = this.events_[i];\n if (eventData !== null) {\n this.events_[i] = null;\n const eventFn = eventData.getEventRunner();\n if (logger) {\n log('event: ' + eventData.toString());\n }\n exceptionGuard(eventFn);\n }\n }\n }\n\n /**\n * @return {!Path}\n */\n getPath(): Path {\n return this.path_;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\n/**\n * Base class to be used if you want to emit events. Call the constructor with\n * the set of allowed event names.\n */\nexport abstract class EventEmitter {\n private listeners_: {\n [eventType: string]: Array<{\n callback(...args: unknown[]): void;\n context: unknown;\n }>;\n } = {};\n\n /**\n * @param {!Array.<string>} allowedEvents_\n */\n constructor(private allowedEvents_: string[]) {\n assert(\n Array.isArray(allowedEvents_) && allowedEvents_.length > 0,\n 'Requires a non-empty array'\n );\n }\n\n /**\n * To be overridden by derived classes in order to fire an initial event when\n * somebody subscribes for data.\n *\n * @param {!string} eventType\n * @return {Array.<*>} Array of parameters to trigger initial event with.\n */\n abstract getInitialEvent(eventType: string): unknown[];\n\n /**\n * To be called by derived classes to trigger events.\n * @param {!string} eventType\n * @param {...*} varArgs\n */\n protected trigger(eventType: string, ...varArgs: unknown[]) {\n if (Array.isArray(this.listeners_[eventType])) {\n // Clone the list, since callbacks could add/remove listeners.\n const listeners = [...this.listeners_[eventType]];\n\n for (let i = 0; i < listeners.length; i++) {\n listeners[i].callback.apply(listeners[i].context, varArgs);\n }\n }\n }\n\n on(eventType: string, callback: (a: unknown) => void, context: unknown) {\n this.validateEventType_(eventType);\n this.listeners_[eventType] = this.listeners_[eventType] || [];\n this.listeners_[eventType].push({ callback, context });\n\n const eventData = this.getInitialEvent(eventType);\n if (eventData) {\n callback.apply(context, eventData);\n }\n }\n\n off(eventType: string, callback: (a: unknown) => void, context: unknown) {\n this.validateEventType_(eventType);\n const listeners = this.listeners_[eventType] || [];\n for (let i = 0; i < listeners.length; i++) {\n if (\n listeners[i].callback === callback &&\n (!context || context === listeners[i].context)\n ) {\n listeners.splice(i, 1);\n return;\n }\n }\n }\n\n private validateEventType_(eventType: string) {\n assert(\n this.allowedEvents_.find(et => {\n return et === eventType;\n }),\n 'Unknown event: ' + eventType\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { EventEmitter } from './EventEmitter';\nimport { assert } from '@firebase/util';\n\ndeclare const document: Document;\n\n/**\n * @extends {EventEmitter}\n */\nexport class VisibilityMonitor extends EventEmitter {\n private visible_: boolean;\n\n static getInstance() {\n return new VisibilityMonitor();\n }\n\n constructor() {\n super(['visible']);\n let hidden: string;\n let visibilityChange: string;\n if (\n typeof document !== 'undefined' &&\n typeof document.addEventListener !== 'undefined'\n ) {\n if (typeof document['hidden'] !== 'undefined') {\n // Opera 12.10 and Firefox 18 and later support\n visibilityChange = 'visibilitychange';\n hidden = 'hidden';\n } else if (typeof document['mozHidden'] !== 'undefined') {\n visibilityChange = 'mozvisibilitychange';\n hidden = 'mozHidden';\n } else if (typeof document['msHidden'] !== 'undefined') {\n visibilityChange = 'msvisibilitychange';\n hidden = 'msHidden';\n } else if (typeof document['webkitHidden'] !== 'undefined') {\n visibilityChange = 'webkitvisibilitychange';\n hidden = 'webkitHidden';\n }\n }\n\n // Initially, we always assume we are visible. This ensures that in browsers\n // without page visibility support or in cases where we are never visible\n // (e.g. chrome extension), we act as if we are visible, i.e. don't delay\n // reconnects\n this.visible_ = true;\n\n if (visibilityChange) {\n document.addEventListener(\n visibilityChange,\n () => {\n const visible = !document[hidden];\n if (visible !== this.visible_) {\n this.visible_ = visible;\n this.trigger('visible', visible);\n }\n },\n false\n );\n }\n }\n\n /**\n * @param {!string} eventType\n * @return {Array.<boolean>}\n */\n getInitialEvent(eventType: string): boolean[] {\n assert(eventType === 'visible', 'Unknown event type: ' + eventType);\n return [this.visible_];\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, isMobileCordova } from '@firebase/util';\nimport { EventEmitter } from './EventEmitter';\n\n/**\n * Monitors online state (as reported by window.online/offline events).\n *\n * The expectation is that this could have many false positives (thinks we are online\n * when we're not), but no false negatives. So we can safely use it to determine when\n * we definitely cannot reach the internet.\n *\n * @extends {EventEmitter}\n */\nexport class OnlineMonitor extends EventEmitter {\n private online_ = true;\n\n static getInstance() {\n return new OnlineMonitor();\n }\n\n constructor() {\n super(['online']);\n\n // We've had repeated complaints that Cordova apps can get stuck \"offline\", e.g.\n // https://forum.ionicframework.com/t/firebase-connection-is-lost-and-never-come-back/43810\n // It would seem that the 'online' event does not always fire consistently. So we disable it\n // for Cordova.\n if (\n typeof window !== 'undefined' &&\n typeof window.addEventListener !== 'undefined' &&\n !isMobileCordova()\n ) {\n window.addEventListener(\n 'online',\n () => {\n if (!this.online_) {\n this.online_ = true;\n this.trigger('online', true);\n }\n },\n false\n );\n\n window.addEventListener(\n 'offline',\n () => {\n if (this.online_) {\n this.online_ = false;\n this.trigger('online', false);\n }\n },\n false\n );\n }\n }\n\n /**\n * @param {!string} eventType\n * @return {Array.<boolean>}\n */\n getInitialEvent(eventType: string): boolean[] {\n assert(eventType === 'online', 'Unknown event type: ' + eventType);\n return [this.online_];\n }\n\n /**\n * @return {boolean}\n */\n currentlyOnline(): boolean {\n return this.online_;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { exceptionGuard } from '../../core/util/util';\n\n/**\n * This class ensures the packets from the server arrive in order\n * This class takes data from the server and ensures it gets passed into the callbacks in order.\n * @constructor\n */\nexport class PacketReceiver {\n pendingResponses: unknown[] = [];\n currentResponseNum = 0;\n closeAfterResponse = -1;\n onClose: (() => void) | null = null;\n\n /**\n * @param onMessage_\n */\n constructor(private onMessage_: (a: {}) => void) {}\n\n closeAfter(responseNum: number, callback: () => void) {\n this.closeAfterResponse = responseNum;\n this.onClose = callback;\n if (this.closeAfterResponse < this.currentResponseNum) {\n this.onClose();\n this.onClose = null;\n }\n }\n\n /**\n * Each message from the server comes with a response number, and an array of data. The responseNumber\n * allows us to ensure that we process them in the right order, since we can't be guaranteed that all\n * browsers will respond in the same order as the requests we sent\n * @param {number} requestNum\n * @param {Array} data\n */\n handleResponse(requestNum: number, data: unknown[]) {\n this.pendingResponses[requestNum] = data;\n while (this.pendingResponses[this.currentResponseNum]) {\n const toProcess = this.pendingResponses[\n this.currentResponseNum\n ] as unknown[];\n delete this.pendingResponses[this.currentResponseNum];\n for (let i = 0; i < toProcess.length; ++i) {\n if (toProcess[i]) {\n exceptionGuard(() => {\n this.onMessage_(toProcess[i]);\n });\n }\n }\n if (this.currentResponseNum === this.closeAfterResponse) {\n if (this.onClose) {\n this.onClose();\n this.onClose = null;\n }\n break;\n }\n this.currentResponseNum++;\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n executeWhenDOMReady,\n isChromeExtensionContentScript,\n isWindowsStoreApp,\n log,\n logWrapper,\n LUIDGenerator,\n splitStringBySize\n} from '../core/util/util';\nimport { StatsManager } from '../core/stats/StatsManager';\nimport { PacketReceiver } from './polling/PacketReceiver';\nimport {\n FORGE_DOMAIN,\n FORGE_REF,\n LAST_SESSION_PARAM,\n LONG_POLLING,\n PROTOCOL_VERSION,\n REFERER_PARAM,\n TRANSPORT_SESSION_PARAM,\n VERSION_PARAM\n} from './Constants';\nimport { base64Encode, stringify, isNodeSdk } from '@firebase/util';\n\nimport { Transport } from './Transport';\nimport { RepoInfo } from '../core/RepoInfo';\nimport { StatsCollection } from '../core/stats/StatsCollection';\n\n// URL query parameters associated with longpolling\nexport const FIREBASE_LONGPOLL_START_PARAM = 'start';\nexport const FIREBASE_LONGPOLL_CLOSE_COMMAND = 'close';\nexport const FIREBASE_LONGPOLL_COMMAND_CB_NAME = 'pLPCommand';\nexport const FIREBASE_LONGPOLL_DATA_CB_NAME = 'pRTLPCB';\nexport const FIREBASE_LONGPOLL_ID_PARAM = 'id';\nexport const FIREBASE_LONGPOLL_PW_PARAM = 'pw';\nexport const FIREBASE_LONGPOLL_SERIAL_PARAM = 'ser';\nexport const FIREBASE_LONGPOLL_CALLBACK_ID_PARAM = 'cb';\nexport const FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM = 'seg';\nexport const FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET = 'ts';\nexport const FIREBASE_LONGPOLL_DATA_PARAM = 'd';\nexport const FIREBASE_LONGPOLL_DISCONN_FRAME_PARAM = 'disconn';\nexport const FIREBASE_LONGPOLL_DISCONN_FRAME_REQUEST_PARAM = 'dframe';\n\n//Data size constants.\n//TODO: Perf: the maximum length actually differs from browser to browser.\n// We should check what browser we're on and set accordingly.\nconst MAX_URL_DATA_SIZE = 1870;\nconst SEG_HEADER_SIZE = 30; //ie: &seg=8299234&ts=982389123&d=\nconst MAX_PAYLOAD_SIZE = MAX_URL_DATA_SIZE - SEG_HEADER_SIZE;\n\n/**\n * Keepalive period\n * send a fresh request at minimum every 25 seconds. Opera has a maximum request\n * length of 30 seconds that we can't exceed.\n * @const\n * @type {number}\n */\nconst KEEPALIVE_REQUEST_INTERVAL = 25000;\n\n/**\n * How long to wait before aborting a long-polling connection attempt.\n * @const\n * @type {number}\n */\nconst LP_CONNECT_TIMEOUT = 30000;\n\n/**\n * This class manages a single long-polling connection.\n *\n * @constructor\n * @implements {Transport}\n */\nexport class BrowserPollConnection implements Transport {\n bytesSent = 0;\n bytesReceived = 0;\n urlFn: (params: object) => string;\n scriptTagHolder: FirebaseIFrameScriptHolder;\n myDisconnFrame: HTMLIFrameElement;\n curSegmentNum: number;\n myPacketOrderer: PacketReceiver;\n id: string;\n password: string;\n private log_: (...a: unknown[]) => void;\n private stats_: StatsCollection;\n private everConnected_ = false;\n private isClosed_: boolean;\n private connectTimeoutTimer_: number | null;\n private onDisconnect_: ((a?: boolean) => void) | null;\n\n /**\n * @param {string} connId An identifier for this connection, used for logging\n * @param {RepoInfo} repoInfo The info for the endpoint to send data to.\n * @param {string=} transportSessionId Optional transportSessionid if we are reconnecting for an existing\n * transport session\n * @param {string=} lastSessionId Optional lastSessionId if the PersistentConnection has already created a\n * connection previously\n */\n constructor(\n public connId: string,\n public repoInfo: RepoInfo,\n public transportSessionId?: string,\n public lastSessionId?: string\n ) {\n this.log_ = logWrapper(connId);\n this.stats_ = StatsManager.getCollection(repoInfo);\n this.urlFn = (params: { [k: string]: string }) =>\n repoInfo.connectionURL(LONG_POLLING, params);\n }\n\n /**\n *\n * @param {function(Object)} onMessage Callback when messages arrive\n * @param {function()} onDisconnect Callback with connection lost.\n */\n open(onMessage: (msg: {}) => void, onDisconnect: (a?: boolean) => void) {\n this.curSegmentNum = 0;\n this.onDisconnect_ = onDisconnect;\n this.myPacketOrderer = new PacketReceiver(onMessage);\n this.isClosed_ = false;\n\n this.connectTimeoutTimer_ = setTimeout(() => {\n this.log_('Timed out trying to connect.');\n // Make sure we clear the host cache\n this.onClosed_();\n this.connectTimeoutTimer_ = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }, Math.floor(LP_CONNECT_TIMEOUT)) as any;\n\n // Ensure we delay the creation of the iframe until the DOM is loaded.\n executeWhenDOMReady(() => {\n if (this.isClosed_) {\n return;\n }\n\n //Set up a callback that gets triggered once a connection is set up.\n this.scriptTagHolder = new FirebaseIFrameScriptHolder(\n (...args) => {\n const [command, arg1, arg2, arg3, arg4] = args;\n this.incrementIncomingBytes_(args);\n if (!this.scriptTagHolder) {\n return; // we closed the connection.\n }\n\n if (this.connectTimeoutTimer_) {\n clearTimeout(this.connectTimeoutTimer_);\n this.connectTimeoutTimer_ = null;\n }\n this.everConnected_ = true;\n if (command === FIREBASE_LONGPOLL_START_PARAM) {\n this.id = arg1 as string;\n this.password = arg2 as string;\n } else if (command === FIREBASE_LONGPOLL_CLOSE_COMMAND) {\n // Don't clear the host cache. We got a response from the server, so we know it's reachable\n if (arg1) {\n // We aren't expecting any more data (other than what the server's already in the process of sending us\n // through our already open polls), so don't send any more.\n this.scriptTagHolder.sendNewPolls = false;\n\n // arg1 in this case is the last response number sent by the server. We should try to receive\n // all of the responses up to this one before closing\n this.myPacketOrderer.closeAfter(arg1 as number, () => {\n this.onClosed_();\n });\n } else {\n this.onClosed_();\n }\n } else {\n throw new Error('Unrecognized command received: ' + command);\n }\n },\n (...args) => {\n const [pN, data] = args;\n this.incrementIncomingBytes_(args);\n this.myPacketOrderer.handleResponse(pN as number, data as unknown[]);\n },\n () => {\n this.onClosed_();\n },\n this.urlFn\n );\n\n //Send the initial request to connect. The serial number is simply to keep the browser from pulling previous results\n //from cache.\n const urlParams: { [k: string]: string | number } = {};\n urlParams[FIREBASE_LONGPOLL_START_PARAM] = 't';\n urlParams[FIREBASE_LONGPOLL_SERIAL_PARAM] = Math.floor(\n Math.random() * 100000000\n );\n if (this.scriptTagHolder.uniqueCallbackIdentifier) {\n urlParams[\n FIREBASE_LONGPOLL_CALLBACK_ID_PARAM\n ] = this.scriptTagHolder.uniqueCallbackIdentifier;\n }\n urlParams[VERSION_PARAM] = PROTOCOL_VERSION;\n if (this.transportSessionId) {\n urlParams[TRANSPORT_SESSION_PARAM] = this.transportSessionId;\n }\n if (this.lastSessionId) {\n urlParams[LAST_SESSION_PARAM] = this.lastSessionId;\n }\n if (\n typeof location !== 'undefined' &&\n location.href &&\n location.href.indexOf(FORGE_DOMAIN) !== -1\n ) {\n urlParams[REFERER_PARAM] = FORGE_REF;\n }\n const connectURL = this.urlFn(urlParams);\n this.log_('Connecting via long-poll to ' + connectURL);\n this.scriptTagHolder.addTag(connectURL, () => {\n /* do nothing */\n });\n });\n }\n\n /**\n * Call this when a handshake has completed successfully and we want to consider the connection established\n */\n start() {\n this.scriptTagHolder.startLongPoll(this.id, this.password);\n this.addDisconnectPingFrame(this.id, this.password);\n }\n\n private static forceAllow_: boolean;\n\n /**\n * Forces long polling to be considered as a potential transport\n */\n static forceAllow() {\n BrowserPollConnection.forceAllow_ = true;\n }\n\n private static forceDisallow_: boolean;\n\n /**\n * Forces longpolling to not be considered as a potential transport\n */\n static forceDisallow() {\n BrowserPollConnection.forceDisallow_ = true;\n }\n\n // Static method, use string literal so it can be accessed in a generic way\n static isAvailable() {\n if (isNodeSdk()) {\n return false;\n } else if (BrowserPollConnection.forceAllow_) {\n return true;\n } else {\n // NOTE: In React-Native there's normally no 'document', but if you debug a React-Native app in\n // the Chrome debugger, 'document' is defined, but document.createElement is null (2015/06/08).\n return (\n !BrowserPollConnection.forceDisallow_ &&\n typeof document !== 'undefined' &&\n document.createElement != null &&\n !isChromeExtensionContentScript() &&\n !isWindowsStoreApp()\n );\n }\n }\n\n /**\n * No-op for polling\n */\n markConnectionHealthy() {}\n\n /**\n * Stops polling and cleans up the iframe\n * @private\n */\n private shutdown_() {\n this.isClosed_ = true;\n\n if (this.scriptTagHolder) {\n this.scriptTagHolder.close();\n this.scriptTagHolder = null;\n }\n\n //remove the disconnect frame, which will trigger an XHR call to the server to tell it we're leaving.\n if (this.myDisconnFrame) {\n document.body.removeChild(this.myDisconnFrame);\n this.myDisconnFrame = null;\n }\n\n if (this.connectTimeoutTimer_) {\n clearTimeout(this.connectTimeoutTimer_);\n this.connectTimeoutTimer_ = null;\n }\n }\n\n /**\n * Triggered when this transport is closed\n * @private\n */\n private onClosed_() {\n if (!this.isClosed_) {\n this.log_('Longpoll is closing itself');\n this.shutdown_();\n\n if (this.onDisconnect_) {\n this.onDisconnect_(this.everConnected_);\n this.onDisconnect_ = null;\n }\n }\n }\n\n /**\n * External-facing close handler. RealTime has requested we shut down. Kill our connection and tell the server\n * that we've left.\n */\n close() {\n if (!this.isClosed_) {\n this.log_('Longpoll is being closed.');\n this.shutdown_();\n }\n }\n\n /**\n * Send the JSON object down to the server. It will need to be stringified, base64 encoded, and then\n * broken into chunks (since URLs have a small maximum length).\n * @param {!Object} data The JSON data to transmit.\n */\n send(data: {}) {\n const dataStr = stringify(data);\n this.bytesSent += dataStr.length;\n this.stats_.incrementCounter('bytes_sent', dataStr.length);\n\n //first, lets get the base64-encoded data\n const base64data = base64Encode(dataStr);\n\n //We can only fit a certain amount in each URL, so we need to split this request\n //up into multiple pieces if it doesn't fit in one request.\n const dataSegs = splitStringBySize(base64data, MAX_PAYLOAD_SIZE);\n\n //Enqueue each segment for transmission. We assign each chunk a sequential ID and a total number\n //of segments so that we can reassemble the packet on the server.\n for (let i = 0; i < dataSegs.length; i++) {\n this.scriptTagHolder.enqueueSegment(\n this.curSegmentNum,\n dataSegs.length,\n dataSegs[i]\n );\n this.curSegmentNum++;\n }\n }\n\n /**\n * This is how we notify the server that we're leaving.\n * We aren't able to send requests with DHTML on a window close event, but we can\n * trigger XHR requests in some browsers (everything but Opera basically).\n * @param {!string} id\n * @param {!string} pw\n */\n addDisconnectPingFrame(id: string, pw: string) {\n if (isNodeSdk()) {\n return;\n }\n this.myDisconnFrame = document.createElement('iframe');\n const urlParams: { [k: string]: string } = {};\n urlParams[FIREBASE_LONGPOLL_DISCONN_FRAME_REQUEST_PARAM] = 't';\n urlParams[FIREBASE_LONGPOLL_ID_PARAM] = id;\n urlParams[FIREBASE_LONGPOLL_PW_PARAM] = pw;\n this.myDisconnFrame.src = this.urlFn(urlParams);\n this.myDisconnFrame.style.display = 'none';\n\n document.body.appendChild(this.myDisconnFrame);\n }\n\n /**\n * Used to track the bytes received by this client\n * @param {*} args\n * @private\n */\n private incrementIncomingBytes_(args: unknown) {\n // TODO: This is an annoying perf hit just to track the number of incoming bytes. Maybe it should be opt-in.\n const bytesReceived = stringify(args).length;\n this.bytesReceived += bytesReceived;\n this.stats_.incrementCounter('bytes_received', bytesReceived);\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/interface-name-prefix\nexport interface IFrameElement extends HTMLIFrameElement {\n doc: Document;\n}\n\n/*********************************************************************************************\n * A wrapper around an iframe that is used as a long-polling script holder.\n * @constructor\n *********************************************************************************************/\nexport class FirebaseIFrameScriptHolder {\n //We maintain a count of all of the outstanding requests, because if we have too many active at once it can cause\n //problems in some browsers.\n outstandingRequests = new Set<number>();\n\n //A queue of the pending segments waiting for transmission to the server.\n pendingSegs: Array<{ seg: number; ts: number; d: unknown }> = [];\n\n //A serial number. We use this for two things:\n // 1) A way to ensure the browser doesn't cache responses to polls\n // 2) A way to make the server aware when long-polls arrive in a different order than we started them. The\n // server needs to release both polls in this case or it will cause problems in Opera since Opera can only execute\n // JSONP code in the order it was added to the iframe.\n currentSerial = Math.floor(Math.random() * 100000000);\n\n // This gets set to false when we're \"closing down\" the connection (e.g. we're switching transports but there's still\n // incoming data from the server that we're waiting for).\n sendNewPolls = true;\n\n uniqueCallbackIdentifier: number;\n myIFrame: IFrameElement;\n alive: boolean;\n myID: string;\n myPW: string;\n commandCB: (command: string, ...args: unknown[]) => void;\n onMessageCB: (...args: unknown[]) => void;\n\n /**\n * @param commandCB - The callback to be called when control commands are recevied from the server.\n * @param onMessageCB - The callback to be triggered when responses arrive from the server.\n * @param onDisconnect - The callback to be triggered when this tag holder is closed\n * @param urlFn - A function that provides the URL of the endpoint to send data to.\n */\n constructor(\n commandCB: (command: string, ...args: unknown[]) => void,\n onMessageCB: (...args: unknown[]) => void,\n public onDisconnect: () => void,\n public urlFn: (a: object) => string\n ) {\n if (!isNodeSdk()) {\n //Each script holder registers a couple of uniquely named callbacks with the window. These are called from the\n //iframes where we put the long-polling script tags. We have two callbacks:\n // 1) Command Callback - Triggered for control issues, like starting a connection.\n // 2) Message Callback - Triggered when new data arrives.\n this.uniqueCallbackIdentifier = LUIDGenerator();\n window[\n FIREBASE_LONGPOLL_COMMAND_CB_NAME + this.uniqueCallbackIdentifier\n ] = commandCB;\n window[\n FIREBASE_LONGPOLL_DATA_CB_NAME + this.uniqueCallbackIdentifier\n ] = onMessageCB;\n\n //Create an iframe for us to add script tags to.\n this.myIFrame = FirebaseIFrameScriptHolder.createIFrame_();\n\n // Set the iframe's contents.\n let script = '';\n // if we set a javascript url, it's IE and we need to set the document domain. The javascript url is sufficient\n // for ie9, but ie8 needs to do it again in the document itself.\n if (\n this.myIFrame.src &&\n this.myIFrame.src.substr(0, 'javascript:'.length) === 'javascript:'\n ) {\n const currentDomain = document.domain;\n script = '<script>document.domain=\"' + currentDomain + '\";</script>';\n }\n const iframeContents = '<html><body>' + script + '</body></html>';\n try {\n this.myIFrame.doc.open();\n this.myIFrame.doc.write(iframeContents);\n this.myIFrame.doc.close();\n } catch (e) {\n log('frame writing exception');\n if (e.stack) {\n log(e.stack);\n }\n log(e);\n }\n } else {\n this.commandCB = commandCB;\n this.onMessageCB = onMessageCB;\n }\n }\n\n /**\n * Each browser has its own funny way to handle iframes. Here we mush them all together into one object that I can\n * actually use.\n * @private\n * @return {Element}\n */\n private static createIFrame_(): IFrameElement {\n const iframe = document.createElement('iframe') as IFrameElement;\n iframe.style.display = 'none';\n\n // This is necessary in order to initialize the document inside the iframe\n if (document.body) {\n document.body.appendChild(iframe);\n try {\n // If document.domain has been modified in IE, this will throw an error, and we need to set the\n // domain of the iframe's document manually. We can do this via a javascript: url as the src attribute\n // Also note that we must do this *after* the iframe has been appended to the page. Otherwise it doesn't work.\n const a = iframe.contentWindow.document;\n if (!a) {\n // Apologies for the log-spam, I need to do something to keep closure from optimizing out the assignment above.\n log('No IE domain setting required');\n }\n } catch (e) {\n const domain = document.domain;\n iframe.src =\n \"javascript:void((function(){document.open();document.domain='\" +\n domain +\n \"';document.close();})())\";\n }\n } else {\n // LongPollConnection attempts to delay initialization until the document is ready, so hopefully this\n // never gets hit.\n throw 'Document body has not initialized. Wait to initialize Firebase until after the document is ready.';\n }\n\n // Get the document of the iframe in a browser-specific way.\n if (iframe.contentDocument) {\n iframe.doc = iframe.contentDocument; // Firefox, Opera, Safari\n } else if (iframe.contentWindow) {\n iframe.doc = iframe.contentWindow.document; // Internet Explorer\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } else if ((iframe as any).document) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n iframe.doc = (iframe as any).document; //others?\n }\n\n return iframe;\n }\n\n /**\n * Cancel all outstanding queries and remove the frame.\n */\n close() {\n //Mark this iframe as dead, so no new requests are sent.\n this.alive = false;\n\n if (this.myIFrame) {\n //We have to actually remove all of the html inside this iframe before removing it from the\n //window, or IE will continue loading and executing the script tags we've already added, which\n //can lead to some errors being thrown. Setting innerHTML seems to be the easiest way to do this.\n this.myIFrame.doc.body.innerHTML = '';\n setTimeout(() => {\n if (this.myIFrame !== null) {\n document.body.removeChild(this.myIFrame);\n this.myIFrame = null;\n }\n }, Math.floor(0));\n }\n\n // Protect from being called recursively.\n const onDisconnect = this.onDisconnect;\n if (onDisconnect) {\n this.onDisconnect = null;\n onDisconnect();\n }\n }\n\n /**\n * Actually start the long-polling session by adding the first script tag(s) to the iframe.\n * @param {!string} id - The ID of this connection\n * @param {!string} pw - The password for this connection\n */\n startLongPoll(id: string, pw: string) {\n this.myID = id;\n this.myPW = pw;\n this.alive = true;\n\n //send the initial request. If there are requests queued, make sure that we transmit as many as we are currently able to.\n while (this.newRequest_()) {}\n }\n\n /**\n * This is called any time someone might want a script tag to be added. It adds a script tag when there aren't\n * too many outstanding requests and we are still alive.\n *\n * If there are outstanding packet segments to send, it sends one. If there aren't, it sends a long-poll anyways if\n * needed.\n */\n private newRequest_() {\n // We keep one outstanding request open all the time to receive data, but if we need to send data\n // (pendingSegs.length > 0) then we create a new request to send the data. The server will automatically\n // close the old request.\n if (\n this.alive &&\n this.sendNewPolls &&\n this.outstandingRequests.size < (this.pendingSegs.length > 0 ? 2 : 1)\n ) {\n //construct our url\n this.currentSerial++;\n const urlParams: { [k: string]: string | number } = {};\n urlParams[FIREBASE_LONGPOLL_ID_PARAM] = this.myID;\n urlParams[FIREBASE_LONGPOLL_PW_PARAM] = this.myPW;\n urlParams[FIREBASE_LONGPOLL_SERIAL_PARAM] = this.currentSerial;\n let theURL = this.urlFn(urlParams);\n //Now add as much data as we can.\n let curDataString = '';\n let i = 0;\n\n while (this.pendingSegs.length > 0) {\n //first, lets see if the next segment will fit.\n const nextSeg = this.pendingSegs[0];\n if (\n (nextSeg.d as unknown[]).length +\n SEG_HEADER_SIZE +\n curDataString.length <=\n MAX_URL_DATA_SIZE\n ) {\n //great, the segment will fit. Lets append it.\n const theSeg = this.pendingSegs.shift();\n curDataString =\n curDataString +\n '&' +\n FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM +\n i +\n '=' +\n theSeg.seg +\n '&' +\n FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET +\n i +\n '=' +\n theSeg.ts +\n '&' +\n FIREBASE_LONGPOLL_DATA_PARAM +\n i +\n '=' +\n theSeg.d;\n i++;\n } else {\n break;\n }\n }\n\n theURL = theURL + curDataString;\n this.addLongPollTag_(theURL, this.currentSerial);\n\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Queue a packet for transmission to the server.\n * @param segnum - A sequential id for this packet segment used for reassembly\n * @param totalsegs - The total number of segments in this packet\n * @param data - The data for this segment.\n */\n enqueueSegment(segnum: number, totalsegs: number, data: unknown) {\n //add this to the queue of segments to send.\n this.pendingSegs.push({ seg: segnum, ts: totalsegs, d: data });\n\n //send the data immediately if there isn't already data being transmitted, unless\n //startLongPoll hasn't been called yet.\n if (this.alive) {\n this.newRequest_();\n }\n }\n\n /**\n * Add a script tag for a regular long-poll request.\n * @param {!string} url - The URL of the script tag.\n * @param {!number} serial - The serial number of the request.\n * @private\n */\n private addLongPollTag_(url: string, serial: number) {\n //remember that we sent this request.\n this.outstandingRequests.add(serial);\n\n const doNewRequest = () => {\n this.outstandingRequests.delete(serial);\n this.newRequest_();\n };\n\n // If this request doesn't return on its own accord (by the server sending us some data), we'll\n // create a new one after the KEEPALIVE interval to make sure we always keep a fresh request open.\n const keepaliveTimeout = setTimeout(\n doNewRequest,\n Math.floor(KEEPALIVE_REQUEST_INTERVAL)\n );\n\n const readyStateCB = () => {\n // Request completed. Cancel the keepalive.\n clearTimeout(keepaliveTimeout);\n\n // Trigger a new request so we can continue receiving data.\n doNewRequest();\n };\n\n this.addTag(url, readyStateCB);\n }\n\n /**\n * Add an arbitrary script tag to the iframe.\n * @param {!string} url - The URL for the script tag source.\n * @param {!function()} loadCB - A callback to be triggered once the script has loaded.\n */\n addTag(url: string, loadCB: () => void) {\n if (isNodeSdk()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any).doNodeLongPoll(url, loadCB);\n } else {\n setTimeout(() => {\n try {\n // if we're already closed, don't add this poll\n if (!this.sendNewPolls) {\n return;\n }\n const newScript = this.myIFrame.doc.createElement('script');\n newScript.type = 'text/javascript';\n newScript.async = true;\n newScript.src = url;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n newScript.onload = (newScript as any).onreadystatechange = function() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rstate = (newScript as any).readyState;\n if (!rstate || rstate === 'loaded' || rstate === 'complete') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n newScript.onload = (newScript as any).onreadystatechange = null;\n if (newScript.parentNode) {\n newScript.parentNode.removeChild(newScript);\n }\n loadCB();\n }\n };\n newScript.onerror = () => {\n log('Long-poll script failed to load: ' + url);\n this.sendNewPolls = false;\n this.close();\n };\n this.myIFrame.doc.body.appendChild(newScript);\n } catch (e) {\n // TODO: we should make this error visible somehow\n }\n }, Math.floor(1));\n }\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** The semver (www.semver.org) version of the SDK. */\nexport let SDK_VERSION = '';\n\n// SDK_VERSION should be set before any database instance is created\nexport function setSDKVersion(version: string): void {\n SDK_VERSION = version;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RepoInfo } from '../core/RepoInfo';\nimport {\n assert,\n CONSTANTS as ENV_CONSTANTS,\n jsonEval,\n stringify,\n isNodeSdk\n} from '@firebase/util';\nimport { logWrapper, splitStringBySize } from '../core/util/util';\nimport { StatsManager } from '../core/stats/StatsManager';\nimport {\n FORGE_DOMAIN,\n FORGE_REF,\n LAST_SESSION_PARAM,\n PROTOCOL_VERSION,\n REFERER_PARAM,\n TRANSPORT_SESSION_PARAM,\n VERSION_PARAM,\n WEBSOCKET\n} from './Constants';\nimport { PersistentStorage } from '../core/storage/storage';\nimport { Transport } from './Transport';\nimport { StatsCollection } from '../core/stats/StatsCollection';\nimport { SDK_VERSION } from '../core/version';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndeclare const MozWebSocket: any;\n\nconst WEBSOCKET_MAX_FRAME_SIZE = 16384;\nconst WEBSOCKET_KEEPALIVE_INTERVAL = 45000;\n\nlet WebSocketImpl = null;\nif (typeof MozWebSocket !== 'undefined') {\n WebSocketImpl = MozWebSocket;\n} else if (typeof WebSocket !== 'undefined') {\n WebSocketImpl = WebSocket;\n}\n\nexport function setWebSocketImpl(impl) {\n WebSocketImpl = impl;\n}\n\n/**\n * Create a new websocket connection with the given callbacks.\n * @constructor\n * @implements {Transport}\n */\nexport class WebSocketConnection implements Transport {\n keepaliveTimer: number | null = null;\n frames: string[] | null = null;\n totalFrames = 0;\n bytesSent = 0;\n bytesReceived = 0;\n connURL: string;\n onDisconnect: (a?: boolean) => void;\n onMessage: (msg: {}) => void;\n mySock: WebSocket | null;\n private log_: (...a: unknown[]) => void;\n private stats_: StatsCollection;\n private everConnected_: boolean;\n private isClosed_: boolean;\n\n /**\n * @param {string} connId identifier for this transport\n * @param {RepoInfo} repoInfo The info for the websocket endpoint.\n * @param {string=} transportSessionId Optional transportSessionId if this is connecting to an existing transport\n * session\n * @param {string=} lastSessionId Optional lastSessionId if there was a previous connection\n */\n constructor(\n public connId: string,\n repoInfo: RepoInfo,\n transportSessionId?: string,\n lastSessionId?: string\n ) {\n this.log_ = logWrapper(this.connId);\n this.stats_ = StatsManager.getCollection(repoInfo);\n this.connURL = WebSocketConnection.connectionURL_(\n repoInfo,\n transportSessionId,\n lastSessionId\n );\n }\n\n /**\n * @param {RepoInfo} repoInfo The info for the websocket endpoint.\n * @param {string=} transportSessionId Optional transportSessionId if this is connecting to an existing transport\n * session\n * @param {string=} lastSessionId Optional lastSessionId if there was a previous connection\n * @return {string} connection url\n * @private\n */\n private static connectionURL_(\n repoInfo: RepoInfo,\n transportSessionId?: string,\n lastSessionId?: string\n ): string {\n const urlParams: { [k: string]: string } = {};\n urlParams[VERSION_PARAM] = PROTOCOL_VERSION;\n\n if (\n !isNodeSdk() &&\n typeof location !== 'undefined' &&\n location.href &&\n location.href.indexOf(FORGE_DOMAIN) !== -1\n ) {\n urlParams[REFERER_PARAM] = FORGE_REF;\n }\n if (transportSessionId) {\n urlParams[TRANSPORT_SESSION_PARAM] = transportSessionId;\n }\n if (lastSessionId) {\n urlParams[LAST_SESSION_PARAM] = lastSessionId;\n }\n return repoInfo.connectionURL(WEBSOCKET, urlParams);\n }\n\n /**\n *\n * @param onMessage Callback when messages arrive\n * @param onDisconnect Callback with connection lost.\n */\n open(onMessage: (msg: {}) => void, onDisconnect: (a?: boolean) => void) {\n this.onDisconnect = onDisconnect;\n this.onMessage = onMessage;\n\n this.log_('Websocket connecting to ' + this.connURL);\n\n this.everConnected_ = false;\n // Assume failure until proven otherwise.\n PersistentStorage.set('previous_websocket_failure', true);\n\n try {\n if (isNodeSdk()) {\n const device = ENV_CONSTANTS.NODE_ADMIN ? 'AdminNode' : 'Node';\n // UA Format: Firebase/<wire_protocol>/<sdk_version>/<platform>/<device>\n const options: { [k: string]: object } = {\n headers: {\n 'User-Agent': `Firebase/${PROTOCOL_VERSION}/${SDK_VERSION}/${process.platform}/${device}`\n }\n };\n\n // Plumb appropriate http_proxy environment variable into faye-websocket if it exists.\n const env = process['env'];\n const proxy =\n this.connURL.indexOf('wss://') === 0\n ? env['HTTPS_PROXY'] || env['https_proxy']\n : env['HTTP_PROXY'] || env['http_proxy'];\n\n if (proxy) {\n options['proxy'] = { origin: proxy };\n }\n\n this.mySock = new WebSocketImpl(this.connURL, [], options);\n } else {\n this.mySock = new WebSocketImpl(this.connURL);\n }\n } catch (e) {\n this.log_('Error instantiating WebSocket.');\n const error = e.message || e.data;\n if (error) {\n this.log_(error);\n }\n this.onClosed_();\n return;\n }\n\n this.mySock.onopen = () => {\n this.log_('Websocket connected.');\n this.everConnected_ = true;\n };\n\n this.mySock.onclose = () => {\n this.log_('Websocket connection was disconnected.');\n this.mySock = null;\n this.onClosed_();\n };\n\n this.mySock.onmessage = m => {\n this.handleIncomingFrame(m as {});\n };\n\n this.mySock.onerror = e => {\n this.log_('WebSocket error. Closing connection.');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const error = (e as any).message || (e as any).data;\n if (error) {\n this.log_(error);\n }\n this.onClosed_();\n };\n }\n\n /**\n * No-op for websockets, we don't need to do anything once the connection is confirmed as open\n */\n start() {}\n\n static forceDisallow_: boolean;\n\n static forceDisallow() {\n WebSocketConnection.forceDisallow_ = true;\n }\n\n static isAvailable(): boolean {\n let isOldAndroid = false;\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\n const oldAndroidRegex = /Android ([0-9]{0,}\\.[0-9]{0,})/;\n const oldAndroidMatch = navigator.userAgent.match(oldAndroidRegex);\n if (oldAndroidMatch && oldAndroidMatch.length > 1) {\n if (parseFloat(oldAndroidMatch[1]) < 4.4) {\n isOldAndroid = true;\n }\n }\n }\n\n return (\n !isOldAndroid &&\n WebSocketImpl !== null &&\n !WebSocketConnection.forceDisallow_\n );\n }\n\n /**\n * Number of response before we consider the connection \"healthy.\"\n * @type {number}\n */\n static responsesRequiredToBeHealthy = 2;\n\n /**\n * Time to wait for the connection te become healthy before giving up.\n * @type {number}\n */\n static healthyTimeout = 30000;\n\n /**\n * Returns true if we previously failed to connect with this transport.\n * @return {boolean}\n */\n static previouslyFailed(): boolean {\n // If our persistent storage is actually only in-memory storage,\n // we default to assuming that it previously failed to be safe.\n return (\n PersistentStorage.isInMemoryStorage ||\n PersistentStorage.get('previous_websocket_failure') === true\n );\n }\n\n markConnectionHealthy() {\n PersistentStorage.remove('previous_websocket_failure');\n }\n\n private appendFrame_(data: string) {\n this.frames.push(data);\n if (this.frames.length === this.totalFrames) {\n const fullMess = this.frames.join('');\n this.frames = null;\n const jsonMess = jsonEval(fullMess) as object;\n\n //handle the message\n this.onMessage(jsonMess);\n }\n }\n\n /**\n * @param {number} frameCount The number of frames we are expecting from the server\n * @private\n */\n private handleNewFrameCount_(frameCount: number) {\n this.totalFrames = frameCount;\n this.frames = [];\n }\n\n /**\n * Attempts to parse a frame count out of some text. If it can't, assumes a value of 1\n * @param {!String} data\n * @return {?String} Any remaining data to be process, or null if there is none\n * @private\n */\n private extractFrameCount_(data: string): string | null {\n assert(this.frames === null, 'We already have a frame buffer');\n // TODO: The server is only supposed to send up to 9999 frames (i.e. length <= 4), but that isn't being enforced\n // currently. So allowing larger frame counts (length <= 6). See https://app.asana.com/0/search/8688598998380/8237608042508\n if (data.length <= 6) {\n const frameCount = Number(data);\n if (!isNaN(frameCount)) {\n this.handleNewFrameCount_(frameCount);\n return null;\n }\n }\n this.handleNewFrameCount_(1);\n return data;\n }\n\n /**\n * Process a websocket frame that has arrived from the server.\n * @param mess The frame data\n */\n handleIncomingFrame(mess: { [k: string]: unknown }) {\n if (this.mySock === null) {\n return; // Chrome apparently delivers incoming packets even after we .close() the connection sometimes.\n }\n const data = mess['data'] as string;\n this.bytesReceived += data.length;\n this.stats_.incrementCounter('bytes_received', data.length);\n\n this.resetKeepAlive();\n\n if (this.frames !== null) {\n // we're buffering\n this.appendFrame_(data);\n } else {\n // try to parse out a frame count, otherwise, assume 1 and process it\n const remainingData = this.extractFrameCount_(data);\n if (remainingData !== null) {\n this.appendFrame_(remainingData);\n }\n }\n }\n\n /**\n * Send a message to the server\n * @param {Object} data The JSON object to transmit\n */\n send(data: {}) {\n this.resetKeepAlive();\n\n const dataStr = stringify(data);\n this.bytesSent += dataStr.length;\n this.stats_.incrementCounter('bytes_sent', dataStr.length);\n\n //We can only fit a certain amount in each websocket frame, so we need to split this request\n //up into multiple pieces if it doesn't fit in one request.\n\n const dataSegs = splitStringBySize(dataStr, WEBSOCKET_MAX_FRAME_SIZE);\n\n //Send the length header\n if (dataSegs.length > 1) {\n this.sendString_(String(dataSegs.length));\n }\n\n //Send the actual data in segments.\n for (let i = 0; i < dataSegs.length; i++) {\n this.sendString_(dataSegs[i]);\n }\n }\n\n private shutdown_() {\n this.isClosed_ = true;\n if (this.keepaliveTimer) {\n clearInterval(this.keepaliveTimer);\n this.keepaliveTimer = null;\n }\n\n if (this.mySock) {\n this.mySock.close();\n this.mySock = null;\n }\n }\n\n private onClosed_() {\n if (!this.isClosed_) {\n this.log_('WebSocket is closing itself');\n this.shutdown_();\n\n // since this is an internal close, trigger the close listener\n if (this.onDisconnect) {\n this.onDisconnect(this.everConnected_);\n this.onDisconnect = null;\n }\n }\n }\n\n /**\n * External-facing close handler.\n * Close the websocket and kill the connection.\n */\n close() {\n if (!this.isClosed_) {\n this.log_('WebSocket is being closed');\n this.shutdown_();\n }\n }\n\n /**\n * Kill the current keepalive timer and start a new one, to ensure that it always fires N seconds after\n * the last activity.\n */\n resetKeepAlive() {\n clearInterval(this.keepaliveTimer);\n this.keepaliveTimer = setInterval(() => {\n //If there has been no websocket activity for a while, send a no-op\n if (this.mySock) {\n this.sendString_('0');\n }\n this.resetKeepAlive();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }, Math.floor(WEBSOCKET_KEEPALIVE_INTERVAL)) as any;\n }\n\n /**\n * Send a string over the websocket.\n *\n * @param {string} str String to send.\n * @private\n */\n private sendString_(str: string) {\n // Firefox seems to sometimes throw exceptions (NS_ERROR_UNEXPECTED) from websocket .send()\n // calls for some unknown reason. We treat these as an error and disconnect.\n // See https://app.asana.com/0/58926111402292/68021340250410\n try {\n this.mySock.send(str);\n } catch (e) {\n this.log_(\n 'Exception thrown from WebSocket.send():',\n e.message || e.data,\n 'Closing connection.'\n );\n setTimeout(this.onClosed_.bind(this), 0);\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BrowserPollConnection } from './BrowserPollConnection';\nimport { WebSocketConnection } from './WebSocketConnection';\nimport { warn, each } from '../core/util/util';\nimport { TransportConstructor } from './Transport';\nimport { RepoInfo } from '../core/RepoInfo';\n\n/**\n * Currently simplistic, this class manages what transport a Connection should use at various stages of its\n * lifecycle.\n *\n * It starts with longpolling in a browser, and httppolling on node. It then upgrades to websockets if\n * they are available.\n * @constructor\n */\nexport class TransportManager {\n private transports_: TransportConstructor[];\n\n /**\n * @const\n * @type {!Array.<function(new:Transport, string, RepoInfo, string=)>}\n */\n static get ALL_TRANSPORTS() {\n return [BrowserPollConnection, WebSocketConnection];\n }\n\n /**\n * @param {!RepoInfo} repoInfo Metadata around the namespace we're connecting to\n */\n constructor(repoInfo: RepoInfo) {\n this.initTransports_(repoInfo);\n }\n\n /**\n * @param {!RepoInfo} repoInfo\n * @private\n */\n private initTransports_(repoInfo: RepoInfo) {\n const isWebSocketsAvailable: boolean =\n WebSocketConnection && WebSocketConnection['isAvailable']();\n let isSkipPollConnection =\n isWebSocketsAvailable && !WebSocketConnection.previouslyFailed();\n\n if (repoInfo.webSocketOnly) {\n if (!isWebSocketsAvailable) {\n warn(\n \"wss:// URL used, but browser isn't known to support websockets. Trying anyway.\"\n );\n }\n\n isSkipPollConnection = true;\n }\n\n if (isSkipPollConnection) {\n this.transports_ = [WebSocketConnection];\n } else {\n const transports = (this.transports_ = [] as TransportConstructor[]);\n for (const transport of TransportManager.ALL_TRANSPORTS) {\n if (transport && transport['isAvailable']()) {\n transports.push(transport);\n }\n }\n }\n }\n\n /**\n * @return {function(new:Transport, !string, !RepoInfo, string=, string=)} The constructor for the\n * initial transport to use\n */\n initialTransport(): TransportConstructor {\n if (this.transports_.length > 0) {\n return this.transports_[0];\n } else {\n throw new Error('No transports available');\n }\n }\n\n /**\n * @return {?function(new:Transport, function(),function(), string=)} The constructor for the next\n * transport, or null\n */\n upgradeTransport(): TransportConstructor | null {\n if (this.transports_.length > 1) {\n return this.transports_[1];\n } else {\n return null;\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n error,\n logWrapper,\n requireKey,\n setTimeoutNonBlocking,\n warn\n} from '../core/util/util';\nimport { PersistentStorage } from '../core/storage/storage';\nimport { PROTOCOL_VERSION } from './Constants';\nimport { TransportManager } from './TransportManager';\nimport { RepoInfo } from '../core/RepoInfo';\nimport { Transport, TransportConstructor } from './Transport';\nimport { Indexable } from '../core/util/misc';\n\n// Abort upgrade attempt if it takes longer than 60s.\nconst UPGRADE_TIMEOUT = 60000;\n\n// For some transports (WebSockets), we need to \"validate\" the transport by exchanging a few requests and responses.\n// If we haven't sent enough requests within 5s, we'll start sending noop ping requests.\nconst DELAY_BEFORE_SENDING_EXTRA_REQUESTS = 5000;\n\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)\n// then we may not be able to exchange our ping/pong requests within the healthy timeout. So if we reach the timeout\n// but we've sent/received enough bytes, we don't cancel the connection.\nconst BYTES_SENT_HEALTHY_OVERRIDE = 10 * 1024;\nconst BYTES_RECEIVED_HEALTHY_OVERRIDE = 100 * 1024;\n\nconst enum RealtimeState {\n CONNECTING,\n CONNECTED,\n DISCONNECTED\n}\n\nconst MESSAGE_TYPE = 't';\nconst MESSAGE_DATA = 'd';\nconst CONTROL_SHUTDOWN = 's';\nconst CONTROL_RESET = 'r';\nconst CONTROL_ERROR = 'e';\nconst CONTROL_PONG = 'o';\nconst SWITCH_ACK = 'a';\nconst END_TRANSMISSION = 'n';\nconst PING = 'p';\n\nconst SERVER_HELLO = 'h';\n\n/**\n * Creates a new real-time connection to the server using whichever method works\n * best in the current browser.\n *\n * @constructor\n */\nexport class Connection {\n connectionCount = 0;\n pendingDataMessages: unknown[] = [];\n sessionId: string;\n\n private conn_: Transport;\n private healthyTimeout_: number;\n private isHealthy_: boolean;\n private log_: (...args: unknown[]) => void;\n private primaryResponsesRequired_: number;\n private rx_: Transport;\n private secondaryConn_: Transport;\n private secondaryResponsesRequired_: number;\n private state_ = RealtimeState.CONNECTING;\n private transportManager_: TransportManager;\n private tx_: Transport;\n\n /**\n * @param {!string} id - an id for this connection\n * @param {!RepoInfo} repoInfo_ - the info for the endpoint to connect to\n * @param {function(Object)} onMessage_ - the callback to be triggered when a server-push message arrives\n * @param {function(number, string)} onReady_ - the callback to be triggered when this connection is ready to send messages.\n * @param {function()} onDisconnect_ - the callback to be triggered when a connection was lost\n * @param {function(string)} onKill_ - the callback to be triggered when this connection has permanently shut down.\n * @param {string=} lastSessionId - last session id in persistent connection. is used to clean up old session in real-time server\n */\n constructor(\n public id: string,\n private repoInfo_: RepoInfo,\n private onMessage_: (a: {}) => void,\n private onReady_: (a: number, b: string) => void,\n private onDisconnect_: () => void,\n private onKill_: (a: string) => void,\n public lastSessionId?: string\n ) {\n this.log_ = logWrapper('c:' + this.id + ':');\n this.transportManager_ = new TransportManager(repoInfo_);\n this.log_('Connection created');\n this.start_();\n }\n\n /**\n * Starts a connection attempt\n * @private\n */\n private start_(): void {\n const conn = this.transportManager_.initialTransport();\n this.conn_ = new conn(\n this.nextTransportId_(),\n this.repoInfo_,\n undefined,\n this.lastSessionId\n );\n\n // For certain transports (WebSockets), we need to send and receive several messages back and forth before we\n // can consider the transport healthy.\n this.primaryResponsesRequired_ = conn['responsesRequiredToBeHealthy'] || 0;\n\n const onMessageReceived = this.connReceiver_(this.conn_);\n const onConnectionLost = this.disconnReceiver_(this.conn_);\n this.tx_ = this.conn_;\n this.rx_ = this.conn_;\n this.secondaryConn_ = null;\n this.isHealthy_ = false;\n\n /*\n * Firefox doesn't like when code from one iframe tries to create another iframe by way of the parent frame.\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.\n * Somehow, setTimeout seems to make this ok. That doesn't make sense from a security perspective, since you should\n * still have the context of your originating frame.\n */\n setTimeout(() => {\n // this.conn_ gets set to null in some of the tests. Check to make sure it still exists before using it\n this.conn_ && this.conn_.open(onMessageReceived, onConnectionLost);\n }, Math.floor(0));\n\n const healthyTimeoutMS = conn['healthyTimeout'] || 0;\n if (healthyTimeoutMS > 0) {\n this.healthyTimeout_ = setTimeoutNonBlocking(() => {\n this.healthyTimeout_ = null;\n if (!this.isHealthy_) {\n if (\n this.conn_ &&\n this.conn_.bytesReceived > BYTES_RECEIVED_HEALTHY_OVERRIDE\n ) {\n this.log_(\n 'Connection exceeded healthy timeout but has received ' +\n this.conn_.bytesReceived +\n ' bytes. Marking connection healthy.'\n );\n this.isHealthy_ = true;\n this.conn_.markConnectionHealthy();\n } else if (\n this.conn_ &&\n this.conn_.bytesSent > BYTES_SENT_HEALTHY_OVERRIDE\n ) {\n this.log_(\n 'Connection exceeded healthy timeout but has sent ' +\n this.conn_.bytesSent +\n ' bytes. Leaving connection alive.'\n );\n // NOTE: We don't want to mark it healthy, since we have no guarantee that the bytes have made it to\n // the server.\n } else {\n this.log_('Closing unhealthy connection after timeout.');\n this.close();\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }, Math.floor(healthyTimeoutMS)) as any;\n }\n }\n\n /**\n * @return {!string}\n * @private\n */\n private nextTransportId_(): string {\n return 'c:' + this.id + ':' + this.connectionCount++;\n }\n\n private disconnReceiver_(conn) {\n return everConnected => {\n if (conn === this.conn_) {\n this.onConnectionLost_(everConnected);\n } else if (conn === this.secondaryConn_) {\n this.log_('Secondary connection lost.');\n this.onSecondaryConnectionLost_();\n } else {\n this.log_('closing an old connection');\n }\n };\n }\n\n private connReceiver_(conn: Transport) {\n return (message: Indexable) => {\n if (this.state_ !== RealtimeState.DISCONNECTED) {\n if (conn === this.rx_) {\n this.onPrimaryMessageReceived_(message);\n } else if (conn === this.secondaryConn_) {\n this.onSecondaryMessageReceived_(message);\n } else {\n this.log_('message on old connection');\n }\n }\n };\n }\n\n /**\n *\n * @param {Object} dataMsg An arbitrary data message to be sent to the server\n */\n sendRequest(dataMsg: object) {\n // wrap in a data message envelope and send it on\n const msg = { t: 'd', d: dataMsg };\n this.sendData_(msg);\n }\n\n tryCleanupConnection() {\n if (this.tx_ === this.secondaryConn_ && this.rx_ === this.secondaryConn_) {\n this.log_(\n 'cleaning up and promoting a connection: ' + this.secondaryConn_.connId\n );\n this.conn_ = this.secondaryConn_;\n this.secondaryConn_ = null;\n // the server will shutdown the old connection\n }\n }\n\n private onSecondaryControl_(controlData: { [k: string]: unknown }) {\n if (MESSAGE_TYPE in controlData) {\n const cmd = controlData[MESSAGE_TYPE] as string;\n if (cmd === SWITCH_ACK) {\n this.upgradeIfSecondaryHealthy_();\n } else if (cmd === CONTROL_RESET) {\n // Most likely the session wasn't valid. Abandon the switch attempt\n this.log_('Got a reset on secondary, closing it');\n this.secondaryConn_.close();\n // If we were already using this connection for something, than we need to fully close\n if (\n this.tx_ === this.secondaryConn_ ||\n this.rx_ === this.secondaryConn_\n ) {\n this.close();\n }\n } else if (cmd === CONTROL_PONG) {\n this.log_('got pong on secondary.');\n this.secondaryResponsesRequired_--;\n this.upgradeIfSecondaryHealthy_();\n }\n }\n }\n\n private onSecondaryMessageReceived_(parsedData: Indexable) {\n const layer: string = requireKey('t', parsedData) as string;\n const data: unknown = requireKey('d', parsedData);\n if (layer === 'c') {\n this.onSecondaryControl_(data as Indexable);\n } else if (layer === 'd') {\n // got a data message, but we're still second connection. Need to buffer it up\n this.pendingDataMessages.push(data);\n } else {\n throw new Error('Unknown protocol layer: ' + layer);\n }\n }\n\n private upgradeIfSecondaryHealthy_() {\n if (this.secondaryResponsesRequired_ <= 0) {\n this.log_('Secondary connection is healthy.');\n this.isHealthy_ = true;\n this.secondaryConn_.markConnectionHealthy();\n this.proceedWithUpgrade_();\n } else {\n // Send a ping to make sure the connection is healthy.\n this.log_('sending ping on secondary.');\n this.secondaryConn_.send({ t: 'c', d: { t: PING, d: {} } });\n }\n }\n\n private proceedWithUpgrade_() {\n // tell this connection to consider itself open\n this.secondaryConn_.start();\n // send ack\n this.log_('sending client ack on secondary');\n this.secondaryConn_.send({ t: 'c', d: { t: SWITCH_ACK, d: {} } });\n\n // send end packet on primary transport, switch to sending on this one\n // can receive on this one, buffer responses until end received on primary transport\n this.log_('Ending transmission on primary');\n this.conn_.send({ t: 'c', d: { t: END_TRANSMISSION, d: {} } });\n this.tx_ = this.secondaryConn_;\n\n this.tryCleanupConnection();\n }\n\n private onPrimaryMessageReceived_(parsedData: { [k: string]: unknown }) {\n // Must refer to parsedData properties in quotes, so closure doesn't touch them.\n const layer: string = requireKey('t', parsedData) as string;\n const data: unknown = requireKey('d', parsedData);\n if (layer === 'c') {\n this.onControl_(data as { [k: string]: unknown });\n } else if (layer === 'd') {\n this.onDataMessage_(data);\n }\n }\n\n private onDataMessage_(message: unknown) {\n this.onPrimaryResponse_();\n\n // We don't do anything with data messages, just kick them up a level\n this.onMessage_(message);\n }\n\n private onPrimaryResponse_() {\n if (!this.isHealthy_) {\n this.primaryResponsesRequired_--;\n if (this.primaryResponsesRequired_ <= 0) {\n this.log_('Primary connection is healthy.');\n this.isHealthy_ = true;\n this.conn_.markConnectionHealthy();\n }\n }\n }\n\n private onControl_(controlData: { [k: string]: unknown }) {\n const cmd: string = requireKey(MESSAGE_TYPE, controlData) as string;\n if (MESSAGE_DATA in controlData) {\n const payload = controlData[MESSAGE_DATA];\n if (cmd === SERVER_HELLO) {\n this.onHandshake_(\n payload as {\n ts: number;\n v: string;\n h: string;\n s: string;\n }\n );\n } else if (cmd === END_TRANSMISSION) {\n this.log_('recvd end transmission on primary');\n this.rx_ = this.secondaryConn_;\n for (let i = 0; i < this.pendingDataMessages.length; ++i) {\n this.onDataMessage_(this.pendingDataMessages[i]);\n }\n this.pendingDataMessages = [];\n this.tryCleanupConnection();\n } else if (cmd === CONTROL_SHUTDOWN) {\n // This was previously the 'onKill' callback passed to the lower-level connection\n // payload in this case is the reason for the shutdown. Generally a human-readable error\n this.onConnectionShutdown_(payload as string);\n } else if (cmd === CONTROL_RESET) {\n // payload in this case is the host we should contact\n this.onReset_(payload as string);\n } else if (cmd === CONTROL_ERROR) {\n error('Server Error: ' + payload);\n } else if (cmd === CONTROL_PONG) {\n this.log_('got pong on primary.');\n this.onPrimaryResponse_();\n this.sendPingOnPrimaryIfNecessary_();\n } else {\n error('Unknown control packet command: ' + cmd);\n }\n }\n }\n\n /**\n *\n * @param {Object} handshake The handshake data returned from the server\n * @private\n */\n private onHandshake_(handshake: {\n ts: number;\n v: string;\n h: string;\n s: string;\n }): void {\n const timestamp = handshake.ts;\n const version = handshake.v;\n const host = handshake.h;\n this.sessionId = handshake.s;\n this.repoInfo_.updateHost(host);\n // if we've already closed the connection, then don't bother trying to progress further\n if (this.state_ === RealtimeState.CONNECTING) {\n this.conn_.start();\n this.onConnectionEstablished_(this.conn_, timestamp);\n if (PROTOCOL_VERSION !== version) {\n warn('Protocol version mismatch detected');\n }\n // TODO: do we want to upgrade? when? maybe a delay?\n this.tryStartUpgrade_();\n }\n }\n\n private tryStartUpgrade_() {\n const conn = this.transportManager_.upgradeTransport();\n if (conn) {\n this.startUpgrade_(conn);\n }\n }\n\n private startUpgrade_(conn: TransportConstructor) {\n this.secondaryConn_ = new conn(\n this.nextTransportId_(),\n this.repoInfo_,\n this.sessionId\n );\n // For certain transports (WebSockets), we need to send and receive several messages back and forth before we\n // can consider the transport healthy.\n this.secondaryResponsesRequired_ =\n conn['responsesRequiredToBeHealthy'] || 0;\n\n const onMessage = this.connReceiver_(this.secondaryConn_);\n const onDisconnect = this.disconnReceiver_(this.secondaryConn_);\n this.secondaryConn_.open(onMessage, onDisconnect);\n\n // If we haven't successfully upgraded after UPGRADE_TIMEOUT, give up and kill the secondary.\n setTimeoutNonBlocking(() => {\n if (this.secondaryConn_) {\n this.log_('Timed out trying to upgrade.');\n this.secondaryConn_.close();\n }\n }, Math.floor(UPGRADE_TIMEOUT));\n }\n\n private onReset_(host: string) {\n this.log_('Reset packet received. New host: ' + host);\n this.repoInfo_.updateHost(host);\n // TODO: if we're already \"connected\", we need to trigger a disconnect at the next layer up.\n // We don't currently support resets after the connection has already been established\n if (this.state_ === RealtimeState.CONNECTED) {\n this.close();\n } else {\n // Close whatever connections we have open and start again.\n this.closeConnections_();\n this.start_();\n }\n }\n\n private onConnectionEstablished_(conn: Transport, timestamp: number) {\n this.log_('Realtime connection established.');\n this.conn_ = conn;\n this.state_ = RealtimeState.CONNECTED;\n\n if (this.onReady_) {\n this.onReady_(timestamp, this.sessionId);\n this.onReady_ = null;\n }\n\n // If after 5 seconds we haven't sent enough requests to the server to get the connection healthy,\n // send some pings.\n if (this.primaryResponsesRequired_ === 0) {\n this.log_('Primary connection is healthy.');\n this.isHealthy_ = true;\n } else {\n setTimeoutNonBlocking(() => {\n this.sendPingOnPrimaryIfNecessary_();\n }, Math.floor(DELAY_BEFORE_SENDING_EXTRA_REQUESTS));\n }\n }\n\n private sendPingOnPrimaryIfNecessary_() {\n // If the connection isn't considered healthy yet, we'll send a noop ping packet request.\n if (!this.isHealthy_ && this.state_ === RealtimeState.CONNECTED) {\n this.log_('sending ping on primary.');\n this.sendData_({ t: 'c', d: { t: PING, d: {} } });\n }\n }\n\n private onSecondaryConnectionLost_() {\n const conn = this.secondaryConn_;\n this.secondaryConn_ = null;\n if (this.tx_ === conn || this.rx_ === conn) {\n // we are relying on this connection already in some capacity. Therefore, a failure is real\n this.close();\n }\n }\n\n /**\n *\n * @param {boolean} everConnected Whether or not the connection ever reached a server. Used to determine if\n * we should flush the host cache\n * @private\n */\n private onConnectionLost_(everConnected: boolean) {\n this.conn_ = null;\n\n // NOTE: IF you're seeing a Firefox error for this line, I think it might be because it's getting\n // called on window close and RealtimeState.CONNECTING is no longer defined. Just a guess.\n if (!everConnected && this.state_ === RealtimeState.CONNECTING) {\n this.log_('Realtime connection failed.');\n // Since we failed to connect at all, clear any cached entry for this namespace in case the machine went away\n if (this.repoInfo_.isCacheableHost()) {\n PersistentStorage.remove('host:' + this.repoInfo_.host);\n // reset the internal host to what we would show the user, i.e. <ns>.firebaseio.com\n this.repoInfo_.internalHost = this.repoInfo_.host;\n }\n } else if (this.state_ === RealtimeState.CONNECTED) {\n this.log_('Realtime connection lost.');\n }\n\n this.close();\n }\n\n /**\n *\n * @param {string} reason\n * @private\n */\n private onConnectionShutdown_(reason: string) {\n this.log_('Connection shutdown command received. Shutting down...');\n\n if (this.onKill_) {\n this.onKill_(reason);\n this.onKill_ = null;\n }\n\n // We intentionally don't want to fire onDisconnect (kill is a different case),\n // so clear the callback.\n this.onDisconnect_ = null;\n\n this.close();\n }\n\n private sendData_(data: object) {\n if (this.state_ !== RealtimeState.CONNECTED) {\n throw 'Connection is not connected';\n } else {\n this.tx_.send(data);\n }\n }\n\n /**\n * Cleans up this connection, calling the appropriate callbacks\n */\n close() {\n if (this.state_ !== RealtimeState.DISCONNECTED) {\n this.log_('Closing realtime connection.');\n this.state_ = RealtimeState.DISCONNECTED;\n\n this.closeConnections_();\n\n if (this.onDisconnect_) {\n this.onDisconnect_();\n this.onDisconnect_ = null;\n }\n }\n }\n\n /**\n *\n * @private\n */\n private closeConnections_() {\n this.log_('Shutting down all connections');\n if (this.conn_) {\n this.conn_.close();\n this.conn_ = null;\n }\n\n if (this.secondaryConn_) {\n this.secondaryConn_.close();\n this.secondaryConn_ = null;\n }\n\n if (this.healthyTimeout_) {\n clearTimeout(this.healthyTimeout_);\n this.healthyTimeout_ = null;\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Query } from '../api/Query';\n\n/**\n * Interface defining the set of actions that can be performed against the Firebase server\n * (basically corresponds to our wire protocol).\n *\n * @interface\n */\nexport abstract class ServerActions {\n /**\n * @param {!Query} query\n * @param {function():string} currentHashFn\n * @param {?number} tag\n * @param {function(string, *)} onComplete\n */\n abstract listen(\n query: Query,\n currentHashFn: () => string,\n tag: number | null,\n onComplete: (a: string, b: unknown) => void\n ): void;\n\n /**\n * Remove a listen.\n *\n * @param {!Query} query\n * @param {?number} tag\n */\n abstract unlisten(query: Query, tag: number | null): void;\n\n /**\n * @param {string} pathString\n * @param {*} data\n * @param {function(string, string)=} onComplete\n * @param {string=} hash\n */\n put(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void,\n hash?: string\n ) {}\n\n /**\n * @param {string} pathString\n * @param {*} data\n * @param {function(string, ?string)} onComplete\n * @param {string=} hash\n */\n merge(\n pathString: string,\n data: unknown,\n onComplete: (a: string, b: string | null) => void,\n hash?: string\n ) {}\n\n /**\n * Refreshes the auth token for the current connection.\n * @param {string} token The authentication token\n */\n refreshAuthToken(token: string) {}\n\n /**\n * @param {string} pathString\n * @param {*} data\n * @param {function(string, string)=} onComplete\n */\n onDisconnectPut(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void\n ) {}\n\n /**\n * @param {string} pathString\n * @param {*} data\n * @param {function(string, string)=} onComplete\n */\n onDisconnectMerge(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void\n ) {}\n\n /**\n * @param {string} pathString\n * @param {function(string, string)=} onComplete\n */\n onDisconnectCancel(\n pathString: string,\n onComplete?: (a: string, b: string) => void\n ) {}\n\n /**\n * @param {Object.<string, *>} stats\n */\n reportStats(stats: { [k: string]: unknown }) {}\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n contains,\n isEmpty,\n safeGet,\n CONSTANTS,\n stringify,\n assert,\n isAdmin,\n isValidFormat,\n isMobileCordova,\n isReactNative,\n isNodeSdk\n} from '@firebase/util';\n\nimport { error, log, logWrapper, warn, ObjectToUniqueKey } from './util/util';\nimport { Path } from './util/Path';\nimport { VisibilityMonitor } from './util/VisibilityMonitor';\nimport { OnlineMonitor } from './util/OnlineMonitor';\n\nimport { Connection } from '../realtime/Connection';\n\nimport { ServerActions } from './ServerActions';\nimport { AuthTokenProvider } from './AuthTokenProvider';\nimport { RepoInfo } from './RepoInfo';\nimport { Query } from '../api/Query';\nimport { SDK_VERSION } from './version';\n\nconst RECONNECT_MIN_DELAY = 1000;\nconst RECONNECT_MAX_DELAY_DEFAULT = 60 * 5 * 1000; // 5 minutes in milliseconds (Case: 1858)\nconst RECONNECT_MAX_DELAY_FOR_ADMINS = 30 * 1000; // 30 seconds for admin clients (likely to be a backend server)\nconst RECONNECT_DELAY_MULTIPLIER = 1.3;\nconst RECONNECT_DELAY_RESET_TIMEOUT = 30000; // Reset delay back to MIN_DELAY after being connected for 30sec.\nconst SERVER_KILL_INTERRUPT_REASON = 'server_kill';\n\n// If auth fails repeatedly, we'll assume something is wrong and log a warning / back off.\nconst INVALID_AUTH_TOKEN_THRESHOLD = 3;\n\ninterface ListenSpec {\n onComplete(s: string, p?: unknown): void;\n\n hashFn(): string;\n\n query: Query;\n tag: number | null;\n}\n\ninterface OnDisconnectRequest {\n pathString: string;\n action: string;\n data: unknown;\n onComplete?: (a: string, b: string) => void;\n}\n\ninterface OutstandingPut {\n action: string;\n request: object;\n queued?: boolean;\n onComplete: (a: string, b?: string) => void;\n}\n\n/**\n * Firebase connection. Abstracts wire protocol and handles reconnecting.\n *\n * NOTE: All JSON objects sent to the realtime connection must have property names enclosed\n * in quotes to make sure the closure compiler does not minify them.\n */\nexport class PersistentConnection extends ServerActions {\n // Used for diagnostic logging.\n id = PersistentConnection.nextPersistentConnectionId_++;\n private log_ = logWrapper('p:' + this.id + ':');\n\n private interruptReasons_: { [reason: string]: boolean } = {};\n /** Map<path, Map<queryId, ListenSpec>> */\n private readonly listens: Map<\n /* path */ string,\n Map</* queryId */ string, ListenSpec>\n > = new Map();\n private outstandingPuts_: OutstandingPut[] = [];\n private outstandingPutCount_ = 0;\n private onDisconnectRequestQueue_: OnDisconnectRequest[] = [];\n private connected_ = false;\n private reconnectDelay_ = RECONNECT_MIN_DELAY;\n private maxReconnectDelay_ = RECONNECT_MAX_DELAY_DEFAULT;\n private securityDebugCallback_: ((a: object) => void) | null = null;\n lastSessionId: string | null = null;\n\n private establishConnectionTimer_: number | null = null;\n\n private visible_: boolean = false;\n\n // Before we get connected, we keep a queue of pending messages to send.\n private requestCBHash_: { [k: number]: (a: unknown) => void } = {};\n private requestNumber_ = 0;\n\n private realtime_: {\n sendRequest(a: object): void;\n close(): void;\n } | null = null;\n\n private authToken_: string | null = null;\n private forceTokenRefresh_ = false;\n private invalidAuthTokenCount_ = 0;\n\n private firstConnection_ = true;\n private lastConnectionAttemptTime_: number | null = null;\n private lastConnectionEstablishedTime_: number | null = null;\n\n private static nextPersistentConnectionId_ = 0;\n\n /**\n * Counter for number of connections created. Mainly used for tagging in the logs\n */\n private static nextConnectionId_ = 0;\n\n /**\n * @implements {ServerActions}\n * @param repoInfo_ Data about the namespace we are connecting to\n * @param onDataUpdate_ A callback for new data from the server\n */\n constructor(\n private repoInfo_: RepoInfo,\n private onDataUpdate_: (\n a: string,\n b: unknown,\n c: boolean,\n d: number | null\n ) => void,\n private onConnectStatus_: (a: boolean) => void,\n private onServerInfoUpdate_: (a: unknown) => void,\n private authTokenProvider_: AuthTokenProvider,\n private authOverride_?: object | null\n ) {\n super();\n\n if (authOverride_ && !isNodeSdk()) {\n throw new Error(\n 'Auth override specified in options, but not supported on non Node.js platforms'\n );\n }\n this.scheduleConnect_(0);\n\n VisibilityMonitor.getInstance().on('visible', this.onVisible_, this);\n\n if (repoInfo_.host.indexOf('fblocal') === -1) {\n OnlineMonitor.getInstance().on('online', this.onOnline_, this);\n }\n }\n\n protected sendRequest(\n action: string,\n body: unknown,\n onResponse?: (a: unknown) => void\n ) {\n const curReqNum = ++this.requestNumber_;\n\n const msg = { r: curReqNum, a: action, b: body };\n this.log_(stringify(msg));\n assert(\n this.connected_,\n \"sendRequest call when we're not connected not allowed.\"\n );\n this.realtime_.sendRequest(msg);\n if (onResponse) {\n this.requestCBHash_[curReqNum] = onResponse;\n }\n }\n\n /**\n * @inheritDoc\n */\n listen(\n query: Query,\n currentHashFn: () => string,\n tag: number | null,\n onComplete: (a: string, b: unknown) => void\n ) {\n const queryId = query.queryIdentifier();\n const pathString = query.path.toString();\n this.log_('Listen called for ' + pathString + ' ' + queryId);\n if (!this.listens.has(pathString)) {\n this.listens.set(pathString, new Map());\n }\n assert(\n query.getQueryParams().isDefault() ||\n !query.getQueryParams().loadsAllData(),\n 'listen() called for non-default but complete query'\n );\n assert(\n !this.listens.get(pathString)!.has(queryId),\n 'listen() called twice for same path/queryId.'\n );\n const listenSpec: ListenSpec = {\n onComplete,\n hashFn: currentHashFn,\n query,\n tag\n };\n this.listens.get(pathString)!.set(queryId, listenSpec);\n\n if (this.connected_) {\n this.sendListen_(listenSpec);\n }\n }\n\n private sendListen_(listenSpec: ListenSpec) {\n const query = listenSpec.query;\n const pathString = query.path.toString();\n const queryId = query.queryIdentifier();\n this.log_('Listen on ' + pathString + ' for ' + queryId);\n const req: { [k: string]: unknown } = { /*path*/ p: pathString };\n\n const action = 'q';\n\n // Only bother to send query if it's non-default.\n if (listenSpec.tag) {\n req['q'] = query.queryObject();\n req['t'] = listenSpec.tag;\n }\n\n req[/*hash*/ 'h'] = listenSpec.hashFn();\n\n this.sendRequest(action, req, (message: { [k: string]: unknown }) => {\n const payload: unknown = message[/*data*/ 'd'];\n const status = message[/*status*/ 's'] as string;\n\n // print warnings in any case...\n PersistentConnection.warnOnListenWarnings_(payload, query);\n\n const currentListenSpec =\n this.listens.get(pathString) &&\n this.listens.get(pathString)!.get(queryId);\n // only trigger actions if the listen hasn't been removed and readded\n if (currentListenSpec === listenSpec) {\n this.log_('listen response', message);\n\n if (status !== 'ok') {\n this.removeListen_(pathString, queryId);\n }\n\n if (listenSpec.onComplete) {\n listenSpec.onComplete(status, payload);\n }\n }\n });\n }\n\n private static warnOnListenWarnings_(payload: unknown, query: Query) {\n if (payload && typeof payload === 'object' && contains(payload, 'w')) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const warnings = safeGet(payload as any, 'w');\n if (Array.isArray(warnings) && ~warnings.indexOf('no_index')) {\n const indexSpec =\n '\".indexOn\": \"' +\n query\n .getQueryParams()\n .getIndex()\n .toString() +\n '\"';\n const indexPath = query.path.toString();\n warn(\n `Using an unspecified index. Your data will be downloaded and ` +\n `filtered on the client. Consider adding ${indexSpec} at ` +\n `${indexPath} to your security rules for better performance.`\n );\n }\n }\n }\n\n /**\n * @inheritDoc\n */\n refreshAuthToken(token: string) {\n this.authToken_ = token;\n this.log_('Auth token refreshed');\n if (this.authToken_) {\n this.tryAuth();\n } else {\n //If we're connected we want to let the server know to unauthenticate us. If we're not connected, simply delete\n //the credential so we dont become authenticated next time we connect.\n if (this.connected_) {\n this.sendRequest('unauth', {}, () => {});\n }\n }\n\n this.reduceReconnectDelayIfAdminCredential_(token);\n }\n\n private reduceReconnectDelayIfAdminCredential_(credential: string) {\n // NOTE: This isn't intended to be bulletproof (a malicious developer can always just modify the client).\n // Additionally, we don't bother resetting the max delay back to the default if auth fails / expires.\n const isFirebaseSecret = credential && credential.length === 40;\n if (isFirebaseSecret || isAdmin(credential)) {\n this.log_(\n 'Admin auth credential detected. Reducing max reconnect time.'\n );\n this.maxReconnectDelay_ = RECONNECT_MAX_DELAY_FOR_ADMINS;\n }\n }\n\n /**\n * Attempts to authenticate with the given credentials. If the authentication attempt fails, it's triggered like\n * a auth revoked (the connection is closed).\n */\n tryAuth() {\n if (this.connected_ && this.authToken_) {\n const token = this.authToken_;\n const authMethod = isValidFormat(token) ? 'auth' : 'gauth';\n const requestData: { [k: string]: unknown } = { cred: token };\n if (this.authOverride_ === null) {\n requestData['noauth'] = true;\n } else if (typeof this.authOverride_ === 'object') {\n requestData['authvar'] = this.authOverride_;\n }\n this.sendRequest(\n authMethod,\n requestData,\n (res: { [k: string]: unknown }) => {\n const status = res[/*status*/ 's'] as string;\n const data = (res[/*data*/ 'd'] as string) || 'error';\n\n if (this.authToken_ === token) {\n if (status === 'ok') {\n this.invalidAuthTokenCount_ = 0;\n } else {\n // Triggers reconnect and force refresh for auth token\n this.onAuthRevoked_(status, data);\n }\n }\n }\n );\n }\n }\n\n /**\n * @inheritDoc\n */\n unlisten(query: Query, tag: number | null) {\n const pathString = query.path.toString();\n const queryId = query.queryIdentifier();\n\n this.log_('Unlisten called for ' + pathString + ' ' + queryId);\n\n assert(\n query.getQueryParams().isDefault() ||\n !query.getQueryParams().loadsAllData(),\n 'unlisten() called for non-default but complete query'\n );\n const listen = this.removeListen_(pathString, queryId);\n if (listen && this.connected_) {\n this.sendUnlisten_(pathString, queryId, query.queryObject(), tag);\n }\n }\n\n private sendUnlisten_(\n pathString: string,\n queryId: string,\n queryObj: object,\n tag: number | null\n ) {\n this.log_('Unlisten on ' + pathString + ' for ' + queryId);\n\n const req: { [k: string]: unknown } = { /*path*/ p: pathString };\n const action = 'n';\n // Only bother sending queryId if it's non-default.\n if (tag) {\n req['q'] = queryObj;\n req['t'] = tag;\n }\n\n this.sendRequest(action, req);\n }\n\n /**\n * @inheritDoc\n */\n onDisconnectPut(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void\n ) {\n if (this.connected_) {\n this.sendOnDisconnect_('o', pathString, data, onComplete);\n } else {\n this.onDisconnectRequestQueue_.push({\n pathString,\n action: 'o',\n data,\n onComplete\n });\n }\n }\n\n /**\n * @inheritDoc\n */\n onDisconnectMerge(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void\n ) {\n if (this.connected_) {\n this.sendOnDisconnect_('om', pathString, data, onComplete);\n } else {\n this.onDisconnectRequestQueue_.push({\n pathString,\n action: 'om',\n data,\n onComplete\n });\n }\n }\n\n /**\n * @inheritDoc\n */\n onDisconnectCancel(\n pathString: string,\n onComplete?: (a: string, b: string) => void\n ) {\n if (this.connected_) {\n this.sendOnDisconnect_('oc', pathString, null, onComplete);\n } else {\n this.onDisconnectRequestQueue_.push({\n pathString,\n action: 'oc',\n data: null,\n onComplete\n });\n }\n }\n\n private sendOnDisconnect_(\n action: string,\n pathString: string,\n data: unknown,\n onComplete: (a: string, b: string) => void\n ) {\n const request = { /*path*/ p: pathString, /*data*/ d: data };\n this.log_('onDisconnect ' + action, request);\n this.sendRequest(action, request, (response: { [k: string]: unknown }) => {\n if (onComplete) {\n setTimeout(() => {\n onComplete(\n response[/*status*/ 's'] as string,\n response[/* data */ 'd'] as string\n );\n }, Math.floor(0));\n }\n });\n }\n\n /**\n * @inheritDoc\n */\n put(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void,\n hash?: string\n ) {\n this.putInternal('p', pathString, data, onComplete, hash);\n }\n\n /**\n * @inheritDoc\n */\n merge(\n pathString: string,\n data: unknown,\n onComplete: (a: string, b: string | null) => void,\n hash?: string\n ) {\n this.putInternal('m', pathString, data, onComplete, hash);\n }\n\n putInternal(\n action: string,\n pathString: string,\n data: unknown,\n onComplete: (a: string, b: string | null) => void,\n hash?: string\n ) {\n const request: { [k: string]: unknown } = {\n /*path*/ p: pathString,\n /*data*/ d: data\n };\n\n if (hash !== undefined) {\n request[/*hash*/ 'h'] = hash;\n }\n\n // TODO: Only keep track of the most recent put for a given path?\n this.outstandingPuts_.push({\n action,\n request,\n onComplete\n });\n\n this.outstandingPutCount_++;\n const index = this.outstandingPuts_.length - 1;\n\n if (this.connected_) {\n this.sendPut_(index);\n } else {\n this.log_('Buffering put: ' + pathString);\n }\n }\n\n private sendPut_(index: number) {\n const action = this.outstandingPuts_[index].action;\n const request = this.outstandingPuts_[index].request;\n const onComplete = this.outstandingPuts_[index].onComplete;\n this.outstandingPuts_[index].queued = this.connected_;\n\n this.sendRequest(action, request, (message: { [k: string]: unknown }) => {\n this.log_(action + ' response', message);\n\n delete this.outstandingPuts_[index];\n this.outstandingPutCount_--;\n\n // Clean up array occasionally.\n if (this.outstandingPutCount_ === 0) {\n this.outstandingPuts_ = [];\n }\n\n if (onComplete) {\n onComplete(\n message[/*status*/ 's'] as string,\n message[/* data */ 'd'] as string\n );\n }\n });\n }\n\n /**\n * @inheritDoc\n */\n reportStats(stats: { [k: string]: unknown }) {\n // If we're not connected, we just drop the stats.\n if (this.connected_) {\n const request = { /*counters*/ c: stats };\n this.log_('reportStats', request);\n\n this.sendRequest(/*stats*/ 's', request, result => {\n const status = result[/*status*/ 's'];\n if (status !== 'ok') {\n const errorReason = result[/* data */ 'd'];\n this.log_('reportStats', 'Error sending stats: ' + errorReason);\n }\n });\n }\n }\n\n private onDataMessage_(message: { [k: string]: unknown }) {\n if ('r' in message) {\n // this is a response\n this.log_('from server: ' + stringify(message));\n const reqNum = message['r'] as string;\n const onResponse = this.requestCBHash_[reqNum];\n if (onResponse) {\n delete this.requestCBHash_[reqNum];\n onResponse(message[/*body*/ 'b']);\n }\n } else if ('error' in message) {\n throw 'A server-side error has occurred: ' + message['error'];\n } else if ('a' in message) {\n // a and b are action and body, respectively\n this.onDataPush_(message['a'] as string, message['b'] as {});\n }\n }\n\n private onDataPush_(action: string, body: { [k: string]: unknown }) {\n this.log_('handleServerMessage', action, body);\n if (action === 'd') {\n this.onDataUpdate_(\n body[/*path*/ 'p'] as string,\n body[/*data*/ 'd'],\n /*isMerge*/ false,\n body['t'] as number\n );\n } else if (action === 'm') {\n this.onDataUpdate_(\n body[/*path*/ 'p'] as string,\n body[/*data*/ 'd'],\n /*isMerge=*/ true,\n body['t'] as number\n );\n } else if (action === 'c') {\n this.onListenRevoked_(\n body[/*path*/ 'p'] as string,\n body[/*query*/ 'q'] as unknown[]\n );\n } else if (action === 'ac') {\n this.onAuthRevoked_(\n body[/*status code*/ 's'] as string,\n body[/* explanation */ 'd'] as string\n );\n } else if (action === 'sd') {\n this.onSecurityDebugPacket_(body);\n } else {\n error(\n 'Unrecognized action received from server: ' +\n stringify(action) +\n '\\nAre you using the latest client?'\n );\n }\n }\n\n private onReady_(timestamp: number, sessionId: string) {\n this.log_('connection ready');\n this.connected_ = true;\n this.lastConnectionEstablishedTime_ = new Date().getTime();\n this.handleTimestamp_(timestamp);\n this.lastSessionId = sessionId;\n if (this.firstConnection_) {\n this.sendConnectStats_();\n }\n this.restoreState_();\n this.firstConnection_ = false;\n this.onConnectStatus_(true);\n }\n\n private scheduleConnect_(timeout: number) {\n assert(\n !this.realtime_,\n \"Scheduling a connect when we're already connected/ing?\"\n );\n\n if (this.establishConnectionTimer_) {\n clearTimeout(this.establishConnectionTimer_);\n }\n\n // NOTE: Even when timeout is 0, it's important to do a setTimeout to work around an infuriating \"Security Error\" in\n // Firefox when trying to write to our long-polling iframe in some scenarios (e.g. Forge or our unit tests).\n\n this.establishConnectionTimer_ = setTimeout(() => {\n this.establishConnectionTimer_ = null;\n this.establishConnection_();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }, Math.floor(timeout)) as any;\n }\n\n private onVisible_(visible: boolean) {\n // NOTE: Tabbing away and back to a window will defeat our reconnect backoff, but I think that's fine.\n if (\n visible &&\n !this.visible_ &&\n this.reconnectDelay_ === this.maxReconnectDelay_\n ) {\n this.log_('Window became visible. Reducing delay.');\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\n\n if (!this.realtime_) {\n this.scheduleConnect_(0);\n }\n }\n this.visible_ = visible;\n }\n\n private onOnline_(online: boolean) {\n if (online) {\n this.log_('Browser went online.');\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\n if (!this.realtime_) {\n this.scheduleConnect_(0);\n }\n } else {\n this.log_('Browser went offline. Killing connection.');\n if (this.realtime_) {\n this.realtime_.close();\n }\n }\n }\n\n private onRealtimeDisconnect_() {\n this.log_('data client disconnected');\n this.connected_ = false;\n this.realtime_ = null;\n\n // Since we don't know if our sent transactions succeeded or not, we need to cancel them.\n this.cancelSentTransactions_();\n\n // Clear out the pending requests.\n this.requestCBHash_ = {};\n\n if (this.shouldReconnect_()) {\n if (!this.visible_) {\n this.log_(\"Window isn't visible. Delaying reconnect.\");\n this.reconnectDelay_ = this.maxReconnectDelay_;\n this.lastConnectionAttemptTime_ = new Date().getTime();\n } else if (this.lastConnectionEstablishedTime_) {\n // If we've been connected long enough, reset reconnect delay to minimum.\n const timeSinceLastConnectSucceeded =\n new Date().getTime() - this.lastConnectionEstablishedTime_;\n if (timeSinceLastConnectSucceeded > RECONNECT_DELAY_RESET_TIMEOUT) {\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\n }\n this.lastConnectionEstablishedTime_ = null;\n }\n\n const timeSinceLastConnectAttempt =\n new Date().getTime() - this.lastConnectionAttemptTime_;\n let reconnectDelay = Math.max(\n 0,\n this.reconnectDelay_ - timeSinceLastConnectAttempt\n );\n reconnectDelay = Math.random() * reconnectDelay;\n\n this.log_('Trying to reconnect in ' + reconnectDelay + 'ms');\n this.scheduleConnect_(reconnectDelay);\n\n // Adjust reconnect delay for next time.\n this.reconnectDelay_ = Math.min(\n this.maxReconnectDelay_,\n this.reconnectDelay_ * RECONNECT_DELAY_MULTIPLIER\n );\n }\n this.onConnectStatus_(false);\n }\n\n private establishConnection_() {\n if (this.shouldReconnect_()) {\n this.log_('Making a connection attempt');\n this.lastConnectionAttemptTime_ = new Date().getTime();\n this.lastConnectionEstablishedTime_ = null;\n const onDataMessage = this.onDataMessage_.bind(this);\n const onReady = this.onReady_.bind(this);\n const onDisconnect = this.onRealtimeDisconnect_.bind(this);\n const connId = this.id + ':' + PersistentConnection.nextConnectionId_++;\n const self = this;\n const lastSessionId = this.lastSessionId;\n let canceled = false;\n let connection: Connection | null = null;\n const closeFn = function() {\n if (connection) {\n connection.close();\n } else {\n canceled = true;\n onDisconnect();\n }\n };\n const sendRequestFn = function(msg: object) {\n assert(\n connection,\n \"sendRequest call when we're not connected not allowed.\"\n );\n connection.sendRequest(msg);\n };\n\n this.realtime_ = {\n close: closeFn,\n sendRequest: sendRequestFn\n };\n\n const forceRefresh = this.forceTokenRefresh_;\n this.forceTokenRefresh_ = false;\n\n // First fetch auth token, and establish connection after fetching the token was successful\n this.authTokenProvider_\n .getToken(forceRefresh)\n .then(result => {\n if (!canceled) {\n log('getToken() completed. Creating connection.');\n self.authToken_ = result && result.accessToken;\n connection = new Connection(\n connId,\n self.repoInfo_,\n onDataMessage,\n onReady,\n onDisconnect,\n /* onKill= */ reason => {\n warn(reason + ' (' + self.repoInfo_.toString() + ')');\n self.interrupt(SERVER_KILL_INTERRUPT_REASON);\n },\n lastSessionId\n );\n } else {\n log('getToken() completed but was canceled');\n }\n })\n .then(null, error => {\n self.log_('Failed to get token: ' + error);\n if (!canceled) {\n if (CONSTANTS.NODE_ADMIN) {\n // This may be a critical error for the Admin Node.js SDK, so log a warning.\n // But getToken() may also just have temporarily failed, so we still want to\n // continue retrying.\n warn(error);\n }\n closeFn();\n }\n });\n }\n }\n\n interrupt(reason: string) {\n log('Interrupting connection for reason: ' + reason);\n this.interruptReasons_[reason] = true;\n if (this.realtime_) {\n this.realtime_.close();\n } else {\n if (this.establishConnectionTimer_) {\n clearTimeout(this.establishConnectionTimer_);\n this.establishConnectionTimer_ = null;\n }\n if (this.connected_) {\n this.onRealtimeDisconnect_();\n }\n }\n }\n\n resume(reason: string) {\n log('Resuming connection for reason: ' + reason);\n delete this.interruptReasons_[reason];\n if (isEmpty(this.interruptReasons_)) {\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\n if (!this.realtime_) {\n this.scheduleConnect_(0);\n }\n }\n }\n\n private handleTimestamp_(timestamp: number) {\n const delta = timestamp - new Date().getTime();\n this.onServerInfoUpdate_({ serverTimeOffset: delta });\n }\n\n private cancelSentTransactions_() {\n for (let i = 0; i < this.outstandingPuts_.length; i++) {\n const put = this.outstandingPuts_[i];\n if (put && /*hash*/ 'h' in put.request && put.queued) {\n if (put.onComplete) {\n put.onComplete('disconnect');\n }\n\n delete this.outstandingPuts_[i];\n this.outstandingPutCount_--;\n }\n }\n\n // Clean up array occasionally.\n if (this.outstandingPutCount_ === 0) {\n this.outstandingPuts_ = [];\n }\n }\n\n private onListenRevoked_(pathString: string, query?: unknown[]) {\n // Remove the listen and manufacture a \"permission_denied\" error for the failed listen.\n let queryId;\n if (!query) {\n queryId = 'default';\n } else {\n queryId = query.map(q => ObjectToUniqueKey(q)).join('$');\n }\n const listen = this.removeListen_(pathString, queryId);\n if (listen && listen.onComplete) {\n listen.onComplete('permission_denied');\n }\n }\n\n private removeListen_(pathString: string, queryId: string): ListenSpec {\n const normalizedPathString = new Path(pathString).toString(); // normalize path.\n let listen;\n if (this.listens.has(normalizedPathString)) {\n const map = this.listens.get(normalizedPathString)!;\n listen = map.get(queryId);\n map.delete(queryId);\n if (map.size === 0) {\n this.listens.delete(normalizedPathString);\n }\n } else {\n // all listens for this path has already been removed\n listen = undefined;\n }\n return listen;\n }\n\n private onAuthRevoked_(statusCode: string, explanation: string) {\n log('Auth token revoked: ' + statusCode + '/' + explanation);\n this.authToken_ = null;\n this.forceTokenRefresh_ = true;\n this.realtime_.close();\n if (statusCode === 'invalid_token' || statusCode === 'permission_denied') {\n // We'll wait a couple times before logging the warning / increasing the\n // retry period since oauth tokens will report as \"invalid\" if they're\n // just expired. Plus there may be transient issues that resolve themselves.\n this.invalidAuthTokenCount_++;\n if (this.invalidAuthTokenCount_ >= INVALID_AUTH_TOKEN_THRESHOLD) {\n // Set a long reconnect delay because recovery is unlikely\n this.reconnectDelay_ = RECONNECT_MAX_DELAY_FOR_ADMINS;\n\n // Notify the auth token provider that the token is invalid, which will log\n // a warning\n this.authTokenProvider_.notifyForInvalidToken();\n }\n }\n }\n\n private onSecurityDebugPacket_(body: { [k: string]: unknown }) {\n if (this.securityDebugCallback_) {\n this.securityDebugCallback_(body);\n } else {\n if ('msg' in body) {\n console.log(\n 'FIREBASE: ' + (body['msg'] as string).replace('\\n', '\\nFIREBASE: ')\n );\n }\n }\n }\n\n private restoreState_() {\n //Re-authenticate ourselves if we have a credential stored.\n this.tryAuth();\n\n // Puts depend on having received the corresponding data update from the server before they complete, so we must\n // make sure to send listens before puts.\n for (const queries of this.listens.values()) {\n for (const listenSpec of queries.values()) {\n this.sendListen_(listenSpec);\n }\n }\n\n for (let i = 0; i < this.outstandingPuts_.length; i++) {\n if (this.outstandingPuts_[i]) {\n this.sendPut_(i);\n }\n }\n\n while (this.onDisconnectRequestQueue_.length) {\n const request = this.onDisconnectRequestQueue_.shift();\n this.sendOnDisconnect_(\n request.action,\n request.pathString,\n request.data,\n request.onComplete\n );\n }\n }\n\n /**\n * Sends client stats for first connection\n */\n private sendConnectStats_() {\n const stats: { [k: string]: number } = {};\n\n let clientName = 'js';\n if (CONSTANTS.NODE_ADMIN) {\n clientName = 'admin_node';\n } else if (CONSTANTS.NODE_CLIENT) {\n clientName = 'node';\n }\n\n stats['sdk.' + clientName + '.' + SDK_VERSION.replace(/\\./g, '-')] = 1;\n\n if (isMobileCordova()) {\n stats['framework.cordova'] = 1;\n } else if (isReactNative()) {\n stats['framework.reactnative'] = 1;\n }\n this.reportStats(stats);\n }\n\n private shouldReconnect_(): boolean {\n const online = OnlineMonitor.getInstance().currentlyOnline();\n return isEmpty(this.interruptReasons_) && online;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, jsonEval, safeGet, querystring } from '@firebase/util';\nimport { logWrapper, warn } from './util/util';\n\nimport { ServerActions } from './ServerActions';\nimport { RepoInfo } from './RepoInfo';\nimport { AuthTokenProvider } from './AuthTokenProvider';\nimport { Query } from '../api/Query';\n\n/**\n * An implementation of ServerActions that communicates with the server via REST requests.\n * This is mostly useful for compatibility with crawlers, where we don't want to spin up a full\n * persistent connection (using WebSockets or long-polling)\n */\nexport class ReadonlyRestClient extends ServerActions {\n reportStats(stats: { [k: string]: unknown }): void {\n throw new Error('Method not implemented.');\n }\n\n /** @private {function(...[*])} */\n private log_: (...args: unknown[]) => void = logWrapper('p:rest:');\n\n /**\n * We don't actually need to track listens, except to prevent us calling an onComplete for a listen\n * that's been removed. :-/\n *\n * @private {!Object.<string, !Object>}\n */\n private listens_: { [k: string]: object } = {};\n\n /**\n * @param {!Query} query\n * @param {?number=} tag\n * @return {string}\n * @private\n */\n static getListenId_(query: Query, tag?: number | null): string {\n if (tag !== undefined) {\n return 'tag$' + tag;\n } else {\n assert(\n query.getQueryParams().isDefault(),\n \"should have a tag if it's not a default query.\"\n );\n return query.path.toString();\n }\n }\n\n /**\n * @param {!RepoInfo} repoInfo_ Data about the namespace we are connecting to\n * @param {function(string, *, boolean, ?number)} onDataUpdate_ A callback for new data from the server\n * @param {AuthTokenProvider} authTokenProvider_\n * @implements {ServerActions}\n */\n constructor(\n private repoInfo_: RepoInfo,\n private onDataUpdate_: (\n a: string,\n b: unknown,\n c: boolean,\n d: number | null\n ) => void,\n private authTokenProvider_: AuthTokenProvider\n ) {\n super();\n }\n\n /** @inheritDoc */\n listen(\n query: Query,\n currentHashFn: () => string,\n tag: number | null,\n onComplete: (a: string, b: unknown) => void\n ) {\n const pathString = query.path.toString();\n this.log_(\n 'Listen called for ' + pathString + ' ' + query.queryIdentifier()\n );\n\n // Mark this listener so we can tell if it's removed.\n const listenId = ReadonlyRestClient.getListenId_(query, tag);\n const thisListen = {};\n this.listens_[listenId] = thisListen;\n\n const queryStringParameters = query\n .getQueryParams()\n .toRestQueryStringParameters();\n\n this.restRequest_(\n pathString + '.json',\n queryStringParameters,\n (error, result) => {\n let data = result;\n\n if (error === 404) {\n data = null;\n error = null;\n }\n\n if (error === null) {\n this.onDataUpdate_(pathString, data, /*isMerge=*/ false, tag);\n }\n\n if (safeGet(this.listens_, listenId) === thisListen) {\n let status;\n if (!error) {\n status = 'ok';\n } else if (error === 401) {\n status = 'permission_denied';\n } else {\n status = 'rest_error:' + error;\n }\n\n onComplete(status, null);\n }\n }\n );\n }\n\n /** @inheritDoc */\n unlisten(query: Query, tag: number | null) {\n const listenId = ReadonlyRestClient.getListenId_(query, tag);\n delete this.listens_[listenId];\n }\n\n /** @inheritDoc */\n refreshAuthToken(token: string) {\n // no-op since we just always call getToken.\n }\n\n /**\n * Performs a REST request to the given path, with the provided query string parameters,\n * and any auth credentials we have.\n *\n * @param {!string} pathString\n * @param {!Object.<string, *>} queryStringParameters\n * @param {?function(?number, *=)} callback\n * @private\n */\n private restRequest_(\n pathString: string,\n queryStringParameters: { [k: string]: string | number } = {},\n callback: ((a: number | null, b?: unknown) => void) | null\n ) {\n queryStringParameters['format'] = 'export';\n\n this.authTokenProvider_\n .getToken(/*forceRefresh=*/ false)\n .then(authTokenData => {\n const authToken = authTokenData && authTokenData.accessToken;\n if (authToken) {\n queryStringParameters['auth'] = authToken;\n }\n\n const url =\n (this.repoInfo_.secure ? 'https://' : 'http://') +\n this.repoInfo_.host +\n pathString +\n '?' +\n 'ns=' +\n this.repoInfo_.namespace +\n querystring(queryStringParameters);\n\n this.log_('Sending REST request for ' + url);\n const xhr = new XMLHttpRequest();\n xhr.onreadystatechange = () => {\n if (callback && xhr.readyState === 4) {\n this.log_(\n 'REST Response for ' + url + ' received. status:',\n xhr.status,\n 'response:',\n xhr.responseText\n );\n let res = null;\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n res = jsonEval(xhr.responseText);\n } catch (e) {\n warn(\n 'Failed to parse JSON response for ' +\n url +\n ': ' +\n xhr.responseText\n );\n }\n callback(null, res);\n } else {\n // 401 and 404 are expected.\n if (xhr.status !== 401 && xhr.status !== 404) {\n warn(\n 'Got unsuccessful REST response for ' +\n url +\n ' Status: ' +\n xhr.status\n );\n }\n callback(xhr.status);\n }\n callback = null;\n }\n };\n\n xhr.open('GET', url, /*asynchronous=*/ true);\n xhr.send();\n });\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n generateWithValues,\n resolveDeferredValueSnapshot,\n resolveDeferredValueTree\n} from './util/ServerValues';\nimport { nodeFromJSON } from './snap/nodeFromJSON';\nimport { Path } from './util/Path';\nimport { SparseSnapshotTree } from './SparseSnapshotTree';\nimport { SyncTree } from './SyncTree';\nimport { SnapshotHolder } from './SnapshotHolder';\nimport { stringify, map, isEmpty } from '@firebase/util';\nimport { beingCrawled, each, exceptionGuard, warn, log } from './util/util';\n\nimport { AuthTokenProvider } from './AuthTokenProvider';\nimport { StatsManager } from './stats/StatsManager';\nimport { StatsReporter } from './stats/StatsReporter';\nimport { StatsListener } from './stats/StatsListener';\nimport { EventQueue } from './view/EventQueue';\nimport { PersistentConnection } from './PersistentConnection';\nimport { ReadonlyRestClient } from './ReadonlyRestClient';\nimport { FirebaseApp } from '@firebase/app-types';\nimport { RepoInfo } from './RepoInfo';\nimport { Database } from '../api/Database';\nimport { ServerActions } from './ServerActions';\nimport { Query } from '../api/Query';\nimport { EventRegistration } from './view/EventRegistration';\nimport { StatsCollection } from './stats/StatsCollection';\nimport { Event } from './view/Event';\nimport { Node } from './snap/Node';\nimport { FirebaseAuthInternalName } from '@firebase/auth-interop-types';\nimport { Provider } from '@firebase/component';\nimport { Indexable } from './util/misc';\n\nconst INTERRUPT_REASON = 'repo_interrupt';\n\n/**\n * A connection to a single data repository.\n */\nexport class Repo {\n dataUpdateCount = 0;\n private infoSyncTree_: SyncTree;\n private serverSyncTree_: SyncTree;\n\n private stats_: StatsCollection;\n private statsListener_: StatsListener | null = null;\n private eventQueue_ = new EventQueue();\n private nextWriteId_ = 1;\n private server_: ServerActions;\n private statsReporter_: StatsReporter;\n private transactionsInit_: () => void;\n private infoData_: SnapshotHolder;\n private abortTransactions_: (path: Path) => Path;\n private rerunTransactions_: (changedPath: Path) => Path;\n private interceptServerDataCallback_:\n | ((a: string, b: unknown) => void)\n | null = null;\n private __database: Database;\n\n /** A list of data pieces and paths to be set when this client disconnects. */\n private onDisconnect_ = new SparseSnapshotTree();\n\n // TODO: This should be @private but it's used by test_access.js and internal.js\n persistentConnection_: PersistentConnection | null = null;\n\n constructor(\n public repoInfo_: RepoInfo,\n forceRestClient: boolean,\n public app: FirebaseApp,\n authProvider: Provider<FirebaseAuthInternalName>\n ) {\n const authTokenProvider = new AuthTokenProvider(app, authProvider);\n\n this.stats_ = StatsManager.getCollection(repoInfo_);\n\n if (forceRestClient || beingCrawled()) {\n this.server_ = new ReadonlyRestClient(\n this.repoInfo_,\n this.onDataUpdate_.bind(this),\n authTokenProvider\n );\n\n // Minor hack: Fire onConnect immediately, since there's no actual connection.\n setTimeout(this.onConnectStatus_.bind(this, true), 0);\n } else {\n const authOverride = app.options['databaseAuthVariableOverride'];\n // Validate authOverride\n if (typeof authOverride !== 'undefined' && authOverride !== null) {\n if (typeof authOverride !== 'object') {\n throw new Error(\n 'Only objects are supported for option databaseAuthVariableOverride'\n );\n }\n try {\n stringify(authOverride);\n } catch (e) {\n throw new Error('Invalid authOverride provided: ' + e);\n }\n }\n\n this.persistentConnection_ = new PersistentConnection(\n this.repoInfo_,\n this.onDataUpdate_.bind(this),\n this.onConnectStatus_.bind(this),\n this.onServerInfoUpdate_.bind(this),\n authTokenProvider,\n authOverride\n );\n\n this.server_ = this.persistentConnection_;\n }\n\n authTokenProvider.addTokenChangeListener(token => {\n this.server_.refreshAuthToken(token);\n });\n\n // In the case of multiple Repos for the same repoInfo (i.e. there are multiple Firebase.Contexts being used),\n // we only want to create one StatsReporter. As such, we'll report stats over the first Repo created.\n this.statsReporter_ = StatsManager.getOrCreateReporter(\n repoInfo_,\n () => new StatsReporter(this.stats_, this.server_)\n );\n\n this.transactionsInit_();\n\n // Used for .info.\n this.infoData_ = new SnapshotHolder();\n this.infoSyncTree_ = new SyncTree({\n startListening: (query, tag, currentHashFn, onComplete) => {\n let infoEvents: Event[] = [];\n const node = this.infoData_.getNode(query.path);\n // This is possibly a hack, but we have different semantics for .info endpoints. We don't raise null events\n // on initial data...\n if (!node.isEmpty()) {\n infoEvents = this.infoSyncTree_.applyServerOverwrite(\n query.path,\n node\n );\n setTimeout(() => {\n onComplete('ok');\n }, 0);\n }\n return infoEvents;\n },\n stopListening: () => {}\n });\n this.updateInfo_('connected', false);\n\n this.serverSyncTree_ = new SyncTree({\n startListening: (query, tag, currentHashFn, onComplete) => {\n this.server_.listen(query, currentHashFn, tag, (status, data) => {\n const events = onComplete(status, data);\n this.eventQueue_.raiseEventsForChangedPath(query.path, events);\n });\n // No synchronous events for network-backed sync trees\n return [];\n },\n stopListening: (query, tag) => {\n this.server_.unlisten(query, tag);\n }\n });\n }\n\n /**\n * @return The URL corresponding to the root of this Firebase.\n */\n toString(): string {\n return (\n (this.repoInfo_.secure ? 'https://' : 'http://') + this.repoInfo_.host\n );\n }\n\n /**\n * @return The namespace represented by the repo.\n */\n name(): string {\n return this.repoInfo_.namespace;\n }\n\n /**\n * @return The time in milliseconds, taking the server offset into account if we have one.\n */\n serverTime(): number {\n const offsetNode = this.infoData_.getNode(\n new Path('.info/serverTimeOffset')\n );\n const offset = (offsetNode.val() as number) || 0;\n return new Date().getTime() + offset;\n }\n\n /**\n * Generate ServerValues using some variables from the repo object.\n */\n generateServerValues(): Indexable {\n return generateWithValues({\n timestamp: this.serverTime()\n });\n }\n\n /**\n * Called by realtime when we get new messages from the server.\n */\n private onDataUpdate_(\n pathString: string,\n data: unknown,\n isMerge: boolean,\n tag: number | null\n ) {\n // For testing.\n this.dataUpdateCount++;\n const path = new Path(pathString);\n data = this.interceptServerDataCallback_\n ? this.interceptServerDataCallback_(pathString, data)\n : data;\n let events = [];\n if (tag) {\n if (isMerge) {\n const taggedChildren = map(\n data as { [k: string]: unknown },\n (raw: unknown) => nodeFromJSON(raw)\n );\n events = this.serverSyncTree_.applyTaggedQueryMerge(\n path,\n taggedChildren,\n tag\n );\n } else {\n const taggedSnap = nodeFromJSON(data);\n events = this.serverSyncTree_.applyTaggedQueryOverwrite(\n path,\n taggedSnap,\n tag\n );\n }\n } else if (isMerge) {\n const changedChildren = map(\n data as { [k: string]: unknown },\n (raw: unknown) => nodeFromJSON(raw)\n );\n events = this.serverSyncTree_.applyServerMerge(path, changedChildren);\n } else {\n const snap = nodeFromJSON(data);\n events = this.serverSyncTree_.applyServerOverwrite(path, snap);\n }\n let affectedPath = path;\n if (events.length > 0) {\n // Since we have a listener outstanding for each transaction, receiving any events\n // is a proxy for some change having occurred.\n affectedPath = this.rerunTransactions_(path);\n }\n this.eventQueue_.raiseEventsForChangedPath(affectedPath, events);\n }\n\n // TODO: This should be @private but it's used by test_access.js and internal.js\n interceptServerData_(callback: ((a: string, b: unknown) => unknown) | null) {\n this.interceptServerDataCallback_ = callback;\n }\n\n private onConnectStatus_(connectStatus: boolean) {\n this.updateInfo_('connected', connectStatus);\n if (connectStatus === false) {\n this.runOnDisconnectEvents_();\n }\n }\n\n private onServerInfoUpdate_(updates: object) {\n each(updates, (key: string, value: unknown) => {\n this.updateInfo_(key, value);\n });\n }\n\n private updateInfo_(pathString: string, value: unknown) {\n const path = new Path('/.info/' + pathString);\n const newNode = nodeFromJSON(value);\n this.infoData_.updateSnapshot(path, newNode);\n const events = this.infoSyncTree_.applyServerOverwrite(path, newNode);\n this.eventQueue_.raiseEventsForChangedPath(path, events);\n }\n\n private getNextWriteId_(): number {\n return this.nextWriteId_++;\n }\n\n setWithPriority(\n path: Path,\n newVal: unknown,\n newPriority: number | string | null,\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n ) {\n this.log_('set', {\n path: path.toString(),\n value: newVal,\n priority: newPriority\n });\n\n // TODO: Optimize this behavior to either (a) store flag to skip resolving where possible and / or\n // (b) store unresolved paths on JSON parse\n const serverValues = this.generateServerValues();\n const newNodeUnresolved = nodeFromJSON(newVal, newPriority);\n const existing = this.serverSyncTree_.calcCompleteEventCache(path);\n const newNode = resolveDeferredValueSnapshot(\n newNodeUnresolved,\n existing,\n serverValues\n );\n\n const writeId = this.getNextWriteId_();\n const events = this.serverSyncTree_.applyUserOverwrite(\n path,\n newNode,\n writeId,\n true\n );\n this.eventQueue_.queueEvents(events);\n this.server_.put(\n path.toString(),\n newNodeUnresolved.val(/*export=*/ true),\n (status, errorReason) => {\n const success = status === 'ok';\n if (!success) {\n warn('set at ' + path + ' failed: ' + status);\n }\n\n const clearEvents = this.serverSyncTree_.ackUserWrite(\n writeId,\n !success\n );\n this.eventQueue_.raiseEventsForChangedPath(path, clearEvents);\n this.callOnCompleteCallback(onComplete, status, errorReason);\n }\n );\n const affectedPath = this.abortTransactions_(path);\n this.rerunTransactions_(affectedPath);\n // We queued the events above, so just flush the queue here\n this.eventQueue_.raiseEventsForChangedPath(affectedPath, []);\n }\n\n update(\n path: Path,\n childrenToMerge: { [k: string]: unknown },\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n ) {\n this.log_('update', { path: path.toString(), value: childrenToMerge });\n\n // Start with our existing data and merge each child into it.\n let empty = true;\n const serverValues = this.generateServerValues();\n const changedChildren: { [k: string]: Node } = {};\n each(childrenToMerge, (changedKey: string, changedValue: unknown) => {\n empty = false;\n changedChildren[changedKey] = resolveDeferredValueTree(\n path.child(changedKey),\n nodeFromJSON(changedValue),\n this.serverSyncTree_,\n serverValues\n );\n });\n\n if (!empty) {\n const writeId = this.getNextWriteId_();\n const events = this.serverSyncTree_.applyUserMerge(\n path,\n changedChildren,\n writeId\n );\n this.eventQueue_.queueEvents(events);\n this.server_.merge(\n path.toString(),\n childrenToMerge,\n (status, errorReason) => {\n const success = status === 'ok';\n if (!success) {\n warn('update at ' + path + ' failed: ' + status);\n }\n\n const clearEvents = this.serverSyncTree_.ackUserWrite(\n writeId,\n !success\n );\n const affectedPath =\n clearEvents.length > 0 ? this.rerunTransactions_(path) : path;\n this.eventQueue_.raiseEventsForChangedPath(affectedPath, clearEvents);\n this.callOnCompleteCallback(onComplete, status, errorReason);\n }\n );\n\n each(childrenToMerge, (changedPath: string) => {\n const affectedPath = this.abortTransactions_(path.child(changedPath));\n this.rerunTransactions_(affectedPath);\n });\n\n // We queued the events above, so just flush the queue here\n this.eventQueue_.raiseEventsForChangedPath(path, []);\n } else {\n log(\"update() called with empty data. Don't do anything.\");\n this.callOnCompleteCallback(onComplete, 'ok');\n }\n }\n\n /**\n * Applies all of the changes stored up in the onDisconnect_ tree.\n */\n private runOnDisconnectEvents_() {\n this.log_('onDisconnectEvents');\n\n const serverValues = this.generateServerValues();\n const resolvedOnDisconnectTree = new SparseSnapshotTree();\n this.onDisconnect_.forEachTree(Path.Empty, (path, node) => {\n const resolved = resolveDeferredValueTree(\n path,\n node,\n this.serverSyncTree_,\n serverValues\n );\n resolvedOnDisconnectTree.remember(path, resolved);\n });\n let events: Event[] = [];\n\n resolvedOnDisconnectTree.forEachTree(Path.Empty, (path, snap) => {\n events = events.concat(\n this.serverSyncTree_.applyServerOverwrite(path, snap)\n );\n const affectedPath = this.abortTransactions_(path);\n this.rerunTransactions_(affectedPath);\n });\n\n this.onDisconnect_ = new SparseSnapshotTree();\n this.eventQueue_.raiseEventsForChangedPath(Path.Empty, events);\n }\n\n onDisconnectCancel(\n path: Path,\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n ) {\n this.server_.onDisconnectCancel(path.toString(), (status, errorReason) => {\n if (status === 'ok') {\n this.onDisconnect_.forget(path);\n }\n this.callOnCompleteCallback(onComplete, status, errorReason);\n });\n }\n\n onDisconnectSet(\n path: Path,\n value: unknown,\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n ) {\n const newNode = nodeFromJSON(value);\n this.server_.onDisconnectPut(\n path.toString(),\n newNode.val(/*export=*/ true),\n (status, errorReason) => {\n if (status === 'ok') {\n this.onDisconnect_.remember(path, newNode);\n }\n this.callOnCompleteCallback(onComplete, status, errorReason);\n }\n );\n }\n\n onDisconnectSetWithPriority(\n path: Path,\n value: unknown,\n priority: unknown,\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n ) {\n const newNode = nodeFromJSON(value, priority);\n this.server_.onDisconnectPut(\n path.toString(),\n newNode.val(/*export=*/ true),\n (status, errorReason) => {\n if (status === 'ok') {\n this.onDisconnect_.remember(path, newNode);\n }\n this.callOnCompleteCallback(onComplete, status, errorReason);\n }\n );\n }\n\n onDisconnectUpdate(\n path: Path,\n childrenToMerge: { [k: string]: unknown },\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n ) {\n if (isEmpty(childrenToMerge)) {\n log(\n \"onDisconnect().update() called with empty data. Don't do anything.\"\n );\n this.callOnCompleteCallback(onComplete, 'ok');\n return;\n }\n\n this.server_.onDisconnectMerge(\n path.toString(),\n childrenToMerge,\n (status, errorReason) => {\n if (status === 'ok') {\n each(childrenToMerge, (childName: string, childNode: unknown) => {\n const newChildNode = nodeFromJSON(childNode);\n this.onDisconnect_.remember(path.child(childName), newChildNode);\n });\n }\n this.callOnCompleteCallback(onComplete, status, errorReason);\n }\n );\n }\n\n addEventCallbackForQuery(query: Query, eventRegistration: EventRegistration) {\n let events;\n if (query.path.getFront() === '.info') {\n events = this.infoSyncTree_.addEventRegistration(\n query,\n eventRegistration\n );\n } else {\n events = this.serverSyncTree_.addEventRegistration(\n query,\n eventRegistration\n );\n }\n this.eventQueue_.raiseEventsAtPath(query.path, events);\n }\n\n removeEventCallbackForQuery(\n query: Query,\n eventRegistration: EventRegistration\n ) {\n // These are guaranteed not to raise events, since we're not passing in a cancelError. However, we can future-proof\n // a little bit by handling the return values anyways.\n let events;\n if (query.path.getFront() === '.info') {\n events = this.infoSyncTree_.removeEventRegistration(\n query,\n eventRegistration\n );\n } else {\n events = this.serverSyncTree_.removeEventRegistration(\n query,\n eventRegistration\n );\n }\n this.eventQueue_.raiseEventsAtPath(query.path, events);\n }\n\n interrupt() {\n if (this.persistentConnection_) {\n this.persistentConnection_.interrupt(INTERRUPT_REASON);\n }\n }\n\n resume() {\n if (this.persistentConnection_) {\n this.persistentConnection_.resume(INTERRUPT_REASON);\n }\n }\n\n stats(showDelta: boolean = false) {\n if (typeof console === 'undefined') {\n return;\n }\n\n let stats: { [k: string]: unknown };\n if (showDelta) {\n if (!this.statsListener_) {\n this.statsListener_ = new StatsListener(this.stats_);\n }\n stats = this.statsListener_.get();\n } else {\n stats = this.stats_.get();\n }\n\n const longestName = Object.keys(stats).reduce(\n (previousValue, currentValue) =>\n Math.max(currentValue.length, previousValue),\n 0\n );\n\n each(stats, (stat: string, value: unknown) => {\n let paddedStat = stat;\n // pad stat names to be the same length (plus 2 extra spaces).\n for (let i = stat.length; i < longestName + 2; i++) {\n paddedStat += ' ';\n }\n console.log(paddedStat + value);\n });\n }\n\n statsIncrementCounter(metric: string) {\n this.stats_.incrementCounter(metric);\n this.statsReporter_.includeStat(metric);\n }\n\n private log_(...varArgs: unknown[]) {\n let prefix = '';\n if (this.persistentConnection_) {\n prefix = this.persistentConnection_.id + ':';\n }\n log(prefix, ...varArgs);\n }\n\n callOnCompleteCallback(\n callback: ((status: Error | null, errorReason?: string) => void) | null,\n status: string,\n errorReason?: string | null\n ) {\n if (callback) {\n exceptionGuard(() => {\n if (status === 'ok') {\n callback(null);\n } else {\n const code = (status || 'error').toUpperCase();\n let message = code;\n if (errorReason) {\n message += ': ' + errorReason;\n }\n\n const error = new Error(message);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).code = code;\n callback(error);\n }\n });\n }\n }\n\n get database(): Database {\n return this.__database || (this.__database = new Database(this));\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { IndexedFilter } from './IndexedFilter';\nimport { PRIORITY_INDEX } from '../../snap/indexes/PriorityIndex';\nimport { NamedNode, Node } from '../../../core/snap/Node';\nimport { ChildrenNode } from '../../snap/ChildrenNode';\nimport { NodeFilter } from './NodeFilter';\nimport { QueryParams } from '../QueryParams';\nimport { Index } from '../../snap/indexes/Index';\nimport { Path } from '../../util/Path';\nimport { CompleteChildSource } from '../CompleteChildSource';\nimport { ChildChangeAccumulator } from '../ChildChangeAccumulator';\n\n/**\n * Filters nodes by range and uses an IndexFilter to track any changes after filtering the node\n *\n * @constructor\n * @implements {NodeFilter}\n */\nexport class RangedFilter implements NodeFilter {\n /**\n * @type {!IndexedFilter}\n * @const\n * @private\n */\n private indexedFilter_: IndexedFilter;\n\n /**\n * @const\n * @type {!Index}\n * @private\n */\n private index_: Index;\n\n /**\n * @const\n * @type {!NamedNode}\n * @private\n */\n private startPost_: NamedNode;\n\n /**\n * @const\n * @type {!NamedNode}\n * @private\n */\n private endPost_: NamedNode;\n\n /**\n * @param {!QueryParams} params\n */\n constructor(params: QueryParams) {\n this.indexedFilter_ = new IndexedFilter(params.getIndex());\n this.index_ = params.getIndex();\n this.startPost_ = RangedFilter.getStartPost_(params);\n this.endPost_ = RangedFilter.getEndPost_(params);\n }\n\n /**\n * @return {!NamedNode}\n */\n getStartPost(): NamedNode {\n return this.startPost_;\n }\n\n /**\n * @return {!NamedNode}\n */\n getEndPost(): NamedNode {\n return this.endPost_;\n }\n\n /**\n * @param {!NamedNode} node\n * @return {boolean}\n */\n matches(node: NamedNode): boolean {\n return (\n this.index_.compare(this.getStartPost(), node) <= 0 &&\n this.index_.compare(node, this.getEndPost()) <= 0\n );\n }\n\n /**\n * @inheritDoc\n */\n updateChild(\n snap: Node,\n key: string,\n newChild: Node,\n affectedPath: Path,\n source: CompleteChildSource,\n optChangeAccumulator: ChildChangeAccumulator | null\n ): Node {\n if (!this.matches(new NamedNode(key, newChild))) {\n newChild = ChildrenNode.EMPTY_NODE;\n }\n return this.indexedFilter_.updateChild(\n snap,\n key,\n newChild,\n affectedPath,\n source,\n optChangeAccumulator\n );\n }\n\n /**\n * @inheritDoc\n */\n updateFullNode(\n oldSnap: Node,\n newSnap: Node,\n optChangeAccumulator: ChildChangeAccumulator | null\n ): Node {\n if (newSnap.isLeafNode()) {\n // Make sure we have a children node with the correct index, not a leaf node;\n newSnap = ChildrenNode.EMPTY_NODE;\n }\n let filtered = newSnap.withIndex(this.index_);\n // Don't support priorities on queries\n filtered = filtered.updatePriority(ChildrenNode.EMPTY_NODE);\n const self = this;\n newSnap.forEachChild(PRIORITY_INDEX, (key, childNode) => {\n if (!self.matches(new NamedNode(key, childNode))) {\n filtered = filtered.updateImmediateChild(key, ChildrenNode.EMPTY_NODE);\n }\n });\n return this.indexedFilter_.updateFullNode(\n oldSnap,\n filtered,\n optChangeAccumulator\n );\n }\n\n /**\n * @inheritDoc\n */\n updatePriority(oldSnap: Node, newPriority: Node): Node {\n // Don't support priorities on queries\n return oldSnap;\n }\n\n /**\n * @inheritDoc\n */\n filtersNodes(): boolean {\n return true;\n }\n\n /**\n * @inheritDoc\n */\n getIndexedFilter(): IndexedFilter {\n return this.indexedFilter_;\n }\n\n /**\n * @inheritDoc\n */\n getIndex(): Index {\n return this.index_;\n }\n\n /**\n * @param {!QueryParams} params\n * @return {!NamedNode}\n * @private\n */\n private static getStartPost_(params: QueryParams): NamedNode {\n if (params.hasStart()) {\n const startName = params.getIndexStartName();\n return params.getIndex().makePost(params.getIndexStartValue(), startName);\n } else {\n return params.getIndex().minPost();\n }\n }\n\n /**\n * @param {!QueryParams} params\n * @return {!NamedNode}\n * @private\n */\n private static getEndPost_(params: QueryParams): NamedNode {\n if (params.hasEnd()) {\n const endName = params.getIndexEndName();\n return params.getIndex().makePost(params.getIndexEndValue(), endName);\n } else {\n return params.getIndex().maxPost();\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RangedFilter } from './RangedFilter';\nimport { ChildrenNode } from '../../snap/ChildrenNode';\nimport { Node, NamedNode } from '../../snap/Node';\nimport { assert } from '@firebase/util';\nimport { Change } from '../Change';\nimport { NodeFilter } from './NodeFilter';\nimport { Index } from '../../snap/indexes/Index';\nimport { IndexedFilter } from './IndexedFilter';\nimport { QueryParams } from '../QueryParams';\nimport { Path } from '../../util/Path';\nimport { CompleteChildSource } from '../CompleteChildSource';\nimport { ChildChangeAccumulator } from '../ChildChangeAccumulator';\n\n/**\n * Applies a limit and a range to a node and uses RangedFilter to do the heavy lifting where possible\n *\n * @constructor\n * @implements {NodeFilter}\n */\nexport class LimitedFilter implements NodeFilter {\n /**\n * @const\n * @type {RangedFilter}\n * @private\n */\n private readonly rangedFilter_: RangedFilter;\n\n /**\n * @const\n * @type {!Index}\n * @private\n */\n private readonly index_: Index;\n\n /**\n * @const\n * @type {number}\n * @private\n */\n private readonly limit_: number;\n\n /**\n * @const\n * @type {boolean}\n * @private\n */\n private readonly reverse_: boolean;\n\n /**\n * @param {!QueryParams} params\n */\n constructor(params: QueryParams) {\n this.rangedFilter_ = new RangedFilter(params);\n this.index_ = params.getIndex();\n this.limit_ = params.getLimit();\n this.reverse_ = !params.isViewFromLeft();\n }\n\n /**\n * @inheritDoc\n */\n updateChild(\n snap: Node,\n key: string,\n newChild: Node,\n affectedPath: Path,\n source: CompleteChildSource,\n optChangeAccumulator: ChildChangeAccumulator | null\n ): Node {\n if (!this.rangedFilter_.matches(new NamedNode(key, newChild))) {\n newChild = ChildrenNode.EMPTY_NODE;\n }\n if (snap.getImmediateChild(key).equals(newChild)) {\n // No change\n return snap;\n } else if (snap.numChildren() < this.limit_) {\n return this.rangedFilter_\n .getIndexedFilter()\n .updateChild(\n snap,\n key,\n newChild,\n affectedPath,\n source,\n optChangeAccumulator\n );\n } else {\n return this.fullLimitUpdateChild_(\n snap,\n key,\n newChild,\n source,\n optChangeAccumulator\n );\n }\n }\n\n /**\n * @inheritDoc\n */\n updateFullNode(\n oldSnap: Node,\n newSnap: Node,\n optChangeAccumulator: ChildChangeAccumulator | null\n ): Node {\n let filtered;\n if (newSnap.isLeafNode() || newSnap.isEmpty()) {\n // Make sure we have a children node with the correct index, not a leaf node;\n filtered = ChildrenNode.EMPTY_NODE.withIndex(this.index_);\n } else {\n if (\n this.limit_ * 2 < newSnap.numChildren() &&\n newSnap.isIndexed(this.index_)\n ) {\n // Easier to build up a snapshot, since what we're given has more than twice the elements we want\n filtered = ChildrenNode.EMPTY_NODE.withIndex(this.index_);\n // anchor to the startPost, endPost, or last element as appropriate\n let iterator;\n if (this.reverse_) {\n iterator = (newSnap as ChildrenNode).getReverseIteratorFrom(\n this.rangedFilter_.getEndPost(),\n this.index_\n );\n } else {\n iterator = (newSnap as ChildrenNode).getIteratorFrom(\n this.rangedFilter_.getStartPost(),\n this.index_\n );\n }\n let count = 0;\n while (iterator.hasNext() && count < this.limit_) {\n const next = iterator.getNext();\n let inRange;\n if (this.reverse_) {\n inRange =\n this.index_.compare(this.rangedFilter_.getStartPost(), next) <= 0;\n } else {\n inRange =\n this.index_.compare(next, this.rangedFilter_.getEndPost()) <= 0;\n }\n if (inRange) {\n filtered = filtered.updateImmediateChild(next.name, next.node);\n count++;\n } else {\n // if we have reached the end post, we cannot keep adding elemments\n break;\n }\n }\n } else {\n // The snap contains less than twice the limit. Faster to delete from the snap than build up a new one\n filtered = newSnap.withIndex(this.index_);\n // Don't support priorities on queries\n filtered = filtered.updatePriority(\n ChildrenNode.EMPTY_NODE\n ) as ChildrenNode;\n let startPost;\n let endPost;\n let cmp;\n let iterator;\n if (this.reverse_) {\n iterator = filtered.getReverseIterator(this.index_);\n startPost = this.rangedFilter_.getEndPost();\n endPost = this.rangedFilter_.getStartPost();\n const indexCompare = this.index_.getCompare();\n cmp = (a: NamedNode, b: NamedNode) => indexCompare(b, a);\n } else {\n iterator = filtered.getIterator(this.index_);\n startPost = this.rangedFilter_.getStartPost();\n endPost = this.rangedFilter_.getEndPost();\n cmp = this.index_.getCompare();\n }\n\n let count = 0;\n let foundStartPost = false;\n while (iterator.hasNext()) {\n const next = iterator.getNext();\n if (!foundStartPost && cmp(startPost, next) <= 0) {\n // start adding\n foundStartPost = true;\n }\n const inRange =\n foundStartPost && count < this.limit_ && cmp(next, endPost) <= 0;\n if (inRange) {\n count++;\n } else {\n filtered = filtered.updateImmediateChild(\n next.name,\n ChildrenNode.EMPTY_NODE\n );\n }\n }\n }\n }\n return this.rangedFilter_\n .getIndexedFilter()\n .updateFullNode(oldSnap, filtered, optChangeAccumulator);\n }\n\n /**\n * @inheritDoc\n */\n updatePriority(oldSnap: Node, newPriority: Node): Node {\n // Don't support priorities on queries\n return oldSnap;\n }\n\n /**\n * @inheritDoc\n */\n filtersNodes(): boolean {\n return true;\n }\n\n /**\n * @inheritDoc\n */\n getIndexedFilter(): IndexedFilter {\n return this.rangedFilter_.getIndexedFilter();\n }\n\n /**\n * @inheritDoc\n */\n getIndex(): Index {\n return this.index_;\n }\n\n /**\n * @param {!Node} snap\n * @param {string} childKey\n * @param {!Node} childSnap\n * @param {!CompleteChildSource} source\n * @param {?ChildChangeAccumulator} changeAccumulator\n * @return {!Node}\n * @private\n */\n private fullLimitUpdateChild_(\n snap: Node,\n childKey: string,\n childSnap: Node,\n source: CompleteChildSource,\n changeAccumulator: ChildChangeAccumulator | null\n ): Node {\n // TODO: rename all cache stuff etc to general snap terminology\n let cmp;\n if (this.reverse_) {\n const indexCmp = this.index_.getCompare();\n cmp = (a: NamedNode, b: NamedNode) => indexCmp(b, a);\n } else {\n cmp = this.index_.getCompare();\n }\n const oldEventCache = snap as ChildrenNode;\n assert(oldEventCache.numChildren() === this.limit_, '');\n const newChildNamedNode = new NamedNode(childKey, childSnap);\n const windowBoundary = this.reverse_\n ? oldEventCache.getFirstChild(this.index_)\n : (oldEventCache.getLastChild(this.index_) as NamedNode);\n const inRange = this.rangedFilter_.matches(newChildNamedNode);\n if (oldEventCache.hasChild(childKey)) {\n const oldChildSnap = oldEventCache.getImmediateChild(childKey);\n let nextChild = source.getChildAfterChild(\n this.index_,\n windowBoundary,\n this.reverse_\n );\n while (\n nextChild != null &&\n (nextChild.name === childKey || oldEventCache.hasChild(nextChild.name))\n ) {\n // There is a weird edge case where a node is updated as part of a merge in the write tree, but hasn't\n // been applied to the limited filter yet. Ignore this next child which will be updated later in\n // the limited filter...\n nextChild = source.getChildAfterChild(\n this.index_,\n nextChild,\n this.reverse_\n );\n }\n const compareNext =\n nextChild == null ? 1 : cmp(nextChild, newChildNamedNode);\n const remainsInWindow =\n inRange && !childSnap.isEmpty() && compareNext >= 0;\n if (remainsInWindow) {\n if (changeAccumulator != null) {\n changeAccumulator.trackChildChange(\n Change.childChangedChange(childKey, childSnap, oldChildSnap)\n );\n }\n return oldEventCache.updateImmediateChild(childKey, childSnap);\n } else {\n if (changeAccumulator != null) {\n changeAccumulator.trackChildChange(\n Change.childRemovedChange(childKey, oldChildSnap)\n );\n }\n const newEventCache = oldEventCache.updateImmediateChild(\n childKey,\n ChildrenNode.EMPTY_NODE\n );\n const nextChildInRange =\n nextChild != null && this.rangedFilter_.matches(nextChild);\n if (nextChildInRange) {\n if (changeAccumulator != null) {\n changeAccumulator.trackChildChange(\n Change.childAddedChange(nextChild.name, nextChild.node)\n );\n }\n return newEventCache.updateImmediateChild(\n nextChild.name,\n nextChild.node\n );\n } else {\n return newEventCache;\n }\n }\n } else if (childSnap.isEmpty()) {\n // we're deleting a node, but it was not in the window, so ignore it\n return snap;\n } else if (inRange) {\n if (cmp(windowBoundary, newChildNamedNode) >= 0) {\n if (changeAccumulator != null) {\n changeAccumulator.trackChildChange(\n Change.childRemovedChange(windowBoundary.name, windowBoundary.node)\n );\n changeAccumulator.trackChildChange(\n Change.childAddedChange(childKey, childSnap)\n );\n }\n return oldEventCache\n .updateImmediateChild(childKey, childSnap)\n .updateImmediateChild(windowBoundary.name, ChildrenNode.EMPTY_NODE);\n } else {\n return snap;\n }\n } else {\n return snap;\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, stringify } from '@firebase/util';\nimport { MIN_NAME, MAX_NAME } from '../util/util';\nimport { KEY_INDEX } from '../snap/indexes/KeyIndex';\nimport { PRIORITY_INDEX } from '../snap/indexes/PriorityIndex';\nimport { VALUE_INDEX } from '../snap/indexes/ValueIndex';\nimport { PathIndex } from '../snap/indexes/PathIndex';\nimport { IndexedFilter } from './filter/IndexedFilter';\nimport { LimitedFilter } from './filter/LimitedFilter';\nimport { RangedFilter } from './filter/RangedFilter';\nimport { NodeFilter } from './filter/NodeFilter';\nimport { Index } from '../snap/indexes/Index';\n\n/**\n * This class is an immutable-from-the-public-api struct containing a set of query parameters defining a\n * range to be returned for a particular location. It is assumed that validation of parameters is done at the\n * user-facing API level, so it is not done here.\n * @constructor\n */\nexport class QueryParams {\n private limitSet_ = false;\n private startSet_ = false;\n private startNameSet_ = false;\n private endSet_ = false;\n private endNameSet_ = false;\n\n private limit_ = 0;\n private viewFrom_ = '';\n private indexStartValue_: unknown | null = null;\n private indexStartName_ = '';\n private indexEndValue_: unknown | null = null;\n private indexEndName_ = '';\n\n private index_ = PRIORITY_INDEX;\n\n /**\n * Wire Protocol Constants\n * @const\n * @enum {string}\n * @private\n */\n private static readonly WIRE_PROTOCOL_CONSTANTS_ = {\n INDEX_START_VALUE: 'sp',\n INDEX_START_NAME: 'sn',\n INDEX_END_VALUE: 'ep',\n INDEX_END_NAME: 'en',\n LIMIT: 'l',\n VIEW_FROM: 'vf',\n VIEW_FROM_LEFT: 'l',\n VIEW_FROM_RIGHT: 'r',\n INDEX: 'i'\n };\n\n /**\n * REST Query Constants\n * @const\n * @enum {string}\n * @private\n */\n private static readonly REST_QUERY_CONSTANTS_ = {\n ORDER_BY: 'orderBy',\n PRIORITY_INDEX: '$priority',\n VALUE_INDEX: '$value',\n KEY_INDEX: '$key',\n START_AT: 'startAt',\n END_AT: 'endAt',\n LIMIT_TO_FIRST: 'limitToFirst',\n LIMIT_TO_LAST: 'limitToLast'\n };\n\n /**\n * Default, empty query parameters\n * @type {!QueryParams}\n * @const\n */\n static readonly DEFAULT = new QueryParams();\n\n /**\n * @return {boolean}\n */\n hasStart(): boolean {\n return this.startSet_;\n }\n\n /**\n * @return {boolean} True if it would return from left.\n */\n isViewFromLeft(): boolean {\n if (this.viewFrom_ === '') {\n // limit(), rather than limitToFirst or limitToLast was called.\n // This means that only one of startSet_ and endSet_ is true. Use them\n // to calculate which side of the view to anchor to. If neither is set,\n // anchor to the end.\n return this.startSet_;\n } else {\n return (\n this.viewFrom_ === QueryParams.WIRE_PROTOCOL_CONSTANTS_.VIEW_FROM_LEFT\n );\n }\n }\n\n /**\n * Only valid to call if hasStart() returns true\n * @return {*}\n */\n getIndexStartValue(): unknown {\n assert(this.startSet_, 'Only valid if start has been set');\n return this.indexStartValue_;\n }\n\n /**\n * Only valid to call if hasStart() returns true.\n * Returns the starting key name for the range defined by these query parameters\n * @return {!string}\n */\n getIndexStartName(): string {\n assert(this.startSet_, 'Only valid if start has been set');\n if (this.startNameSet_) {\n return this.indexStartName_;\n } else {\n return MIN_NAME;\n }\n }\n\n /**\n * @return {boolean}\n */\n hasEnd(): boolean {\n return this.endSet_;\n }\n\n /**\n * Only valid to call if hasEnd() returns true.\n * @return {*}\n */\n getIndexEndValue(): unknown {\n assert(this.endSet_, 'Only valid if end has been set');\n return this.indexEndValue_;\n }\n\n /**\n * Only valid to call if hasEnd() returns true.\n * Returns the end key name for the range defined by these query parameters\n * @return {!string}\n */\n getIndexEndName(): string {\n assert(this.endSet_, 'Only valid if end has been set');\n if (this.endNameSet_) {\n return this.indexEndName_;\n } else {\n return MAX_NAME;\n }\n }\n\n /**\n * @return {boolean}\n */\n hasLimit(): boolean {\n return this.limitSet_;\n }\n\n /**\n * @return {boolean} True if a limit has been set and it has been explicitly anchored\n */\n hasAnchoredLimit(): boolean {\n return this.limitSet_ && this.viewFrom_ !== '';\n }\n\n /**\n * Only valid to call if hasLimit() returns true\n * @return {!number}\n */\n getLimit(): number {\n assert(this.limitSet_, 'Only valid if limit has been set');\n return this.limit_;\n }\n\n /**\n * @return {!Index}\n */\n getIndex(): Index {\n return this.index_;\n }\n\n /**\n * @return {!QueryParams}\n * @private\n */\n private copy_(): QueryParams {\n const copy = new QueryParams();\n copy.limitSet_ = this.limitSet_;\n copy.limit_ = this.limit_;\n copy.startSet_ = this.startSet_;\n copy.indexStartValue_ = this.indexStartValue_;\n copy.startNameSet_ = this.startNameSet_;\n copy.indexStartName_ = this.indexStartName_;\n copy.endSet_ = this.endSet_;\n copy.indexEndValue_ = this.indexEndValue_;\n copy.endNameSet_ = this.endNameSet_;\n copy.indexEndName_ = this.indexEndName_;\n copy.index_ = this.index_;\n copy.viewFrom_ = this.viewFrom_;\n return copy;\n }\n\n /**\n * @param {!number} newLimit\n * @return {!QueryParams}\n */\n limit(newLimit: number): QueryParams {\n const newParams = this.copy_();\n newParams.limitSet_ = true;\n newParams.limit_ = newLimit;\n newParams.viewFrom_ = '';\n return newParams;\n }\n\n /**\n * @param {!number} newLimit\n * @return {!QueryParams}\n */\n limitToFirst(newLimit: number): QueryParams {\n const newParams = this.copy_();\n newParams.limitSet_ = true;\n newParams.limit_ = newLimit;\n newParams.viewFrom_ = QueryParams.WIRE_PROTOCOL_CONSTANTS_.VIEW_FROM_LEFT;\n return newParams;\n }\n\n /**\n * @param {!number} newLimit\n * @return {!QueryParams}\n */\n limitToLast(newLimit: number): QueryParams {\n const newParams = this.copy_();\n newParams.limitSet_ = true;\n newParams.limit_ = newLimit;\n newParams.viewFrom_ = QueryParams.WIRE_PROTOCOL_CONSTANTS_.VIEW_FROM_RIGHT;\n return newParams;\n }\n\n /**\n * @param {*} indexValue\n * @param {?string=} key\n * @return {!QueryParams}\n */\n startAt(indexValue: unknown, key?: string | null): QueryParams {\n const newParams = this.copy_();\n newParams.startSet_ = true;\n if (indexValue === undefined) {\n indexValue = null;\n }\n newParams.indexStartValue_ = indexValue;\n if (key != null) {\n newParams.startNameSet_ = true;\n newParams.indexStartName_ = key;\n } else {\n newParams.startNameSet_ = false;\n newParams.indexStartName_ = '';\n }\n return newParams;\n }\n\n /**\n * @param {*} indexValue\n * @param {?string=} key\n * @return {!QueryParams}\n */\n endAt(indexValue: unknown, key?: string | null): QueryParams {\n const newParams = this.copy_();\n newParams.endSet_ = true;\n if (indexValue === undefined) {\n indexValue = null;\n }\n newParams.indexEndValue_ = indexValue;\n if (key !== undefined) {\n newParams.endNameSet_ = true;\n newParams.indexEndName_ = key;\n } else {\n newParams.endNameSet_ = false;\n newParams.indexEndName_ = '';\n }\n return newParams;\n }\n\n /**\n * @param {!Index} index\n * @return {!QueryParams}\n */\n orderBy(index: Index): QueryParams {\n const newParams = this.copy_();\n newParams.index_ = index;\n return newParams;\n }\n\n /**\n * @return {!Object}\n */\n getQueryObject(): {} {\n const WIRE_PROTOCOL_CONSTANTS = QueryParams.WIRE_PROTOCOL_CONSTANTS_;\n const obj: { [k: string]: unknown } = {};\n if (this.startSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_VALUE] = this.indexStartValue_;\n if (this.startNameSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_NAME] = this.indexStartName_;\n }\n }\n if (this.endSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_VALUE] = this.indexEndValue_;\n if (this.endNameSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_NAME] = this.indexEndName_;\n }\n }\n if (this.limitSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.LIMIT] = this.limit_;\n let viewFrom = this.viewFrom_;\n if (viewFrom === '') {\n if (this.isViewFromLeft()) {\n viewFrom = WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_LEFT;\n } else {\n viewFrom = WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_RIGHT;\n }\n }\n obj[WIRE_PROTOCOL_CONSTANTS.VIEW_FROM] = viewFrom;\n }\n // For now, priority index is the default, so we only specify if it's some other index\n if (this.index_ !== PRIORITY_INDEX) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX] = this.index_.toString();\n }\n return obj;\n }\n\n /**\n * @return {boolean}\n */\n loadsAllData(): boolean {\n return !(this.startSet_ || this.endSet_ || this.limitSet_);\n }\n\n /**\n * @return {boolean}\n */\n isDefault(): boolean {\n return this.loadsAllData() && this.index_ === PRIORITY_INDEX;\n }\n\n /**\n * @return {!NodeFilter}\n */\n getNodeFilter(): NodeFilter {\n if (this.loadsAllData()) {\n return new IndexedFilter(this.getIndex());\n } else if (this.hasLimit()) {\n return new LimitedFilter(this);\n } else {\n return new RangedFilter(this);\n }\n }\n\n /**\n * Returns a set of REST query string parameters representing this query.\n *\n * @return {!Object.<string,*>} query string parameters\n */\n toRestQueryStringParameters(): { [k: string]: string | number } {\n const REST_CONSTANTS = QueryParams.REST_QUERY_CONSTANTS_;\n const qs: { [k: string]: string | number } = {};\n\n if (this.isDefault()) {\n return qs;\n }\n\n let orderBy;\n if (this.index_ === PRIORITY_INDEX) {\n orderBy = REST_CONSTANTS.PRIORITY_INDEX;\n } else if (this.index_ === VALUE_INDEX) {\n orderBy = REST_CONSTANTS.VALUE_INDEX;\n } else if (this.index_ === KEY_INDEX) {\n orderBy = REST_CONSTANTS.KEY_INDEX;\n } else {\n assert(this.index_ instanceof PathIndex, 'Unrecognized index type!');\n orderBy = this.index_.toString();\n }\n qs[REST_CONSTANTS.ORDER_BY] = stringify(orderBy);\n\n if (this.startSet_) {\n qs[REST_CONSTANTS.START_AT] = stringify(this.indexStartValue_);\n if (this.startNameSet_) {\n qs[REST_CONSTANTS.START_AT] += ',' + stringify(this.indexStartName_);\n }\n }\n\n if (this.endSet_) {\n qs[REST_CONSTANTS.END_AT] = stringify(this.indexEndValue_);\n if (this.endNameSet_) {\n qs[REST_CONSTANTS.END_AT] += ',' + stringify(this.indexEndName_);\n }\n }\n\n if (this.limitSet_) {\n if (this.isViewFromLeft()) {\n qs[REST_CONSTANTS.LIMIT_TO_FIRST] = this.limit_;\n } else {\n qs[REST_CONSTANTS.LIMIT_TO_LAST] = this.limit_;\n }\n }\n\n return qs;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { OnDisconnect } from './onDisconnect';\nimport { TransactionResult } from './TransactionResult';\nimport { warn } from '../core/util/util';\nimport { nextPushId } from '../core/util/NextPushId';\nimport { Query } from './Query';\nimport { Repo } from '../core/Repo';\nimport { Path } from '../core/util/Path';\nimport { QueryParams } from '../core/view/QueryParams';\nimport {\n validateRootPathString,\n validatePathString,\n validateFirebaseMergeDataArg,\n validateBoolean,\n validatePriority,\n validateFirebaseDataArg,\n validateWritablePath\n} from '../core/util/validation';\nimport { validateArgCount, validateCallback, Deferred } from '@firebase/util';\n\nimport { SyncPoint } from '../core/SyncPoint';\nimport { Database } from './Database';\nimport { DataSnapshot } from './DataSnapshot';\nimport * as types from '@firebase/database-types';\n\nexport interface ReferenceConstructor {\n new (repo: Repo, path: Path): Reference;\n}\n\nexport class Reference extends Query {\n then: Promise<Reference>['then'];\n catch: Promise<Reference>['catch'];\n\n /**\n * Call options:\n * new Reference(Repo, Path) or\n * new Reference(url: string, string|RepoManager)\n *\n * Externally - this is the firebase.database.Reference type.\n *\n * @param {!Repo} repo\n * @param {(!Path)} path\n * @extends {Query}\n */\n constructor(repo: Repo, path: Path) {\n if (!(repo instanceof Repo)) {\n throw new Error(\n 'new Reference() no longer supported - use app.database().'\n );\n }\n\n // call Query's constructor, passing in the repo and path.\n super(repo, path, QueryParams.DEFAULT, false);\n }\n\n /** @return {?string} */\n getKey(): string | null {\n validateArgCount('Reference.key', 0, 0, arguments.length);\n\n if (this.path.isEmpty()) {\n return null;\n } else {\n return this.path.getBack();\n }\n }\n\n /**\n * @param {!(string|Path)} pathString\n * @return {!Reference}\n */\n child(pathString: string | Path): Reference {\n validateArgCount('Reference.child', 1, 1, arguments.length);\n if (typeof pathString === 'number') {\n pathString = String(pathString);\n } else if (!(pathString instanceof Path)) {\n if (this.path.getFront() === null) {\n validateRootPathString('Reference.child', 1, pathString, false);\n } else {\n validatePathString('Reference.child', 1, pathString, false);\n }\n }\n\n return new Reference(this.repo, this.path.child(pathString));\n }\n\n /** @return {?Reference} */\n getParent(): Reference | null {\n validateArgCount('Reference.parent', 0, 0, arguments.length);\n\n const parentPath = this.path.parent();\n return parentPath === null ? null : new Reference(this.repo, parentPath);\n }\n\n /** @return {!Reference} */\n getRoot(): Reference {\n validateArgCount('Reference.root', 0, 0, arguments.length);\n\n let ref: Reference = this;\n while (ref.getParent() !== null) {\n ref = ref.getParent();\n }\n return ref;\n }\n\n /** @return {!Database} */\n databaseProp(): Database {\n return this.repo.database;\n }\n\n /**\n * @param {*} newVal\n * @param {function(?Error)=} onComplete\n * @return {!Promise}\n */\n set(\n newVal: unknown,\n onComplete?: (a: Error | null) => void\n ): Promise<unknown> {\n validateArgCount('Reference.set', 1, 2, arguments.length);\n validateWritablePath('Reference.set', this.path);\n validateFirebaseDataArg('Reference.set', 1, newVal, this.path, false);\n validateCallback('Reference.set', 2, onComplete, true);\n\n const deferred = new Deferred();\n this.repo.setWithPriority(\n this.path,\n newVal,\n /*priority=*/ null,\n deferred.wrapCallback(onComplete)\n );\n return deferred.promise;\n }\n\n /**\n * @param {!Object} objectToMerge\n * @param {function(?Error)=} onComplete\n * @return {!Promise}\n */\n update(\n objectToMerge: object,\n onComplete?: (a: Error | null) => void\n ): Promise<unknown> {\n validateArgCount('Reference.update', 1, 2, arguments.length);\n validateWritablePath('Reference.update', this.path);\n\n if (Array.isArray(objectToMerge)) {\n const newObjectToMerge: { [k: string]: unknown } = {};\n for (let i = 0; i < objectToMerge.length; ++i) {\n newObjectToMerge['' + i] = objectToMerge[i];\n }\n objectToMerge = newObjectToMerge;\n warn(\n 'Passing an Array to Firebase.update() is deprecated. ' +\n 'Use set() if you want to overwrite the existing data, or ' +\n 'an Object with integer keys if you really do want to ' +\n 'only update some of the children.'\n );\n }\n validateFirebaseMergeDataArg(\n 'Reference.update',\n 1,\n objectToMerge,\n this.path,\n false\n );\n validateCallback('Reference.update', 2, onComplete, true);\n const deferred = new Deferred();\n this.repo.update(\n this.path,\n objectToMerge as { [k: string]: unknown },\n deferred.wrapCallback(onComplete)\n );\n return deferred.promise;\n }\n\n /**\n * @param {*} newVal\n * @param {string|number|null} newPriority\n * @param {function(?Error)=} onComplete\n * @return {!Promise}\n */\n setWithPriority(\n newVal: unknown,\n newPriority: string | number | null,\n onComplete?: (a: Error | null) => void\n ): Promise<unknown> {\n validateArgCount('Reference.setWithPriority', 2, 3, arguments.length);\n validateWritablePath('Reference.setWithPriority', this.path);\n validateFirebaseDataArg(\n 'Reference.setWithPriority',\n 1,\n newVal,\n this.path,\n false\n );\n validatePriority('Reference.setWithPriority', 2, newPriority, false);\n validateCallback('Reference.setWithPriority', 3, onComplete, true);\n\n if (this.getKey() === '.length' || this.getKey() === '.keys') {\n throw 'Reference.setWithPriority failed: ' +\n this.getKey() +\n ' is a read-only object.';\n }\n\n const deferred = new Deferred();\n this.repo.setWithPriority(\n this.path,\n newVal,\n newPriority,\n deferred.wrapCallback(onComplete)\n );\n return deferred.promise;\n }\n\n /**\n * @param {function(?Error)=} onComplete\n * @return {!Promise}\n */\n remove(onComplete?: (a: Error | null) => void): Promise<unknown> {\n validateArgCount('Reference.remove', 0, 1, arguments.length);\n validateWritablePath('Reference.remove', this.path);\n validateCallback('Reference.remove', 1, onComplete, true);\n\n return this.set(null, onComplete);\n }\n\n /**\n * @param {function(*):*} transactionUpdate\n * @param {(function(?Error, boolean, ?DataSnapshot))=} onComplete\n * @param {boolean=} applyLocally\n * @return {!Promise}\n */\n transaction(\n transactionUpdate: (a: unknown) => unknown,\n onComplete?: (a: Error | null, b: boolean, c: DataSnapshot | null) => void,\n applyLocally?: boolean\n ): Promise<TransactionResult> {\n validateArgCount('Reference.transaction', 1, 3, arguments.length);\n validateWritablePath('Reference.transaction', this.path);\n validateCallback('Reference.transaction', 1, transactionUpdate, false);\n validateCallback('Reference.transaction', 2, onComplete, true);\n // NOTE: applyLocally is an internal-only option for now. We need to decide if we want to keep it and how\n // to expose it.\n validateBoolean('Reference.transaction', 3, applyLocally, true);\n\n if (this.getKey() === '.length' || this.getKey() === '.keys') {\n throw 'Reference.transaction failed: ' +\n this.getKey() +\n ' is a read-only object.';\n }\n\n if (applyLocally === undefined) {\n applyLocally = true;\n }\n\n const deferred = new Deferred<TransactionResult>();\n if (typeof onComplete === 'function') {\n deferred.promise.catch(() => {});\n }\n\n const promiseComplete = function(\n error: Error,\n committed: boolean,\n snapshot: DataSnapshot\n ) {\n if (error) {\n deferred.reject(error);\n } else {\n deferred.resolve(new TransactionResult(committed, snapshot));\n }\n if (typeof onComplete === 'function') {\n onComplete(error, committed, snapshot);\n }\n };\n this.repo.startTransaction(\n this.path,\n transactionUpdate,\n promiseComplete,\n applyLocally\n );\n\n return deferred.promise;\n }\n\n /**\n * @param {string|number|null} priority\n * @param {function(?Error)=} onComplete\n * @return {!Promise}\n */\n setPriority(\n priority: string | number | null,\n onComplete?: (a: Error | null) => void\n ): Promise<unknown> {\n validateArgCount('Reference.setPriority', 1, 2, arguments.length);\n validateWritablePath('Reference.setPriority', this.path);\n validatePriority('Reference.setPriority', 1, priority, false);\n validateCallback('Reference.setPriority', 2, onComplete, true);\n\n const deferred = new Deferred();\n this.repo.setWithPriority(\n this.path.child('.priority'),\n priority,\n null,\n deferred.wrapCallback(onComplete)\n );\n return deferred.promise;\n }\n\n /**\n * @param {*=} value\n * @param {function(?Error)=} onComplete\n * @return {!Reference}\n */\n push(value?: unknown, onComplete?: (a: Error | null) => void): Reference {\n validateArgCount('Reference.push', 0, 2, arguments.length);\n validateWritablePath('Reference.push', this.path);\n validateFirebaseDataArg('Reference.push', 1, value, this.path, true);\n validateCallback('Reference.push', 2, onComplete, true);\n\n const now = this.repo.serverTime();\n const name = nextPushId(now);\n\n // push() returns a ThennableReference whose promise is fulfilled with a regular Reference.\n // We use child() to create handles to two different references. The first is turned into a\n // ThennableReference below by adding then() and catch() methods and is used as the\n // return value of push(). The second remains a regular Reference and is used as the fulfilled\n // value of the first ThennableReference.\n const thennablePushRef = this.child(name);\n const pushRef = this.child(name);\n\n let promise;\n if (value != null) {\n promise = thennablePushRef.set(value, onComplete).then(() => pushRef);\n } else {\n promise = Promise.resolve(pushRef);\n }\n\n thennablePushRef.then = promise.then.bind(promise);\n thennablePushRef.catch = promise.then.bind(promise, undefined);\n\n if (typeof onComplete === 'function') {\n promise.catch(() => {});\n }\n\n return thennablePushRef;\n }\n\n /**\n * @return {!OnDisconnect}\n */\n onDisconnect(): OnDisconnect {\n validateWritablePath('Reference.onDisconnect', this.path);\n return new OnDisconnect(this.repo, this.path);\n }\n\n get database(): Database {\n return this.databaseProp();\n }\n\n get key(): string | null {\n return this.getKey();\n }\n\n get parent(): Reference | null {\n return this.getParent();\n }\n\n get root(): Reference {\n return this.getRoot();\n }\n}\n\n/**\n * Define reference constructor in various modules\n *\n * We are doing this here to avoid several circular\n * dependency issues\n */\nQuery.__referenceConstructor = Reference;\nSyncPoint.__referenceConstructor = Reference;\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, contains, safeGet } from '@firebase/util';\nimport { Path } from './Path';\n\nimport { each } from './util';\n\n/**\n * Node in a Tree.\n */\nexport class TreeNode<T> {\n // TODO: Consider making accessors that create children and value lazily or\n // separate Internal / Leaf 'types'.\n children: { [name: string]: TreeNode<T> } = {};\n childCount = 0;\n value: T | null = null;\n}\n\n/**\n * A light-weight tree, traversable by path. Nodes can have both values and children.\n * Nodes are not enumerated (by forEachChild) unless they have a value or non-empty\n * children.\n */\nexport class Tree<T> {\n /**\n * @template T\n * @param {string=} name_ Optional name of the node.\n * @param {Tree=} parent_ Optional parent node.\n * @param {TreeNode=} node_ Optional node to wrap.\n */\n constructor(\n private name_: string = '',\n private parent_: Tree<T> | null = null,\n private node_: TreeNode<T> = new TreeNode<T>()\n ) {}\n\n /**\n * Returns a sub-Tree for the given path.\n *\n * @param {!(string|Path)} pathObj Path to look up.\n * @return {!Tree.<T>} Tree for path.\n */\n subTree(pathObj: string | Path): Tree<T> {\n // TODO: Require pathObj to be Path?\n let path = pathObj instanceof Path ? pathObj : new Path(pathObj);\n let child = this as Tree<T>,\n next = path.getFront();\n while (next !== null) {\n const childNode = safeGet(child.node_.children, next) || new TreeNode();\n child = new Tree(next, child, childNode);\n path = path.popFront();\n next = path.getFront();\n }\n\n return child;\n }\n\n /**\n * Returns the data associated with this tree node.\n *\n * @return {?T} The data or null if no data exists.\n */\n getValue(): T | null {\n return this.node_.value;\n }\n\n /**\n * Sets data to this tree node.\n *\n * @param {!T} value Value to set.\n */\n setValue(value: T) {\n assert(typeof value !== 'undefined', 'Cannot set value to undefined');\n this.node_.value = value;\n this.updateParents_();\n }\n\n /**\n * Clears the contents of the tree node (its value and all children).\n */\n clear() {\n this.node_.value = null;\n this.node_.children = {};\n this.node_.childCount = 0;\n this.updateParents_();\n }\n\n /**\n * @return {boolean} Whether the tree has any children.\n */\n hasChildren(): boolean {\n return this.node_.childCount > 0;\n }\n\n /**\n * @return {boolean} Whether the tree is empty (no value or children).\n */\n isEmpty(): boolean {\n return this.getValue() === null && !this.hasChildren();\n }\n\n /**\n * Calls action for each child of this tree node.\n *\n * @param {function(!Tree.<T>)} action Action to be called for each child.\n */\n forEachChild(action: (tree: Tree<T>) => void) {\n each(this.node_.children, (child: string, childTree: TreeNode<T>) => {\n action(new Tree<T>(child, this, childTree));\n });\n }\n\n /**\n * Does a depth-first traversal of this node's descendants, calling action for each one.\n *\n * @param {function(!Tree.<T>)} action Action to be called for each child.\n * @param {boolean=} includeSelf Whether to call action on this node as well. Defaults to\n * false.\n * @param {boolean=} childrenFirst Whether to call action on children before calling it on\n * parent.\n */\n forEachDescendant(\n action: (tree: Tree<T>) => void,\n includeSelf?: boolean,\n childrenFirst?: boolean\n ) {\n if (includeSelf && !childrenFirst) {\n action(this);\n }\n\n this.forEachChild(child => {\n child.forEachDescendant(action, /*includeSelf=*/ true, childrenFirst);\n });\n\n if (includeSelf && childrenFirst) {\n action(this);\n }\n }\n\n /**\n * Calls action on each ancestor node.\n *\n * @param {function(!Tree.<T>)} action Action to be called on each parent; return\n * true to abort.\n * @param {boolean=} includeSelf Whether to call action on this node as well.\n * @return {boolean} true if the action callback returned true.\n */\n forEachAncestor(\n action: (tree: Tree<T>) => unknown,\n includeSelf?: boolean\n ): boolean {\n let node = includeSelf ? this : this.parent();\n while (node !== null) {\n if (action(node)) {\n return true;\n }\n node = node.parent();\n }\n return false;\n }\n\n /**\n * Does a depth-first traversal of this node's descendants. When a descendant with a value\n * is found, action is called on it and traversal does not continue inside the node.\n * Action is *not* called on this node.\n *\n * @param {function(!Tree.<T>)} action Action to be called for each child.\n */\n forEachImmediateDescendantWithValue(action: (tree: Tree<T>) => void) {\n this.forEachChild(child => {\n if (child.getValue() !== null) {\n action(child);\n } else {\n child.forEachImmediateDescendantWithValue(action);\n }\n });\n }\n\n /**\n * @return {!Path} The path of this tree node, as a Path.\n */\n path(): Path {\n return new Path(\n this.parent_ === null\n ? this.name_\n : this.parent_.path() + '/' + this.name_\n );\n }\n\n /**\n * @return {string} The name of the tree node.\n */\n name(): string {\n return this.name_;\n }\n\n /**\n * @return {?Tree} The parent tree node, or null if this is the root of the tree.\n */\n parent(): Tree<T> | null {\n return this.parent_;\n }\n\n /**\n * Adds or removes this child from its parent based on whether it's empty or not.\n *\n * @private\n */\n private updateParents_() {\n if (this.parent_ !== null) {\n this.parent_.updateChild_(this.name_, this);\n }\n }\n\n /**\n * Adds or removes the passed child to this tree node, depending on whether it's empty.\n *\n * @param {string} childName The name of the child to update.\n * @param {!Tree.<T>} child The child to update.\n * @private\n */\n private updateChild_(childName: string, child: Tree<T>) {\n const childEmpty = child.isEmpty();\n const childExists = contains(this.node_.children, childName);\n if (childEmpty && childExists) {\n delete this.node_.children[childName];\n this.node_.childCount--;\n this.updateParents_();\n } else if (!childEmpty && !childExists) {\n this.node_.children[childName] = child.node_;\n this.node_.childCount++;\n this.updateParents_();\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, contains, safeGet } from '@firebase/util';\nimport { Reference } from '../api/Reference';\nimport { DataSnapshot } from '../api/DataSnapshot';\nimport { Path } from './util/Path';\nimport { Tree } from './util/Tree';\nimport { PRIORITY_INDEX } from './snap/indexes/PriorityIndex';\nimport { Node } from './snap/Node';\nimport { LUIDGenerator, warn, exceptionGuard } from './util/util';\nimport { resolveDeferredValueSnapshot } from './util/ServerValues';\nimport { isValidPriority, validateFirebaseData } from './util/validation';\n\nimport { nodeFromJSON } from './snap/nodeFromJSON';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { Repo } from './Repo';\nimport { Event } from './view/Event';\n\n// TODO: This is pretty messy. Ideally, a lot of this would move into FirebaseData, or a transaction-specific\n// component used by FirebaseData, but it has ties to user callbacks (transaction update and onComplete) as well\n// as the realtime connection (to send transactions to the server). So that all needs to be decoupled first.\n// For now it's part of Repo, but in its own file.\n\n/**\n * @enum {number}\n */\nexport enum TransactionStatus {\n // We've run the transaction and updated transactionResultData_ with the result, but it isn't currently sent to the\n // server. A transaction will go from RUN -> SENT -> RUN if it comes back from the server as rejected due to\n // mismatched hash.\n RUN,\n\n // We've run the transaction and sent it to the server and it's currently outstanding (hasn't come back as accepted\n // or rejected yet).\n SENT,\n\n // Temporary state used to mark completed transactions (whether successful or aborted). The transaction will be\n // removed when we get a chance to prune completed ones.\n COMPLETED,\n\n // Used when an already-sent transaction needs to be aborted (e.g. due to a conflicting set() call that was made).\n // If it comes back as unsuccessful, we'll abort it.\n SENT_NEEDS_ABORT,\n\n // Temporary state used to mark transactions that need to be aborted.\n NEEDS_ABORT\n}\n\n/**\n * If a transaction does not succeed after 25 retries, we abort it. Among other things this ensure that if there's\n * ever a bug causing a mismatch between client / server hashes for some data, we won't retry indefinitely.\n * @type {number}\n * @const\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo as any).MAX_TRANSACTION_RETRIES_ = 25;\n\n/**\n * @typedef {{\n * path: !Path,\n * update: function(*):*,\n * onComplete: ?function(?Error, boolean, ?DataSnapshot),\n * status: ?TransactionStatus,\n * order: !number,\n * applyLocally: boolean,\n * retryCount: !number,\n * unwatcher: function(),\n * abortReason: ?string,\n * currentWriteId: !number,\n * currentInputSnapshot: ?Node,\n * currentOutputSnapshotRaw: ?Node,\n * currentOutputSnapshotResolved: ?Node\n * }}\n */\ninterface Transaction {\n path: Path;\n update: (a: unknown) => unknown;\n onComplete: (a: Error | null, b: boolean, c: DataSnapshot | null) => void;\n status: TransactionStatus;\n order: number;\n applyLocally: boolean;\n retryCount: number;\n unwatcher: () => void;\n abortReason: string | null;\n currentWriteId: number;\n currentInputSnapshot: Node | null;\n currentOutputSnapshotRaw: Node | null;\n currentOutputSnapshotResolved: Node | null;\n}\n\n/**\n * Setup the transaction data structures\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo.prototype as any).transactionsInit_ = function() {\n /**\n * Stores queues of outstanding transactions for Firebase locations.\n *\n * @type {!Tree.<Array.<!Transaction>>}\n * @private\n */\n this.transactionQueueTree_ = new Tree<Transaction[]>();\n};\n\ndeclare module './Repo' {\n interface Repo {\n startTransaction(\n path: Path,\n transactionUpdate: (a: unknown) => void,\n onComplete: ((a: Error, b: boolean, c: DataSnapshot) => void) | null,\n applyLocally: boolean\n ): void;\n }\n}\n\n/**\n * Creates a new transaction, adds it to the transactions we're tracking, and sends it to the server if possible.\n *\n * @param {!Path} path Path at which to do transaction.\n * @param {function(*):*} transactionUpdate Update callback.\n * @param {?function(?Error, boolean, ?DataSnapshot)} onComplete Completion callback.\n * @param {boolean} applyLocally Whether or not to make intermediate results visible\n */\nRepo.prototype.startTransaction = function(\n path: Path,\n transactionUpdate: (a: unknown) => unknown,\n onComplete: ((a: Error, b: boolean, c: DataSnapshot) => void) | null,\n applyLocally: boolean\n) {\n this.log_('transaction on ' + path);\n\n // Add a watch to make sure we get server updates.\n const valueCallback = function() {};\n const watchRef = new Reference(this, path);\n watchRef.on('value', valueCallback);\n const unwatcher = function() {\n watchRef.off('value', valueCallback);\n };\n\n // Initialize transaction.\n const transaction: Transaction = {\n path,\n update: transactionUpdate,\n onComplete,\n\n // One of TransactionStatus enums.\n status: null,\n\n // Used when combining transactions at different locations to figure out which one goes first.\n order: LUIDGenerator(),\n\n // Whether to raise local events for this transaction.\n applyLocally,\n\n // Count of how many times we've retried the transaction.\n retryCount: 0,\n\n // Function to call to clean up our .on() listener.\n unwatcher,\n\n // Stores why a transaction was aborted.\n abortReason: null,\n\n currentWriteId: null,\n\n currentInputSnapshot: null,\n\n currentOutputSnapshotRaw: null,\n\n currentOutputSnapshotResolved: null\n };\n\n // Run transaction initially.\n const currentState = this.getLatestState_(path);\n transaction.currentInputSnapshot = currentState;\n const newVal = transaction.update(currentState.val());\n if (newVal === undefined) {\n // Abort transaction.\n transaction.unwatcher();\n transaction.currentOutputSnapshotRaw = null;\n transaction.currentOutputSnapshotResolved = null;\n if (transaction.onComplete) {\n // We just set the input snapshot, so this cast should be safe\n const snapshot = new DataSnapshot(\n transaction.currentInputSnapshot,\n new Reference(this, transaction.path),\n PRIORITY_INDEX\n );\n transaction.onComplete(null, false, snapshot);\n }\n } else {\n validateFirebaseData(\n 'transaction failed: Data returned ',\n newVal,\n transaction.path\n );\n\n // Mark as run and add to our queue.\n transaction.status = TransactionStatus.RUN;\n const queueNode = this.transactionQueueTree_.subTree(path);\n const nodeQueue = queueNode.getValue() || [];\n nodeQueue.push(transaction);\n\n queueNode.setValue(nodeQueue);\n\n // Update visibleData and raise events\n // Note: We intentionally raise events after updating all of our transaction state, since the user could\n // start new transactions from the event callbacks.\n let priorityForNode;\n if (\n typeof newVal === 'object' &&\n newVal !== null &&\n contains(newVal, '.priority')\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n priorityForNode = safeGet(newVal as any, '.priority');\n assert(\n isValidPriority(priorityForNode),\n 'Invalid priority returned by transaction. ' +\n 'Priority must be a valid string, finite number, server value, or null.'\n );\n } else {\n const currentNode =\n this.serverSyncTree_.calcCompleteEventCache(path) ||\n ChildrenNode.EMPTY_NODE;\n priorityForNode = currentNode.getPriority().val();\n }\n priorityForNode /** @type {null|number|string} */ = priorityForNode;\n\n const serverValues = this.generateServerValues();\n const newNodeUnresolved = nodeFromJSON(newVal, priorityForNode);\n const newNode = resolveDeferredValueSnapshot(\n newNodeUnresolved,\n currentState,\n serverValues\n );\n transaction.currentOutputSnapshotRaw = newNodeUnresolved;\n transaction.currentOutputSnapshotResolved = newNode;\n transaction.currentWriteId = this.getNextWriteId_();\n\n const events = this.serverSyncTree_.applyUserOverwrite(\n path,\n newNode,\n transaction.currentWriteId,\n transaction.applyLocally\n );\n this.eventQueue_.raiseEventsForChangedPath(path, events);\n\n this.sendReadyTransactions_();\n }\n};\n\n/**\n * @param {!Path} path\n * @param {Array.<number>=} excludeSets A specific set to exclude\n * @return {Node}\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo.prototype as any).getLatestState_ = function(\n path: Path,\n excludeSets?: number[]\n): Node {\n return (\n this.serverSyncTree_.calcCompleteEventCache(path, excludeSets) ||\n ChildrenNode.EMPTY_NODE\n );\n};\n\n/**\n * Sends any already-run transactions that aren't waiting for outstanding transactions to\n * complete.\n *\n * Externally it's called with no arguments, but it calls itself recursively with a particular\n * transactionQueueTree node to recurse through the tree.\n *\n * @param {Tree.<Array.<Transaction>>=} node transactionQueueTree node to start at.\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo.prototype as any).sendReadyTransactions_ = function(\n node: Tree<Transaction[]> = this.transactionQueueTree_\n) {\n // Before recursing, make sure any completed transactions are removed.\n if (!node) {\n this.pruneCompletedTransactionsBelowNode_(node);\n }\n\n if (node.getValue() !== null) {\n const queue = this.buildTransactionQueue_(node);\n assert(queue.length > 0, 'Sending zero length transaction queue');\n\n const allRun = queue.every(\n (transaction: Transaction) => transaction.status === TransactionStatus.RUN\n );\n\n // If they're all run (and not sent), we can send them. Else, we must wait.\n if (allRun) {\n this.sendTransactionQueue_(node.path(), queue);\n }\n } else if (node.hasChildren()) {\n node.forEachChild(childNode => {\n this.sendReadyTransactions_(childNode);\n });\n }\n};\n\n/**\n * Given a list of run transactions, send them to the server and then handle the result (success or failure).\n *\n * @param {!Path} path The location of the queue.\n * @param {!Array.<Transaction>} queue Queue of transactions under the specified location.\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo.prototype as any).sendTransactionQueue_ = function(\n path: Path,\n queue: Transaction[]\n) {\n // Mark transactions as sent and increment retry count!\n const setsToIgnore = queue.map(txn => {\n return txn.currentWriteId;\n });\n const latestState = this.getLatestState_(path, setsToIgnore);\n let snapToSend = latestState;\n const latestHash = latestState.hash();\n for (let i = 0; i < queue.length; i++) {\n const txn = queue[i];\n assert(\n txn.status === TransactionStatus.RUN,\n 'tryToSendTransactionQueue_: items in queue should all be run.'\n );\n txn.status = TransactionStatus.SENT;\n txn.retryCount++;\n const relativePath = Path.relativePath(path, txn.path);\n // If we've gotten to this point, the output snapshot must be defined.\n snapToSend = snapToSend.updateChild(\n relativePath /** @type {!Node} */,\n txn.currentOutputSnapshotRaw\n );\n }\n\n const dataToSend = snapToSend.val(true);\n const pathToSend = path;\n\n // Send the put.\n this.server_.put(\n pathToSend.toString(),\n dataToSend,\n (status: string) => {\n this.log_('transaction put response', {\n path: pathToSend.toString(),\n status\n });\n\n let events: Event[] = [];\n if (status === 'ok') {\n // Queue up the callbacks and fire them after cleaning up all of our transaction state, since\n // the callback could trigger more transactions or sets.\n const callbacks = [];\n for (let i = 0; i < queue.length; i++) {\n queue[i].status = TransactionStatus.COMPLETED;\n events = events.concat(\n this.serverSyncTree_.ackUserWrite(queue[i].currentWriteId)\n );\n if (queue[i].onComplete) {\n // We never unset the output snapshot, and given that this transaction is complete, it should be set\n const node = queue[i].currentOutputSnapshotResolved as Node;\n const ref = new Reference(this, queue[i].path);\n const snapshot = new DataSnapshot(node, ref, PRIORITY_INDEX);\n callbacks.push(\n queue[i].onComplete.bind(null, null, true, snapshot)\n );\n }\n queue[i].unwatcher();\n }\n\n // Now remove the completed transactions.\n this.pruneCompletedTransactionsBelowNode_(\n this.transactionQueueTree_.subTree(path)\n );\n // There may be pending transactions that we can now send.\n this.sendReadyTransactions_();\n\n this.eventQueue_.raiseEventsForChangedPath(path, events);\n\n // Finally, trigger onComplete callbacks.\n for (let i = 0; i < callbacks.length; i++) {\n exceptionGuard(callbacks[i]);\n }\n } else {\n // transactions are no longer sent. Update their status appropriately.\n if (status === 'datastale') {\n for (let i = 0; i < queue.length; i++) {\n if (queue[i].status === TransactionStatus.SENT_NEEDS_ABORT) {\n queue[i].status = TransactionStatus.NEEDS_ABORT;\n } else {\n queue[i].status = TransactionStatus.RUN;\n }\n }\n } else {\n warn(\n 'transaction at ' + pathToSend.toString() + ' failed: ' + status\n );\n for (let i = 0; i < queue.length; i++) {\n queue[i].status = TransactionStatus.NEEDS_ABORT;\n queue[i].abortReason = status;\n }\n }\n\n this.rerunTransactions_(path);\n }\n },\n latestHash\n );\n};\n\n/**\n * Finds all transactions dependent on the data at changedPath and reruns them.\n *\n * Should be called any time cached data changes.\n *\n * Return the highest path that was affected by rerunning transactions. This is the path at which events need to\n * be raised for.\n *\n * @param {!Path} changedPath The path in mergedData that changed.\n * @return {!Path} The rootmost path that was affected by rerunning transactions.\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo.prototype as any).rerunTransactions_ = function(changedPath: Path): Path {\n const rootMostTransactionNode = this.getAncestorTransactionNode_(changedPath);\n const path = rootMostTransactionNode.path();\n\n const queue = this.buildTransactionQueue_(rootMostTransactionNode);\n this.rerunTransactionQueue_(queue, path);\n\n return path;\n};\n\n/**\n * Does all the work of rerunning transactions (as well as cleans up aborted transactions and whatnot).\n *\n * @param {Array.<Transaction>} queue The queue of transactions to run.\n * @param {!Path} path The path the queue is for.\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo.prototype as any).rerunTransactionQueue_ = function(\n queue: Transaction[],\n path: Path\n) {\n if (queue.length === 0) {\n return; // Nothing to do!\n }\n\n // Queue up the callbacks and fire them after cleaning up all of our transaction state, since\n // the callback could trigger more transactions or sets.\n const callbacks = [];\n let events: Event[] = [];\n // Ignore all of the sets we're going to re-run.\n const txnsToRerun = queue.filter(q => {\n return q.status === TransactionStatus.RUN;\n });\n const setsToIgnore = txnsToRerun.map(q => {\n return q.currentWriteId;\n });\n for (let i = 0; i < queue.length; i++) {\n const transaction = queue[i];\n const relativePath = Path.relativePath(path, transaction.path);\n let abortTransaction = false,\n abortReason;\n assert(\n relativePath !== null,\n 'rerunTransactionsUnderNode_: relativePath should not be null.'\n );\n\n if (transaction.status === TransactionStatus.NEEDS_ABORT) {\n abortTransaction = true;\n abortReason = transaction.abortReason;\n events = events.concat(\n this.serverSyncTree_.ackUserWrite(transaction.currentWriteId, true)\n );\n } else if (transaction.status === TransactionStatus.RUN) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (transaction.retryCount >= (Repo as any).MAX_TRANSACTION_RETRIES_) {\n abortTransaction = true;\n abortReason = 'maxretry';\n events = events.concat(\n this.serverSyncTree_.ackUserWrite(transaction.currentWriteId, true)\n );\n } else {\n // This code reruns a transaction\n const currentNode = this.getLatestState_(\n transaction.path,\n setsToIgnore\n );\n transaction.currentInputSnapshot = currentNode;\n const newData = queue[i].update(currentNode.val());\n if (newData !== undefined) {\n validateFirebaseData(\n 'transaction failed: Data returned ',\n newData,\n transaction.path\n );\n let newDataNode = nodeFromJSON(newData);\n const hasExplicitPriority =\n typeof newData === 'object' &&\n newData != null &&\n contains(newData, '.priority');\n if (!hasExplicitPriority) {\n // Keep the old priority if there wasn't a priority explicitly specified.\n newDataNode = newDataNode.updatePriority(currentNode.getPriority());\n }\n\n const oldWriteId = transaction.currentWriteId;\n const serverValues = this.generateServerValues();\n const newNodeResolved = resolveDeferredValueSnapshot(\n newDataNode,\n currentNode,\n serverValues\n );\n\n transaction.currentOutputSnapshotRaw = newDataNode;\n transaction.currentOutputSnapshotResolved = newNodeResolved;\n transaction.currentWriteId = this.getNextWriteId_();\n // Mutates setsToIgnore in place\n setsToIgnore.splice(setsToIgnore.indexOf(oldWriteId), 1);\n events = events.concat(\n this.serverSyncTree_.applyUserOverwrite(\n transaction.path,\n newNodeResolved,\n transaction.currentWriteId,\n transaction.applyLocally\n )\n );\n events = events.concat(\n this.serverSyncTree_.ackUserWrite(oldWriteId, true)\n );\n } else {\n abortTransaction = true;\n abortReason = 'nodata';\n events = events.concat(\n this.serverSyncTree_.ackUserWrite(transaction.currentWriteId, true)\n );\n }\n }\n }\n this.eventQueue_.raiseEventsForChangedPath(path, events);\n events = [];\n if (abortTransaction) {\n // Abort.\n queue[i].status = TransactionStatus.COMPLETED;\n\n // Removing a listener can trigger pruning which can muck with mergedData/visibleData (as it prunes data).\n // So defer the unwatcher until we're done.\n (function(unwatcher) {\n setTimeout(unwatcher, Math.floor(0));\n })(queue[i].unwatcher);\n\n if (queue[i].onComplete) {\n if (abortReason === 'nodata') {\n const ref = new Reference(this, queue[i].path);\n // We set this field immediately, so it's safe to cast to an actual snapshot\n const lastInput /** @type {!Node} */ = queue[i].currentInputSnapshot;\n const snapshot = new DataSnapshot(lastInput, ref, PRIORITY_INDEX);\n callbacks.push(queue[i].onComplete.bind(null, null, false, snapshot));\n } else {\n callbacks.push(\n queue[i].onComplete.bind(null, new Error(abortReason), false, null)\n );\n }\n }\n }\n }\n\n // Clean up completed transactions.\n this.pruneCompletedTransactionsBelowNode_(this.transactionQueueTree_);\n\n // Now fire callbacks, now that we're in a good, known state.\n for (let i = 0; i < callbacks.length; i++) {\n exceptionGuard(callbacks[i]);\n }\n\n // Try to send the transaction result to the server.\n this.sendReadyTransactions_();\n};\n\n/**\n * Returns the rootmost ancestor node of the specified path that has a pending transaction on it, or just returns\n * the node for the given path if there are no pending transactions on any ancestor.\n *\n * @param {!Path} path The location to start at.\n * @return {!Tree.<Array.<!Transaction>>} The rootmost node with a transaction.\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo.prototype as any).getAncestorTransactionNode_ = function(\n path: Path\n): Tree<Transaction[]> {\n let front;\n\n // Start at the root and walk deeper into the tree towards path until we find a node with pending transactions.\n let transactionNode = this.transactionQueueTree_;\n front = path.getFront();\n while (front !== null && transactionNode.getValue() === null) {\n transactionNode = transactionNode.subTree(front);\n path = path.popFront();\n front = path.getFront();\n }\n\n return transactionNode;\n};\n\n/**\n * Builds the queue of all transactions at or below the specified transactionNode.\n *\n * @param {!Tree.<Array.<Transaction>>} transactionNode\n * @return {Array.<Transaction>} The generated queue.\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo.prototype as any).buildTransactionQueue_ = function(\n transactionNode: Tree<Transaction[]>\n): Transaction[] {\n // Walk any child transaction queues and aggregate them into a single queue.\n const transactionQueue: Transaction[] = [];\n this.aggregateTransactionQueuesForNode_(transactionNode, transactionQueue);\n\n // Sort them by the order the transactions were created.\n transactionQueue.sort((a, b) => {\n return a.order - b.order;\n });\n\n return transactionQueue;\n};\n\n/**\n * @param {!Tree.<Array.<Transaction>>} node\n * @param {Array.<Transaction>} queue\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo.prototype as any).aggregateTransactionQueuesForNode_ = function(\n node: Tree<Transaction[]>,\n queue: Transaction[]\n) {\n const nodeQueue = node.getValue();\n if (nodeQueue !== null) {\n for (let i = 0; i < nodeQueue.length; i++) {\n queue.push(nodeQueue[i]);\n }\n }\n\n node.forEachChild(child => {\n this.aggregateTransactionQueuesForNode_(child, queue);\n });\n};\n\n/**\n * Remove COMPLETED transactions at or below this node in the transactionQueueTree_.\n *\n * @param {!Tree.<Array.<!Transaction>>} node\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo.prototype as any).pruneCompletedTransactionsBelowNode_ = function(\n node: Tree<Transaction[]>\n) {\n const queue = node.getValue();\n if (queue) {\n let to = 0;\n for (let from = 0; from < queue.length; from++) {\n if (queue[from].status !== TransactionStatus.COMPLETED) {\n queue[to] = queue[from];\n to++;\n }\n }\n queue.length = to;\n node.setValue(queue.length > 0 ? queue : null);\n }\n\n node.forEachChild(childNode => {\n this.pruneCompletedTransactionsBelowNode_(childNode);\n });\n};\n\n/**\n * Aborts all transactions on ancestors or descendants of the specified path. Called when doing a set() or update()\n * since we consider them incompatible with transactions.\n *\n * @param {!Path} path Path for which we want to abort related transactions.\n * @return {!Path}\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo.prototype as any).abortTransactions_ = function(path: Path): Path {\n const affectedPath = this.getAncestorTransactionNode_(path).path();\n\n const transactionNode = this.transactionQueueTree_.subTree(path);\n\n transactionNode.forEachAncestor((node: Tree<Transaction[]>) => {\n this.abortTransactionsOnNode_(node);\n });\n\n this.abortTransactionsOnNode_(transactionNode);\n\n transactionNode.forEachDescendant((node: Tree<Transaction[]>) => {\n this.abortTransactionsOnNode_(node);\n });\n\n return affectedPath;\n};\n\n/**\n * Abort transactions stored in this transaction queue node.\n *\n * @param {!Tree.<Array.<Transaction>>} node Node to abort transactions for.\n * @private\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Repo.prototype as any).abortTransactionsOnNode_ = function(\n node: Tree<Transaction[]>\n) {\n const queue = node.getValue();\n if (queue !== null) {\n // Queue up the callbacks and fire them after cleaning up all of our transaction state, since\n // the callback could trigger more transactions or sets.\n const callbacks = [];\n\n // Go through queue. Any already-sent transactions must be marked for abort, while the unsent ones\n // can be immediately aborted and removed.\n let events: Event[] = [];\n let lastSent = -1;\n for (let i = 0; i < queue.length; i++) {\n if (queue[i].status === TransactionStatus.SENT_NEEDS_ABORT) {\n // Already marked. No action needed.\n } else if (queue[i].status === TransactionStatus.SENT) {\n assert(\n lastSent === i - 1,\n 'All SENT items should be at beginning of queue.'\n );\n lastSent = i;\n // Mark transaction for abort when it comes back.\n queue[i].status = TransactionStatus.SENT_NEEDS_ABORT;\n queue[i].abortReason = 'set';\n } else {\n assert(\n queue[i].status === TransactionStatus.RUN,\n 'Unexpected transaction status in abort'\n );\n // We can abort it immediately.\n queue[i].unwatcher();\n events = events.concat(\n this.serverSyncTree_.ackUserWrite(queue[i].currentWriteId, true)\n );\n if (queue[i].onComplete) {\n const snapshot: DataSnapshot | null = null;\n callbacks.push(\n queue[i].onComplete.bind(null, new Error('set'), false, snapshot)\n );\n }\n }\n }\n if (lastSent === -1) {\n // We're not waiting for any sent transactions. We can clear the queue.\n node.setValue(null);\n } else {\n // Remove the transactions we aborted.\n queue.length = lastSent + 1;\n }\n\n // Now fire the callbacks.\n this.eventQueue_.raiseEventsForChangedPath(node.path(), events);\n for (let i = 0; i < callbacks.length; i++) {\n exceptionGuard(callbacks[i]);\n }\n }\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseApp } from '@firebase/app-types';\nimport { safeGet } from '@firebase/util';\nimport { Repo } from './Repo';\nimport { fatal } from './util/util';\nimport { parseRepoInfo } from './util/libs/parser';\nimport { validateUrl } from './util/validation';\nimport './Repo_transaction';\nimport { Database } from '../api/Database';\nimport { RepoInfo } from './RepoInfo';\nimport { FirebaseAuthInternalName } from '@firebase/auth-interop-types';\nimport { Provider } from '@firebase/component';\n\n/** @const {string} */\nconst DATABASE_URL_OPTION = 'databaseURL';\n\n/**\n * This variable is also defined in the firebase node.js admin SDK. Before\n * modifying this definition, consult the definition in:\n *\n * https://github.com/firebase/firebase-admin-node\n *\n * and make sure the two are consistent.\n */\nconst FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST';\n\nlet _staticInstance: RepoManager;\n\n/**\n * Creates and caches Repo instances.\n */\nexport class RepoManager {\n /**\n * @private {!Object.<string, Object<string, !fb.core.Repo>>}\n */\n private repos_: {\n [appName: string]: {\n [dbUrl: string]: Repo;\n };\n } = {};\n\n /**\n * If true, new Repos will be created to use ReadonlyRestClient (for testing purposes).\n * @private {boolean}\n */\n private useRestClient_: boolean = false;\n\n static getInstance(): RepoManager {\n if (!_staticInstance) {\n _staticInstance = new RepoManager();\n }\n return _staticInstance;\n }\n\n // TODO(koss): Remove these functions unless used in tests?\n interrupt() {\n for (const appName of Object.keys(this.repos_)) {\n for (const dbUrl of Object.keys(this.repos_[appName])) {\n this.repos_[appName][dbUrl].interrupt();\n }\n }\n }\n\n resume() {\n for (const appName of Object.keys(this.repos_)) {\n for (const dbUrl of Object.keys(this.repos_[appName])) {\n this.repos_[appName][dbUrl].resume();\n }\n }\n }\n\n /**\n * This function should only ever be called to CREATE a new database instance.\n *\n * @param {!FirebaseApp} app\n * @return {!Database}\n */\n databaseFromApp(\n app: FirebaseApp,\n authProvider: Provider<FirebaseAuthInternalName>,\n url?: string\n ): Database {\n let dbUrl: string | undefined = url || app.options[DATABASE_URL_OPTION];\n if (dbUrl === undefined) {\n fatal(\n \"Can't determine Firebase Database URL. Be sure to include \" +\n DATABASE_URL_OPTION +\n ' option when calling firebase.initializeApp().'\n );\n }\n\n let parsedUrl = parseRepoInfo(dbUrl);\n let repoInfo = parsedUrl.repoInfo;\n\n let dbEmulatorHost: string | undefined = undefined;\n if (typeof process !== 'undefined') {\n dbEmulatorHost = process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR];\n }\n if (dbEmulatorHost) {\n dbUrl = `http://${dbEmulatorHost}?ns=${repoInfo.namespace}`;\n parsedUrl = parseRepoInfo(dbUrl);\n repoInfo = parsedUrl.repoInfo;\n }\n\n validateUrl('Invalid Firebase Database URL', 1, parsedUrl);\n if (!parsedUrl.path.isEmpty()) {\n fatal(\n 'Database URL must point to the root of a Firebase Database ' +\n '(not including a child path).'\n );\n }\n\n const repo = this.createRepo(repoInfo, app, authProvider);\n\n return repo.database;\n }\n\n /**\n * Remove the repo and make sure it is disconnected.\n *\n * @param {!Repo} repo\n */\n deleteRepo(repo: Repo) {\n const appRepos = safeGet(this.repos_, repo.app.name);\n // This should never happen...\n if (!appRepos || safeGet(appRepos, repo.repoInfo_.toURLString()) !== repo) {\n fatal(\n `Database ${repo.app.name}(${repo.repoInfo_}) has already been deleted.`\n );\n }\n repo.interrupt();\n delete appRepos[repo.repoInfo_.toURLString()];\n }\n\n /**\n * Ensures a repo doesn't already exist and then creates one using the\n * provided app.\n *\n * @param {!RepoInfo} repoInfo The metadata about the Repo\n * @param {!FirebaseApp} app\n * @return {!Repo} The Repo object for the specified server / repoName.\n */\n createRepo(\n repoInfo: RepoInfo,\n app: FirebaseApp,\n authProvider: Provider<FirebaseAuthInternalName>\n ): Repo {\n let appRepos = safeGet(this.repos_, app.name);\n\n if (!appRepos) {\n appRepos = {};\n this.repos_[app.name] = appRepos;\n }\n\n let repo = safeGet(appRepos, repoInfo.toURLString());\n if (repo) {\n fatal(\n 'Database initialized multiple times. Please make sure the format of the database URL matches with each database() call.'\n );\n }\n repo = new Repo(repoInfo, this.useRestClient_, app, authProvider);\n appRepos[repoInfo.toURLString()] = repo;\n\n return repo;\n }\n\n /**\n * Forces us to use ReadonlyRestClient instead of PersistentConnection for new Repos.\n * @param {boolean} forceRestClient\n */\n forceRestClient(forceRestClient: boolean) {\n this.useRestClient_ = forceRestClient;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { fatal } from '../core/util/util';\nimport { parseRepoInfo } from '../core/util/libs/parser';\nimport { Path } from '../core/util/Path';\nimport { Reference } from './Reference';\nimport { Repo } from '../core/Repo';\nimport { RepoManager } from '../core/RepoManager';\nimport { validateArgCount } from '@firebase/util';\nimport { validateUrl } from '../core/util/validation';\nimport { FirebaseApp } from '@firebase/app-types';\nimport { FirebaseService } from '@firebase/app-types/private';\nimport { RepoInfo } from '../core/RepoInfo';\nimport { FirebaseDatabase } from '@firebase/database-types';\n\n/**\n * Class representing a firebase database.\n * @implements {FirebaseService}\n */\nexport class Database implements FirebaseService {\n INTERNAL: DatabaseInternals;\n private root_: Reference;\n\n static readonly ServerValue = {\n TIMESTAMP: {\n '.sv': 'timestamp'\n },\n increment: (delta: number) => {\n return {\n '.sv': {\n 'increment': delta\n }\n };\n }\n };\n\n /**\n * The constructor should not be called by users of our public API.\n * @param {!Repo} repo_\n */\n constructor(private repo_: Repo) {\n if (!(repo_ instanceof Repo)) {\n fatal(\n \"Don't call new Database() directly - please use firebase.database().\"\n );\n }\n\n /** @type {Reference} */\n this.root_ = new Reference(repo_, Path.Empty);\n\n this.INTERNAL = new DatabaseInternals(this);\n }\n\n get app(): FirebaseApp {\n return this.repo_.app;\n }\n\n /**\n * Returns a reference to the root or to the path specified in the provided\n * argument.\n *\n * @param {string|Reference=} path The relative string path or an existing\n * Reference to a database location.\n * @throws If a Reference is provided, throws if it does not belong to the\n * same project.\n * @return {!Reference} Firebase reference.\n */\n ref(path?: string): Reference;\n ref(path?: Reference): Reference;\n ref(path?: string | Reference): Reference {\n this.checkDeleted_('ref');\n validateArgCount('database.ref', 0, 1, arguments.length);\n\n if (path instanceof Reference) {\n return this.refFromURL(path.toString());\n }\n\n return path !== undefined ? this.root_.child(path) : this.root_;\n }\n\n /**\n * Returns a reference to the root or the path specified in url.\n * We throw a exception if the url is not in the same domain as the\n * current repo.\n * @param {string} url\n * @return {!Reference} Firebase reference.\n */\n refFromURL(url: string): Reference {\n /** @const {string} */\n const apiName = 'database.refFromURL';\n this.checkDeleted_(apiName);\n validateArgCount(apiName, 1, 1, arguments.length);\n const parsedURL = parseRepoInfo(url);\n validateUrl(apiName, 1, parsedURL);\n\n const repoInfo = parsedURL.repoInfo;\n if (repoInfo.host !== (this.repo_.repoInfo_ as RepoInfo).host) {\n fatal(\n apiName +\n ': Host name does not match the current database: ' +\n '(found ' +\n repoInfo.host +\n ' but expected ' +\n (this.repo_.repoInfo_ as RepoInfo).host +\n ')'\n );\n }\n\n return this.ref(parsedURL.path.toString());\n }\n\n /**\n * @param {string} apiName\n */\n private checkDeleted_(apiName: string) {\n if (this.repo_ === null) {\n fatal('Cannot call ' + apiName + ' on a deleted database.');\n }\n }\n\n // Make individual repo go offline.\n goOffline() {\n validateArgCount('database.goOffline', 0, 0, arguments.length);\n this.checkDeleted_('goOffline');\n this.repo_.interrupt();\n }\n\n goOnline() {\n validateArgCount('database.goOnline', 0, 0, arguments.length);\n this.checkDeleted_('goOnline');\n this.repo_.resume();\n }\n}\n\nexport class DatabaseInternals {\n /** @param {!Database} database */\n constructor(public database: Database) {}\n\n /** @return {Promise<void>} */\n async delete(): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.database as any).checkDeleted_('delete');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RepoManager.getInstance().deleteRepo((this.database as any).repo_ as Repo);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.database as any).repo_ = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.database as any).root_ = null;\n this.database.INTERNAL = null;\n this.database = null;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WebSocketConnection } from '../realtime/WebSocketConnection';\nimport { BrowserPollConnection } from '../realtime/BrowserPollConnection';\nimport { Reference } from './Reference';\n\n/**\n * INTERNAL methods for internal-use only (tests, etc.).\n *\n * Customers shouldn't use these or else should be aware that they could break at any time.\n *\n * @const\n */\n\nexport const forceLongPolling = function() {\n WebSocketConnection.forceDisallow();\n BrowserPollConnection.forceAllow();\n};\n\nexport const forceWebSockets = function() {\n BrowserPollConnection.forceDisallow();\n};\n\n/* Used by App Manager */\nexport const isWebSocketsAvailable = function(): boolean {\n return WebSocketConnection['isAvailable']();\n};\n\nexport const setSecurityDebugCallback = function(\n ref: Reference,\n callback: (a: object) => void\n) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (ref.repo.persistentConnection_ as any).securityDebugCallback_ = callback;\n};\n\nexport const stats = function(ref: Reference, showDelta?: boolean) {\n ref.repo.stats(showDelta);\n};\n\nexport const statsIncrementCounter = function(ref: Reference, metric: string) {\n ref.repo.statsIncrementCounter(metric);\n};\n\nexport const dataUpdateCount = function(ref: Reference): number {\n return ref.repo.dataUpdateCount;\n};\n\nexport const interceptServerData = function(\n ref: Reference,\n callback: ((a: string, b: unknown) => void) | null\n) {\n return ref.repo.interceptServerData_(callback);\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RepoInfo } from '../core/RepoInfo';\nimport { PersistentConnection } from '../core/PersistentConnection';\nimport { RepoManager } from '../core/RepoManager';\nimport { Connection } from '../realtime/Connection';\nimport { Query } from './Query';\n\nexport const DataConnection = PersistentConnection;\n\n/**\n * @param {!string} pathString\n * @param {function(*)} onComplete\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(PersistentConnection.prototype as any).simpleListen = function(\n pathString: string,\n onComplete: (a: unknown) => void\n) {\n this.sendRequest('q', { p: pathString }, onComplete);\n};\n\n/**\n * @param {*} data\n * @param {function(*)} onEcho\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(PersistentConnection.prototype as any).echo = function(\n data: unknown,\n onEcho: (a: unknown) => void\n) {\n this.sendRequest('echo', { d: data }, onEcho);\n};\n\n// RealTimeConnection properties that we use in tests.\nexport const RealTimeConnection = Connection;\n\n/**\n * @param {function(): string} newHash\n * @return {function()}\n */\nexport const hijackHash = function(newHash: () => string) {\n const oldPut = PersistentConnection.prototype.put;\n PersistentConnection.prototype.put = function(\n pathString,\n data,\n onComplete,\n hash\n ) {\n if (hash !== undefined) {\n hash = newHash();\n }\n oldPut.call(this, pathString, data, onComplete, hash);\n };\n return function() {\n PersistentConnection.prototype.put = oldPut;\n };\n};\n\n/**\n * @type {function(new:RepoInfo, !string, boolean, !string, boolean): undefined}\n */\nexport const ConnectionTarget = RepoInfo;\n\n/**\n * @param {!Query} query\n * @return {!string}\n */\nexport const queryIdentifier = function(query: Query) {\n return query.queryIdentifier();\n};\n\n/**\n * Forces the RepoManager to create Repos that use ReadonlyRestClient instead of PersistentConnection.\n *\n * @param {boolean} forceRestClient\n */\nexport const forceRestClient = function(forceRestClient: boolean) {\n RepoManager.getInstance().forceRestClient(forceRestClient);\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport firebase from '@firebase/app';\nimport { FirebaseNamespace } from '@firebase/app-types';\nimport { _FirebaseNamespace } from '@firebase/app-types/private';\nimport { Database } from './src/api/Database';\nimport { DataSnapshot } from './src/api/DataSnapshot';\nimport { Query } from './src/api/Query';\nimport { Reference } from './src/api/Reference';\nimport { enableLogging } from './src/core/util/util';\nimport { RepoManager } from './src/core/RepoManager';\nimport * as INTERNAL from './src/api/internal';\nimport * as TEST_ACCESS from './src/api/test_access';\nimport { isNodeSdk } from '@firebase/util';\nimport * as types from '@firebase/database-types';\nimport { setSDKVersion } from './src/core/version';\nimport { Component, ComponentType } from '@firebase/component';\n\nimport { name, version } from './package.json';\n\nconst ServerValue = Database.ServerValue;\n\nexport function registerDatabase(instance: FirebaseNamespace) {\n // set SDK_VERSION\n setSDKVersion(instance.SDK_VERSION);\n\n // Register the Database Service with the 'firebase' namespace.\n const namespace = (instance as _FirebaseNamespace).INTERNAL.registerComponent(\n new Component(\n 'database',\n (container, url) => {\n /* Dependencies */\n // getImmediate for FirebaseApp will always succeed\n const app = container.getProvider('app').getImmediate();\n const authProvider = container.getProvider('auth-internal');\n\n return RepoManager.getInstance().databaseFromApp(\n app,\n authProvider,\n url\n );\n },\n ComponentType.PUBLIC\n )\n .setServiceProps(\n // firebase.database namespace properties\n {\n Reference,\n Query,\n Database,\n DataSnapshot,\n enableLogging,\n INTERNAL,\n ServerValue,\n TEST_ACCESS\n }\n )\n .setMultipleInstances(true)\n );\n\n instance.registerVersion(name, version);\n\n if (isNodeSdk()) {\n module.exports = namespace;\n }\n}\n\nregisterDatabase(firebase);\n\n// Types to export for the admin SDK\nexport { Database, Query, Reference, enableLogging, ServerValue };\n\nexport { DataSnapshot } from './src/api/DataSnapshot';\nexport { OnDisconnect } from './src/api/onDisconnect';\n\ndeclare module '@firebase/app-types' {\n interface FirebaseNamespace {\n database?: {\n (app?: FirebaseApp): types.FirebaseDatabase;\n enableLogging: typeof types.enableLogging;\n ServerValue: types.ServerValue;\n Database: typeof types.FirebaseDatabase;\n };\n }\n interface FirebaseApp {\n database?(databaseURL?: string): types.FirebaseDatabase;\n }\n}\n"],"names":["errorPrefixFxn","errorPrefix","MAX_NODE","setMaxNode","setPriorityMaxNode","nodeFromJSON","__referenceConstructor","ENV_CONSTANTS"],"mappings":"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"}