{"version":3,"file":"index.node.esm.js","sources":["../../src/realtime/Constants.ts","../../src/core/storage/DOMStorageWrapper.ts","../../src/core/storage/MemoryStorage.ts","../../src/core/storage/storage.ts","../../src/core/util/util.ts","../../src/core/RepoInfo.ts","../../src/core/stats/StatsCollection.ts","../../src/core/stats/StatsManager.ts","../../src/core/version.ts","../../src/realtime/WebSocketConnection.ts","../../src/core/AppCheckTokenProvider.ts","../../src/core/AuthTokenProvider.ts","../../src/realtime/polling/PacketReceiver.ts","../../src/realtime/BrowserPollConnection.ts","../../src/realtime/TransportManager.ts","../../src/realtime/Connection.ts","../../src/core/ServerActions.ts","../../src/core/util/EventEmitter.ts","../../src/core/util/OnlineMonitor.ts","../../src/core/util/Path.ts","../../src/core/util/VisibilityMonitor.ts","../../src/core/PersistentConnection.ts","../../src/core/snap/Node.ts","../../src/core/snap/indexes/Index.ts","../../src/core/snap/indexes/KeyIndex.ts","../../src/core/util/SortedMap.ts","../../src/core/snap/comparators.ts","../../src/core/snap/snap.ts","../../src/core/snap/LeafNode.ts","../../src/core/snap/indexes/PriorityIndex.ts","../../src/core/snap/childSet.ts","../../src/core/snap/IndexMap.ts","../../src/core/snap/ChildrenNode.ts","../../src/core/snap/nodeFromJSON.ts","../../src/core/snap/indexes/PathIndex.ts","../../src/core/snap/indexes/ValueIndex.ts","../../src/core/view/Change.ts","../../src/core/view/filter/IndexedFilter.ts","../../src/core/view/filter/RangedFilter.ts","../../src/core/view/filter/LimitedFilter.ts","../../src/core/view/QueryParams.ts","../../src/core/ReadonlyRestClient.ts","../../src/core/SnapshotHolder.ts","../../src/core/SparseSnapshotTree.ts","../../src/core/stats/StatsListener.ts","../../src/core/stats/StatsReporter.ts","../../src/core/operation/Operation.ts","../../src/core/operation/AckUserWrite.ts","../../src/core/operation/ListenComplete.ts","../../src/core/operation/Overwrite.ts","../../src/core/operation/Merge.ts","../../src/core/view/CacheNode.ts","../../src/core/view/EventGenerator.ts","../../src/core/view/ViewCache.ts","../../src/core/util/ImmutableTree.ts","../../src/core/CompoundWrite.ts","../../src/core/WriteTree.ts","../../src/core/view/ChildChangeAccumulator.ts","../../src/core/view/CompleteChildSource.ts","../../src/core/view/ViewProcessor.ts","../../src/core/view/View.ts","../../src/core/SyncPoint.ts","../../src/core/SyncTree.ts","../../src/core/util/ServerValues.ts","../../src/core/util/Tree.ts","../../src/core/util/validation.ts","../../src/core/view/EventQueue.ts","../../src/core/Repo.ts","../../src/core/util/libs/parser.ts","../../src/core/util/NextPushId.ts","../../src/core/view/Event.ts","../../src/core/view/EventRegistration.ts","../../src/api/OnDisconnect.ts","../../src/api/Reference_impl.ts","../../src/api/Database.ts","../../src/register.ts","../../src/api/ServerValue.ts","../../src/api/Transaction.ts","../../src/api/test_access.ts","../../src/index.node.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\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\n// Matches console.firebase.google.com, firebase-console-*.corp.google.com and\n// firebase.corp.google.com\nexport const FORGE_DOMAIN_RE =\n /(console\\.firebase|firebase-console-\\w+\\.corp|firebase\\.corp)\\.google\\.com/;\n\nexport const LAST_SESSION_PARAM = 'ls';\n\nexport const APPLICATION_ID_PARAM = 'p';\n\nexport const APP_CHECK_TOKEN_PARAM = 'ac';\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 { 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 */\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 domStorage_ - The underlying storage object (e.g. localStorage or sessionStorage)\n */\n constructor(private domStorage_: Storage) {}\n\n /**\n * @param key - The key to save the value under\n * @param 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 * @returns 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 remove(key: string) {\n this.domStorage_.removeItem(this.prefixedName_(key));\n }\n\n isInMemoryStorage: boolean;\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 */\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 domStorageName - Name of the underlying storage object\n * (e.g. 'localStorage' or 'sessionStorage').\n * @returns 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 { Logger, LogLevel } from '@firebase/logger';\nimport {\n assert,\n base64,\n Sha1,\n stringToByteArray,\n stringify,\n isNodeSdk\n} from '@firebase/util';\n\nimport { SessionStorage } from '../storage/storage';\nimport { QueryContext } from '../view/EventRegistration';\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 */\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 str - The string to hash\n * @returns {!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\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 */\nexport let logger: ((a: string) => void) | null = null;\n\n/**\n * Flag to check for log availability on first log message\n */\nlet firstLog_ = true;\n\n/**\n * The implementation of Firebase.enableLogging (defined here to break dependencies)\n * @param logger_ - A flag to turn on logging, or a custom logger\n * @param 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\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\nexport const logWrapper = function (\n prefix: string\n): (...varArgs: unknown[]) => void {\n return function (...varArgs: unknown[]) {\n log(prefix, ...varArgs);\n };\n};\n\nexport const error = function (...varArgs: string[]) {\n const message = 'FIREBASE INTERNAL ERROR: ' + buildLogMessage_(...varArgs);\n logClient.error(message);\n};\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\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\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 */\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\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 */\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 */\nexport const MAX_NAME = '[MAX_NAME]';\n\n/**\n * Compares valid Firebase key names, plus min and max name\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 * @returns {!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\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\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 str - The string\n * @param segsize - The maximum number of chars in the string.\n * @returns 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 callback - Callback function.\n * @param context - Optional context to bind to.\n *\n */\nexport const bindCallback = function (\n callback: (a: unknown) => void,\n context?: object | null\n): (a: unknown) => void {\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 v - A double\n *\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 */\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 */\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 */\nexport function errorForServerCode(code: string, query: QueryContext): 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 */\nexport const INTEGER_REGEXP_ = new RegExp('^-?(0*)\\\\d{1,10}$');\n\n/**\n * For use in keys, the minimum possible 32-bit integer.\n */\nexport const INTEGER_32_MIN = -2147483648;\n\n/**\n * For use in kyes, the maximum possible 32-bit integer.\n */\nexport const INTEGER_32_MAX = 2147483647;\n\n/**\n * If the string contains a 32-bit integer, return it. Else return null.\n */\nexport const tryParseInt = function (str: string): number | null {\n if (INTEGER_REGEXP_.test(str)) {\n const intVal = Number(str);\n if (intVal >= INTEGER_32_MIN && intVal <= INTEGER_32_MAX) {\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 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 callback - Optional onComplete callback.\n * @param varArgs - Arbitrary args to be passed to opt_onComplete\n */\nexport const callUserCallback = function (\n // eslint-disable-next-line @typescript-eslint/ban-types\n callback?: Function | null,\n ...varArgs: unknown[]\n) {\n if (typeof callback === 'function') {\n exceptionGuard(() => {\n callback(...varArgs);\n });\n }\n};\n\n/**\n * @returns {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 */\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 fn - Function to run.\n * @param time - Milliseconds to wait before running.\n * @returns The setTimeout() return value.\n */\nexport const setTimeoutNonBlocking = function (\n fn: () => void,\n time: number\n): number | object {\n const timeout: number | object = setTimeout(fn, time);\n // Note: at the time of this comment, unrefTimer is under the unstable set of APIs. Run with --unstable to enable the API.\n if (\n typeof timeout === 'number' &&\n // @ts-ignore Is only defined in Deno environments.\n typeof Deno !== 'undefined' &&\n // @ts-ignore Deno and unrefTimer are only defined in Deno environments.\n Deno['unrefTimer']\n ) {\n // @ts-ignore Deno and unrefTimer are only defined in Deno environments.\n Deno.unrefTimer(timeout);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } else 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\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 { assert } from '@firebase/util';\n\nimport { LONG_POLLING, WEBSOCKET } from '../realtime/Constants';\n\nimport { PersistentStorage } from './storage/storage';\nimport { each } from './util/util';\n\n/**\n * A class that holds metadata about a Repo object\n */\nexport class RepoInfo {\n private _host: string;\n private _domain: string;\n internalHost: string;\n\n /**\n * @param host - Hostname portion of the url for the repo\n * @param secure - Whether or not this repo is accessed over ssl\n * @param namespace - The namespace represented by the repo\n * @param webSocketOnly - Whether to prefer websockets over all other transports (used by Nest).\n * @param nodeAdmin - Whether this instance uses Admin SDK credentials\n * @param persistenceKey - Override the default session persistence storage key\n */\n constructor(\n host: string,\n public readonly secure: boolean,\n public readonly namespace: string,\n public readonly webSocketOnly: boolean,\n public readonly nodeAdmin: boolean = false,\n public readonly persistenceKey: string = '',\n public readonly 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 isCacheableHost(): boolean {\n return this.internalHost.substr(0, 2) === 's-';\n }\n\n isCustomHost() {\n return (\n this._domain !== 'firebaseio.com' &&\n this._domain !== 'firebaseio-demo.com'\n );\n }\n\n get host() {\n return this._host;\n }\n\n set host(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 toString(): string {\n let str = this.toURLString();\n if (this.persistenceKey) {\n str += '<' + this.persistenceKey + '>';\n }\n return str;\n }\n\n toURLString(): string {\n const protocol = this.secure ? 'https://' : 'http://';\n const query = this.includeNamespaceInQueryParams\n ? `?ns=${this.namespace}`\n : '';\n return `${protocol}${this.host}/${query}`;\n }\n}\n\nfunction repoInfoNeedsQueryParam(repoInfo: RepoInfo): boolean {\n return (\n repoInfo.host !== repoInfo.internalHost ||\n repoInfo.isCustomHost() ||\n repoInfo.includeNamespaceInQueryParams\n );\n}\n\n/**\n * Returns the websocket URL for this repo\n * @param repoInfo - RepoInfo object\n * @param type - of connection\n * @param params - list\n * @returns The URL for this repo\n */\nexport function repoInfoConnectionURL(\n repoInfo: RepoInfo,\n type: string,\n params: { [k: string]: string }\n): 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 (repoInfo.secure ? 'wss://' : 'ws://') + repoInfo.internalHost + '/.ws?';\n } else if (type === LONG_POLLING) {\n connURL =\n (repoInfo.secure ? 'https://' : 'http://') +\n repoInfo.internalHost +\n '/.lp?';\n } else {\n throw new Error('Unknown connection type: ' + type);\n }\n if (repoInfoNeedsQueryParam(repoInfo)) {\n params['ns'] = repoInfo.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 * @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 */\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 { RepoInfo } from '../RepoInfo';\n\nimport { StatsCollection } from './StatsCollection';\n\nconst collections: { [k: string]: StatsCollection } = {};\nconst reporters: { [k: string]: unknown } = {};\n\nexport function statsManagerGetCollection(repoInfo: RepoInfo): StatsCollection {\n const hashString = repoInfo.toString();\n\n if (!collections[hashString]) {\n collections[hashString] = new StatsCollection();\n }\n\n return collections[hashString];\n}\n\nexport function statsManagerGetOrCreateReporter(\n repoInfo: RepoInfo,\n creatorFunction: () => T\n): T {\n const hashString = repoInfo.toString();\n\n if (!reporters[hashString]) {\n reporters[hashString] = creatorFunction();\n }\n\n return reporters[hashString] as T;\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/**\n * SDK_VERSION should be set before any database instance is created\n * @internal\n */\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 { assert, isNodeSdk, jsonEval, stringify } from '@firebase/util';\n\nimport { RepoInfo, repoInfoConnectionURL } from '../core/RepoInfo';\nimport { StatsCollection } from '../core/stats/StatsCollection';\nimport { statsManagerGetCollection } from '../core/stats/StatsManager';\nimport { PersistentStorage } from '../core/storage/storage';\nimport { logWrapper, splitStringBySize } from '../core/util/util';\nimport { SDK_VERSION } from '../core/version';\n\nimport {\n APPLICATION_ID_PARAM,\n APP_CHECK_TOKEN_PARAM,\n FORGE_DOMAIN_RE,\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 { Transport } from './Transport';\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 */\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 private nodeAdmin: boolean;\n\n /**\n * @param connId identifier for this transport\n * @param repoInfo The info for the websocket endpoint.\n * @param applicationId The Firebase App ID for this project.\n * @param appCheckToken The App Check Token for this client.\n * @param authToken The Auth Token for this client.\n * @param transportSessionId Optional transportSessionId if this is connecting\n * to an existing transport session\n * @param lastSessionId Optional lastSessionId if there was a previous\n * connection\n */\n constructor(\n public connId: string,\n repoInfo: RepoInfo,\n private applicationId?: string,\n private appCheckToken?: string,\n private authToken?: string,\n transportSessionId?: string,\n lastSessionId?: string\n ) {\n this.log_ = logWrapper(this.connId);\n this.stats_ = statsManagerGetCollection(repoInfo);\n this.connURL = WebSocketConnection.connectionURL_(\n repoInfo,\n transportSessionId,\n lastSessionId,\n appCheckToken,\n applicationId\n );\n this.nodeAdmin = repoInfo.nodeAdmin;\n }\n\n /**\n * @param repoInfo - The info for the websocket endpoint.\n * @param transportSessionId - Optional transportSessionId if this is connecting to an existing transport\n * session\n * @param lastSessionId - Optional lastSessionId if there was a previous connection\n * @returns connection url\n */\n private static connectionURL_(\n repoInfo: RepoInfo,\n transportSessionId?: string,\n lastSessionId?: string,\n appCheckToken?: string,\n applicationId?: 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.hostname &&\n FORGE_DOMAIN_RE.test(location.hostname)\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 if (appCheckToken) {\n urlParams[APP_CHECK_TOKEN_PARAM] = appCheckToken;\n }\n if (applicationId) {\n urlParams[APPLICATION_ID_PARAM] = applicationId;\n }\n\n return repoInfoConnectionURL(repoInfo, WEBSOCKET, urlParams);\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 let options: { [k: string]: object };\n if (isNodeSdk()) {\n const device = this.nodeAdmin ? 'AdminNode' : 'Node';\n // UA Format: Firebase////\n options = {\n headers: {\n 'User-Agent': `Firebase/${PROTOCOL_VERSION}/${SDK_VERSION}/${process.platform}/${device}`,\n 'X-Firebase-GMPID': this.applicationId || ''\n }\n };\n\n // If using Node with admin creds, AppCheck-related checks are unnecessary.\n // Note that we send the credentials here even if they aren't admin credentials, which is\n // not a problem.\n // Note that this header is just used to bypass appcheck, and the token should still be sent\n // through the websocket connection once it is established.\n if (this.authToken) {\n options.headers['Authorization'] = `Bearer ${this.authToken}`;\n }\n if (this.appCheckToken) {\n options.headers['X-Firebase-AppCheck'] = this.appCheckToken;\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 } 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 */\n static responsesRequiredToBeHealthy = 2;\n\n /**\n * Time to wait for the connection te become healthy before giving up.\n */\n static healthyTimeout = 30000;\n\n /**\n * Returns true if we previously failed to connect with this transport.\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 frameCount - The number of frames we are expecting from the server\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 * @returns Any remaining data to be process, or null if there is none\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 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 str - String to send.\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 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n AppCheckInternalComponentName,\n AppCheckTokenListener,\n AppCheckTokenResult,\n FirebaseAppCheckInternal\n} from '@firebase/app-check-interop-types';\nimport { Provider } from '@firebase/component';\n\nimport { warn } from './util/util';\n\n/**\n * Abstraction around AppCheck's token fetching capabilities.\n */\nexport class AppCheckTokenProvider {\n private appCheck?: FirebaseAppCheckInternal;\n constructor(\n private appName_: string,\n private appCheckProvider?: Provider\n ) {\n this.appCheck = appCheckProvider?.getImmediate({ optional: true });\n if (!this.appCheck) {\n appCheckProvider?.get().then(appCheck => (this.appCheck = appCheck));\n }\n }\n\n getToken(forceRefresh?: boolean): Promise {\n if (!this.appCheck) {\n return new Promise((resolve, reject) => {\n // Support delayed initialization of FirebaseAppCheck. This allows our\n // customers to initialize the RTDB SDK before initializing Firebase\n // AppCheck and ensures that all requests are authenticated if a token\n // becomes available before the timoeout below expires.\n setTimeout(() => {\n if (this.appCheck) {\n this.getToken(forceRefresh).then(resolve, reject);\n } else {\n resolve(null);\n }\n }, 0);\n });\n }\n return this.appCheck.getToken(forceRefresh);\n }\n\n addTokenChangeListener(listener: AppCheckTokenListener) {\n this.appCheckProvider\n ?.get()\n .then(appCheck => appCheck.addTokenListener(listener));\n }\n\n notifyForInvalidToken(): void {\n warn(\n `Provided AppCheck credentials for the app named \"${this.appName_}\" ` +\n 'are invalid. This usually indicates your app was not initialized correctly.'\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 { FirebaseAuthTokenData } from '@firebase/app-types/private';\nimport {\n FirebaseAuthInternal,\n FirebaseAuthInternalName\n} from '@firebase/auth-interop-types';\nimport { Provider } from '@firebase/component';\n\nimport { log, warn } from './util/util';\n\nexport interface AuthTokenProvider {\n getToken(forceRefresh: boolean): Promise;\n addTokenChangeListener(listener: (token: string | null) => void): void;\n removeTokenChangeListener(listener: (token: string | null) => void): void;\n notifyForInvalidToken(): void;\n}\n\n/**\n * Abstraction around FirebaseApp's token fetching capabilities.\n */\nexport class FirebaseAuthTokenProvider implements AuthTokenProvider {\n private auth_: FirebaseAuthInternal | null = null;\n\n constructor(\n private appName_: string,\n private firebaseOptions_: object,\n private authProvider_: Provider\n ) {\n this.auth_ = authProvider_.getImmediate({ optional: true });\n if (!this.auth_) {\n authProvider_.onInit(auth => (this.auth_ = auth));\n }\n }\n\n getToken(forceRefresh: boolean): Promise {\n if (!this.auth_) {\n return new Promise((resolve, reject) => {\n // Support delayed initialization of FirebaseAuth. This allows our\n // customers to initialize the RTDB SDK before initializing Firebase\n // Auth and ensures that all requests are authenticated if a token\n // becomes available before the timoeout below expires.\n setTimeout(() => {\n if (this.auth_) {\n this.getToken(forceRefresh).then(resolve, reject);\n } else {\n resolve(null);\n }\n }, 0);\n });\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): 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 this.authProvider_\n .get()\n .then(auth => auth.addAuthTokenListener(listener));\n }\n }\n\n removeTokenChangeListener(listener: (token: string | null) => void): void {\n this.authProvider_\n .get()\n .then(auth => auth.removeAuthTokenListener(listener));\n }\n\n notifyForInvalidToken(): void {\n let errorMessage =\n 'Provided authentication credentials for the app named \"' +\n this.appName_ +\n '\" are invalid. This usually indicates your app was not ' +\n 'initialized correctly. ';\n if ('credential' in this.firebaseOptions_) {\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.firebaseOptions_) {\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/* AuthTokenProvider that supplies a constant token. Used by Admin SDK or mockUserToken with emulators. */\nexport class EmulatorTokenProvider implements AuthTokenProvider {\n /** A string that is treated as an admin access token by the RTDB emulator. Used by Admin SDK. */\n static OWNER = 'owner';\n\n constructor(private accessToken: string) {}\n\n getToken(forceRefresh: boolean): Promise {\n return Promise.resolve({\n accessToken: this.accessToken\n });\n }\n\n addTokenChangeListener(listener: (token: string | null) => void): void {\n // Invoke the listener immediately to match the behavior in Firebase Auth\n // (see packages/auth/src/auth.js#L1807)\n listener(this.accessToken);\n }\n\n removeTokenChangeListener(listener: (token: string | null) => void): void {}\n\n notifyForInvalidToken(): void {}\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 */\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 */\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 { base64Encode, isNodeSdk, stringify } from '@firebase/util';\n\nimport { RepoInfo, repoInfoConnectionURL } from '../core/RepoInfo';\nimport { StatsCollection } from '../core/stats/StatsCollection';\nimport { statsManagerGetCollection } from '../core/stats/StatsManager';\nimport {\n executeWhenDOMReady,\n isChromeExtensionContentScript,\n isWindowsStoreApp,\n log,\n logWrapper,\n LUIDGenerator,\n splitStringBySize\n} from '../core/util/util';\n\nimport {\n APP_CHECK_TOKEN_PARAM,\n APPLICATION_ID_PARAM,\n FORGE_DOMAIN_RE,\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 { PacketReceiver } from './polling/PacketReceiver';\nimport { Transport } from './Transport';\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 */\nconst KEEPALIVE_REQUEST_INTERVAL = 25000;\n\n/**\n * How long to wait before aborting a long-polling connection attempt.\n */\nconst LP_CONNECT_TIMEOUT = 30000;\n\n/**\n * This class manages a single long-polling connection.\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 connId An identifier for this connection, used for logging\n * @param repoInfo The info for the endpoint to send data to.\n * @param applicationId The Firebase App ID for this project.\n * @param appCheckToken The AppCheck token for this client.\n * @param authToken The AuthToken to use for this connection.\n * @param transportSessionId Optional transportSessionid if we are\n * reconnecting for an existing transport session\n * @param lastSessionId Optional lastSessionId if the PersistentConnection has\n * already created a connection previously\n */\n constructor(\n public connId: string,\n public repoInfo: RepoInfo,\n private applicationId?: string,\n private appCheckToken?: string,\n private authToken?: string,\n public transportSessionId?: string,\n public lastSessionId?: string\n ) {\n this.log_ = logWrapper(connId);\n this.stats_ = statsManagerGetCollection(repoInfo);\n this.urlFn = (params: { [k: string]: string }) => {\n // Always add the token if we have one.\n if (this.appCheckToken) {\n params[APP_CHECK_TOKEN_PARAM] = this.appCheckToken;\n }\n return repoInfoConnectionURL(repoInfo, LONG_POLLING, params);\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.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[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 (this.applicationId) {\n urlParams[APPLICATION_ID_PARAM] = this.applicationId;\n }\n if (this.appCheckToken) {\n urlParams[APP_CHECK_TOKEN_PARAM] = this.appCheckToken;\n }\n if (\n typeof location !== 'undefined' &&\n location.hostname &&\n FORGE_DOMAIN_RE.test(location.hostname)\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 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 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 */\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 */\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 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 */\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 */\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/naming-convention\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 *********************************************************************************************/\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();\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[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 = '';\n }\n const iframeContents = '' + script + '';\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 */\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 textContent seems to be the safest way to do this.\n this.myIFrame.doc.body.textContent = '';\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 id - The ID of this connection\n * @param 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 url - The URL of the script tag.\n * @param serial - The serial number of the request.\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 url - The URL for the script tag source.\n * @param 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 =\n 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 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 { warn } from '../core/util/util';\n\nimport { BrowserPollConnection } from './BrowserPollConnection';\nimport { TransportConstructor } from './Transport';\nimport { WebSocketConnection } from './WebSocketConnection';\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 */\nexport class TransportManager {\n private transports_: TransportConstructor[];\n\n // Keeps track of whether the TransportManager has already chosen a transport to use\n static globalTransportInitialized_ = false;\n\n static get ALL_TRANSPORTS() {\n return [BrowserPollConnection, WebSocketConnection];\n }\n\n /**\n * Returns whether transport has been selected to ensure WebSocketConnection or BrowserPollConnection are not called after\n * TransportManager has already set up transports_\n */\n static get IS_TRANSPORT_INITIALIZED() {\n return this.globalTransportInitialized_;\n }\n\n /**\n * @param repoInfo - Metadata around the namespace we're connecting to\n */\n constructor(repoInfo: RepoInfo) {\n this.initTransports_(repoInfo);\n }\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 TransportManager.globalTransportInitialized_ = true;\n }\n }\n\n /**\n * @returns The constructor for the 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 * @returns The constructor for the next 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 { RepoInfo } from '../core/RepoInfo';\nimport { PersistentStorage } from '../core/storage/storage';\nimport { Indexable } from '../core/util/misc';\nimport {\n error,\n logWrapper,\n requireKey,\n setTimeoutNonBlocking,\n warn\n} from '../core/util/util';\n\nimport { PROTOCOL_VERSION } from './Constants';\nimport { Transport, TransportConstructor } from './Transport';\nimport { TransportManager } from './TransportManager';\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 */\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 id - an id for this connection\n * @param repoInfo_ - the info for the endpoint to connect to\n * @param applicationId_ - the Firebase App ID for this project\n * @param appCheckToken_ - The App Check Token for this device.\n * @param authToken_ - The auth token for this session.\n * @param onMessage_ - the callback to be triggered when a server-push message arrives\n * @param onReady_ - the callback to be triggered when this connection is ready to send messages.\n * @param onDisconnect_ - the callback to be triggered when a connection was lost\n * @param onKill_ - the callback to be triggered when this connection has permanently shut down.\n * @param 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 applicationId_: string | undefined,\n private appCheckToken_: string | undefined,\n private authToken_: string | undefined,\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 */\n private start_(): void {\n const conn = this.transportManager_.initialTransport();\n this.conn_ = new conn(\n this.nextTransportId_(),\n this.repoInfo_,\n this.applicationId_,\n this.appCheckToken_,\n this.authToken_,\n null,\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 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 * @param 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 * @param handshake - The handshake data returned from the server\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_.host = 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.applicationId_,\n this.appCheckToken_,\n this.authToken_,\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_.host = 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 * @param everConnected - Whether or not the connection ever reached a server. Used to determine if\n * we should flush the host cache\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. .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 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 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 { QueryContext } from './view/EventRegistration';\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 abstract listen(\n query: QueryContext,\n currentHashFn: () => string,\n tag: number | null,\n onComplete: (a: string, b: unknown) => void\n ): void;\n\n /**\n * Remove a listen.\n */\n abstract unlisten(query: QueryContext, tag: number | null): void;\n\n /**\n * Get the server value satisfying this query.\n */\n abstract get(query: QueryContext): Promise;\n\n put(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void,\n hash?: string\n ) {}\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 token - The authentication token\n */\n refreshAuthToken(token: string) {}\n\n /**\n * Refreshes the app check token for the current connection.\n * @param token The app check token\n */\n refreshAppCheckToken(token: string) {}\n\n onDisconnectPut(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void\n ) {}\n\n onDisconnectMerge(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void\n ) {}\n\n onDisconnectCancel(\n pathString: string,\n onComplete?: (a: string, b: string) => void\n ) {}\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 { 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 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 * @returns {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 */\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 { assert, isMobileCordova } from '@firebase/util';\n\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 */\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 getInitialEvent(eventType: string): boolean[] {\n assert(eventType === 'online', 'Unknown event type: ' + eventType);\n return [this.online_];\n }\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 { stringLength } from '@firebase/util';\n\nimport { nameCompare } from './util';\n\n/** Maximum key depth. */\nconst MAX_PATH_DEPTH = 32;\n\n/** Maximum number of (UTF8) bytes in a Firebase path. */\nconst MAX_PATH_LENGTH_BYTES = 768;\n\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 pieces_: string[];\n pieceNum_: number;\n\n /**\n * @param pathOrString - Path string to parse, or another path, or the raw\n * tokens array\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 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\nexport function newEmptyPath(): Path {\n return new Path('');\n}\n\nexport function pathGetFront(path: Path): string | null {\n if (path.pieceNum_ >= path.pieces_.length) {\n return null;\n }\n\n return path.pieces_[path.pieceNum_];\n}\n\n/**\n * @returns The number of segments in this path\n */\nexport function pathGetLength(path: Path): number {\n return path.pieces_.length - path.pieceNum_;\n}\n\nexport function pathPopFront(path: Path): Path {\n let pieceNum = path.pieceNum_;\n if (pieceNum < path.pieces_.length) {\n pieceNum++;\n }\n return new Path(path.pieces_, pieceNum);\n}\n\nexport function pathGetBack(path: Path): string | null {\n if (path.pieceNum_ < path.pieces_.length) {\n return path.pieces_[path.pieces_.length - 1];\n }\n\n return null;\n}\n\nexport function pathToUrlEncodedString(path: Path): string {\n let pathString = '';\n for (let i = path.pieceNum_; i < path.pieces_.length; i++) {\n if (path.pieces_[i] !== '') {\n pathString += '/' + encodeURIComponent(String(path.pieces_[i]));\n }\n }\n\n return pathString || '/';\n}\n\n/**\n * Shallow copy of the parts of the path.\n *\n */\nexport function pathSlice(path: Path, begin: number = 0): string[] {\n return path.pieces_.slice(path.pieceNum_ + begin);\n}\n\nexport function pathParent(path: Path): Path | null {\n if (path.pieceNum_ >= path.pieces_.length) {\n return null;\n }\n\n const pieces = [];\n for (let i = path.pieceNum_; i < path.pieces_.length - 1; i++) {\n pieces.push(path.pieces_[i]);\n }\n\n return new Path(pieces, 0);\n}\n\nexport function pathChild(path: Path, childPathObj: string | Path): Path {\n const pieces = [];\n for (let i = path.pieceNum_; i < path.pieces_.length; i++) {\n pieces.push(path.pieces_[i]);\n }\n\n if (childPathObj instanceof Path) {\n for (let i = childPathObj.pieceNum_; i < childPathObj.pieces_.length; i++) {\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 * @returns True if there are no segments in this path\n */\nexport function pathIsEmpty(path: Path): boolean {\n return path.pieceNum_ >= path.pieces_.length;\n}\n\n/**\n * @returns The path from outerPath to innerPath\n */\nexport function newRelativePath(outerPath: Path, innerPath: Path): Path {\n const outer = pathGetFront(outerPath),\n inner = pathGetFront(innerPath);\n if (outer === null) {\n return innerPath;\n } else if (outer === inner) {\n return newRelativePath(pathPopFront(outerPath), pathPopFront(innerPath));\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 * @returns -1, 0, 1 if left is less, equal, or greater than the right.\n */\nexport function pathCompare(left: Path, right: Path): number {\n const leftKeys = pathSlice(left, 0);\n const rightKeys = pathSlice(right, 0);\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 * @returns true if paths are the same.\n */\nexport function pathEquals(path: Path, other: Path): boolean {\n if (pathGetLength(path) !== pathGetLength(other)) {\n return false;\n }\n\n for (\n let i = path.pieceNum_, j = other.pieceNum_;\n i <= path.pieces_.length;\n i++, j++\n ) {\n if (path.pieces_[i] !== other.pieces_[j]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * @returns True if this path is a parent of (or the same as) other\n */\nexport function pathContains(path: Path, other: Path): boolean {\n let i = path.pieceNum_;\n let j = other.pieceNum_;\n if (pathGetLength(path) > pathGetLength(other)) {\n return false;\n }\n while (i < path.pieces_.length) {\n if (path.pieces_[i] !== other.pieces_[j]) {\n return false;\n }\n ++i;\n ++j;\n }\n return true;\n}\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 parts_: string[];\n /** Initialize to number of '/' chars needed in path. */\n byteLength_: number;\n\n /**\n * @param path - Initial Path.\n * @param errorPrefix_ - Prefix for any error messages.\n */\n constructor(path: Path, public errorPrefix_: string) {\n this.parts_ = pathSlice(path, 0);\n /** 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 validationPathCheckValid(this);\n }\n}\n\nexport function validationPathPush(\n validationPath: ValidationPath,\n child: string\n): void {\n // Count the needed '/'\n if (validationPath.parts_.length > 0) {\n validationPath.byteLength_ += 1;\n }\n validationPath.parts_.push(child);\n validationPath.byteLength_ += stringLength(child);\n validationPathCheckValid(validationPath);\n}\n\nexport function validationPathPop(validationPath: ValidationPath): void {\n const last = validationPath.parts_.pop();\n validationPath.byteLength_ -= stringLength(last);\n // Un-count the previous '/'\n if (validationPath.parts_.length > 0) {\n validationPath.byteLength_ -= 1;\n }\n}\n\nfunction validationPathCheckValid(validationPath: ValidationPath): void {\n if (validationPath.byteLength_ > MAX_PATH_LENGTH_BYTES) {\n throw new Error(\n validationPath.errorPrefix_ +\n 'has a key path longer than ' +\n MAX_PATH_LENGTH_BYTES +\n ' bytes (' +\n validationPath.byteLength_ +\n ').'\n );\n }\n if (validationPath.parts_.length > MAX_PATH_DEPTH) {\n throw new Error(\n validationPath.errorPrefix_ +\n 'path specified exceeds the maximum depth that can be written (' +\n MAX_PATH_DEPTH +\n ') or object contains a cycle ' +\n validationPathToErrorString(validationPath)\n );\n }\n}\n\n/**\n * String for use in error messages - uses '.' notation for path.\n */\nexport function validationPathToErrorString(\n validationPath: ValidationPath\n): string {\n if (validationPath.parts_.length === 0) {\n return '';\n }\n return \"in property '\" + validationPath.parts_.join('.') + \"'\";\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\nimport { EventEmitter } from './EventEmitter';\n\ndeclare const document: Document;\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 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 {\n assert,\n contains,\n Deferred,\n isEmpty,\n isMobileCordova,\n isNodeSdk,\n isReactNative,\n isValidFormat,\n safeGet,\n stringify,\n isAdmin\n} from '@firebase/util';\n\nimport { Connection } from '../realtime/Connection';\n\nimport { AppCheckTokenProvider } from './AppCheckTokenProvider';\nimport { AuthTokenProvider } from './AuthTokenProvider';\nimport { RepoInfo } from './RepoInfo';\nimport { ServerActions } from './ServerActions';\nimport { OnlineMonitor } from './util/OnlineMonitor';\nimport { Path } from './util/Path';\nimport { error, log, logWrapper, warn, ObjectToUniqueKey } from './util/util';\nimport { VisibilityMonitor } from './util/VisibilityMonitor';\nimport { SDK_VERSION } from './version';\nimport { QueryContext } from './view/EventRegistration';\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_TOKEN_THRESHOLD = 3;\n\ninterface ListenSpec {\n onComplete(s: string, p?: unknown): void;\n\n hashFn(): string;\n\n query: QueryContext;\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\ninterface OutstandingGet {\n request: object;\n onComplete: (response: { [k: string]: unknown }) => 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 private readonly listens: Map<\n /* path */ string,\n Map\n > = new Map();\n private outstandingPuts_: OutstandingPut[] = [];\n private outstandingGets_: OutstandingGet[] = [];\n private outstandingPutCount_ = 0;\n private outstandingGetCount_ = 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 appCheckToken_: string | null = null;\n private forceTokenRefresh_ = false;\n private invalidAuthTokenCount_ = 0;\n private invalidAppCheckTokenCount_ = 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 * @param repoInfo_ - Data about the namespace we are connecting to\n * @param applicationId_ - The Firebase App ID for this project\n * @param onDataUpdate_ - A callback for new data from the server\n */\n constructor(\n private repoInfo_: RepoInfo,\n private applicationId_: string,\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 appCheckTokenProvider_: AppCheckTokenProvider,\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\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 get(query: QueryContext): Promise {\n this.initConnection_();\n\n const deferred = new Deferred();\n const request = {\n p: query._path.toString(),\n q: query._queryObject\n };\n const outstandingGet = {\n action: 'g',\n request,\n onComplete: (message: { [k: string]: unknown }) => {\n const payload = message['d'] as string;\n if (message['s'] === 'ok') {\n deferred.resolve(payload);\n } else {\n deferred.reject(payload);\n }\n }\n };\n this.outstandingGets_.push(outstandingGet);\n this.outstandingGetCount_++;\n const index = this.outstandingGets_.length - 1;\n\n if (this.connected_) {\n this.sendGet_(index);\n }\n\n return deferred.promise;\n }\n\n listen(\n query: QueryContext,\n currentHashFn: () => string,\n tag: number | null,\n onComplete: (a: string, b: unknown) => void\n ) {\n this.initConnection_();\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._queryParams.isDefault() || !query._queryParams.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 sendGet_(index: number) {\n const get = this.outstandingGets_[index];\n this.sendRequest('g', get.request, (message: { [k: string]: unknown }) => {\n delete this.outstandingGets_[index];\n this.outstandingGetCount_--;\n if (this.outstandingGetCount_ === 0) {\n this.outstandingGets_ = [];\n }\n if (get.onComplete) {\n get.onComplete(message);\n }\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: QueryContext) {\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\": \"' + query._queryParams.getIndex().toString() + '\"';\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 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 refreshAppCheckToken(token: string | null) {\n this.appCheckToken_ = token;\n this.log_('App check token refreshed');\n if (this.appCheckToken_) {\n this.tryAppCheck();\n } else {\n //If we're connected we want to let the server know to unauthenticate us.\n //If we're not connected, simply delete the credential so we dont become\n // authenticated next time we connect.\n if (this.connected_) {\n this.sendRequest('unappeck', {}, () => {});\n }\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 * Attempts to authenticate with the given token. If the authentication\n * attempt fails, it's triggered like the token was revoked (the connection is\n * closed).\n */\n tryAppCheck() {\n if (this.connected_ && this.appCheckToken_) {\n this.sendRequest(\n 'appcheck',\n { 'token': this.appCheckToken_ },\n (res: { [k: string]: unknown }) => {\n const status = res[/*status*/ 's'] as string;\n const data = (res[/*data*/ 'd'] as string) || 'error';\n if (status === 'ok') {\n this.invalidAppCheckTokenCount_ = 0;\n } else {\n this.onAppCheckRevoked_(status, data);\n }\n }\n );\n }\n }\n\n /**\n * @inheritDoc\n */\n unlisten(query: QueryContext, 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._queryParams.isDefault() || !query._queryParams.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 onDisconnectPut(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void\n ) {\n this.initConnection_();\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 onDisconnectMerge(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void\n ) {\n this.initConnection_();\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 onDisconnectCancel(\n pathString: string,\n onComplete?: (a: string, b: string) => void\n ) {\n this.initConnection_();\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 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 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 this.initConnection_();\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 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 === 'apc') {\n this.onAppCheckRevoked_(\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 initConnection_() {\n if (!this.realtime_ && this.firstConnection_) {\n this.scheduleConnect_(0);\n }\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 async 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 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 try {\n // First fetch auth and app check token, and establish connection after\n // fetching the token was successful\n const [authToken, appCheckToken] = await Promise.all([\n this.authTokenProvider_.getToken(forceRefresh),\n this.appCheckTokenProvider_.getToken(forceRefresh)\n ]);\n\n if (!canceled) {\n log('getToken() completed. Creating connection.');\n this.authToken_ = authToken && authToken.accessToken;\n this.appCheckToken_ = appCheckToken && appCheckToken.token;\n connection = new Connection(\n connId,\n this.repoInfo_,\n this.applicationId_,\n this.appCheckToken_,\n this.authToken_,\n onDataMessage,\n onReady,\n onDisconnect,\n /* onKill= */ reason => {\n warn(reason + ' (' + this.repoInfo_.toString() + ')');\n this.interrupt(SERVER_KILL_INTERRUPT_REASON);\n },\n lastSessionId\n );\n } else {\n log('getToken() completed but was canceled');\n }\n } catch (error) {\n this.log_('Failed to get token: ' + error);\n if (!canceled) {\n if (this.repoInfo_.nodeAdmin) {\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_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 onAppCheckRevoked_(statusCode: string, explanation: string) {\n log('App check token revoked: ' + statusCode + '/' + explanation);\n this.appCheckToken_ = null;\n this.forceTokenRefresh_ = true;\n // Note: We don't close the connection as the developer may not have\n // enforcement enabled. The backend closes connections with enforcements.\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.invalidAppCheckTokenCount_++;\n if (this.invalidAppCheckTokenCount_ >= INVALID_TOKEN_THRESHOLD) {\n this.appCheckTokenProvider_.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 this.tryAppCheck();\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 for (let i = 0; i < this.outstandingGets_.length; i++) {\n if (this.outstandingGets_[i]) {\n this.sendGet_(i);\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 (isNodeSdk()) {\n if (this.repoInfo_.nodeAdmin) {\n clientName = 'admin_node';\n } else {\n clientName = 'node';\n }\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 { Path } from '../util/Path';\n\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 * @returns Whether this is a leaf node.\n */\n isLeafNode(): boolean;\n\n /**\n * Gets the priority of the node.\n * @returns The priority of the node.\n */\n getPriority(): Node;\n\n /**\n * Returns a duplicate node with the new priority.\n * @param newPriorityNode - New priority to set for the node.\n * @returns 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 childName - The name of the child to retrieve.\n * @returns 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 - The path of the child to retrieve.\n * @returns 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 childName - The name of the child to find the predecessor of.\n * @param childNode - The node to find the predecessor of.\n * @param index - The index to use to determine the predecessor\n * @returns 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 childName - The name of the child to update.\n * @param newChildNode - The new child node\n * @returns 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 - The path of the child to update.\n * @param newChildNode - The new child node, which may be an empty node\n * @returns The updated node.\n */\n updateChild(path: Path, newChildNode: Node): Node;\n\n /**\n * True if the immediate child specified exists\n */\n hasChild(childName: string): boolean;\n\n /**\n * @returns True if this node has no value or children.\n */\n isEmpty(): boolean;\n\n /**\n * @returns The number of children of this node.\n */\n numChildren(): number;\n\n /**\n * Calls action for each child.\n * @param action - Action to be called for\n * each child. It's passed the child name and the child node.\n * @returns 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 * @returns Value of this node as JSON.\n */\n val(exportFormat?: boolean): unknown;\n\n /**\n * @returns hash representing the node contents.\n */\n hash(): string;\n\n /**\n * @param other - Another node\n * @returns -1 for less than, 0 for equal, 1 for greater than other\n */\n compareTo(other: Node): number;\n\n /**\n * @returns Whether or not this snapshot equals other\n */\n equals(other: Node): boolean;\n\n /**\n * @returns This node, with the specified index now available\n */\n withIndex(indexDefinition: Index): Node;\n\n isIndexed(indexDefinition: Index): boolean;\n}\n\nexport class NamedNode {\n constructor(public name: string, public node: Node) {}\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 { Comparator } from '../../util/SortedMap';\nimport { MIN_NAME } from '../../util/util';\nimport { Node, NamedNode } from '../Node';\n\nexport abstract class Index {\n abstract compare(a: NamedNode, b: NamedNode): number;\n\n abstract isDefinedOn(node: Node): boolean;\n\n /**\n * @returns A standalone comparison function for\n * this index\n */\n getCompare(): Comparator {\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 *\n * @returns 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 * @returns 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 * @returns 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 abstract makePost(indexValue: unknown, name: string): NamedNode;\n\n /**\n * @returns 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 { assert, assertionError } from '@firebase/util';\n\nimport { nameCompare, MAX_NAME } from '../../util/util';\nimport { ChildrenNode } from '../ChildrenNode';\nimport { Node, NamedNode } from '../Node';\n\nimport { Index } from './Index';\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 compare(a: NamedNode, b: NamedNode): number {\n return nameCompare(a.name, b.name);\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 indexedValueChanged(oldNode: Node, newNode: Node): boolean {\n return false; // The key for a node never changes.\n }\n minPost() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MIN;\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 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 * @returns 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\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 = (key1: K, key2: K) => number;\n\n/**\n * An iterator over an LLRBNode.\n */\nexport class SortedMapIterator {\n private nodeStack_: Array | LLRBEmptyNode> = [];\n\n /**\n * @param node - Node to iterate.\n * @param isReverse_ - Whether or not to iterate in reverse\n */\n constructor(\n node: LLRBNode | LLRBEmptyNode,\n startKey: K | null,\n comparator: Comparator,\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;\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 {\n color: boolean;\n left: LLRBNode | LLRBEmptyNode;\n right: LLRBNode | LLRBEmptyNode;\n\n /**\n * @param key - Key associated with this node.\n * @param value - Value associated with this node.\n * @param color - Whether this node is red.\n * @param left - Left child.\n * @param right - Right child.\n */\n constructor(\n public key: K,\n public value: V,\n color: boolean | null,\n left?: LLRBNode | LLRBEmptyNode | null,\n right?: LLRBNode | LLRBEmptyNode | null\n ) {\n this.color = color != null ? color : LLRBNode.RED;\n this.left =\n left != null ? left : (SortedMap.EMPTY_NODE as LLRBEmptyNode);\n this.right =\n right != null ? right : (SortedMap.EMPTY_NODE as LLRBEmptyNode);\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 key - New key for the node, or null.\n * @param value - New value for the node, or null.\n * @param color - New color for the node, or null.\n * @param left - New left child for the node, or null.\n * @param right - New right child for the node, or null.\n * @returns The node copy.\n */\n copy(\n key: K | null,\n value: V | null,\n color: boolean | null,\n left: LLRBNode | LLRBEmptyNode | null,\n right: LLRBNode | LLRBEmptyNode | null\n ): LLRBNode {\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 * @returns 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 * @returns 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 action - Callback function to be called for each\n * node. If it returns true, traversal is aborted.\n * @returns 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 action - Callback function to be called for each\n * node. If it returns true, traversal is aborted.\n * @returns 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 * @returns The minimum node in the tree.\n */\n private min_(): LLRBNode {\n if (this.left.isEmpty()) {\n return this;\n } else {\n return (this.left as LLRBNode).min_();\n }\n }\n\n /**\n * @returns The maximum key in the tree.\n */\n minKey(): K {\n return this.min_().key;\n }\n\n /**\n * @returns 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 * @param key - Key to insert.\n * @param value - Value to insert.\n * @param comparator - Comparator.\n * @returns New tree, with the key/value added.\n */\n insert(key: K, value: V, comparator: Comparator): LLRBNode {\n let n: LLRBNode = 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 * @returns New tree, with the minimum key removed.\n */\n private removeMin_(): LLRBNode | LLRBEmptyNode {\n if (this.left.isEmpty()) {\n return SortedMap.EMPTY_NODE as LLRBEmptyNode;\n }\n let n: LLRBNode = 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).removeMin_(), null);\n return n.fixUp_();\n }\n\n /**\n * @param key - The key of the item to remove.\n * @param comparator - Comparator.\n * @returns New tree, with the specified item removed.\n */\n remove(\n key: K,\n comparator: Comparator\n ): LLRBNode | LLRBEmptyNode {\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;\n } else {\n smallest = (n.right as LLRBNode).min_();\n n = n.copy(\n smallest.key,\n smallest.value,\n null,\n null,\n (n.right as LLRBNode).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 * @returns Whether this is a RED node.\n */\n isRed_(): boolean {\n return this.color;\n }\n\n /**\n * @returns New tree after performing any needed rotations.\n */\n private fixUp_(): LLRBNode {\n let n: LLRBNode = 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 * @returns New tree, after moveRedLeft.\n */\n private moveRedLeft_(): LLRBNode {\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).rotateRight_()\n );\n n = n.rotateLeft_();\n n = n.colorFlip_();\n }\n return n;\n }\n\n /**\n * @returns New tree, after moveRedRight.\n */\n private moveRedRight_(): LLRBNode {\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 * @returns New tree, after rotateLeft.\n */\n private rotateLeft_(): LLRBNode {\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;\n }\n\n /**\n * @returns New tree, after rotateRight.\n */\n private rotateRight_(): LLRBNode {\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;\n }\n\n /**\n * @returns Newt ree, after colorFlip.\n */\n private colorFlip_(): LLRBNode {\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 * @returns 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 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 {\n key: K;\n value: V;\n left: LLRBNode | LLRBEmptyNode;\n right: LLRBNode | LLRBEmptyNode;\n color: boolean;\n\n /**\n * Returns a copy of the current node.\n *\n * @returns The node copy.\n */\n copy(\n key: K | null,\n value: V | null,\n color: boolean | null,\n left: LLRBNode | LLRBEmptyNode | null,\n right: LLRBNode | LLRBEmptyNode | null\n ): LLRBEmptyNode {\n return this;\n }\n\n /**\n * Returns a copy of the tree, with the specified key/value added.\n *\n * @param key - Key to be added.\n * @param value - Value to be added.\n * @param comparator - Comparator.\n * @returns New tree, with item added.\n */\n insert(key: K, value: V, comparator: Comparator): LLRBNode {\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 key - The key to remove.\n * @param comparator - Comparator.\n * @returns New tree, with item removed.\n */\n remove(key: K, comparator: Comparator): LLRBEmptyNode {\n return this;\n }\n\n /**\n * @returns The total number of nodes in the tree.\n */\n count(): number {\n return 0;\n }\n\n /**\n * @returns 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 action - Callback function to be called for each\n * node. If it returns true, traversal is aborted.\n * @returns 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 action - Callback function to be called for each\n * node. If it returns true, traversal is aborted.\n * @returns True if traversal was aborted.\n */\n reverseTraversal(action: (k: K, v: V) => void): boolean {\n return false;\n }\n\n minKey(): null {\n return null;\n }\n\n maxKey(): null {\n return null;\n }\n\n check_(): number {\n return 0;\n }\n\n /**\n * @returns 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 {\n /**\n * Always use the same empty node, to reduce memory.\n */\n static EMPTY_NODE = new LLRBEmptyNode();\n\n /**\n * @param comparator_ - Key comparator.\n * @param root_ - Optional root node for the map.\n */\n constructor(\n private comparator_: Comparator,\n private root_:\n | LLRBNode\n | LLRBEmptyNode = SortedMap.EMPTY_NODE as LLRBEmptyNode\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 key - Key to be added.\n * @param value - Value to be added.\n * @returns New map, with item added.\n */\n insert(key: K, value: V): SortedMap {\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 key - The key to remove.\n * @returns New map, with item removed.\n */\n remove(key: K): SortedMap {\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 key - The key to look up.\n * @returns 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 key - The key to find the predecessor of\n * @returns 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 * @returns True if the map is empty.\n */\n isEmpty(): boolean {\n return this.root_.isEmpty();\n }\n\n /**\n * @returns The total number of nodes in the map.\n */\n count(): number {\n return this.root_.count();\n }\n\n /**\n * @returns The minimum key in the map.\n */\n minKey(): K | null {\n return this.root_.minKey();\n }\n\n /**\n * @returns 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 action - Callback function to be called\n * for each key/value pair. If action returns true, traversal is aborted.\n * @returns 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 action - Callback function to be called\n * for each key/value pair. If action returns true, traversal is aborted.\n * @returns 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 * @returns The iterator.\n */\n getIterator(\n resultGenerator?: (k: K, v: V) => T\n ): SortedMapIterator {\n return new SortedMapIterator(\n this.root_,\n null,\n this.comparator_,\n false,\n resultGenerator\n );\n }\n\n getIteratorFrom(\n key: K,\n resultGenerator?: (k: K, v: V) => T\n ): SortedMapIterator {\n return new SortedMapIterator(\n this.root_,\n key,\n this.comparator_,\n false,\n resultGenerator\n );\n }\n\n getReverseIteratorFrom(\n key: K,\n resultGenerator?: (k: K, v: V) => T\n ): SortedMapIterator {\n return new SortedMapIterator(\n this.root_,\n key,\n this.comparator_,\n true,\n resultGenerator\n );\n }\n\n getReverseIterator(\n resultGenerator?: (k: K, v: V) => T\n ): SortedMapIterator {\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 { nameCompare } from '../util/util';\n\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, contains } from '@firebase/util';\n\nimport { Indexable } from '../util/misc';\nimport { doubleToIEEE754String } from '../util/util';\n\nimport { Node } from './Node';\n\nlet MAX_NODE: Node;\n\nexport function setMaxNode(val: Node) {\n MAX_NODE = val;\n}\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 */\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';\n\nimport { Indexable } from '../util/misc';\nimport {\n Path,\n pathGetFront,\n pathGetLength,\n pathIsEmpty,\n pathPopFront\n} from '../util/Path';\nimport { doubleToIEEE754String, sha1 } from '../util/util';\n\nimport { ChildrenNodeConstructor } from './ChildrenNode';\nimport { Index } from './indexes/Index';\nimport { Node } from './Node';\nimport { priorityHashText, validatePriorityNode } from './snap';\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 */\n static VALUE_TYPE_ORDER = ['object', 'boolean', 'number', 'string'];\n\n private lazyHash_: string | null = null;\n\n /**\n * @param value_ - The value to store in this leaf node. The object type is\n * possible in the event of a deferred value\n * @param 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 (pathIsEmpty(path)) {\n return this;\n } else if (pathGetFront(path) === '.priority') {\n return this.priorityNode_;\n } else {\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE;\n }\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 = pathGetFront(path);\n if (front === null) {\n return newChildNode;\n } else if (newChildNode.isEmpty() && front !== '.priority') {\n return this;\n } else {\n assert(\n front !== '.priority' || pathGetLength(path) === 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 pathPopFront(path),\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 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 * @returns The value of the node.\n */\n getValue(): Indexable | string | number | boolean {\n return this.value_;\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 */\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 withIndex(): Node {\n return this;\n }\n isIndexed(): boolean {\n return true;\n }\n equals(other: Node): boolean {\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 { nameCompare, MAX_NAME } from '../../util/util';\nimport { LeafNode } from '../LeafNode';\nimport { NamedNode, Node } from '../Node';\n\nimport { Index } from './Index';\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\nexport class PriorityIndex extends Index {\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 isDefinedOn(node: Node): boolean {\n return !node.getPriority().isEmpty();\n }\n indexedValueChanged(oldNode: Node, newNode: Node): boolean {\n return !oldNode.getPriority().equals(newNode.getPriority());\n }\n minPost(): NamedNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MIN;\n }\n maxPost(): NamedNode {\n return new NamedNode(MAX_NAME, new LeafNode('[PRIORITY-POST]', MAX_NODE));\n }\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 * @returns 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\nimport { LLRBNode, SortedMap } from '../util/SortedMap';\n\nimport { NamedNode } from './Node';\n\nconst LOG_2 = Math.log(2);\n\nclass Base12Num {\n count: number;\n private current_: number;\n private bits_: number;\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 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 * @param childList - Unsorted list of children\n * @param cmp - The comparison method to be used\n * @param keyFn - An optional function to extract K from a node wrapper, if K's\n * type is not NamedNode\n * @param mapSortFn - An optional override for comparator used by the generated sorted map\n */\nexport const buildChildSet = function (\n childList: NamedNode[],\n cmp: (a: NamedNode, b: NamedNode) => number,\n keyFn?: (a: NamedNode) => K,\n mapSortFn?: (a: K, b: K) => number\n): SortedMap {\n childList.sort(cmp);\n\n const buildBalancedTree = function (\n low: number,\n high: number\n ): LLRBNode | 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 {\n let node: LLRBNode = 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) {\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(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';\n\nimport { SortedMap } from '../util/SortedMap';\n\nimport { buildChildSet } from './childSet';\nimport { Index } from './indexes/Index';\nimport { KEY_INDEX } from './indexes/KeyIndex';\nimport { PRIORITY_INDEX } from './indexes/PriorityIndex';\nimport { NamedNode, Node } from './Node';\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 | /*FallbackType*/ object;\n },\n private indexSet_: { [k: string]: Index }\n ) {}\n\n get(indexKey: string): SortedMap | 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\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\n ): IndexMap {\n const newIndexes = map(\n this.indexes_,\n (indexedChildren: SortedMap, 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\n ): IndexMap {\n const newIndexes = map(\n this.indexes_,\n (indexedChildren: SortedMap) => {\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 { assert } from '@firebase/util';\n\nimport { Path, pathGetFront, pathGetLength, pathPopFront } from '../util/Path';\nimport { SortedMap, SortedMapIterator } from '../util/SortedMap';\nimport { MAX_NAME, MIN_NAME, sha1 } from '../util/util';\n\nimport { NAME_COMPARATOR } from './comparators';\nimport { Index } from './indexes/Index';\nimport { KEY_INDEX, KeyIndex } from './indexes/KeyIndex';\nimport {\n PRIORITY_INDEX,\n setMaxNode as setPriorityMaxNode\n} from './indexes/PriorityIndex';\nimport { IndexMap } from './IndexMap';\nimport { LeafNode } from './LeafNode';\nimport { NamedNode, Node } from './Node';\nimport { priorityHashText, setMaxNode, validatePriorityNode } from './snap';\n\nexport interface ChildrenNodeConstructor {\n new (\n children_: SortedMap,\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 */\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(NAME_COMPARATOR),\n null,\n IndexMap.Default\n ))\n );\n }\n\n /**\n * @param children_ - List of children of this node..\n * @param priorityNode_ - The priority of this node (as a snapshot node).\n */\n constructor(\n private readonly children_: SortedMap,\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 = pathGetFront(path);\n if (front === null) {\n return this;\n }\n\n return this.getImmediateChild(front).getChild(pathPopFront(path));\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 = pathGetFront(path);\n if (front === null) {\n return newChildNode;\n } else {\n assert(\n pathGetFront(path) !== '.priority' || pathGetLength(path) === 1,\n '.priority must be the last token in a path'\n );\n const newImmediateChild = this.getImmediateChild(front).updateChild(\n pathPopFront(path),\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 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 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 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 */\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 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 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 getIterator(\n indexDefinition: Index\n ): SortedMapIterator {\n return this.getIteratorFrom(indexDefinition.minPost(), indexDefinition);\n }\n\n getIteratorFrom(\n startPost: NamedNode,\n indexDefinition: Index\n ): SortedMapIterator {\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 getReverseIterator(\n indexDefinition: Index\n ): SortedMapIterator {\n return this.getReverseIteratorFrom(\n indexDefinition.maxPost(),\n indexDefinition\n );\n }\n\n getReverseIteratorFrom(\n endPost: NamedNode,\n indexDefinition: Index\n ): SortedMapIterator {\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 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 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 isIndexed(index: Index): boolean {\n return index === KEY_INDEX || this.indexMap_.hasIndex(index);\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 */\n private resolveIndex_(\n indexDefinition: Index\n ): SortedMap | null {\n if (indexDefinition === KEY_INDEX) {\n return null;\n } else {\n return this.indexMap_.get(indexDefinition.toString());\n }\n }\n}\n\nexport class MaxNode extends ChildrenNode {\n constructor() {\n super(\n new SortedMap(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 */\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 { contains, assert } from '@firebase/util';\n\nimport { Indexable } from '../util/misc';\nimport { SortedMap } from '../util/SortedMap';\nimport { each } from '../util/util';\n\nimport { ChildrenNode } from './ChildrenNode';\nimport { buildChildSet } from './childSet';\nimport { NAME_COMPARATOR, NAME_ONLY_COMPARATOR } from './comparators';\nimport { PRIORITY_INDEX, setNodeFromJSON } from './indexes/PriorityIndex';\nimport { IndexMap } from './IndexMap';\nimport { LeafNode } from './LeafNode';\nimport { NamedNode, Node } from './Node';\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 priority - Optional priority to use. This will be ignored if the\n * passed JSON contains a .priority property.\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;\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 { assert } from '@firebase/util';\n\nimport { Path, pathGetFront, pathIsEmpty, pathSlice } from '../../util/Path';\nimport { MAX_NAME, nameCompare } from '../../util/util';\nimport { ChildrenNode, MAX_NODE } from '../ChildrenNode';\nimport { NamedNode, Node } from '../Node';\nimport { nodeFromJSON } from '../nodeFromJSON';\n\nimport { Index } from './Index';\n\nexport class PathIndex extends Index {\n constructor(private indexPath_: Path) {\n super();\n\n assert(\n !pathIsEmpty(indexPath_) && pathGetFront(indexPath_) !== '.priority',\n \"Can't create PathIndex with empty path or .priority key\"\n );\n }\n\n protected extractChild(snap: Node): Node {\n return snap.getChild(this.indexPath_);\n }\n isDefinedOn(node: Node): boolean {\n return !node.getChild(this.indexPath_).isEmpty();\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 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 maxPost(): NamedNode {\n const node = ChildrenNode.EMPTY_NODE.updateChild(this.indexPath_, MAX_NODE);\n return new NamedNode(MAX_NAME, node);\n }\n toString(): string {\n return pathSlice(this.indexPath_, 0).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 { nameCompare } from '../../util/util';\nimport { NamedNode, Node } from '../Node';\nimport { nodeFromJSON } from '../nodeFromJSON';\n\nimport { Index } from './Index';\n\nexport class ValueIndex extends Index {\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 isDefinedOn(node: Node): boolean {\n return true;\n }\n indexedValueChanged(oldNode: Node, newNode: Node): boolean {\n return !oldNode.equals(newNode);\n }\n minPost(): NamedNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MIN;\n }\n maxPost(): NamedNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MAX;\n }\n\n makePost(indexValue: object, name: string): NamedNode {\n const valueNode = nodeFromJSON(indexValue);\n return new NamedNode(name, valueNode);\n }\n\n /**\n * @returns 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 { Node } from '../snap/Node';\n\nexport const enum ChangeType {\n /** Event type for a child added */\n CHILD_ADDED = 'child_added',\n /** Event type for a child removed */\n CHILD_REMOVED = 'child_removed',\n /** Event type for a child changed */\n CHILD_CHANGED = 'child_changed',\n /** Event type for a child moved */\n CHILD_MOVED = 'child_moved',\n /** Event type for a value change */\n VALUE = 'value'\n}\n\nexport interface Change {\n /** @param type - The event type */\n type: ChangeType;\n /** @param snapshotNode - The data */\n snapshotNode: Node;\n /** @param childName - The name for this child, if it's a child even */\n childName?: string;\n /** @param oldSnap - Used for intermediate processing of child changed events */\n oldSnap?: Node;\n /** * @param prevName - The name for the previous child, if applicable */\n prevName?: string | null;\n}\n\nexport function changeValue(snapshotNode: Node): Change {\n return { type: ChangeType.VALUE, snapshotNode };\n}\n\nexport function changeChildAdded(\n childName: string,\n snapshotNode: Node\n): Change {\n return { type: ChangeType.CHILD_ADDED, snapshotNode, childName };\n}\n\nexport function changeChildRemoved(\n childName: string,\n snapshotNode: Node\n): Change {\n return { type: ChangeType.CHILD_REMOVED, snapshotNode, childName };\n}\n\nexport function changeChildChanged(\n childName: string,\n snapshotNode: Node,\n oldSnap: Node\n): Change {\n return {\n type: ChangeType.CHILD_CHANGED,\n snapshotNode,\n childName,\n oldSnap\n };\n}\n\nexport function changeChildMoved(\n childName: string,\n snapshotNode: Node\n): Change {\n return { type: ChangeType.CHILD_MOVED, snapshotNode, childName };\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\nimport { ChildrenNode } from '../../snap/ChildrenNode';\nimport { Index } from '../../snap/indexes/Index';\nimport { PRIORITY_INDEX } from '../../snap/indexes/PriorityIndex';\nimport { Node } from '../../snap/Node';\nimport { Path } from '../../util/Path';\nimport {\n changeChildAdded,\n changeChildChanged,\n changeChildRemoved\n} from '../Change';\nimport { ChildChangeAccumulator } from '../ChildChangeAccumulator';\nimport { CompleteChildSource } from '../CompleteChildSource';\n\nimport { NodeFilter } from './NodeFilter';\n\n/**\n * Doesn't really filter nodes but applies an index to the node and keeps track of any changes\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 changeChildRemoved(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(changeChildAdded(key, newChild));\n } else {\n optChangeAccumulator.trackChildChange(\n changeChildChanged(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 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 changeChildRemoved(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 changeChildChanged(key, childNode, oldChild)\n );\n }\n } else {\n optChangeAccumulator.trackChildChange(\n changeChildAdded(key, childNode)\n );\n }\n });\n }\n }\n return newSnap.withIndex(this.index_);\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 filtersNodes(): boolean {\n return false;\n }\n getIndexedFilter(): IndexedFilter {\n return this;\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 { NamedNode, Node } from '../../../core/snap/Node';\nimport { ChildrenNode } from '../../snap/ChildrenNode';\nimport { Index } from '../../snap/indexes/Index';\nimport { PRIORITY_INDEX } from '../../snap/indexes/PriorityIndex';\nimport { Path } from '../../util/Path';\nimport { ChildChangeAccumulator } from '../ChildChangeAccumulator';\nimport { CompleteChildSource } from '../CompleteChildSource';\nimport { QueryParams } from '../QueryParams';\n\nimport { IndexedFilter } from './IndexedFilter';\nimport { NodeFilter } from './NodeFilter';\n\n/**\n * Filters nodes by range and uses an IndexFilter to track any changes after filtering the node\n */\nexport class RangedFilter implements NodeFilter {\n private indexedFilter_: IndexedFilter;\n\n private index_: Index;\n\n private startPost_: NamedNode;\n\n private endPost_: NamedNode;\n\n private startIsInclusive_: boolean;\n\n private endIsInclusive_: boolean;\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 this.startIsInclusive_ = !params.startAfterSet_;\n this.endIsInclusive_ = !params.endBeforeSet_;\n }\n\n getStartPost(): NamedNode {\n return this.startPost_;\n }\n\n getEndPost(): NamedNode {\n return this.endPost_;\n }\n\n matches(node: NamedNode): boolean {\n const isWithinStart = this.startIsInclusive_\n ? this.index_.compare(this.getStartPost(), node) <= 0\n : this.index_.compare(this.getStartPost(), node) < 0;\n const isWithinEnd = this.endIsInclusive_\n ? this.index_.compare(node, this.getEndPost()) <= 0\n : this.index_.compare(node, this.getEndPost()) < 0;\n return isWithinStart && isWithinEnd;\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 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 updatePriority(oldSnap: Node, newPriority: Node): Node {\n // Don't support priorities on queries\n return oldSnap;\n }\n filtersNodes(): boolean {\n return true;\n }\n getIndexedFilter(): IndexedFilter {\n return this.indexedFilter_;\n }\n getIndex(): Index {\n return this.index_;\n }\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 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 { assert } from '@firebase/util';\n\nimport { ChildrenNode } from '../../snap/ChildrenNode';\nimport { Index } from '../../snap/indexes/Index';\nimport { NamedNode, Node } from '../../snap/Node';\nimport { Path } from '../../util/Path';\nimport {\n changeChildAdded,\n changeChildChanged,\n changeChildRemoved\n} from '../Change';\nimport { ChildChangeAccumulator } from '../ChildChangeAccumulator';\nimport { CompleteChildSource } from '../CompleteChildSource';\nimport { QueryParams } from '../QueryParams';\n\nimport { IndexedFilter } from './IndexedFilter';\nimport { NodeFilter } from './NodeFilter';\nimport { RangedFilter } from './RangedFilter';\n\n/**\n * Applies a limit and a range to a node and uses RangedFilter to do the heavy lifting where possible\n */\nexport class LimitedFilter implements NodeFilter {\n private readonly rangedFilter_: RangedFilter;\n\n private readonly index_: Index;\n\n private readonly limit_: number;\n\n private readonly reverse_: boolean;\n\n private readonly startIsInclusive_: boolean;\n\n private readonly endIsInclusive_: boolean;\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 this.startIsInclusive_ = !params.startAfterSet_;\n this.endIsInclusive_ = !params.endBeforeSet_;\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 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 if (!this.withinDirectionalStart(next)) {\n // if we have not reached the start, skip to the next element\n continue;\n } else if (!this.withinDirectionalEnd(next)) {\n // if we have reached the end, stop adding elements\n break;\n } else {\n filtered = filtered.updateImmediateChild(next.name, next.node);\n count++;\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\n let iterator;\n if (this.reverse_) {\n iterator = filtered.getReverseIterator(this.index_);\n } else {\n iterator = filtered.getIterator(this.index_);\n }\n\n let count = 0;\n while (iterator.hasNext()) {\n const next = iterator.getNext();\n const inRange =\n count < this.limit_ &&\n this.withinDirectionalStart(next) &&\n this.withinDirectionalEnd(next);\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 updatePriority(oldSnap: Node, newPriority: Node): Node {\n // Don't support priorities on queries\n return oldSnap;\n }\n filtersNodes(): boolean {\n return true;\n }\n getIndexedFilter(): IndexedFilter {\n return this.rangedFilter_.getIndexedFilter();\n }\n getIndex(): Index {\n return this.index_;\n }\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 changeChildChanged(childKey, childSnap, oldChildSnap)\n );\n }\n return oldEventCache.updateImmediateChild(childKey, childSnap);\n } else {\n if (changeAccumulator != null) {\n changeAccumulator.trackChildChange(\n changeChildRemoved(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 changeChildAdded(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 changeChildRemoved(windowBoundary.name, windowBoundary.node)\n );\n changeAccumulator.trackChildChange(\n changeChildAdded(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 private withinDirectionalStart = (node: NamedNode) =>\n this.reverse_ ? this.withinEndPost(node) : this.withinStartPost(node);\n\n private withinDirectionalEnd = (node: NamedNode) =>\n this.reverse_ ? this.withinStartPost(node) : this.withinEndPost(node);\n\n private withinStartPost = (node: NamedNode) => {\n const compareRes = this.index_.compare(\n this.rangedFilter_.getStartPost(),\n node\n );\n return this.startIsInclusive_ ? compareRes <= 0 : compareRes < 0;\n };\n\n private withinEndPost = (node: NamedNode) => {\n const compareRes = this.index_.compare(\n node,\n this.rangedFilter_.getEndPost()\n );\n return this.endIsInclusive_ ? compareRes <= 0 : compareRes < 0;\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';\n\nimport { Index } from '../snap/indexes/Index';\nimport { KEY_INDEX } from '../snap/indexes/KeyIndex';\nimport { PathIndex } from '../snap/indexes/PathIndex';\nimport { PRIORITY_INDEX, PriorityIndex } from '../snap/indexes/PriorityIndex';\nimport { VALUE_INDEX } from '../snap/indexes/ValueIndex';\nimport { MAX_NAME, MIN_NAME } from '../util/util';\n\nimport { IndexedFilter } from './filter/IndexedFilter';\nimport { LimitedFilter } from './filter/LimitedFilter';\nimport { NodeFilter } from './filter/NodeFilter';\nimport { RangedFilter } from './filter/RangedFilter';\n\n/**\n * Wire Protocol Constants\n */\nconst enum WIRE_PROTOCOL_CONSTANTS {\n INDEX_START_VALUE = 'sp',\n INDEX_START_NAME = 'sn',\n INDEX_START_IS_INCLUSIVE = 'sin',\n INDEX_END_VALUE = 'ep',\n INDEX_END_NAME = 'en',\n INDEX_END_IS_INCLUSIVE = 'ein',\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 */\nconst enum REST_QUERY_CONSTANTS {\n ORDER_BY = 'orderBy',\n PRIORITY_INDEX = '$priority',\n VALUE_INDEX = '$value',\n KEY_INDEX = '$key',\n START_AFTER = 'startAfter',\n START_AT = 'startAt',\n END_AT = 'endAt',\n END_BEFORE = 'endBefore',\n LIMIT_TO_FIRST = 'limitToFirst',\n LIMIT_TO_LAST = 'limitToLast'\n}\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 *\n * @internal\n */\nexport class QueryParams {\n limitSet_ = false;\n startSet_ = false;\n startNameSet_ = false;\n startAfterSet_ = false; // can only be true if startSet_ is true\n endSet_ = false;\n endNameSet_ = false;\n endBeforeSet_ = false; // can only be true if endSet_ is true\n limit_ = 0;\n viewFrom_ = '';\n indexStartValue_: unknown | null = null;\n indexStartName_ = '';\n indexEndValue_: unknown | null = null;\n indexEndName_ = '';\n index_: PriorityIndex = PRIORITY_INDEX;\n\n hasStart(): boolean {\n return this.startSet_;\n }\n\n /**\n * @returns 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 this.viewFrom_ === WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_LEFT;\n }\n }\n\n /**\n * Only valid to call if hasStart() returns true\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 */\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 hasEnd(): boolean {\n return this.endSet_;\n }\n\n /**\n * Only valid to call if hasEnd() returns true.\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 */\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 hasLimit(): boolean {\n return this.limitSet_;\n }\n\n /**\n * @returns 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 */\n getLimit(): number {\n assert(this.limitSet_, 'Only valid if limit has been set');\n return this.limit_;\n }\n\n getIndex(): Index {\n return this.index_;\n }\n\n loadsAllData(): boolean {\n return !(this.startSet_ || this.endSet_ || this.limitSet_);\n }\n\n isDefault(): boolean {\n return this.loadsAllData() && this.index_ === PRIORITY_INDEX;\n }\n\n copy(): QueryParams {\n const copy = new QueryParams();\n copy.limitSet_ = this.limitSet_;\n copy.limit_ = this.limit_;\n copy.startSet_ = this.startSet_;\n copy.startAfterSet_ = this.startAfterSet_;\n copy.indexStartValue_ = this.indexStartValue_;\n copy.startNameSet_ = this.startNameSet_;\n copy.indexStartName_ = this.indexStartName_;\n copy.endSet_ = this.endSet_;\n copy.endBeforeSet_ = this.endBeforeSet_;\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\nexport function queryParamsGetNodeFilter(queryParams: QueryParams): NodeFilter {\n if (queryParams.loadsAllData()) {\n return new IndexedFilter(queryParams.getIndex());\n } else if (queryParams.hasLimit()) {\n return new LimitedFilter(queryParams);\n } else {\n return new RangedFilter(queryParams);\n }\n}\n\nexport function queryParamsLimit(\n queryParams: QueryParams,\n newLimit: number\n): QueryParams {\n const newParams = queryParams.copy();\n newParams.limitSet_ = true;\n newParams.limit_ = newLimit;\n newParams.viewFrom_ = '';\n return newParams;\n}\n\nexport function queryParamsLimitToFirst(\n queryParams: QueryParams,\n newLimit: number\n): QueryParams {\n const newParams = queryParams.copy();\n newParams.limitSet_ = true;\n newParams.limit_ = newLimit;\n newParams.viewFrom_ = WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_LEFT;\n return newParams;\n}\n\nexport function queryParamsLimitToLast(\n queryParams: QueryParams,\n newLimit: number\n): QueryParams {\n const newParams = queryParams.copy();\n newParams.limitSet_ = true;\n newParams.limit_ = newLimit;\n newParams.viewFrom_ = WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_RIGHT;\n return newParams;\n}\n\nexport function queryParamsStartAt(\n queryParams: QueryParams,\n indexValue: unknown,\n key?: string | null\n): QueryParams {\n const newParams = queryParams.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\nexport function queryParamsStartAfter(\n queryParams: QueryParams,\n indexValue: unknown,\n key?: string | null\n): QueryParams {\n let params: QueryParams;\n if (queryParams.index_ === KEY_INDEX || !!key) {\n params = queryParamsStartAt(queryParams, indexValue, key);\n } else {\n params = queryParamsStartAt(queryParams, indexValue, MAX_NAME);\n }\n params.startAfterSet_ = true;\n return params;\n}\n\nexport function queryParamsEndAt(\n queryParams: QueryParams,\n indexValue: unknown,\n key?: string | null\n): QueryParams {\n const newParams = queryParams.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\nexport function queryParamsEndBefore(\n queryParams: QueryParams,\n indexValue: unknown,\n key?: string | null\n): QueryParams {\n let params: QueryParams;\n if (queryParams.index_ === KEY_INDEX || !!key) {\n params = queryParamsEndAt(queryParams, indexValue, key);\n } else {\n params = queryParamsEndAt(queryParams, indexValue, MIN_NAME);\n }\n params.endBeforeSet_ = true;\n return params;\n}\n\nexport function queryParamsOrderBy(\n queryParams: QueryParams,\n index: Index\n): QueryParams {\n const newParams = queryParams.copy();\n newParams.index_ = index;\n return newParams;\n}\n\n/**\n * Returns a set of REST query string parameters representing this query.\n *\n * @returns query string parameters\n */\nexport function queryParamsToRestQueryStringParameters(\n queryParams: QueryParams\n): Record {\n const qs: Record = {};\n\n if (queryParams.isDefault()) {\n return qs;\n }\n\n let orderBy;\n if (queryParams.index_ === PRIORITY_INDEX) {\n orderBy = REST_QUERY_CONSTANTS.PRIORITY_INDEX;\n } else if (queryParams.index_ === VALUE_INDEX) {\n orderBy = REST_QUERY_CONSTANTS.VALUE_INDEX;\n } else if (queryParams.index_ === KEY_INDEX) {\n orderBy = REST_QUERY_CONSTANTS.KEY_INDEX;\n } else {\n assert(queryParams.index_ instanceof PathIndex, 'Unrecognized index type!');\n orderBy = queryParams.index_.toString();\n }\n qs[REST_QUERY_CONSTANTS.ORDER_BY] = stringify(orderBy);\n\n if (queryParams.startSet_) {\n const startParam = queryParams.startAfterSet_\n ? REST_QUERY_CONSTANTS.START_AFTER\n : REST_QUERY_CONSTANTS.START_AT;\n qs[startParam] = stringify(queryParams.indexStartValue_);\n if (queryParams.startNameSet_) {\n qs[startParam] += ',' + stringify(queryParams.indexStartName_);\n }\n }\n\n if (queryParams.endSet_) {\n const endParam = queryParams.endBeforeSet_\n ? REST_QUERY_CONSTANTS.END_BEFORE\n : REST_QUERY_CONSTANTS.END_AT;\n qs[endParam] = stringify(queryParams.indexEndValue_);\n if (queryParams.endNameSet_) {\n qs[endParam] += ',' + stringify(queryParams.indexEndName_);\n }\n }\n\n if (queryParams.limitSet_) {\n if (queryParams.isViewFromLeft()) {\n qs[REST_QUERY_CONSTANTS.LIMIT_TO_FIRST] = queryParams.limit_;\n } else {\n qs[REST_QUERY_CONSTANTS.LIMIT_TO_LAST] = queryParams.limit_;\n }\n }\n\n return qs;\n}\n\nexport function queryParamsGetQueryObject(\n queryParams: QueryParams\n): Record {\n const obj: Record = {};\n if (queryParams.startSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_VALUE] =\n queryParams.indexStartValue_;\n if (queryParams.startNameSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_NAME] =\n queryParams.indexStartName_;\n }\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_IS_INCLUSIVE] =\n !queryParams.startAfterSet_;\n }\n if (queryParams.endSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_VALUE] = queryParams.indexEndValue_;\n if (queryParams.endNameSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_NAME] = queryParams.indexEndName_;\n }\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_IS_INCLUSIVE] =\n !queryParams.endBeforeSet_;\n }\n if (queryParams.limitSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.LIMIT] = queryParams.limit_;\n let viewFrom = queryParams.viewFrom_;\n if (viewFrom === '') {\n if (queryParams.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 (queryParams.index_ !== PRIORITY_INDEX) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX] = queryParams.index_.toString();\n }\n return obj;\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 jsonEval,\n safeGet,\n querystring,\n Deferred\n} from '@firebase/util';\n\nimport { AppCheckTokenProvider } from './AppCheckTokenProvider';\nimport { AuthTokenProvider } from './AuthTokenProvider';\nimport { RepoInfo } from './RepoInfo';\nimport { ServerActions } from './ServerActions';\nimport { logWrapper, warn } from './util/util';\nimport { QueryContext } from './view/EventRegistration';\nimport { queryParamsToRestQueryStringParameters } from './view/QueryParams';\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 listens_: { [k: string]: object } = {};\n\n static getListenId_(query: QueryContext, tag?: number | null): string {\n if (tag !== undefined) {\n return 'tag$' + tag;\n } else {\n assert(\n query._queryParams.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_ - 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 authTokenProvider_: AuthTokenProvider,\n private appCheckTokenProvider_: AppCheckTokenProvider\n ) {\n super();\n }\n\n /** @inheritDoc */\n listen(\n query: QueryContext,\n currentHashFn: () => string,\n tag: number | null,\n onComplete: (a: string, b: unknown) => void\n ) {\n const pathString = query._path.toString();\n this.log_('Listen called for ' + pathString + ' ' + query._queryIdentifier);\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 = queryParamsToRestQueryStringParameters(\n query._queryParams\n );\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: QueryContext, tag: number | null) {\n const listenId = ReadonlyRestClient.getListenId_(query, tag);\n delete this.listens_[listenId];\n }\n\n get(query: QueryContext): Promise {\n const queryStringParameters = queryParamsToRestQueryStringParameters(\n query._queryParams\n );\n\n const pathString = query._path.toString();\n\n const deferred = new Deferred();\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_(\n pathString,\n data,\n /*isMerge=*/ false,\n /*tag=*/ null\n );\n deferred.resolve(data as string);\n } else {\n deferred.reject(new Error(data as string));\n }\n }\n );\n return deferred.promise;\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 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 return Promise.all([\n this.authTokenProvider_.getToken(/*forceRefresh=*/ false),\n this.appCheckTokenProvider_.getToken(/*forceRefresh=*/ false)\n ]).then(([authToken, appCheckToken]) => {\n if (authToken && authToken.accessToken) {\n queryStringParameters['auth'] = authToken.accessToken;\n }\n if (appCheckToken && appCheckToken.token) {\n queryStringParameters['ac'] = appCheckToken.token;\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 { ChildrenNode } from './snap/ChildrenNode';\nimport { Node } from './snap/Node';\nimport { Path } from './util/Path';\n\n/**\n * Mutable object which basically just stores a reference to the \"latest\" immutable snapshot.\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 { PRIORITY_INDEX } from './snap/indexes/PriorityIndex';\nimport { Node } from './snap/Node';\nimport { Path, pathGetFront, pathIsEmpty, pathPopFront } from './util/Path';\n\n/**\n * Helper class to store a sparse set of snapshots.\n */\nexport interface SparseSnapshotTree {\n value: Node | null;\n readonly children: Map;\n}\n\nexport function newSparseSnapshotTree(): SparseSnapshotTree {\n return {\n value: null,\n children: new Map()\n };\n}\n\n/**\n * Gets the node stored at the given path if one exists.\n * Only seems to be used in tests.\n *\n * @param path - Path to look up snapshot for.\n * @returns The retrieved node, or null.\n */\nexport function sparseSnapshotTreeFind(\n sparseSnapshotTree: SparseSnapshotTree,\n path: Path\n): Node | null {\n if (sparseSnapshotTree.value != null) {\n return sparseSnapshotTree.value.getChild(path);\n } else if (!pathIsEmpty(path) && sparseSnapshotTree.children.size > 0) {\n const childKey = pathGetFront(path);\n path = pathPopFront(path);\n if (sparseSnapshotTree.children.has(childKey)) {\n const childTree = sparseSnapshotTree.children.get(childKey);\n return sparseSnapshotTreeFind(childTree, 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 */\nexport function sparseSnapshotTreeRemember(\n sparseSnapshotTree: SparseSnapshotTree,\n path: Path,\n data: Node\n): void {\n if (pathIsEmpty(path)) {\n sparseSnapshotTree.value = data;\n sparseSnapshotTree.children.clear();\n } else if (sparseSnapshotTree.value !== null) {\n sparseSnapshotTree.value = sparseSnapshotTree.value.updateChild(path, data);\n } else {\n const childKey = pathGetFront(path);\n if (!sparseSnapshotTree.children.has(childKey)) {\n sparseSnapshotTree.children.set(childKey, newSparseSnapshotTree());\n }\n\n const child = sparseSnapshotTree.children.get(childKey);\n path = pathPopFront(path);\n sparseSnapshotTreeRemember(child, 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 * @returns True if this node should now be removed.\n */\nexport function sparseSnapshotTreeForget(\n sparseSnapshotTree: SparseSnapshotTree,\n path: Path\n): boolean {\n if (pathIsEmpty(path)) {\n sparseSnapshotTree.value = null;\n sparseSnapshotTree.children.clear();\n return true;\n } else {\n if (sparseSnapshotTree.value !== null) {\n if (sparseSnapshotTree.value.isLeafNode()) {\n // We're trying to forget a node that doesn't exist\n return false;\n } else {\n const value = sparseSnapshotTree.value;\n sparseSnapshotTree.value = null;\n\n value.forEachChild(PRIORITY_INDEX, (key, tree) => {\n sparseSnapshotTreeRemember(sparseSnapshotTree, new Path(key), tree);\n });\n\n return sparseSnapshotTreeForget(sparseSnapshotTree, path);\n }\n } else if (sparseSnapshotTree.children.size > 0) {\n const childKey = pathGetFront(path);\n path = pathPopFront(path);\n if (sparseSnapshotTree.children.has(childKey)) {\n const safeToRemove = sparseSnapshotTreeForget(\n sparseSnapshotTree.children.get(childKey),\n path\n );\n if (safeToRemove) {\n sparseSnapshotTree.children.delete(childKey);\n }\n }\n\n return sparseSnapshotTree.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 */\nexport function sparseSnapshotTreeForEachTree(\n sparseSnapshotTree: SparseSnapshotTree,\n prefixPath: Path,\n func: (a: Path, b: Node) => unknown\n): void {\n if (sparseSnapshotTree.value !== null) {\n func(prefixPath, sparseSnapshotTree.value);\n } else {\n sparseSnapshotTreeForEachChild(sparseSnapshotTree, (key, tree) => {\n const path = new Path(prefixPath.toString() + '/' + key);\n sparseSnapshotTreeForEachTree(tree, path, func);\n });\n }\n}\n\n/**\n * Iterates through each immediate child and triggers the callback.\n * Only seems to be used in tests.\n *\n * @param func - The function to invoke for each child.\n */\nexport function sparseSnapshotTreeForEachChild(\n sparseSnapshotTree: SparseSnapshotTree,\n func: (a: string, b: SparseSnapshotTree) => void\n): void {\n sparseSnapshotTree.children.forEach((tree, key) => {\n func(key, tree);\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 { each } from '../util/util';\n\nimport { StatsCollection } from './StatsCollection';\n\n/**\n * Returns the delta from the previous call to get stats.\n *\n * @param collection_ - The collection to \"listen\" to.\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';\n\nimport { ServerActions } from '../ServerActions';\nimport { setTimeoutNonBlocking, each } from '../util/util';\n\nimport { StatsCollection } from './StatsCollection';\nimport { StatsListener } from './StatsListener';\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\nexport class StatsReporter {\n private statsListener_: StatsListener;\n statsToReport_: { [k: string]: boolean } = {};\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 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\nexport function statsReporterIncludeStat(\n reporter: StatsReporter,\n stat: string\n) {\n reporter.statsToReport_[stat] = 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 { 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 source: OperationSource;\n\n type: OperationType;\n\n path: Path;\n\n operationForChild(childName: string): Operation | null;\n}\n\nexport interface OperationSource {\n fromUser: boolean;\n fromServer: boolean;\n queryId: string | null;\n tagged: boolean;\n}\n\nexport function newOperationSourceUser(): OperationSource {\n return {\n fromUser: true,\n fromServer: false,\n queryId: null,\n tagged: false\n };\n}\n\nexport function newOperationSourceServer(): OperationSource {\n return {\n fromUser: false,\n fromServer: true,\n queryId: null,\n tagged: false\n };\n}\n\nexport function newOperationSourceServerTaggedQuery(\n queryId: string\n): OperationSource {\n return {\n fromUser: false,\n fromServer: true,\n queryId,\n tagged: true\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\nimport { ImmutableTree } from '../util/ImmutableTree';\nimport {\n newEmptyPath,\n Path,\n pathGetFront,\n pathIsEmpty,\n pathPopFront\n} from '../util/Path';\n\nimport { newOperationSourceUser, Operation, OperationType } from './Operation';\n\nexport class AckUserWrite implements Operation {\n /** @inheritDoc */\n type = OperationType.ACK_USER_WRITE;\n\n /** @inheritDoc */\n source = newOperationSourceUser();\n\n /**\n * @param affectedTree - A tree containing true for each affected path. Affected paths can't overlap.\n */\n constructor(\n /** @inheritDoc */ public path: Path,\n /** @inheritDoc */ public affectedTree: ImmutableTree,\n /** @inheritDoc */ public revert: boolean\n ) {}\n operationForChild(childName: string): AckUserWrite {\n if (!pathIsEmpty(this.path)) {\n assert(\n pathGetFront(this.path) === childName,\n 'operationForChild called for unrelated child.'\n );\n return new AckUserWrite(\n pathPopFront(this.path),\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(newEmptyPath(), 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 { newEmptyPath, Path, pathIsEmpty, pathPopFront } from '../util/Path';\n\nimport { Operation, OperationSource, OperationType } from './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 (pathIsEmpty(this.path)) {\n return new ListenComplete(this.source, newEmptyPath());\n } else {\n return new ListenComplete(this.source, pathPopFront(this.path));\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 { newEmptyPath, Path, pathIsEmpty, pathPopFront } from '../util/Path';\n\nimport { Operation, OperationSource, OperationType } from './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 (pathIsEmpty(this.path)) {\n return new Overwrite(\n this.source,\n newEmptyPath(),\n this.snap.getImmediateChild(childName)\n );\n } else {\n return new Overwrite(this.source, pathPopFront(this.path), 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 { assert } from '@firebase/util';\n\nimport { Node } from '../snap/Node';\nimport { ImmutableTree } from '../util/ImmutableTree';\nimport {\n newEmptyPath,\n Path,\n pathGetFront,\n pathIsEmpty,\n pathPopFront\n} from '../util/Path';\n\nimport { Operation, OperationSource, OperationType } from './Operation';\nimport { Overwrite } from './Overwrite';\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\n ) {}\n operationForChild(childName: string): Operation {\n if (pathIsEmpty(this.path)) {\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, newEmptyPath(), childTree.value);\n } else {\n // This is a merge at a deeper level\n return new Merge(this.source, newEmptyPath(), childTree);\n }\n } else {\n assert(\n pathGetFront(this.path) === childName,\n \"Can't get a merge for a child not on the path of the operation\"\n );\n return new Merge(this.source, pathPopFront(this.path), this.children);\n }\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, pathGetFront, pathIsEmpty } 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 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 */\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 */\n isFiltered(): boolean {\n return this.filtered_;\n }\n\n isCompleteForPath(path: Path): boolean {\n if (pathIsEmpty(path)) {\n return this.isFullyInitialized() && !this.filtered_;\n }\n\n const childKey = pathGetFront(path);\n return this.isCompleteForChild(childKey);\n }\n\n isCompleteForChild(key: string): boolean {\n return (\n (this.isFullyInitialized() && !this.filtered_) || this.node_.hasChild(key)\n );\n }\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 { assertionError } from '@firebase/util';\n\nimport { Index } from '../snap/indexes/Index';\nimport { NamedNode, Node } from '../snap/Node';\n\nimport { Change, ChangeType, changeChildMoved } from './Change';\nimport { Event } from './Event';\nimport { EventRegistration, QueryContext } from './EventRegistration';\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 */\nexport class EventGenerator {\n index_: Index;\n\n constructor(public query_: QueryContext) {\n this.index_ = this.query_._queryParams.getIndex();\n }\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 */\nexport function eventGeneratorGenerateEventsForChanges(\n eventGenerator: EventGenerator,\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 === ChangeType.CHILD_CHANGED &&\n eventGenerator.index_.indexedValueChanged(\n change.oldSnap as Node,\n change.snapshotNode\n )\n ) {\n moves.push(changeChildMoved(change.childName, change.snapshotNode));\n }\n });\n\n eventGeneratorGenerateEventsForType(\n eventGenerator,\n events,\n ChangeType.CHILD_REMOVED,\n changes,\n eventRegistrations,\n eventCache\n );\n eventGeneratorGenerateEventsForType(\n eventGenerator,\n events,\n ChangeType.CHILD_ADDED,\n changes,\n eventRegistrations,\n eventCache\n );\n eventGeneratorGenerateEventsForType(\n eventGenerator,\n events,\n ChangeType.CHILD_MOVED,\n moves,\n eventRegistrations,\n eventCache\n );\n eventGeneratorGenerateEventsForType(\n eventGenerator,\n events,\n ChangeType.CHILD_CHANGED,\n changes,\n eventRegistrations,\n eventCache\n );\n eventGeneratorGenerateEventsForType(\n eventGenerator,\n events,\n ChangeType.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 */\nfunction eventGeneratorGenerateEventsForType(\n eventGenerator: EventGenerator,\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((a, b) =>\n eventGeneratorCompareChanges(eventGenerator, a, b)\n );\n filteredChanges.forEach(change => {\n const materializedChange = eventGeneratorMaterializeSingleChange(\n eventGenerator,\n change,\n eventCache\n );\n registrations.forEach(registration => {\n if (registration.respondsTo(change.type)) {\n events.push(\n registration.createEvent(materializedChange, eventGenerator.query_)\n );\n }\n });\n });\n}\n\nfunction eventGeneratorMaterializeSingleChange(\n eventGenerator: EventGenerator,\n change: Change,\n eventCache: Node\n): Change {\n if (change.type === 'value' || change.type === 'child_removed') {\n return change;\n } else {\n change.prevName = eventCache.getPredecessorChildName(\n change.childName,\n change.snapshotNode,\n eventGenerator.index_\n );\n return change;\n }\n}\n\nfunction eventGeneratorCompareChanges(\n eventGenerator: EventGenerator,\n a: Change,\n b: Change\n) {\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 eventGenerator.index_.compare(aWrapped, bWrapped);\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\nimport { CacheNode } from './CacheNode';\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 */\nexport interface ViewCache {\n readonly eventCache: CacheNode;\n readonly serverCache: CacheNode;\n}\n\nexport function newViewCache(\n eventCache: CacheNode,\n serverCache: CacheNode\n): ViewCache {\n return { eventCache, serverCache };\n}\n\nexport function viewCacheUpdateEventSnap(\n viewCache: ViewCache,\n eventSnap: Node,\n complete: boolean,\n filtered: boolean\n): ViewCache {\n return newViewCache(\n new CacheNode(eventSnap, complete, filtered),\n viewCache.serverCache\n );\n}\n\nexport function viewCacheUpdateServerSnap(\n viewCache: ViewCache,\n serverSnap: Node,\n complete: boolean,\n filtered: boolean\n): ViewCache {\n return newViewCache(\n viewCache.eventCache,\n new CacheNode(serverSnap, complete, filtered)\n );\n}\n\nexport function viewCacheGetCompleteEventSnap(\n viewCache: ViewCache\n): Node | null {\n return viewCache.eventCache.isFullyInitialized()\n ? viewCache.eventCache.getNode()\n : null;\n}\n\nexport function viewCacheGetCompleteServerSnap(\n viewCache: ViewCache\n): Node | null {\n return viewCache.serverCache.isFullyInitialized()\n ? viewCache.serverCache.getNode()\n : null;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n newEmptyPath,\n Path,\n pathChild,\n pathGetFront,\n pathIsEmpty,\n pathPopFront\n} from './Path';\nimport { SortedMap } from './SortedMap';\nimport { each, stringCompare } from './util';\n\nlet emptyChildrenSingleton: SortedMap>;\n\n/**\n * Singleton empty children collection.\n *\n */\nconst EmptyChildren = (): SortedMap> => {\n if (!emptyChildrenSingleton) {\n emptyChildrenSingleton = new SortedMap>(\n stringCompare\n );\n }\n return emptyChildrenSingleton;\n};\n\n/**\n * A tree with immutable elements.\n */\nexport class ImmutableTree {\n static fromObject(obj: { [k: string]: T }): ImmutableTree {\n let tree: ImmutableTree = new ImmutableTree(null);\n each(obj, (childPath: string, childSnap: T) => {\n tree = tree.set(new Path(childPath), childSnap);\n });\n return tree;\n }\n\n constructor(\n public readonly value: T | null,\n public readonly children: SortedMap<\n string,\n ImmutableTree\n > = EmptyChildren()\n ) {}\n\n /**\n * True if the value is empty and there are no children\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:}`\n * objects on the way back out, it may be better to pass down a pathSoFar obj.\n *\n * @param relativePath - The remainder of the path\n * @param predicate - The predicate to satisfy to return a node\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: newEmptyPath(), value: this.value };\n } else {\n if (pathIsEmpty(relativePath)) {\n return null;\n } else {\n const front = pathGetFront(relativePath);\n const child = this.children.get(front);\n if (child !== null) {\n const childExistingPathAndValue =\n child.findRootMostMatchingPathAndValue(\n pathPopFront(relativePath),\n predicate\n );\n if (childExistingPathAndValue != null) {\n const fullPath = pathChild(\n new Path(front),\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 */\n findRootMostValueAndPath(\n relativePath: Path\n ): { path: Path; value: T } | null {\n return this.findRootMostMatchingPathAndValue(relativePath, () => true);\n }\n\n /**\n * @returns The subtree at the given path\n */\n subtree(relativePath: Path): ImmutableTree {\n if (pathIsEmpty(relativePath)) {\n return this;\n } else {\n const front = pathGetFront(relativePath);\n const childTree = this.children.get(front);\n if (childTree !== null) {\n return childTree.subtree(pathPopFront(relativePath));\n } else {\n return new ImmutableTree(null);\n }\n }\n }\n\n /**\n * Sets a value at the specified path.\n *\n * @param relativePath - Path to set value at.\n * @param toSet - Value to set.\n * @returns Resulting tree.\n */\n set(relativePath: Path, toSet: T | null): ImmutableTree {\n if (pathIsEmpty(relativePath)) {\n return new ImmutableTree(toSet, this.children);\n } else {\n const front = pathGetFront(relativePath);\n const child = this.children.get(front) || new ImmutableTree(null);\n const newChild = child.set(pathPopFront(relativePath), 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 relativePath - Path to value to remove.\n * @returns Resulting tree.\n */\n remove(relativePath: Path): ImmutableTree {\n if (pathIsEmpty(relativePath)) {\n if (this.children.isEmpty()) {\n return new ImmutableTree(null);\n } else {\n return new ImmutableTree(null, this.children);\n }\n } else {\n const front = pathGetFront(relativePath);\n const child = this.children.get(front);\n if (child) {\n const newChild = child.remove(pathPopFront(relativePath));\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 new ImmutableTree(null);\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 relativePath - Path to get value for.\n * @returns Value at path, or null.\n */\n get(relativePath: Path): T | null {\n if (pathIsEmpty(relativePath)) {\n return this.value;\n } else {\n const front = pathGetFront(relativePath);\n const child = this.children.get(front);\n if (child) {\n return child.get(pathPopFront(relativePath));\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 relativePath - Path to replace subtree for.\n * @param newTree - New tree.\n * @returns Resulting tree.\n */\n setTree(relativePath: Path, newTree: ImmutableTree): ImmutableTree {\n if (pathIsEmpty(relativePath)) {\n return newTree;\n } else {\n const front = pathGetFront(relativePath);\n const child = this.children.get(front) || new ImmutableTree(null);\n const newChild = child.setTree(pathPopFront(relativePath), 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 */\n fold(fn: (path: Path, value: T, children: { [k: string]: V }) => V): V {\n return this.fold_(newEmptyPath(), fn);\n }\n\n /**\n * Recursive helper for public-facing fold() method\n */\n private fold_(\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) => {\n accum[childKey] = childTree.fold_(pathChild(pathSoFar, 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 */\n findOnPath(path: Path, f: (path: Path, value: T) => V | null): V | null {\n return this.findOnPath_(path, newEmptyPath(), f);\n }\n\n private findOnPath_(\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 (pathIsEmpty(pathToFollow)) {\n return null;\n } else {\n const front = pathGetFront(pathToFollow)!;\n const nextChild = this.children.get(front);\n if (nextChild) {\n return nextChild.findOnPath_(\n pathPopFront(pathToFollow),\n pathChild(pathSoFar, front),\n f\n );\n } else {\n return null;\n }\n }\n }\n }\n\n foreachOnPath(\n path: Path,\n f: (path: Path, value: T) => void\n ): ImmutableTree {\n return this.foreachOnPath_(path, newEmptyPath(), f);\n }\n\n private foreachOnPath_(\n pathToFollow: Path,\n currentRelativePath: Path,\n f: (path: Path, value: T) => void\n ): ImmutableTree {\n if (pathIsEmpty(pathToFollow)) {\n return this;\n } else {\n if (this.value) {\n f(currentRelativePath, this.value);\n }\n const front = pathGetFront(pathToFollow);\n const nextChild = this.children.get(front);\n if (nextChild) {\n return nextChild.foreachOnPath_(\n pathPopFront(pathToFollow),\n pathChild(currentRelativePath, front),\n f\n );\n } else {\n return new ImmutableTree(null);\n }\n }\n }\n\n /**\n * Calls the given function for each node in the tree that has a value.\n *\n * @param f - A function to be called with the path from the root of the tree to\n * a node, and the value at that node. Called in depth-first order.\n */\n foreach(f: (path: Path, value: T) => void) {\n this.foreach_(newEmptyPath(), 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_(pathChild(currentRelativePath, childName), f);\n });\n if (this.value) {\n f(currentRelativePath, this.value);\n }\n }\n\n foreachChild(f: (name: string, value: T) => void) {\n this.children.inorderTraversal(\n (childName: string, childTree: ImmutableTree) => {\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 { assert } from '@firebase/util';\n\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { PRIORITY_INDEX } from './snap/indexes/PriorityIndex';\nimport { NamedNode, Node } from './snap/Node';\nimport { ImmutableTree } from './util/ImmutableTree';\nimport {\n newEmptyPath,\n newRelativePath,\n Path,\n pathChild,\n pathIsEmpty\n} from './util/Path';\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(public writeTree_: ImmutableTree) {}\n\n static empty(): CompoundWrite {\n return new CompoundWrite(new ImmutableTree(null));\n }\n}\n\nexport function compoundWriteAddWrite(\n compoundWrite: CompoundWrite,\n path: Path,\n node: Node\n): CompoundWrite {\n if (pathIsEmpty(path)) {\n return new CompoundWrite(new ImmutableTree(node));\n } else {\n const rootmost = compoundWrite.writeTree_.findRootMostValueAndPath(path);\n if (rootmost != null) {\n const rootMostPath = rootmost.path;\n let value = rootmost.value;\n const relativePath = newRelativePath(rootMostPath, path);\n value = value.updateChild(relativePath, node);\n return new CompoundWrite(\n compoundWrite.writeTree_.set(rootMostPath, value)\n );\n } else {\n const subtree = new ImmutableTree(node);\n const newWriteTree = compoundWrite.writeTree_.setTree(path, subtree);\n return new CompoundWrite(newWriteTree);\n }\n }\n}\n\nexport function compoundWriteAddWrites(\n compoundWrite: CompoundWrite,\n path: Path,\n updates: { [name: string]: Node }\n): CompoundWrite {\n let newWrite = compoundWrite;\n each(updates, (childKey: string, node: Node) => {\n newWrite = compoundWriteAddWrite(newWrite, pathChild(path, childKey), node);\n });\n return newWrite;\n}\n\n/**\n * Will remove a write at the given path and deeper paths. This will not modify a write at a higher\n * location, which must be removed by calling this method with that path.\n *\n * @param compoundWrite - The CompoundWrite to remove.\n * @param path - The path at which a write and all deeper writes should be removed\n * @returns The new CompoundWrite with the removed path\n */\nexport function compoundWriteRemoveWrite(\n compoundWrite: CompoundWrite,\n path: Path\n): CompoundWrite {\n if (pathIsEmpty(path)) {\n return CompoundWrite.empty();\n } else {\n const newWriteTree = compoundWrite.writeTree_.setTree(\n path,\n new ImmutableTree(null)\n );\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 compoundWrite - The CompoundWrite to check.\n * @param path - The path to check for\n * @returns Whether there is a complete write at that path\n */\nexport function compoundWriteHasCompleteWrite(\n compoundWrite: CompoundWrite,\n path: Path\n): boolean {\n return compoundWriteGetCompleteNode(compoundWrite, 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 compoundWrite - The CompoundWrite to get the node from.\n * @param path - The path to get a complete write\n * @returns The node if complete at that path, or null otherwise.\n */\nexport function compoundWriteGetCompleteNode(\n compoundWrite: CompoundWrite,\n path: Path\n): Node | null {\n const rootmost = compoundWrite.writeTree_.findRootMostValueAndPath(path);\n if (rootmost != null) {\n return compoundWrite.writeTree_\n .get(rootmost.path)\n .getChild(newRelativePath(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 * @param compoundWrite - The CompoundWrite to get children from.\n * @returns A list of all complete children.\n */\nexport function compoundWriteGetCompleteChildren(\n compoundWrite: CompoundWrite\n): NamedNode[] {\n const children: NamedNode[] = [];\n const node = compoundWrite.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 compoundWrite.writeTree_.children.inorderTraversal(\n (childName, childTree) => {\n if (childTree.value != null) {\n children.push(new NamedNode(childName, childTree.value));\n }\n }\n );\n }\n return children;\n}\n\nexport function compoundWriteChildCompoundWrite(\n compoundWrite: CompoundWrite,\n path: Path\n): CompoundWrite {\n if (pathIsEmpty(path)) {\n return compoundWrite;\n } else {\n const shadowingNode = compoundWriteGetCompleteNode(compoundWrite, path);\n if (shadowingNode != null) {\n return new CompoundWrite(new ImmutableTree(shadowingNode));\n } else {\n return new CompoundWrite(compoundWrite.writeTree_.subtree(path));\n }\n }\n}\n\n/**\n * Returns true if this CompoundWrite is empty and therefore does not modify any nodes.\n * @returns Whether this CompoundWrite is empty\n */\nexport function compoundWriteIsEmpty(compoundWrite: CompoundWrite): boolean {\n return compoundWrite.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 * @returns The node with all writes applied\n */\nexport function compoundWriteApply(\n compoundWrite: CompoundWrite,\n node: Node\n): Node {\n return applySubtreeWrite(newEmptyPath(), compoundWrite.writeTree_, node);\n}\n\nfunction applySubtreeWrite(\n relativePath: Path,\n writeTree: ImmutableTree,\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(\n pathChild(relativePath, childKey),\n childTree,\n node\n );\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(\n pathChild(relativePath, '.priority'),\n priorityWrite\n );\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 { assert, assertionError, safeGet } from '@firebase/util';\n\nimport {\n CompoundWrite,\n compoundWriteAddWrite,\n compoundWriteAddWrites,\n compoundWriteApply,\n compoundWriteChildCompoundWrite,\n compoundWriteGetCompleteChildren,\n compoundWriteGetCompleteNode,\n compoundWriteHasCompleteWrite,\n compoundWriteIsEmpty,\n compoundWriteRemoveWrite\n} from './CompoundWrite';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { Index } from './snap/indexes/Index';\nimport { PRIORITY_INDEX } from './snap/indexes/PriorityIndex';\nimport { NamedNode, Node } from './snap/Node';\nimport {\n newEmptyPath,\n newRelativePath,\n Path,\n pathChild,\n pathContains,\n pathGetFront,\n pathIsEmpty,\n pathPopFront\n} from './util/Path';\nimport { each } from './util/util';\nimport { CacheNode } from './view/CacheNode';\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 * Create a new WriteTreeRef for the given path. For use with a new sync point at the given path.\n *\n */\nexport function writeTreeChildWrites(\n writeTree: WriteTree,\n path: Path\n): WriteTreeRef {\n return newWriteTreeRef(path, writeTree);\n}\n\n/**\n * Record a new overwrite from user code.\n *\n * @param visible - This is set to false by some transactions. It should be excluded from event caches\n */\nexport function writeTreeAddOverwrite(\n writeTree: WriteTree,\n path: Path,\n snap: Node,\n writeId: number,\n visible?: boolean\n) {\n assert(\n writeId > writeTree.lastWriteId,\n 'Stacking an older write on top of newer ones'\n );\n if (visible === undefined) {\n visible = true;\n }\n writeTree.allWrites.push({\n path,\n snap,\n writeId,\n visible\n });\n\n if (visible) {\n writeTree.visibleWrites = compoundWriteAddWrite(\n writeTree.visibleWrites,\n path,\n snap\n );\n }\n writeTree.lastWriteId = writeId;\n}\n\n/**\n * Record a new merge from user code.\n */\nexport function writeTreeAddMerge(\n writeTree: WriteTree,\n path: Path,\n changedChildren: { [k: string]: Node },\n writeId: number\n) {\n assert(\n writeId > writeTree.lastWriteId,\n 'Stacking an older merge on top of newer ones'\n );\n writeTree.allWrites.push({\n path,\n children: changedChildren,\n writeId,\n visible: true\n });\n\n writeTree.visibleWrites = compoundWriteAddWrites(\n writeTree.visibleWrites,\n path,\n changedChildren\n );\n writeTree.lastWriteId = writeId;\n}\n\nexport function writeTreeGetWrite(\n writeTree: WriteTree,\n writeId: number\n): WriteRecord | null {\n for (let i = 0; i < writeTree.allWrites.length; i++) {\n const record = writeTree.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 * @returns true if the write may have been visible (meaning we'll need to reevaluate / raise\n * events as a result).\n */\nexport function writeTreeRemoveWrite(\n writeTree: WriteTree,\n writeId: number\n): 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 = writeTree.allWrites.findIndex(s => {\n return s.writeId === writeId;\n });\n assert(idx >= 0, 'removeWrite called with nonexistent writeId.');\n const writeToRemove = writeTree.allWrites[idx];\n writeTree.allWrites.splice(idx, 1);\n\n let removedWriteWasVisible = writeToRemove.visible;\n let removedWriteOverlapsWithOtherWrites = false;\n\n let i = writeTree.allWrites.length - 1;\n\n while (removedWriteWasVisible && i >= 0) {\n const currentWrite = writeTree.allWrites[i];\n if (currentWrite.visible) {\n if (\n i >= idx &&\n writeTreeRecordContainsPath_(currentWrite, writeToRemove.path)\n ) {\n // The removed write was completely shadowed by a subsequent write.\n removedWriteWasVisible = false;\n } else if (pathContains(writeToRemove.path, 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 writeTreeResetTree_(writeTree);\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 writeTree.visibleWrites = compoundWriteRemoveWrite(\n writeTree.visibleWrites,\n writeToRemove.path\n );\n } else {\n const children = writeToRemove.children;\n each(children, (childName: string) => {\n writeTree.visibleWrites = compoundWriteRemoveWrite(\n writeTree.visibleWrites,\n pathChild(writeToRemove.path, childName)\n );\n });\n }\n return true;\n }\n}\n\nfunction writeTreeRecordContainsPath_(\n writeRecord: WriteRecord,\n path: Path\n): boolean {\n if (writeRecord.snap) {\n return pathContains(writeRecord.path, path);\n } else {\n for (const childName in writeRecord.children) {\n if (\n writeRecord.children.hasOwnProperty(childName) &&\n pathContains(pathChild(writeRecord.path, childName), 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 */\nfunction writeTreeResetTree_(writeTree: WriteTree) {\n writeTree.visibleWrites = writeTreeLayerTree_(\n writeTree.allWrites,\n writeTreeDefaultFilter_,\n newEmptyPath()\n );\n if (writeTree.allWrites.length > 0) {\n writeTree.lastWriteId =\n writeTree.allWrites[writeTree.allWrites.length - 1].writeId;\n } else {\n writeTree.lastWriteId = -1;\n }\n}\n\n/**\n * The default filter used when constructing the tree. Keep everything that's visible.\n */\nfunction writeTreeDefaultFilter_(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 */\nfunction writeTreeLayerTree_(\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: Path;\n if (write.snap) {\n if (pathContains(treeRoot, writePath)) {\n relativePath = newRelativePath(treeRoot, writePath);\n compoundWrite = compoundWriteAddWrite(\n compoundWrite,\n relativePath,\n write.snap\n );\n } else if (pathContains(writePath, treeRoot)) {\n relativePath = newRelativePath(writePath, treeRoot);\n compoundWrite = compoundWriteAddWrite(\n compoundWrite,\n newEmptyPath(),\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 (pathContains(treeRoot, writePath)) {\n relativePath = newRelativePath(treeRoot, writePath);\n compoundWrite = compoundWriteAddWrites(\n compoundWrite,\n relativePath,\n write.children\n );\n } else if (pathContains(writePath, treeRoot)) {\n relativePath = newRelativePath(writePath, treeRoot);\n if (pathIsEmpty(relativePath)) {\n compoundWrite = compoundWriteAddWrites(\n compoundWrite,\n newEmptyPath(),\n write.children\n );\n } else {\n const child = safeGet(write.children, pathGetFront(relativePath));\n if (child) {\n // There exists a child in this node that matches the root path\n const deepNode = child.getChild(pathPopFront(relativePath));\n compoundWrite = compoundWriteAddWrite(\n compoundWrite,\n newEmptyPath(),\n deepNode\n );\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 * 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 */\nexport function writeTreeGetCompleteWriteData(\n writeTree: WriteTree,\n path: Path\n): Node | null {\n return compoundWriteGetCompleteNode(writeTree.visibleWrites, 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 writeIdsToExclude - An optional set to be excluded\n * @param includeHiddenWrites - Defaults to false, whether or not to layer on writes with visible set to false\n */\nexport function writeTreeCalcCompleteEventCache(\n writeTree: WriteTree,\n treePath: Path,\n completeServerCache: Node | null,\n writeIdsToExclude?: number[],\n includeHiddenWrites?: boolean\n): Node | null {\n if (!writeIdsToExclude && !includeHiddenWrites) {\n const shadowingNode = compoundWriteGetCompleteNode(\n writeTree.visibleWrites,\n treePath\n );\n if (shadowingNode != null) {\n return shadowingNode;\n } else {\n const subMerge = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n treePath\n );\n if (compoundWriteIsEmpty(subMerge)) {\n return completeServerCache;\n } else if (\n completeServerCache == null &&\n !compoundWriteHasCompleteWrite(subMerge, newEmptyPath())\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 compoundWriteApply(subMerge, layeredCache);\n }\n }\n } else {\n const merge = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n treePath\n );\n if (!includeHiddenWrites && compoundWriteIsEmpty(merge)) {\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 !compoundWriteHasCompleteWrite(merge, newEmptyPath())\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 (pathContains(write.path, treePath) ||\n pathContains(treePath, write.path))\n );\n };\n const mergeAtPath = writeTreeLayerTree_(\n writeTree.allWrites,\n filter,\n treePath\n );\n const layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\n return compoundWriteApply(mergeAtPath, 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 */\nexport function writeTreeCalcCompleteEventChildren(\n writeTree: WriteTree,\n treePath: Path,\n completeServerChildren: ChildrenNode | null\n) {\n let completeChildren = ChildrenNode.EMPTY_NODE as Node;\n const topLevelSet = compoundWriteGetCompleteNode(\n writeTree.visibleWrites,\n treePath\n );\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 = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n treePath\n );\n completeServerChildren.forEachChild(\n PRIORITY_INDEX,\n (childName, childNode) => {\n const node = compoundWriteApply(\n compoundWriteChildCompoundWrite(merge, new Path(childName)),\n childNode\n );\n completeChildren = completeChildren.updateImmediateChild(\n childName,\n node\n );\n }\n );\n // Add any complete children we have from the set\n compoundWriteGetCompleteChildren(merge).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 = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n treePath\n );\n compoundWriteGetCompleteChildren(merge).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 */\nexport function writeTreeCalcEventCacheAfterServerOverwrite(\n writeTree: WriteTree,\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 = pathChild(treePath, childPath);\n if (compoundWriteHasCompleteWrite(writeTree.visibleWrites, 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 = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n path\n );\n if (compoundWriteIsEmpty(childMerge)) {\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 compoundWriteApply(\n childMerge,\n existingServerSnap.getChild(childPath)\n );\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 */\nexport function writeTreeCalcCompleteChild(\n writeTree: WriteTree,\n treePath: Path,\n childKey: string,\n existingServerSnap: CacheNode\n): Node | null {\n const path = pathChild(treePath, childKey);\n const shadowingNode = compoundWriteGetCompleteNode(\n writeTree.visibleWrites,\n path\n );\n if (shadowingNode != null) {\n return shadowingNode;\n } else {\n if (existingServerSnap.isCompleteForChild(childKey)) {\n const childMerge = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n path\n );\n return compoundWriteApply(\n childMerge,\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 */\nexport function writeTreeShadowingWrite(\n writeTree: WriteTree,\n path: Path\n): Node | null {\n return compoundWriteGetCompleteNode(writeTree.visibleWrites, 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 */\nexport function writeTreeCalcIndexedSlice(\n writeTree: WriteTree,\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 = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n treePath\n );\n const shadowingNode = compoundWriteGetCompleteNode(merge, newEmptyPath());\n if (shadowingNode != null) {\n toIterate = shadowingNode;\n } else if (completeServerData != null) {\n toIterate = compoundWriteApply(merge, 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\nexport function newWriteTree(): WriteTree {\n return {\n visibleWrites: CompoundWrite.empty(),\n allWrites: [],\n lastWriteId: -1\n };\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 */\nexport interface 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 visibleWrites: CompoundWrite;\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 allWrites: WriteRecord[];\n\n lastWriteId: number;\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 writeIdsToExclude - Optional writes to exclude.\n * @param includeHiddenWrites - Defaults to false, whether or not to layer on writes with visible set to false\n */\nexport function writeTreeRefCalcCompleteEventCache(\n writeTreeRef: WriteTreeRef,\n completeServerCache: Node | null,\n writeIdsToExclude?: number[],\n includeHiddenWrites?: boolean\n): Node | null {\n return writeTreeCalcCompleteEventCache(\n writeTreeRef.writeTree,\n writeTreeRef.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 */\nexport function writeTreeRefCalcCompleteEventChildren(\n writeTreeRef: WriteTreeRef,\n completeServerChildren: ChildrenNode | null\n): ChildrenNode {\n return writeTreeCalcCompleteEventChildren(\n writeTreeRef.writeTree,\n writeTreeRef.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 *\n */\nexport function writeTreeRefCalcEventCacheAfterServerOverwrite(\n writeTreeRef: WriteTreeRef,\n path: Path,\n existingEventSnap: Node | null,\n existingServerSnap: Node | null\n): Node | null {\n return writeTreeCalcEventCacheAfterServerOverwrite(\n writeTreeRef.writeTree,\n writeTreeRef.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 */\nexport function writeTreeRefShadowingWrite(\n writeTreeRef: WriteTreeRef,\n path: Path\n): Node | null {\n return writeTreeShadowingWrite(\n writeTreeRef.writeTree,\n pathChild(writeTreeRef.treePath, path)\n );\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 */\nexport function writeTreeRefCalcIndexedSlice(\n writeTreeRef: WriteTreeRef,\n completeServerData: Node | null,\n startPost: NamedNode,\n count: number,\n reverse: boolean,\n index: Index\n): NamedNode[] {\n return writeTreeCalcIndexedSlice(\n writeTreeRef.writeTree,\n writeTreeRef.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 */\nexport function writeTreeRefCalcCompleteChild(\n writeTreeRef: WriteTreeRef,\n childKey: string,\n existingServerCache: CacheNode\n): Node | null {\n return writeTreeCalcCompleteChild(\n writeTreeRef.writeTree,\n writeTreeRef.treePath,\n childKey,\n existingServerCache\n );\n}\n\n/**\n * Return a WriteTreeRef for a child.\n */\nexport function writeTreeRefChild(\n writeTreeRef: WriteTreeRef,\n childName: string\n): WriteTreeRef {\n return newWriteTreeRef(\n pathChild(writeTreeRef.treePath, childName),\n writeTreeRef.writeTree\n );\n}\n\nexport function newWriteTreeRef(\n path: Path,\n writeTree: WriteTree\n): WriteTreeRef {\n return {\n treePath: path,\n writeTree\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 */\nexport interface 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 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 readonly writeTree: WriteTree;\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, assertionError } from '@firebase/util';\n\nimport {\n Change,\n ChangeType,\n changeChildAdded,\n changeChildChanged,\n changeChildRemoved\n} from './Change';\n\nexport class ChildChangeAccumulator {\n private readonly changeMap: Map = new Map();\n\n trackChildChange(change: Change) {\n const type = change.type;\n const childKey = change.childName!;\n assert(\n type === ChangeType.CHILD_ADDED ||\n type === ChangeType.CHILD_CHANGED ||\n type === ChangeType.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 (\n type === ChangeType.CHILD_ADDED &&\n oldType === ChangeType.CHILD_REMOVED\n ) {\n this.changeMap.set(\n childKey,\n changeChildChanged(\n childKey,\n change.snapshotNode,\n oldChange.snapshotNode\n )\n );\n } else if (\n type === ChangeType.CHILD_REMOVED &&\n oldType === ChangeType.CHILD_ADDED\n ) {\n this.changeMap.delete(childKey);\n } else if (\n type === ChangeType.CHILD_REMOVED &&\n oldType === ChangeType.CHILD_CHANGED\n ) {\n this.changeMap.set(\n childKey,\n changeChildRemoved(childKey, oldChange.oldSnap)\n );\n } else if (\n type === ChangeType.CHILD_CHANGED &&\n oldType === ChangeType.CHILD_ADDED\n ) {\n this.changeMap.set(\n childKey,\n changeChildAdded(childKey, change.snapshotNode)\n );\n } else if (\n type === ChangeType.CHILD_CHANGED &&\n oldType === ChangeType.CHILD_CHANGED\n ) {\n this.changeMap.set(\n childKey,\n changeChildChanged(childKey, change.snapshotNode, oldChange.oldSnap)\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 { Index } from '../snap/indexes/Index';\nimport { NamedNode, Node } from '../snap/Node';\nimport {\n WriteTreeRef,\n writeTreeRefCalcCompleteChild,\n writeTreeRefCalcIndexedSlice\n} from '../WriteTree';\n\nimport { CacheNode } from './CacheNode';\nimport { ViewCache, viewCacheGetCompleteServerSnap } 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 getCompleteChild(childKey: string): Node | null;\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// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class NoCompleteChildSource_ implements CompleteChildSource {\n getCompleteChild(childKey?: string): Node | null {\n return null;\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 */\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 */\nexport class WriteTreeCompleteChildSource implements CompleteChildSource {\n constructor(\n private writes_: WriteTreeRef,\n private viewCache_: ViewCache,\n private optCompleteServerCache_: Node | null = null\n ) {}\n getCompleteChild(childKey: string): Node | null {\n const node = this.viewCache_.eventCache;\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_.serverCache;\n return writeTreeRefCalcCompleteChild(this.writes_, childKey, serverNode);\n }\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 : viewCacheGetCompleteServerSnap(this.viewCache_);\n const nodes = writeTreeRefCalcIndexedSlice(\n this.writes_,\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 { assert, assertionError } from '@firebase/util';\n\nimport { AckUserWrite } from '../operation/AckUserWrite';\nimport { Merge } from '../operation/Merge';\nimport { Operation, OperationType } from '../operation/Operation';\nimport { Overwrite } from '../operation/Overwrite';\nimport { ChildrenNode } from '../snap/ChildrenNode';\nimport { KEY_INDEX } from '../snap/indexes/KeyIndex';\nimport { Node } from '../snap/Node';\nimport { ImmutableTree } from '../util/ImmutableTree';\nimport {\n newEmptyPath,\n Path,\n pathChild,\n pathGetBack,\n pathGetFront,\n pathGetLength,\n pathIsEmpty,\n pathParent,\n pathPopFront\n} from '../util/Path';\nimport {\n WriteTreeRef,\n writeTreeRefCalcCompleteChild,\n writeTreeRefCalcCompleteEventCache,\n writeTreeRefCalcCompleteEventChildren,\n writeTreeRefCalcEventCacheAfterServerOverwrite,\n writeTreeRefShadowingWrite\n} from '../WriteTree';\n\nimport { Change, changeValue } from './Change';\nimport { ChildChangeAccumulator } from './ChildChangeAccumulator';\nimport {\n CompleteChildSource,\n NO_COMPLETE_CHILD_SOURCE,\n WriteTreeCompleteChildSource\n} from './CompleteChildSource';\nimport { NodeFilter } from './filter/NodeFilter';\nimport {\n ViewCache,\n viewCacheGetCompleteEventSnap,\n viewCacheGetCompleteServerSnap,\n viewCacheUpdateEventSnap,\n viewCacheUpdateServerSnap\n} from './ViewCache';\n\nexport interface ProcessorResult {\n readonly viewCache: ViewCache;\n readonly changes: Change[];\n}\n\nexport interface ViewProcessor {\n readonly filter: NodeFilter;\n}\n\nexport function newViewProcessor(filter: NodeFilter): ViewProcessor {\n return { filter };\n}\n\nexport function viewProcessorAssertIndexed(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache\n): void {\n assert(\n viewCache.eventCache.getNode().isIndexed(viewProcessor.filter.getIndex()),\n 'Event snap not indexed'\n );\n assert(\n viewCache.serverCache.getNode().isIndexed(viewProcessor.filter.getIndex()),\n 'Server snap not indexed'\n );\n}\n\nexport function viewProcessorApplyOperation(\n viewProcessor: ViewProcessor,\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 = viewProcessorApplyUserOverwrite(\n viewProcessor,\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.serverCache.isFiltered() && !pathIsEmpty(overwrite.path));\n newViewCache = viewProcessorApplyServerOverwrite(\n viewProcessor,\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 = viewProcessorApplyUserMerge(\n viewProcessor,\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.serverCache.isFiltered();\n newViewCache = viewProcessorApplyServerMerge(\n viewProcessor,\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 = viewProcessorAckUserWrite(\n viewProcessor,\n oldViewCache,\n ackUserWrite.path,\n ackUserWrite.affectedTree,\n writesCache,\n completeCache,\n accumulator\n );\n } else {\n newViewCache = viewProcessorRevertUserWrite(\n viewProcessor,\n oldViewCache,\n ackUserWrite.path,\n writesCache,\n completeCache,\n accumulator\n );\n }\n } else if (operation.type === OperationType.LISTEN_COMPLETE) {\n newViewCache = viewProcessorListenComplete(\n viewProcessor,\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 viewProcessorMaybeAddValueEvent(oldViewCache, newViewCache, changes);\n return { viewCache: newViewCache, changes };\n}\n\nfunction viewProcessorMaybeAddValueEvent(\n oldViewCache: ViewCache,\n newViewCache: ViewCache,\n accumulator: Change[]\n): void {\n const eventSnap = newViewCache.eventCache;\n if (eventSnap.isFullyInitialized()) {\n const isLeafOrEmpty =\n eventSnap.getNode().isLeafNode() || eventSnap.getNode().isEmpty();\n const oldCompleteSnap = viewCacheGetCompleteEventSnap(oldViewCache);\n if (\n accumulator.length > 0 ||\n !oldViewCache.eventCache.isFullyInitialized() ||\n (isLeafOrEmpty && !eventSnap.getNode().equals(oldCompleteSnap)) ||\n !eventSnap.getNode().getPriority().equals(oldCompleteSnap.getPriority())\n ) {\n accumulator.push(\n changeValue(viewCacheGetCompleteEventSnap(newViewCache))\n );\n }\n }\n}\n\nfunction viewProcessorGenerateEventCacheAfterServerEvent(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache,\n changePath: Path,\n writesCache: WriteTreeRef,\n source: CompleteChildSource,\n accumulator: ChildChangeAccumulator\n): ViewCache {\n const oldEventSnap = viewCache.eventCache;\n if (writeTreeRefShadowingWrite(writesCache, changePath) != null) {\n // we have a shadowing write, ignore changes\n return viewCache;\n } else {\n let newEventCache, serverNode;\n if (pathIsEmpty(changePath)) {\n // TODO: figure out how this plays with \"sliding ack windows\"\n assert(\n viewCache.serverCache.isFullyInitialized(),\n 'If change path is empty, we must have complete server data'\n );\n if (viewCache.serverCache.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 = viewCacheGetCompleteServerSnap(viewCache);\n const completeChildren =\n serverCache instanceof ChildrenNode\n ? serverCache\n : ChildrenNode.EMPTY_NODE;\n const completeEventChildren = writeTreeRefCalcCompleteEventChildren(\n writesCache,\n completeChildren\n );\n newEventCache = viewProcessor.filter.updateFullNode(\n viewCache.eventCache.getNode(),\n completeEventChildren,\n accumulator\n );\n } else {\n const completeNode = writeTreeRefCalcCompleteEventCache(\n writesCache,\n viewCacheGetCompleteServerSnap(viewCache)\n );\n newEventCache = viewProcessor.filter.updateFullNode(\n viewCache.eventCache.getNode(),\n completeNode,\n accumulator\n );\n }\n } else {\n const childKey = pathGetFront(changePath);\n if (childKey === '.priority') {\n assert(\n pathGetLength(changePath) === 1,\n \"Can't have a priority with additional path components\"\n );\n const oldEventNode = oldEventSnap.getNode();\n serverNode = viewCache.serverCache.getNode();\n // we might have overwrites for this priority\n const updatedPriority = writeTreeRefCalcEventCacheAfterServerOverwrite(\n writesCache,\n changePath,\n oldEventNode,\n serverNode\n );\n if (updatedPriority != null) {\n newEventCache = viewProcessor.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 = pathPopFront(changePath);\n // update child\n let newEventChild;\n if (oldEventSnap.isCompleteForChild(childKey)) {\n serverNode = viewCache.serverCache.getNode();\n const eventChildUpdate =\n writeTreeRefCalcEventCacheAfterServerOverwrite(\n writesCache,\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.getNode().getImmediateChild(childKey);\n }\n } else {\n newEventChild = writeTreeRefCalcCompleteChild(\n writesCache,\n childKey,\n viewCache.serverCache\n );\n }\n if (newEventChild != null) {\n newEventCache = viewProcessor.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 viewCacheUpdateEventSnap(\n viewCache,\n newEventCache,\n oldEventSnap.isFullyInitialized() || pathIsEmpty(changePath),\n viewProcessor.filter.filtersNodes()\n );\n }\n}\n\nfunction viewProcessorApplyServerOverwrite(\n viewProcessor: ViewProcessor,\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.serverCache;\n let newServerCache;\n const serverFilter = filterServerNode\n ? viewProcessor.filter\n : viewProcessor.filter.getIndexedFilter();\n if (pathIsEmpty(changePath)) {\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 = pathGetFront(changePath);\n if (\n !oldServerSnap.isCompleteForPath(changePath) &&\n pathGetLength(changePath) > 1\n ) {\n // We don't update incomplete nodes with updates intended for other listeners\n return oldViewCache;\n }\n const childChangePath = pathPopFront(changePath);\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 = viewCacheUpdateServerSnap(\n oldViewCache,\n newServerCache,\n oldServerSnap.isFullyInitialized() || pathIsEmpty(changePath),\n serverFilter.filtersNodes()\n );\n const source = new WriteTreeCompleteChildSource(\n writesCache,\n newViewCache,\n completeCache\n );\n return viewProcessorGenerateEventCacheAfterServerEvent(\n viewProcessor,\n newViewCache,\n changePath,\n writesCache,\n source,\n accumulator\n );\n}\n\nfunction viewProcessorApplyUserOverwrite(\n viewProcessor: ViewProcessor,\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.eventCache;\n let newViewCache, newEventCache;\n const source = new WriteTreeCompleteChildSource(\n writesCache,\n oldViewCache,\n completeCache\n );\n if (pathIsEmpty(changePath)) {\n newEventCache = viewProcessor.filter.updateFullNode(\n oldViewCache.eventCache.getNode(),\n changedSnap,\n accumulator\n );\n newViewCache = viewCacheUpdateEventSnap(\n oldViewCache,\n newEventCache,\n true,\n viewProcessor.filter.filtersNodes()\n );\n } else {\n const childKey = pathGetFront(changePath);\n if (childKey === '.priority') {\n newEventCache = viewProcessor.filter.updatePriority(\n oldViewCache.eventCache.getNode(),\n changedSnap\n );\n newViewCache = viewCacheUpdateEventSnap(\n oldViewCache,\n newEventCache,\n oldEventSnap.isFullyInitialized(),\n oldEventSnap.isFiltered()\n );\n } else {\n const childChangePath = pathPopFront(changePath);\n const oldChild = oldEventSnap.getNode().getImmediateChild(childKey);\n let newChild;\n if (pathIsEmpty(childChangePath)) {\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 pathGetBack(childChangePath) === '.priority' &&\n childNode.getChild(pathParent(childChangePath)).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 = viewProcessor.filter.updateChild(\n oldEventSnap.getNode(),\n childKey,\n newChild,\n childChangePath,\n source,\n accumulator\n );\n newViewCache = viewCacheUpdateEventSnap(\n oldViewCache,\n newEventSnap,\n oldEventSnap.isFullyInitialized(),\n viewProcessor.filter.filtersNodes()\n );\n } else {\n newViewCache = oldViewCache;\n }\n }\n }\n return newViewCache;\n}\n\nfunction viewProcessorCacheHasChild(\n viewCache: ViewCache,\n childKey: string\n): boolean {\n return viewCache.eventCache.isCompleteForChild(childKey);\n}\n\nfunction viewProcessorApplyUserMerge(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache,\n path: Path,\n changedChildren: ImmutableTree,\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 = pathChild(path, relativePath);\n if (viewProcessorCacheHasChild(viewCache, pathGetFront(writePath))) {\n curViewCache = viewProcessorApplyUserOverwrite(\n viewProcessor,\n curViewCache,\n writePath,\n childNode,\n writesCache,\n serverCache,\n accumulator\n );\n }\n });\n\n changedChildren.foreach((relativePath, childNode) => {\n const writePath = pathChild(path, relativePath);\n if (!viewProcessorCacheHasChild(viewCache, pathGetFront(writePath))) {\n curViewCache = viewProcessorApplyUserOverwrite(\n viewProcessor,\n curViewCache,\n writePath,\n childNode,\n writesCache,\n serverCache,\n accumulator\n );\n }\n });\n\n return curViewCache;\n}\n\nfunction viewProcessorApplyMerge(\n viewProcessor: ViewProcessor,\n node: Node,\n merge: ImmutableTree\n): Node {\n merge.foreach((relativePath, childNode) => {\n node = node.updateChild(relativePath, childNode);\n });\n return node;\n}\n\nfunction viewProcessorApplyServerMerge(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache,\n path: Path,\n changedChildren: ImmutableTree,\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.serverCache.getNode().isEmpty() &&\n !viewCache.serverCache.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: ImmutableTree;\n if (pathIsEmpty(path)) {\n viewMergeTree = changedChildren;\n } else {\n viewMergeTree = new ImmutableTree(null).setTree(\n path,\n changedChildren\n );\n }\n const serverNode = viewCache.serverCache.getNode();\n viewMergeTree.children.inorderTraversal((childKey, childTree) => {\n if (serverNode.hasChild(childKey)) {\n const serverChild = viewCache.serverCache\n .getNode()\n .getImmediateChild(childKey);\n const newChild = viewProcessorApplyMerge(\n viewProcessor,\n serverChild,\n childTree\n );\n curViewCache = viewProcessorApplyServerOverwrite(\n viewProcessor,\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.serverCache.isCompleteForChild(childKey) &&\n childMergeTree.value === null;\n if (!serverNode.hasChild(childKey) && !isUnknownDeepMerge) {\n const serverChild = viewCache.serverCache\n .getNode()\n .getImmediateChild(childKey);\n const newChild = viewProcessorApplyMerge(\n viewProcessor,\n serverChild,\n childMergeTree\n );\n curViewCache = viewProcessorApplyServerOverwrite(\n viewProcessor,\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\nfunction viewProcessorAckUserWrite(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache,\n ackPath: Path,\n affectedTree: ImmutableTree,\n writesCache: WriteTreeRef,\n completeCache: Node | null,\n accumulator: ChildChangeAccumulator\n): ViewCache {\n if (writeTreeRefShadowingWrite(writesCache, ackPath) != null) {\n return viewCache;\n }\n\n // Only filter server node if it is currently filtered\n const filterServerNode = viewCache.serverCache.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.serverCache;\n if (affectedTree.value != null) {\n // This is an overwrite.\n if (\n (pathIsEmpty(ackPath) && serverCache.isFullyInitialized()) ||\n serverCache.isCompleteForPath(ackPath)\n ) {\n return viewProcessorApplyServerOverwrite(\n viewProcessor,\n viewCache,\n ackPath,\n serverCache.getNode().getChild(ackPath),\n writesCache,\n completeCache,\n filterServerNode,\n accumulator\n );\n } else if (pathIsEmpty(ackPath)) {\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 = new ImmutableTree(null);\n serverCache.getNode().forEachChild(KEY_INDEX, (name, node) => {\n changedChildren = changedChildren.set(new Path(name), node);\n });\n return viewProcessorApplyServerMerge(\n viewProcessor,\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 = new ImmutableTree(null);\n affectedTree.foreach((mergePath, value) => {\n const serverCachePath = pathChild(ackPath, mergePath);\n if (serverCache.isCompleteForPath(serverCachePath)) {\n changedChildren = changedChildren.set(\n mergePath,\n serverCache.getNode().getChild(serverCachePath)\n );\n }\n });\n return viewProcessorApplyServerMerge(\n viewProcessor,\n viewCache,\n ackPath,\n changedChildren,\n writesCache,\n completeCache,\n filterServerNode,\n accumulator\n );\n }\n}\n\nfunction viewProcessorListenComplete(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache,\n path: Path,\n writesCache: WriteTreeRef,\n accumulator: ChildChangeAccumulator\n): ViewCache {\n const oldServerNode = viewCache.serverCache;\n const newViewCache = viewCacheUpdateServerSnap(\n viewCache,\n oldServerNode.getNode(),\n oldServerNode.isFullyInitialized() || pathIsEmpty(path),\n oldServerNode.isFiltered()\n );\n return viewProcessorGenerateEventCacheAfterServerEvent(\n viewProcessor,\n newViewCache,\n path,\n writesCache,\n NO_COMPLETE_CHILD_SOURCE,\n accumulator\n );\n}\n\nfunction viewProcessorRevertUserWrite(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache,\n path: Path,\n writesCache: WriteTreeRef,\n completeServerCache: Node | null,\n accumulator: ChildChangeAccumulator\n): ViewCache {\n let complete;\n if (writeTreeRefShadowingWrite(writesCache, path) != null) {\n return viewCache;\n } else {\n const source = new WriteTreeCompleteChildSource(\n writesCache,\n viewCache,\n completeServerCache\n );\n const oldEventCache = viewCache.eventCache.getNode();\n let newEventCache;\n if (pathIsEmpty(path) || pathGetFront(path) === '.priority') {\n let newNode;\n if (viewCache.serverCache.isFullyInitialized()) {\n newNode = writeTreeRefCalcCompleteEventCache(\n writesCache,\n viewCacheGetCompleteServerSnap(viewCache)\n );\n } else {\n const serverChildren = viewCache.serverCache.getNode();\n assert(\n serverChildren instanceof ChildrenNode,\n 'serverChildren would be complete if leaf node'\n );\n newNode = writeTreeRefCalcCompleteEventChildren(\n writesCache,\n serverChildren as ChildrenNode\n );\n }\n newNode = newNode as Node;\n newEventCache = viewProcessor.filter.updateFullNode(\n oldEventCache,\n newNode,\n accumulator\n );\n } else {\n const childKey = pathGetFront(path);\n let newChild = writeTreeRefCalcCompleteChild(\n writesCache,\n childKey,\n viewCache.serverCache\n );\n if (\n newChild == null &&\n viewCache.serverCache.isCompleteForChild(childKey)\n ) {\n newChild = oldEventCache.getImmediateChild(childKey);\n }\n if (newChild != null) {\n newEventCache = viewProcessor.filter.updateChild(\n oldEventCache,\n childKey,\n newChild,\n pathPopFront(path),\n source,\n accumulator\n );\n } else if (viewCache.eventCache.getNode().hasChild(childKey)) {\n // No complete child available, delete the existing one, if any\n newEventCache = viewProcessor.filter.updateChild(\n oldEventCache,\n childKey,\n ChildrenNode.EMPTY_NODE,\n pathPopFront(path),\n source,\n accumulator\n );\n } else {\n newEventCache = oldEventCache;\n }\n if (\n newEventCache.isEmpty() &&\n viewCache.serverCache.isFullyInitialized()\n ) {\n // We might have reverted all child writes. Maybe the old event was a leaf node\n complete = writeTreeRefCalcCompleteEventCache(\n writesCache,\n viewCacheGetCompleteServerSnap(viewCache)\n );\n if (complete.isLeafNode()) {\n newEventCache = viewProcessor.filter.updateFullNode(\n newEventCache,\n complete,\n accumulator\n );\n }\n }\n }\n complete =\n viewCache.serverCache.isFullyInitialized() ||\n writeTreeRefShadowingWrite(writesCache, newEmptyPath()) != null;\n return viewCacheUpdateEventSnap(\n viewCache,\n newEventCache,\n complete,\n viewProcessor.filter.filtersNodes()\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';\n\nimport { Operation, OperationType } from '../operation/Operation';\nimport { ChildrenNode } from '../snap/ChildrenNode';\nimport { PRIORITY_INDEX } from '../snap/indexes/PriorityIndex';\nimport { Node } from '../snap/Node';\nimport { Path, pathGetFront, pathIsEmpty } from '../util/Path';\nimport { WriteTreeRef } from '../WriteTree';\n\nimport { CacheNode } from './CacheNode';\nimport { Change, changeChildAdded, changeValue } from './Change';\nimport { CancelEvent, Event } from './Event';\nimport {\n EventGenerator,\n eventGeneratorGenerateEventsForChanges\n} from './EventGenerator';\nimport { EventRegistration, QueryContext } from './EventRegistration';\nimport { IndexedFilter } from './filter/IndexedFilter';\nimport { queryParamsGetNodeFilter } from './QueryParams';\nimport {\n newViewCache,\n ViewCache,\n viewCacheGetCompleteEventSnap,\n viewCacheGetCompleteServerSnap\n} from './ViewCache';\nimport {\n newViewProcessor,\n ViewProcessor,\n viewProcessorApplyOperation,\n viewProcessorAssertIndexed\n} from './ViewProcessor';\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 */\nexport class View {\n processor_: ViewProcessor;\n viewCache_: ViewCache;\n eventRegistrations_: EventRegistration[] = [];\n eventGenerator_: EventGenerator;\n\n constructor(private query_: QueryContext, initialViewCache: ViewCache) {\n const params = this.query_._queryParams;\n\n const indexFilter = new IndexedFilter(params.getIndex());\n const filter = queryParamsGetNodeFilter(params);\n\n this.processor_ = newViewProcessor(filter);\n\n const initialServerCache = initialViewCache.serverCache;\n const initialEventCache = initialViewCache.eventCache;\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 this.viewCache_ = newViewCache(newEventCache, newServerCache);\n this.eventGenerator_ = new EventGenerator(this.query_);\n }\n\n get query(): QueryContext {\n return this.query_;\n }\n}\n\nexport function viewGetServerCache(view: View): Node | null {\n return view.viewCache_.serverCache.getNode();\n}\n\nexport function viewGetCompleteNode(view: View): Node | null {\n return viewCacheGetCompleteEventSnap(view.viewCache_);\n}\n\nexport function viewGetCompleteServerCache(\n view: View,\n path: Path\n): Node | null {\n const cache = viewCacheGetCompleteServerSnap(view.viewCache_);\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 view.query._queryParams.loadsAllData() ||\n (!pathIsEmpty(path) &&\n !cache.getImmediateChild(pathGetFront(path)).isEmpty())\n ) {\n return cache.getChild(path);\n }\n }\n return null;\n}\n\nexport function viewIsEmpty(view: View): boolean {\n return view.eventRegistrations_.length === 0;\n}\n\nexport function viewAddEventRegistration(\n view: View,\n eventRegistration: EventRegistration\n) {\n view.eventRegistrations_.push(eventRegistration);\n}\n\n/**\n * @param eventRegistration - If null, remove all callbacks.\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\n * @returns Cancel events, if cancelError was provided.\n */\nexport function viewRemoveEventRegistration(\n view: View,\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 = view.query._path;\n view.eventRegistrations_.forEach(registration => {\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 < view.eventRegistrations_.length; ++i) {\n const existing = view.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(view.eventRegistrations_.slice(i + 1));\n break;\n }\n }\n view.eventRegistrations_ = remaining;\n } else {\n view.eventRegistrations_ = [];\n }\n return cancelEvents;\n}\n\n/**\n * Applies the given Operation, updates our cache, and returns the appropriate events.\n */\nexport function viewApplyOperation(\n view: View,\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 viewCacheGetCompleteServerSnap(view.viewCache_),\n 'We should always have a full cache before handling merges'\n );\n assert(\n viewCacheGetCompleteEventSnap(view.viewCache_),\n 'Missing event cache, even though we have a server cache'\n );\n }\n\n const oldViewCache = view.viewCache_;\n const result = viewProcessorApplyOperation(\n view.processor_,\n oldViewCache,\n operation,\n writesCache,\n completeServerCache\n );\n viewProcessorAssertIndexed(view.processor_, result.viewCache);\n\n assert(\n result.viewCache.serverCache.isFullyInitialized() ||\n !oldViewCache.serverCache.isFullyInitialized(),\n 'Once a server snap is complete, it should never go back'\n );\n\n view.viewCache_ = result.viewCache;\n\n return viewGenerateEventsForChanges_(\n view,\n result.changes,\n result.viewCache.eventCache.getNode(),\n null\n );\n}\n\nexport function viewGetInitialEvents(\n view: View,\n registration: EventRegistration\n): Event[] {\n const eventSnap = view.viewCache_.eventCache;\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(changeChildAdded(key, childNode));\n });\n }\n if (eventSnap.isFullyInitialized()) {\n initialChanges.push(changeValue(eventSnap.getNode()));\n }\n return viewGenerateEventsForChanges_(\n view,\n initialChanges,\n eventSnap.getNode(),\n registration\n );\n}\n\nfunction viewGenerateEventsForChanges_(\n view: View,\n changes: Change[],\n eventCache: Node,\n eventRegistration?: EventRegistration\n): Event[] {\n const registrations = eventRegistration\n ? [eventRegistration]\n : view.eventRegistrations_;\n return eventGeneratorGenerateEventsForChanges(\n view.eventGenerator_,\n changes,\n eventCache,\n registrations\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\nimport { ReferenceConstructor } from '../api/Reference';\n\nimport { Operation } from './operation/Operation';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { Node } from './snap/Node';\nimport { Path } from './util/Path';\nimport { CacheNode } from './view/CacheNode';\nimport { Event } from './view/Event';\nimport { EventRegistration, QueryContext } from './view/EventRegistration';\nimport {\n View,\n viewAddEventRegistration,\n viewApplyOperation,\n viewGetCompleteServerCache,\n viewGetInitialEvents,\n viewIsEmpty,\n viewRemoveEventRegistration\n} from './view/View';\nimport { newViewCache } from './view/ViewCache';\nimport {\n WriteTreeRef,\n writeTreeRefCalcCompleteEventCache,\n writeTreeRefCalcCompleteEventChildren\n} from './WriteTree';\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 /**\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 readonly views: Map = new Map();\n}\n\nexport function syncPointSetReferenceConstructor(\n val: ReferenceConstructor\n): void {\n assert(\n !referenceConstructor,\n '__referenceConstructor has already been defined'\n );\n referenceConstructor = val;\n}\n\nfunction syncPointGetReferenceConstructor(): ReferenceConstructor {\n assert(referenceConstructor, 'Reference.ts has not been loaded');\n return referenceConstructor;\n}\n\nexport function syncPointIsEmpty(syncPoint: SyncPoint): boolean {\n return syncPoint.views.size === 0;\n}\n\nexport function syncPointApplyOperation(\n syncPoint: SyncPoint,\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 = syncPoint.views.get(queryId);\n assert(view != null, 'SyncTree gave us an op for an invalid query.');\n return viewApplyOperation(\n view,\n operation,\n writesCache,\n optCompleteServerCache\n );\n } else {\n let events: Event[] = [];\n\n for (const view of syncPoint.views.values()) {\n events = events.concat(\n viewApplyOperation(view, operation, writesCache, optCompleteServerCache)\n );\n }\n\n return events;\n }\n}\n\n/**\n * Get a view for the specified query.\n *\n * @param query - The query to return a view for\n * @param writesCache\n * @param serverCache\n * @param serverCacheComplete\n * @returns Events to raise.\n */\nexport function syncPointGetView(\n syncPoint: SyncPoint,\n query: QueryContext,\n writesCache: WriteTreeRef,\n serverCache: Node | null,\n serverCacheComplete: boolean\n): View {\n const queryId = query._queryIdentifier;\n const view = syncPoint.views.get(queryId);\n if (!view) {\n // TODO: make writesCache take flag for complete server node\n let eventCache = writeTreeRefCalcCompleteEventCache(\n writesCache,\n serverCacheComplete ? serverCache : null\n );\n let eventCacheComplete = false;\n if (eventCache) {\n eventCacheComplete = true;\n } else if (serverCache instanceof ChildrenNode) {\n eventCache = writeTreeRefCalcCompleteEventChildren(\n writesCache,\n serverCache\n );\n eventCacheComplete = false;\n } else {\n eventCache = ChildrenNode.EMPTY_NODE;\n eventCacheComplete = false;\n }\n const viewCache = newViewCache(\n new CacheNode(eventCache, eventCacheComplete, false),\n new CacheNode(serverCache, serverCacheComplete, false)\n );\n return new View(query, viewCache);\n }\n return view;\n}\n\n/**\n * Add an event callback for the specified query.\n *\n * @param query\n * @param eventRegistration\n * @param writesCache\n * @param serverCache - Complete server cache, if we have it.\n * @param serverCacheComplete\n * @returns Events to raise.\n */\nexport function syncPointAddEventRegistration(\n syncPoint: SyncPoint,\n query: QueryContext,\n eventRegistration: EventRegistration,\n writesCache: WriteTreeRef,\n serverCache: Node | null,\n serverCacheComplete: boolean\n): Event[] {\n const view = syncPointGetView(\n syncPoint,\n query,\n writesCache,\n serverCache,\n serverCacheComplete\n );\n if (!syncPoint.views.has(query._queryIdentifier)) {\n syncPoint.views.set(query._queryIdentifier, view);\n }\n // This is guaranteed to exist now, we just created anything that was missing\n viewAddEventRegistration(view, eventRegistration);\n return viewGetInitialEvents(view, 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 eventRegistration - If null, remove all callbacks.\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\n * @returns removed queries and any cancel events\n */\nexport function syncPointRemoveEventRegistration(\n syncPoint: SyncPoint,\n query: QueryContext,\n eventRegistration: EventRegistration | null,\n cancelError?: Error\n): { removed: QueryContext[]; events: Event[] } {\n const queryId = query._queryIdentifier;\n const removed: QueryContext[] = [];\n let cancelEvents: Event[] = [];\n const hadCompleteView = syncPointHasCompleteView(syncPoint);\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 syncPoint.views.entries()) {\n cancelEvents = cancelEvents.concat(\n viewRemoveEventRegistration(view, eventRegistration, cancelError)\n );\n if (viewIsEmpty(view)) {\n syncPoint.views.delete(viewQueryId);\n\n // We'll deal with complete views later.\n if (!view.query._queryParams.loadsAllData()) {\n removed.push(view.query);\n }\n }\n }\n } else {\n // remove the callback from the specific view.\n const view = syncPoint.views.get(queryId);\n if (view) {\n cancelEvents = cancelEvents.concat(\n viewRemoveEventRegistration(view, eventRegistration, cancelError)\n );\n if (viewIsEmpty(view)) {\n syncPoint.views.delete(queryId);\n\n // We'll deal with complete views later.\n if (!view.query._queryParams.loadsAllData()) {\n removed.push(view.query);\n }\n }\n }\n }\n\n if (hadCompleteView && !syncPointHasCompleteView(syncPoint)) {\n // We removed our last complete view.\n removed.push(\n new (syncPointGetReferenceConstructor())(query._repo, query._path)\n );\n }\n\n return { removed, events: cancelEvents };\n}\n\nexport function syncPointGetQueryViews(syncPoint: SyncPoint): View[] {\n const result = [];\n for (const view of syncPoint.views.values()) {\n if (!view.query._queryParams.loadsAllData()) {\n result.push(view);\n }\n }\n return result;\n}\n\n/**\n * @param path - The path to the desired complete snapshot\n * @returns A complete cache, if it exists\n */\nexport function syncPointGetCompleteServerCache(\n syncPoint: SyncPoint,\n path: Path\n): Node | null {\n let serverCache: Node | null = null;\n for (const view of syncPoint.views.values()) {\n serverCache = serverCache || viewGetCompleteServerCache(view, path);\n }\n return serverCache;\n}\n\nexport function syncPointViewForQuery(\n syncPoint: SyncPoint,\n query: QueryContext\n): View | null {\n const params = query._queryParams;\n if (params.loadsAllData()) {\n return syncPointGetCompleteView(syncPoint);\n } else {\n const queryId = query._queryIdentifier;\n return syncPoint.views.get(queryId);\n }\n}\n\nexport function syncPointViewExistsForQuery(\n syncPoint: SyncPoint,\n query: QueryContext\n): boolean {\n return syncPointViewForQuery(syncPoint, query) != null;\n}\n\nexport function syncPointHasCompleteView(syncPoint: SyncPoint): boolean {\n return syncPointGetCompleteView(syncPoint) != null;\n}\n\nexport function syncPointGetCompleteView(syncPoint: SyncPoint): View | null {\n for (const view of syncPoint.views.values()) {\n if (view.query._queryParams.loadsAllData()) {\n return view;\n }\n }\n return null;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { ReferenceConstructor } from '../api/Reference';\n\nimport { AckUserWrite } from './operation/AckUserWrite';\nimport { ListenComplete } from './operation/ListenComplete';\nimport { Merge } from './operation/Merge';\nimport {\n newOperationSourceServer,\n newOperationSourceServerTaggedQuery,\n newOperationSourceUser,\n Operation\n} from './operation/Operation';\nimport { Overwrite } from './operation/Overwrite';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { Node } from './snap/Node';\nimport {\n SyncPoint,\n syncPointAddEventRegistration,\n syncPointApplyOperation,\n syncPointGetCompleteServerCache,\n syncPointGetCompleteView,\n syncPointGetQueryViews,\n syncPointGetView,\n syncPointHasCompleteView,\n syncPointIsEmpty,\n syncPointRemoveEventRegistration,\n syncPointViewExistsForQuery,\n syncPointViewForQuery\n} from './SyncPoint';\nimport { ImmutableTree } from './util/ImmutableTree';\nimport {\n newEmptyPath,\n newRelativePath,\n Path,\n pathGetFront,\n pathIsEmpty\n} from './util/Path';\nimport { each, errorForServerCode } from './util/util';\nimport { CacheNode } from './view/CacheNode';\nimport { Event } from './view/Event';\nimport { EventRegistration, QueryContext } from './view/EventRegistration';\nimport { View, viewGetCompleteNode, viewGetServerCache } from './view/View';\nimport {\n newWriteTree,\n WriteTree,\n writeTreeAddMerge,\n writeTreeAddOverwrite,\n writeTreeCalcCompleteEventCache,\n writeTreeChildWrites,\n writeTreeGetWrite,\n WriteTreeRef,\n writeTreeRefChild,\n writeTreeRemoveWrite\n} from './WriteTree';\n\nlet referenceConstructor: ReferenceConstructor;\n\nexport function syncTreeSetReferenceConstructor(\n val: ReferenceConstructor\n): void {\n assert(\n !referenceConstructor,\n '__referenceConstructor has already been defined'\n );\n referenceConstructor = val;\n}\n\nfunction syncTreeGetReferenceConstructor(): ReferenceConstructor {\n assert(referenceConstructor, 'Reference.ts has not been loaded');\n return referenceConstructor;\n}\n\nexport interface ListenProvider {\n startListening(\n query: QueryContext,\n tag: number | null,\n hashFn: () => string,\n onComplete: (a: string, b?: unknown) => Event[]\n ): Event[];\n\n stopListening(a: QueryContext, b: number | null): void;\n}\n\n/**\n * Static tracker for next query tag.\n */\nlet syncTreeNextQueryTag_ = 1;\n\nexport function resetSyncTreeTag() {\n syncTreeNextQueryTag_ = 1;\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 */\nexport class SyncTree {\n /**\n * Tree of SyncPoints. There's a SyncPoint at any location that has 1 or more views.\n */\n syncPointTree_: ImmutableTree = new ImmutableTree(null);\n\n /**\n * A tree of all pending user writes (user-initiated set()'s, transaction()'s, update()'s, etc.).\n */\n pendingWriteTree_: WriteTree = newWriteTree();\n\n readonly tagToQueryMap: Map = new Map();\n readonly queryToTagMap: Map = new Map();\n\n /**\n * @param listenProvider_ - Used by SyncTree to start / stop listening\n * to server data.\n */\n constructor(public listenProvider_: ListenProvider) {}\n}\n\n/**\n * Apply the data changes for a user-generated set() or transaction() call.\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyUserOverwrite(\n syncTree: SyncTree,\n path: Path,\n newData: Node,\n writeId: number,\n visible?: boolean\n): Event[] {\n // Record pending write.\n writeTreeAddOverwrite(\n syncTree.pendingWriteTree_,\n path,\n newData,\n writeId,\n visible\n );\n\n if (!visible) {\n return [];\n } else {\n return syncTreeApplyOperationToSyncPoints_(\n syncTree,\n new Overwrite(newOperationSourceUser(), path, newData)\n );\n }\n}\n\n/**\n * Apply the data from a user-generated update() call\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyUserMerge(\n syncTree: SyncTree,\n path: Path,\n changedChildren: { [k: string]: Node },\n writeId: number\n): Event[] {\n // Record pending merge.\n writeTreeAddMerge(syncTree.pendingWriteTree_, path, changedChildren, writeId);\n\n const changeTree = ImmutableTree.fromObject(changedChildren);\n\n return syncTreeApplyOperationToSyncPoints_(\n syncTree,\n new Merge(newOperationSourceUser(), 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 * @returns Events to raise.\n */\nexport function syncTreeAckUserWrite(\n syncTree: SyncTree,\n writeId: number,\n revert: boolean = false\n) {\n const write = writeTreeGetWrite(syncTree.pendingWriteTree_, writeId);\n const needToReevaluate = writeTreeRemoveWrite(\n syncTree.pendingWriteTree_,\n writeId\n );\n if (!needToReevaluate) {\n return [];\n } else {\n let affectedTree = new ImmutableTree(null);\n if (write.snap != null) {\n // overwrite\n affectedTree = affectedTree.set(newEmptyPath(), true);\n } else {\n each(write.children, (pathString: string) => {\n affectedTree = affectedTree.set(new Path(pathString), true);\n });\n }\n return syncTreeApplyOperationToSyncPoints_(\n syncTree,\n new AckUserWrite(write.path, affectedTree, revert)\n );\n }\n}\n\n/**\n * Apply new server data for the specified path..\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyServerOverwrite(\n syncTree: SyncTree,\n path: Path,\n newData: Node\n): Event[] {\n return syncTreeApplyOperationToSyncPoints_(\n syncTree,\n new Overwrite(newOperationSourceServer(), path, newData)\n );\n}\n\n/**\n * Apply new server data to be merged in at the specified path.\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyServerMerge(\n syncTree: SyncTree,\n path: Path,\n changedChildren: { [k: string]: Node }\n): Event[] {\n const changeTree = ImmutableTree.fromObject(changedChildren);\n\n return syncTreeApplyOperationToSyncPoints_(\n syncTree,\n new Merge(newOperationSourceServer(), path, changeTree)\n );\n}\n\n/**\n * Apply a listen complete for a query\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyListenComplete(\n syncTree: SyncTree,\n path: Path\n): Event[] {\n return syncTreeApplyOperationToSyncPoints_(\n syncTree,\n new ListenComplete(newOperationSourceServer(), path)\n );\n}\n\n/**\n * Apply a listen complete for a tagged query\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyTaggedListenComplete(\n syncTree: SyncTree,\n path: Path,\n tag: number\n): Event[] {\n const queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\n if (queryKey) {\n const r = syncTreeParseQueryKey_(queryKey);\n const queryPath = r.path,\n queryId = r.queryId;\n const relativePath = newRelativePath(queryPath, path);\n const op = new ListenComplete(\n newOperationSourceServerTaggedQuery(queryId),\n relativePath\n );\n return syncTreeApplyTaggedOperation_(syncTree, queryPath, op);\n } else {\n // We've already removed the query. No big deal, ignore the update\n return [];\n }\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 * @param skipListenerDedup - When performing a `get()`, we don't add any new listeners, so no\n * deduping needs to take place. This flag allows toggling of that behavior\n * @returns Cancel events, if cancelError was provided.\n */\nexport function syncTreeRemoveEventRegistration(\n syncTree: SyncTree,\n query: QueryContext,\n eventRegistration: EventRegistration | null,\n cancelError?: Error,\n skipListenerDedup = false\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 = syncTree.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 syncPointViewExistsForQuery(maybeSyncPoint, query))\n ) {\n const removedAndEvents = syncPointRemoveEventRegistration(\n maybeSyncPoint,\n query,\n eventRegistration,\n cancelError\n );\n if (syncPointIsEmpty(maybeSyncPoint)) {\n syncTree.syncPointTree_ = syncTree.syncPointTree_.remove(path);\n }\n\n const removed = removedAndEvents.removed;\n cancelEvents = removedAndEvents.events;\n\n if (!skipListenerDedup) {\n /**\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\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._queryParams.loadsAllData();\n });\n const covered = syncTree.syncPointTree_.findOnPath(\n path,\n (relativePath, parentSyncPoint) =>\n syncPointHasCompleteView(parentSyncPoint)\n );\n\n if (removingDefault && !covered) {\n const subtree = syncTree.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 = syncTreeCollectDistinctViewsForSubTree_(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.query;\n const listener = syncTreeCreateListenerForView_(syncTree, view);\n syncTree.listenProvider_.startListening(\n syncTreeQueryForListening_(newQuery),\n syncTreeTagForQuery(syncTree, newQuery),\n listener.hashFn,\n listener.onComplete\n );\n }\n }\n // Otherwise there's nothing below us, so nothing we need to start listening on\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 syncTree.listenProvider_.stopListening(\n syncTreeQueryForListening_(query),\n defaultTag\n );\n } else {\n removed.forEach((queryToRemove: QueryContext) => {\n const tagToRemove = syncTree.queryToTagMap.get(\n syncTreeMakeQueryKey_(queryToRemove)\n );\n syncTree.listenProvider_.stopListening(\n syncTreeQueryForListening_(queryToRemove),\n tagToRemove\n );\n });\n }\n }\n }\n // Now, clear all of the tags we're tracking for the removed listens\n syncTreeRemoveTags_(syncTree, removed);\n } else {\n // No-op, this listener must've been already removed\n }\n return cancelEvents;\n}\n\n/**\n * Apply new server data for the specified tagged query.\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyTaggedQueryOverwrite(\n syncTree: SyncTree,\n path: Path,\n snap: Node,\n tag: number\n): Event[] {\n const queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\n if (queryKey != null) {\n const r = syncTreeParseQueryKey_(queryKey);\n const queryPath = r.path,\n queryId = r.queryId;\n const relativePath = newRelativePath(queryPath, path);\n const op = new Overwrite(\n newOperationSourceServerTaggedQuery(queryId),\n relativePath,\n snap\n );\n return syncTreeApplyTaggedOperation_(syncTree, 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 * @returns Events to raise.\n */\nexport function syncTreeApplyTaggedQueryMerge(\n syncTree: SyncTree,\n path: Path,\n changedChildren: { [k: string]: Node },\n tag: number\n): Event[] {\n const queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\n if (queryKey) {\n const r = syncTreeParseQueryKey_(queryKey);\n const queryPath = r.path,\n queryId = r.queryId;\n const relativePath = newRelativePath(queryPath, path);\n const changeTree = ImmutableTree.fromObject(changedChildren);\n const op = new Merge(\n newOperationSourceServerTaggedQuery(queryId),\n relativePath,\n changeTree\n );\n return syncTreeApplyTaggedOperation_(syncTree, 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 * @returns Events to raise.\n */\nexport function syncTreeAddEventRegistration(\n syncTree: SyncTree,\n query: QueryContext,\n eventRegistration: EventRegistration,\n skipSetupListener = false\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 syncTree.syncPointTree_.foreachOnPath(path, (pathToSyncPoint, sp) => {\n const relativePath = newRelativePath(pathToSyncPoint, path);\n serverCache =\n serverCache || syncPointGetCompleteServerCache(sp, relativePath);\n foundAncestorDefaultView =\n foundAncestorDefaultView || syncPointHasCompleteView(sp);\n });\n let syncPoint = syncTree.syncPointTree_.get(path);\n if (!syncPoint) {\n syncPoint = new SyncPoint();\n syncTree.syncPointTree_ = syncTree.syncPointTree_.set(path, syncPoint);\n } else {\n foundAncestorDefaultView =\n foundAncestorDefaultView || syncPointHasCompleteView(syncPoint);\n serverCache =\n serverCache || syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\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 = syncTree.syncPointTree_.subtree(path);\n subtree.foreachChild((childName, childSyncPoint) => {\n const completeCache = syncPointGetCompleteServerCache(\n childSyncPoint,\n newEmptyPath()\n );\n if (completeCache) {\n serverCache = serverCache.updateImmediateChild(\n childName,\n completeCache\n );\n }\n });\n }\n\n const viewAlreadyExists = syncPointViewExistsForQuery(syncPoint, query);\n if (!viewAlreadyExists && !query._queryParams.loadsAllData()) {\n // We need to track a tag for this query\n const queryKey = syncTreeMakeQueryKey_(query);\n assert(\n !syncTree.queryToTagMap.has(queryKey),\n 'View does not exist, but we have a tag'\n );\n const tag = syncTreeGetNextQueryTag_();\n syncTree.queryToTagMap.set(queryKey, tag);\n syncTree.tagToQueryMap.set(tag, queryKey);\n }\n const writesCache = writeTreeChildWrites(syncTree.pendingWriteTree_, path);\n let events = syncPointAddEventRegistration(\n syncPoint,\n query,\n eventRegistration,\n writesCache,\n serverCache,\n serverCacheComplete\n );\n if (!viewAlreadyExists && !foundAncestorDefaultView && !skipSetupListener) {\n const view = syncPointViewForQuery(syncPoint, query);\n events = events.concat(syncTreeSetupListener_(syncTree, query, view));\n }\n return events;\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 ->\n * 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 */\nexport function syncTreeCalcCompleteEventCache(\n syncTree: SyncTree,\n path: Path,\n writeIdsToExclude?: number[]\n): Node {\n const includeHiddenSets = true;\n const writeTree = syncTree.pendingWriteTree_;\n const serverCache = syncTree.syncPointTree_.findOnPath(\n path,\n (pathSoFar, syncPoint) => {\n const relativePath = newRelativePath(pathSoFar, path);\n const serverCache = syncPointGetCompleteServerCache(\n syncPoint,\n relativePath\n );\n if (serverCache) {\n return serverCache;\n }\n }\n );\n return writeTreeCalcCompleteEventCache(\n writeTree,\n path,\n serverCache,\n writeIdsToExclude,\n includeHiddenSets\n );\n}\n\nexport function syncTreeGetServerValue(\n syncTree: SyncTree,\n query: QueryContext\n): Node | null {\n const path = query._path;\n let serverCache: Node | null = null;\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 syncTree.syncPointTree_.foreachOnPath(path, (pathToSyncPoint, sp) => {\n const relativePath = newRelativePath(pathToSyncPoint, path);\n serverCache =\n serverCache || syncPointGetCompleteServerCache(sp, relativePath);\n });\n let syncPoint = syncTree.syncPointTree_.get(path);\n if (!syncPoint) {\n syncPoint = new SyncPoint();\n syncTree.syncPointTree_ = syncTree.syncPointTree_.set(path, syncPoint);\n } else {\n serverCache =\n serverCache || syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\n }\n const serverCacheComplete = serverCache != null;\n const serverCacheNode: CacheNode | null = serverCacheComplete\n ? new CacheNode(serverCache, true, false)\n : null;\n const writesCache: WriteTreeRef | null = writeTreeChildWrites(\n syncTree.pendingWriteTree_,\n query._path\n );\n const view: View = syncPointGetView(\n syncPoint,\n query,\n writesCache,\n serverCacheComplete ? serverCacheNode.getNode() : ChildrenNode.EMPTY_NODE,\n serverCacheComplete\n );\n return viewGetCompleteNode(view);\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 */\nfunction syncTreeApplyOperationToSyncPoints_(\n syncTree: SyncTree,\n operation: Operation\n): Event[] {\n return syncTreeApplyOperationHelper_(\n operation,\n syncTree.syncPointTree_,\n /*serverCache=*/ null,\n writeTreeChildWrites(syncTree.pendingWriteTree_, newEmptyPath())\n );\n}\n\n/**\n * Recursive helper for applyOperationToSyncPoints_\n */\nfunction syncTreeApplyOperationHelper_(\n operation: Operation,\n syncPointTree: ImmutableTree,\n serverCache: Node | null,\n writesCache: WriteTreeRef\n): Event[] {\n if (pathIsEmpty(operation.path)) {\n return syncTreeApplyOperationDescendantsHelper_(\n operation,\n syncPointTree,\n serverCache,\n writesCache\n );\n } else {\n const syncPoint = syncPointTree.get(newEmptyPath());\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 = syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\n }\n\n let events: Event[] = [];\n const childName = pathGetFront(operation.path);\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 = writeTreeRefChild(writesCache, childName);\n events = events.concat(\n syncTreeApplyOperationHelper_(\n childOperation,\n childTree,\n childServerCache,\n childWritesCache\n )\n );\n }\n\n if (syncPoint) {\n events = events.concat(\n syncPointApplyOperation(syncPoint, operation, writesCache, serverCache)\n );\n }\n\n return events;\n }\n}\n\n/**\n * Recursive helper for applyOperationToSyncPoints_\n */\nfunction syncTreeApplyOperationDescendantsHelper_(\n operation: Operation,\n syncPointTree: ImmutableTree,\n serverCache: Node | null,\n writesCache: WriteTreeRef\n): Event[] {\n const syncPoint = syncPointTree.get(newEmptyPath());\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 = syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\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 = writeTreeRefChild(writesCache, childName);\n const childOperation = operation.operationForChild(childName);\n if (childOperation) {\n events = events.concat(\n syncTreeApplyOperationDescendantsHelper_(\n childOperation,\n childTree,\n childServerCache,\n childWritesCache\n )\n );\n }\n });\n\n if (syncPoint) {\n events = events.concat(\n syncPointApplyOperation(syncPoint, operation, writesCache, serverCache)\n );\n }\n\n return events;\n}\n\nfunction syncTreeCreateListenerForView_(\n syncTree: SyncTree,\n view: View\n): { hashFn(): string; onComplete(a: string, b?: unknown): Event[] } {\n const query = view.query;\n const tag = syncTreeTagForQuery(syncTree, query);\n\n return {\n hashFn: () => {\n const cache = viewGetServerCache(view) || ChildrenNode.EMPTY_NODE;\n return cache.hash();\n },\n onComplete: (status: string): Event[] => {\n if (status === 'ok') {\n if (tag) {\n return syncTreeApplyTaggedListenComplete(syncTree, query._path, tag);\n } else {\n return syncTreeApplyListenComplete(syncTree, 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 syncTreeRemoveEventRegistration(\n syncTree,\n query,\n /*eventRegistration*/ null,\n error\n );\n }\n }\n };\n}\n\n/**\n * Return the tag associated with the given query.\n */\nexport function syncTreeTagForQuery(\n syncTree: SyncTree,\n query: QueryContext\n): number | null {\n const queryKey = syncTreeMakeQueryKey_(query);\n return syncTree.queryToTagMap.get(queryKey);\n}\n\n/**\n * Given a query, computes a \"queryKey\" suitable for use in our queryToTagMap_.\n */\nfunction syncTreeMakeQueryKey_(query: QueryContext): string {\n return query._path.toString() + '$' + query._queryIdentifier;\n}\n\n/**\n * Return the query associated with the given tag, if we have one\n */\nfunction syncTreeQueryKeyForTag_(\n syncTree: SyncTree,\n tag: number\n): string | null {\n return syncTree.tagToQueryMap.get(tag);\n}\n\n/**\n * Given a queryKey (created by makeQueryKey), parse it back into a path and queryId.\n */\nfunction syncTreeParseQueryKey_(queryKey: string): {\n queryId: string;\n path: Path;\n} {\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 * A helper method to apply tagged operations\n */\nfunction syncTreeApplyTaggedOperation_(\n syncTree: SyncTree,\n queryPath: Path,\n operation: Operation\n): Event[] {\n const syncPoint = syncTree.syncPointTree_.get(queryPath);\n assert(syncPoint, \"Missing sync point for query tag that we're tracking\");\n const writesCache = writeTreeChildWrites(\n syncTree.pendingWriteTree_,\n queryPath\n );\n return syncPointApplyOperation(syncPoint, operation, writesCache, null);\n}\n\n/**\n * This collapses multiple unfiltered views into a single view, since we only need a single\n * listener for them.\n */\nfunction syncTreeCollectDistinctViewsForSubTree_(\n subtree: ImmutableTree\n): View[] {\n return subtree.fold((relativePath, maybeChildSyncPoint, childMap) => {\n if (maybeChildSyncPoint && syncPointHasCompleteView(maybeChildSyncPoint)) {\n const completeView = syncPointGetCompleteView(maybeChildSyncPoint);\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 = syncPointGetQueryViews(maybeChildSyncPoint);\n }\n each(childMap, (_key: string, childViews: View[]) => {\n views = views.concat(childViews);\n });\n return views;\n }\n });\n}\n\n/**\n * Normalizes a query to a query we send the server for listening\n *\n * @returns The normalized query\n */\nfunction syncTreeQueryForListening_(query: QueryContext): QueryContext {\n if (query._queryParams.loadsAllData() && !query._queryParams.isDefault()) {\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 new (syncTreeGetReferenceConstructor())(query._repo, query._path);\n } else {\n return query;\n }\n}\n\nfunction syncTreeRemoveTags_(syncTree: SyncTree, queries: QueryContext[]) {\n for (let j = 0; j < queries.length; ++j) {\n const removedQuery = queries[j];\n if (!removedQuery._queryParams.loadsAllData()) {\n // We should have a tag for this\n const removedQueryKey = syncTreeMakeQueryKey_(removedQuery);\n const removedQueryTag = syncTree.queryToTagMap.get(removedQueryKey);\n syncTree.queryToTagMap.delete(removedQueryKey);\n syncTree.tagToQueryMap.delete(removedQueryTag);\n }\n }\n}\n\n/**\n * Static accessor for query tags.\n */\nfunction syncTreeGetNextQueryTag_(): number {\n return syncTreeNextQueryTag_++;\n}\n\n/**\n * For a given new listen, manage the de-duplication of outstanding subscriptions.\n *\n * @returns This method can return events to support synchronous data sources\n */\nfunction syncTreeSetupListener_(\n syncTree: SyncTree,\n query: QueryContext,\n view: View\n): Event[] {\n const path = query._path;\n const tag = syncTreeTagForQuery(syncTree, query);\n const listener = syncTreeCreateListenerForView_(syncTree, view);\n\n const events = syncTree.listenProvider_.startListening(\n syncTreeQueryForListening_(query),\n tag,\n listener.hashFn,\n listener.onComplete\n );\n\n const subtree = syncTree.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 !syncPointHasCompleteView(subtree.value),\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(\n (relativePath, maybeChildSyncPoint, childMap) => {\n if (\n !pathIsEmpty(relativePath) &&\n maybeChildSyncPoint &&\n syncPointHasCompleteView(maybeChildSyncPoint)\n ) {\n return [syncPointGetCompleteView(maybeChildSyncPoint).query];\n } else {\n // No default listener here, flatten any deeper queries into an array\n let queries: QueryContext[] = [];\n if (maybeChildSyncPoint) {\n queries = queries.concat(\n syncPointGetQueryViews(maybeChildSyncPoint).map(\n view => view.query\n )\n );\n }\n each(childMap, (_key: string, childQueries: QueryContext[]) => {\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 syncTree.listenProvider_.stopListening(\n syncTreeQueryForListening_(queryToStop),\n syncTreeTagForQuery(syncTree, queryToStop)\n );\n }\n }\n return events;\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\nimport { ChildrenNode } from '../snap/ChildrenNode';\nimport { PRIORITY_INDEX } from '../snap/indexes/PriorityIndex';\nimport { LeafNode } from '../snap/LeafNode';\nimport { Node } from '../snap/Node';\nimport { nodeFromJSON } from '../snap/nodeFromJSON';\nimport { SyncTree, syncTreeCalcCompleteEventCache } from '../SyncTree';\n\nimport { Indexable } from './misc';\nimport { Path, pathChild } from './Path';\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 = pathChild(this.path_, childName);\n return new DeferredValueProvider(this.syncTree_, childPath);\n }\n\n node(): Node {\n return syncTreeCalcCompleteEventCache(this.syncTree_, this.path_);\n }\n}\n\n/**\n * Generate placeholders for deferred values.\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 */\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 to which write is relative\n * @param node - new data written at path\n * @param syncTree - current data\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 */\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 { contains, safeGet } from '@firebase/util';\n\nimport { Path, pathGetFront, pathPopFront } from './Path';\nimport { each } from './util';\n\n/**\n * Node in a Tree.\n */\nexport interface TreeNode {\n // TODO: Consider making accessors that create children and value lazily or\n // separate Internal / Leaf 'types'.\n children: Record>;\n childCount: number;\n value?: T;\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 {\n /**\n * @param name - Optional name of the node.\n * @param parent - Optional parent node.\n * @param node - Optional node to wrap.\n */\n constructor(\n readonly name: string = '',\n readonly parent: Tree | null = null,\n public node: TreeNode = { children: {}, childCount: 0 }\n ) {}\n}\n\n/**\n * Returns a sub-Tree for the given path.\n *\n * @param pathObj - Path to look up.\n * @returns Tree for path.\n */\nexport function treeSubTree(tree: Tree, pathObj: string | Path): Tree {\n // TODO: Require pathObj to be Path?\n let path = pathObj instanceof Path ? pathObj : new Path(pathObj);\n let child = tree,\n next = pathGetFront(path);\n while (next !== null) {\n const childNode = safeGet(child.node.children, next) || {\n children: {},\n childCount: 0\n };\n child = new Tree(next, child, childNode);\n path = pathPopFront(path);\n next = pathGetFront(path);\n }\n\n return child;\n}\n\n/**\n * Returns the data associated with this tree node.\n *\n * @returns The data or null if no data exists.\n */\nexport function treeGetValue(tree: Tree): T | undefined {\n return tree.node.value;\n}\n\n/**\n * Sets data to this tree node.\n *\n * @param value - Value to set.\n */\nexport function treeSetValue(tree: Tree, value: T | undefined): void {\n tree.node.value = value;\n treeUpdateParents(tree);\n}\n\n/**\n * @returns Whether the tree has any children.\n */\nexport function treeHasChildren(tree: Tree): boolean {\n return tree.node.childCount > 0;\n}\n\n/**\n * @returns Whethe rthe tree is empty (no value or children).\n */\nexport function treeIsEmpty(tree: Tree): boolean {\n return treeGetValue(tree) === undefined && !treeHasChildren(tree);\n}\n\n/**\n * Calls action for each child of this tree node.\n *\n * @param action - Action to be called for each child.\n */\nexport function treeForEachChild(\n tree: Tree,\n action: (tree: Tree) => void\n): void {\n each(tree.node.children, (child: string, childTree: TreeNode) => {\n action(new Tree(child, tree, childTree));\n });\n}\n\n/**\n * Does a depth-first traversal of this node's descendants, calling action for each one.\n *\n * @param action - Action to be called for each child.\n * @param includeSelf - Whether to call action on this node as well. Defaults to\n * false.\n * @param childrenFirst - Whether to call action on children before calling it on\n * parent.\n */\nexport function treeForEachDescendant(\n tree: Tree,\n action: (tree: Tree) => void,\n includeSelf?: boolean,\n childrenFirst?: boolean\n): void {\n if (includeSelf && !childrenFirst) {\n action(tree);\n }\n\n treeForEachChild(tree, child => {\n treeForEachDescendant(child, action, true, childrenFirst);\n });\n\n if (includeSelf && childrenFirst) {\n action(tree);\n }\n}\n\n/**\n * Calls action on each ancestor node.\n *\n * @param action - Action to be called on each parent; return\n * true to abort.\n * @param includeSelf - Whether to call action on this node as well.\n * @returns true if the action callback returned true.\n */\nexport function treeForEachAncestor(\n tree: Tree,\n action: (tree: Tree) => unknown,\n includeSelf?: boolean\n): boolean {\n let node = includeSelf ? tree : tree.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 action - Action to be called for each child.\n */\nexport function treeForEachImmediateDescendantWithValue(\n tree: Tree,\n action: (tree: Tree) => void\n): void {\n treeForEachChild(tree, child => {\n if (treeGetValue(child) !== undefined) {\n action(child);\n } else {\n treeForEachImmediateDescendantWithValue(child, action);\n }\n });\n}\n\n/**\n * @returns The path of this tree node, as a Path.\n */\nexport function treeGetPath(tree: Tree) {\n return new Path(\n tree.parent === null\n ? tree.name\n : treeGetPath(tree.parent) + '/' + tree.name\n );\n}\n\n/**\n * Adds or removes this child from its parent based on whether it's empty or not.\n */\nfunction treeUpdateParents(tree: Tree) {\n if (tree.parent !== null) {\n treeUpdateChild(tree.parent, tree.name, tree);\n }\n}\n\n/**\n * Adds or removes the passed child to this tree node, depending on whether it's empty.\n *\n * @param childName - The name of the child to update.\n * @param child - The child to update.\n */\nfunction treeUpdateChild(tree: Tree, childName: string, child: Tree) {\n const childEmpty = treeIsEmpty(child);\n const childExists = contains(tree.node.children, childName);\n if (childEmpty && childExists) {\n delete tree.node.children[childName];\n tree.node.childCount--;\n treeUpdateParents(tree);\n } else if (!childEmpty && !childExists) {\n tree.node.children[childName] = child.node;\n tree.node.childCount++;\n treeUpdateParents(tree);\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 contains,\n errorPrefix as errorPrefixFxn,\n safeGet,\n stringLength\n} from '@firebase/util';\n\nimport { RepoInfo } from '../RepoInfo';\n\nimport {\n Path,\n pathChild,\n pathCompare,\n pathContains,\n pathGetBack,\n pathGetFront,\n pathSlice,\n ValidationPath,\n validationPathPop,\n validationPathPush,\n validationPathToErrorString\n} from './Path';\nimport { each, isInvalidJSONNumber } from './util';\n\n/**\n * True for invalid Firebase keys\n */\nexport const INVALID_KEY_REGEX_ = /[\\[\\].#$\\/\\u0000-\\u001F\\u007F]/;\n\n/**\n * True for invalid Firebase paths.\n * Allows '/' in paths.\n */\nexport const INVALID_PATH_REGEX_ = /[\\[\\].#$\\u0000-\\u001F\\u007F]/;\n\n/**\n * Maximum number of characters to allow in leaf value\n */\nexport const MAX_LEAF_SIZE_ = 10 * 1024 * 1024;\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\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\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\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 */\nexport const validateFirebaseDataArg = function (\n fnName: string,\n value: unknown,\n path: Path,\n optional: boolean\n) {\n if (optional && value === undefined) {\n return;\n }\n\n validateFirebaseData(errorPrefixFxn(fnName, 'value'), value, path);\n};\n\n/**\n * Validate a data object client-side before sending to server.\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(\n errorPrefix + 'contains undefined ' + validationPathToErrorString(path)\n );\n }\n if (typeof data === 'function') {\n throw new Error(\n errorPrefix +\n 'contains a function ' +\n validationPathToErrorString(path) +\n ' with contents = ' +\n data.toString()\n );\n }\n if (isInvalidJSONNumber(data)) {\n throw new Error(\n errorPrefix +\n 'contains ' +\n data.toString() +\n ' ' +\n validationPathToErrorString(path)\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 validationPathToErrorString(path) +\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 validationPathToErrorString(path) +\n '. Keys must be non-empty strings ' +\n 'and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"'\n );\n }\n }\n\n validationPathPush(path, key);\n validateFirebaseData(errorPrefix, value, path);\n validationPathPop(path);\n });\n\n if (hasDotValue && hasActualChild) {\n throw new Error(\n errorPrefix +\n ' contains \".value\" child ' +\n validationPathToErrorString(path) +\n ' in addition to actual children.'\n );\n }\n }\n};\n\n/**\n * Pre-validate paths passed in the firebase function.\n */\nexport const validateFirebaseMergePaths = function (\n errorPrefix: string,\n mergePaths: Path[]\n) {\n let i, curPath: Path;\n for (i = 0; i < mergePaths.length; i++) {\n curPath = mergePaths[i];\n const keys = pathSlice(curPath);\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(pathCompare);\n let prevPath: Path | null = null;\n for (i = 0; i < mergePaths.length; i++) {\n curPath = mergePaths[i];\n if (prevPath !== null && pathContains(prevPath, 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 */\nexport const validateFirebaseMergeDataArg = function (\n fnName: string,\n data: unknown,\n path: Path,\n optional: boolean\n) {\n if (optional && data === undefined) {\n return;\n }\n\n const errorPrefix = errorPrefixFxn(fnName, 'values');\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, pathChild(path, curPath));\n if (pathGetBack(curPath) === '.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 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, 'priority') +\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, 'priority') +\n 'must be a valid Firebase priority ' +\n '(a string, finite number, server value, or null).'\n );\n }\n};\n\nexport const validateKey = function (\n fnName: string,\n argumentName: string,\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, argumentName) +\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\n/**\n * @internal\n */\nexport const validatePathString = function (\n fnName: string,\n argumentName: string,\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, argumentName) +\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 argumentName: string,\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, argumentName, pathString, optional);\n};\n\n/**\n * @internal\n */\nexport const validateWritablePath = function (fnName: string, path: Path) {\n if (pathGetFront(path) === '.info') {\n throw new Error(fnName + \" failed = Can't modify data under /.info/\");\n }\n};\n\nexport const validateUrl = function (\n fnName: string,\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, 'url') +\n 'must be a valid firebase URL and ' +\n 'the path can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\".'\n );\n }\n};\n\nexport const validateString = function (\n fnName: string,\n argumentName: string,\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, argumentName) + 'must be a valid string.'\n );\n }\n};\n\nexport const validateObject = function (\n fnName: string,\n argumentName: string,\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, argumentName) + 'must be a valid object.'\n );\n }\n};\n\nexport const validateObjectContainsKey = function (\n fnName: string,\n argumentName: string,\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, argumentName) +\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, argumentName) +\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, argumentName) +\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 { Path, pathContains, pathEquals } from '../util/Path';\nimport { exceptionGuard, log, logger } from '../util/util';\n\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 */\nexport class EventQueue {\n eventLists_: EventList[] = [];\n\n /**\n * Tracks recursion depth of raiseQueuedEvents_, for debugging purposes.\n */\n recursionDepth_ = 0;\n}\n\n/**\n * @param eventDataList - The new events to queue.\n */\nexport function eventQueueQueueEvents(\n eventQueue: EventQueue,\n eventDataList: Event[]\n) {\n // We group events by path, storing them in a single EventList, to make it easier to skip over them quickly.\n let currList: EventList | null = null;\n for (let i = 0; i < eventDataList.length; i++) {\n const data = eventDataList[i];\n const path = data.getPath();\n if (currList !== null && !pathEquals(path, currList.path)) {\n eventQueue.eventLists_.push(currList);\n currList = null;\n }\n\n if (currList === null) {\n currList = { events: [], path };\n }\n\n currList.events.push(data);\n }\n if (currList) {\n eventQueue.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 - The path to raise events for.\n * @param eventDataList - The new events to raise.\n */\nexport function eventQueueRaiseEventsAtPath(\n eventQueue: EventQueue,\n path: Path,\n eventDataList: Event[]\n) {\n eventQueueQueueEvents(eventQueue, eventDataList);\n eventQueueRaiseQueuedEventsMatchingPredicate(eventQueue, eventPath =>\n pathEquals(eventPath, 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 changedPath - The path to raise events for.\n * @param eventDataList - The events to raise\n */\nexport function eventQueueRaiseEventsForChangedPath(\n eventQueue: EventQueue,\n changedPath: Path,\n eventDataList: Event[]\n) {\n eventQueueQueueEvents(eventQueue, eventDataList);\n eventQueueRaiseQueuedEventsMatchingPredicate(\n eventQueue,\n eventPath =>\n pathContains(eventPath, changedPath) ||\n pathContains(changedPath, eventPath)\n );\n}\n\nfunction eventQueueRaiseQueuedEventsMatchingPredicate(\n eventQueue: EventQueue,\n predicate: (path: Path) => boolean\n) {\n eventQueue.recursionDepth_++;\n\n let sentAll = true;\n for (let i = 0; i < eventQueue.eventLists_.length; i++) {\n const eventList = eventQueue.eventLists_[i];\n if (eventList) {\n const eventPath = eventList.path;\n if (predicate(eventPath)) {\n eventListRaise(eventQueue.eventLists_[i]);\n eventQueue.eventLists_[i] = null;\n } else {\n sentAll = false;\n }\n }\n }\n\n if (sentAll) {\n eventQueue.eventLists_ = [];\n }\n\n eventQueue.recursionDepth_--;\n}\n\ninterface EventList {\n events: Event[];\n path: Path;\n}\n\n/**\n * Iterates through the list and raises each event\n */\nfunction eventListRaise(eventList: EventList) {\n for (let i = 0; i < eventList.events.length; i++) {\n const eventData = eventList.events[i];\n if (eventData !== null) {\n eventList.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 * @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 contains,\n isEmpty,\n map,\n safeGet,\n stringify\n} from '@firebase/util';\n\nimport { ValueEventRegistration } from '../api/Reference_impl';\n\nimport { AppCheckTokenProvider } from './AppCheckTokenProvider';\nimport { AuthTokenProvider } from './AuthTokenProvider';\nimport { PersistentConnection } from './PersistentConnection';\nimport { ReadonlyRestClient } from './ReadonlyRestClient';\nimport { RepoInfo } from './RepoInfo';\nimport { ServerActions } from './ServerActions';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { Node } from './snap/Node';\nimport { nodeFromJSON } from './snap/nodeFromJSON';\nimport { SnapshotHolder } from './SnapshotHolder';\nimport {\n newSparseSnapshotTree,\n SparseSnapshotTree,\n sparseSnapshotTreeForEachTree,\n sparseSnapshotTreeForget,\n sparseSnapshotTreeRemember\n} from './SparseSnapshotTree';\nimport { StatsCollection } from './stats/StatsCollection';\nimport { StatsListener } from './stats/StatsListener';\nimport {\n statsManagerGetCollection,\n statsManagerGetOrCreateReporter\n} from './stats/StatsManager';\nimport { StatsReporter, statsReporterIncludeStat } from './stats/StatsReporter';\nimport {\n SyncTree,\n syncTreeAckUserWrite,\n syncTreeAddEventRegistration,\n syncTreeApplyServerMerge,\n syncTreeApplyServerOverwrite,\n syncTreeApplyTaggedQueryMerge,\n syncTreeApplyTaggedQueryOverwrite,\n syncTreeApplyUserMerge,\n syncTreeApplyUserOverwrite,\n syncTreeCalcCompleteEventCache,\n syncTreeGetServerValue,\n syncTreeRemoveEventRegistration,\n syncTreeTagForQuery\n} from './SyncTree';\nimport { Indexable } from './util/misc';\nimport {\n newEmptyPath,\n newRelativePath,\n Path,\n pathChild,\n pathGetFront,\n pathPopFront\n} from './util/Path';\nimport {\n generateWithValues,\n resolveDeferredValueSnapshot,\n resolveDeferredValueTree\n} from './util/ServerValues';\nimport {\n Tree,\n treeForEachAncestor,\n treeForEachChild,\n treeForEachDescendant,\n treeGetPath,\n treeGetValue,\n treeHasChildren,\n treeSetValue,\n treeSubTree\n} from './util/Tree';\nimport {\n beingCrawled,\n each,\n exceptionGuard,\n log,\n LUIDGenerator,\n warn\n} from './util/util';\nimport { isValidPriority, validateFirebaseData } from './util/validation';\nimport { Event } from './view/Event';\nimport {\n EventQueue,\n eventQueueQueueEvents,\n eventQueueRaiseEventsAtPath,\n eventQueueRaiseEventsForChangedPath\n} from './view/EventQueue';\nimport { EventRegistration, QueryContext } from './view/EventRegistration';\n\nconst INTERRUPT_REASON = 'repo_interrupt';\n\n/**\n * If a transaction does not succeed after 25 retries, we abort it. Among other\n * things this ensure that if there's ever a bug causing a mismatch between\n * client / server hashes for some data, we won't retry indefinitely.\n */\nconst MAX_TRANSACTION_RETRIES = 25;\n\nconst 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\ninterface Transaction {\n path: Path;\n update: (a: unknown) => unknown;\n onComplete: (\n error: Error | null,\n committed: boolean,\n node: Node | null\n ) => 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 * A connection to a single data repository.\n */\nexport class Repo {\n /** Key for uniquely identifying this repo, used in RepoManager */\n readonly key: string;\n\n dataUpdateCount = 0;\n infoSyncTree_: SyncTree;\n serverSyncTree_: SyncTree;\n\n stats_: StatsCollection;\n statsListener_: StatsListener | null = null;\n eventQueue_ = new EventQueue();\n nextWriteId_ = 1;\n server_: ServerActions;\n statsReporter_: StatsReporter;\n infoData_: SnapshotHolder;\n interceptServerDataCallback_: ((a: string, b: unknown) => void) | null = null;\n\n /** A list of data pieces and paths to be set when this client disconnects. */\n onDisconnect_: SparseSnapshotTree = newSparseSnapshotTree();\n\n /** Stores queues of outstanding transactions for Firebase locations. */\n transactionQueueTree_ = new Tree();\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 public forceRestClient_: boolean,\n public authTokenProvider_: AuthTokenProvider,\n public appCheckProvider_: AppCheckTokenProvider\n ) {\n // This key is intentionally not updated if RepoInfo is later changed or replaced\n this.key = this.repoInfo_.toURLString();\n }\n\n /**\n * @returns 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\nexport function repoStart(\n repo: Repo,\n appId: string,\n authOverride?: object\n): void {\n repo.stats_ = statsManagerGetCollection(repo.repoInfo_);\n\n if (repo.forceRestClient_ || beingCrawled()) {\n repo.server_ = new ReadonlyRestClient(\n repo.repoInfo_,\n (\n pathString: string,\n data: unknown,\n isMerge: boolean,\n tag: number | null\n ) => {\n repoOnDataUpdate(repo, pathString, data, isMerge, tag);\n },\n repo.authTokenProvider_,\n repo.appCheckProvider_\n );\n\n // Minor hack: Fire onConnect immediately, since there's no actual connection.\n setTimeout(() => repoOnConnectStatus(repo, /* connectStatus= */ true), 0);\n } else {\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 repo.persistentConnection_ = new PersistentConnection(\n repo.repoInfo_,\n appId,\n (\n pathString: string,\n data: unknown,\n isMerge: boolean,\n tag: number | null\n ) => {\n repoOnDataUpdate(repo, pathString, data, isMerge, tag);\n },\n (connectStatus: boolean) => {\n repoOnConnectStatus(repo, connectStatus);\n },\n (updates: object) => {\n repoOnServerInfoUpdate(repo, updates);\n },\n repo.authTokenProvider_,\n repo.appCheckProvider_,\n authOverride\n );\n\n repo.server_ = repo.persistentConnection_;\n }\n\n repo.authTokenProvider_.addTokenChangeListener(token => {\n repo.server_.refreshAuthToken(token);\n });\n\n repo.appCheckProvider_.addTokenChangeListener(result => {\n repo.server_.refreshAppCheckToken(result.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 repo.statsReporter_ = statsManagerGetOrCreateReporter(\n repo.repoInfo_,\n () => new StatsReporter(repo.stats_, repo.server_)\n );\n\n // Used for .info.\n repo.infoData_ = new SnapshotHolder();\n repo.infoSyncTree_ = new SyncTree({\n startListening: (query, tag, currentHashFn, onComplete) => {\n let infoEvents: Event[] = [];\n const node = repo.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 = syncTreeApplyServerOverwrite(\n repo.infoSyncTree_,\n query._path,\n node\n );\n setTimeout(() => {\n onComplete('ok');\n }, 0);\n }\n return infoEvents;\n },\n stopListening: () => {}\n });\n repoUpdateInfo(repo, 'connected', false);\n\n repo.serverSyncTree_ = new SyncTree({\n startListening: (query, tag, currentHashFn, onComplete) => {\n repo.server_.listen(query, currentHashFn, tag, (status, data) => {\n const events = onComplete(status, data);\n eventQueueRaiseEventsForChangedPath(\n repo.eventQueue_,\n query._path,\n events\n );\n });\n // No synchronous events for network-backed sync trees\n return [];\n },\n stopListening: (query, tag) => {\n repo.server_.unlisten(query, tag);\n }\n });\n}\n\n/**\n * @returns The time in milliseconds, taking the server offset into account if we have one.\n */\nexport function repoServerTime(repo: Repo): number {\n const offsetNode = repo.infoData_.getNode(new Path('.info/serverTimeOffset'));\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 */\nexport function repoGenerateServerValues(repo: Repo): Indexable {\n return generateWithValues({\n timestamp: repoServerTime(repo)\n });\n}\n\n/**\n * Called by realtime when we get new messages from the server.\n */\nfunction repoOnDataUpdate(\n repo: Repo,\n pathString: string,\n data: unknown,\n isMerge: boolean,\n tag: number | null\n): void {\n // For testing.\n repo.dataUpdateCount++;\n const path = new Path(pathString);\n data = repo.interceptServerDataCallback_\n ? repo.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 = syncTreeApplyTaggedQueryMerge(\n repo.serverSyncTree_,\n path,\n taggedChildren,\n tag\n );\n } else {\n const taggedSnap = nodeFromJSON(data);\n events = syncTreeApplyTaggedQueryOverwrite(\n repo.serverSyncTree_,\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 = syncTreeApplyServerMerge(\n repo.serverSyncTree_,\n path,\n changedChildren\n );\n } else {\n const snap = nodeFromJSON(data);\n events = syncTreeApplyServerOverwrite(repo.serverSyncTree_, 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 = repoRerunTransactions(repo, path);\n }\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, events);\n}\n\n// TODO: This should be @private but it's used by test_access.js and internal.js\nexport function repoInterceptServerData(\n repo: Repo,\n callback: ((a: string, b: unknown) => unknown) | null\n): void {\n repo.interceptServerDataCallback_ = callback;\n}\n\nfunction repoOnConnectStatus(repo: Repo, connectStatus: boolean): void {\n repoUpdateInfo(repo, 'connected', connectStatus);\n if (connectStatus === false) {\n repoRunOnDisconnectEvents(repo);\n }\n}\n\nfunction repoOnServerInfoUpdate(repo: Repo, updates: object): void {\n each(updates, (key: string, value: unknown) => {\n repoUpdateInfo(repo, key, value);\n });\n}\n\nfunction repoUpdateInfo(repo: Repo, pathString: string, value: unknown): void {\n const path = new Path('/.info/' + pathString);\n const newNode = nodeFromJSON(value);\n repo.infoData_.updateSnapshot(path, newNode);\n const events = syncTreeApplyServerOverwrite(\n repo.infoSyncTree_,\n path,\n newNode\n );\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\n}\n\nfunction repoGetNextWriteId(repo: Repo): number {\n return repo.nextWriteId_++;\n}\n\n/**\n * The purpose of `getValue` is to return the latest known value\n * satisfying `query`.\n *\n * This method will first check for in-memory cached values\n * belonging to active listeners. If they are found, such values\n * are considered to be the most up-to-date.\n *\n * If the client is not connected, this method will wait until the\n * repo has established a connection and then request the value for `query`.\n * If the client is not able to retrieve the query result for another reason,\n * it reports an error.\n *\n * @param query - The query to surface a value for.\n */\nexport function repoGetValue(\n repo: Repo,\n query: QueryContext,\n eventRegistration: ValueEventRegistration\n): Promise {\n // Only active queries are cached. There is no persisted cache.\n const cached = syncTreeGetServerValue(repo.serverSyncTree_, query);\n if (cached != null) {\n return Promise.resolve(cached);\n }\n return repo.server_.get(query).then(\n payload => {\n const node = nodeFromJSON(payload).withIndex(\n query._queryParams.getIndex()\n );\n /**\n * Below we simulate the actions of an `onlyOnce` `onValue()` event where:\n * Add an event registration,\n * Update data at the path,\n * Raise any events,\n * Cleanup the SyncTree\n */\n syncTreeAddEventRegistration(\n repo.serverSyncTree_,\n query,\n eventRegistration,\n true\n );\n let events: Event[];\n if (query._queryParams.loadsAllData()) {\n events = syncTreeApplyServerOverwrite(\n repo.serverSyncTree_,\n query._path,\n node\n );\n } else {\n const tag = syncTreeTagForQuery(repo.serverSyncTree_, query);\n events = syncTreeApplyTaggedQueryOverwrite(\n repo.serverSyncTree_,\n query._path,\n node,\n tag\n );\n }\n /*\n * We need to raise events in the scenario where `get()` is called at a parent path, and\n * while the `get()` is pending, `onValue` is called at a child location. While get() is waiting\n * for the data, `onValue` will register a new event. Then, get() will come back, and update the syncTree\n * and its corresponding serverCache, including the child location where `onValue` is called. Then,\n * `onValue` will receive the event from the server, but look at the syncTree and see that the data received\n * from the server is already at the SyncPoint, and so the `onValue` callback will never get fired.\n * Calling `eventQueueRaiseEventsForChangedPath()` is the correct way to propagate the events and\n * ensure the corresponding child events will get fired.\n */\n eventQueueRaiseEventsForChangedPath(\n repo.eventQueue_,\n query._path,\n events\n );\n syncTreeRemoveEventRegistration(\n repo.serverSyncTree_,\n query,\n eventRegistration,\n null,\n true\n );\n return node;\n },\n err => {\n repoLog(repo, 'get for query ' + stringify(query) + ' failed: ' + err);\n return Promise.reject(new Error(err as string));\n }\n );\n}\n\nexport function repoSetWithPriority(\n repo: Repo,\n path: Path,\n newVal: unknown,\n newPriority: number | string | null,\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n): void {\n repoLog(repo, '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 = repoGenerateServerValues(repo);\n const newNodeUnresolved = nodeFromJSON(newVal, newPriority);\n const existing = syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path);\n const newNode = resolveDeferredValueSnapshot(\n newNodeUnresolved,\n existing,\n serverValues\n );\n\n const writeId = repoGetNextWriteId(repo);\n const events = syncTreeApplyUserOverwrite(\n repo.serverSyncTree_,\n path,\n newNode,\n writeId,\n true\n );\n eventQueueQueueEvents(repo.eventQueue_, events);\n repo.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 = syncTreeAckUserWrite(\n repo.serverSyncTree_,\n writeId,\n !success\n );\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, clearEvents);\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\n }\n );\n const affectedPath = repoAbortTransactions(repo, path);\n repoRerunTransactions(repo, affectedPath);\n // We queued the events above, so just flush the queue here\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, []);\n}\n\nexport function repoUpdate(\n repo: Repo,\n path: Path,\n childrenToMerge: { [k: string]: unknown },\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n): void {\n repoLog(repo, '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 = repoGenerateServerValues(repo);\n const changedChildren: { [k: string]: Node } = {};\n each(childrenToMerge, (changedKey: string, changedValue: unknown) => {\n empty = false;\n changedChildren[changedKey] = resolveDeferredValueTree(\n pathChild(path, changedKey),\n nodeFromJSON(changedValue),\n repo.serverSyncTree_,\n serverValues\n );\n });\n\n if (!empty) {\n const writeId = repoGetNextWriteId(repo);\n const events = syncTreeApplyUserMerge(\n repo.serverSyncTree_,\n path,\n changedChildren,\n writeId\n );\n eventQueueQueueEvents(repo.eventQueue_, events);\n repo.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 = syncTreeAckUserWrite(\n repo.serverSyncTree_,\n writeId,\n !success\n );\n const affectedPath =\n clearEvents.length > 0 ? repoRerunTransactions(repo, path) : path;\n eventQueueRaiseEventsForChangedPath(\n repo.eventQueue_,\n affectedPath,\n clearEvents\n );\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\n }\n );\n\n each(childrenToMerge, (changedPath: string) => {\n const affectedPath = repoAbortTransactions(\n repo,\n pathChild(path, changedPath)\n );\n repoRerunTransactions(repo, affectedPath);\n });\n\n // We queued the events above, so just flush the queue here\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, []);\n } else {\n log(\"update() called with empty data. Don't do anything.\");\n repoCallOnCompleteCallback(repo, onComplete, 'ok', undefined);\n }\n}\n\n/**\n * Applies all of the changes stored up in the onDisconnect_ tree.\n */\nfunction repoRunOnDisconnectEvents(repo: Repo): void {\n repoLog(repo, 'onDisconnectEvents');\n\n const serverValues = repoGenerateServerValues(repo);\n const resolvedOnDisconnectTree = newSparseSnapshotTree();\n sparseSnapshotTreeForEachTree(\n repo.onDisconnect_,\n newEmptyPath(),\n (path, node) => {\n const resolved = resolveDeferredValueTree(\n path,\n node,\n repo.serverSyncTree_,\n serverValues\n );\n sparseSnapshotTreeRemember(resolvedOnDisconnectTree, path, resolved);\n }\n );\n let events: Event[] = [];\n\n sparseSnapshotTreeForEachTree(\n resolvedOnDisconnectTree,\n newEmptyPath(),\n (path, snap) => {\n events = events.concat(\n syncTreeApplyServerOverwrite(repo.serverSyncTree_, path, snap)\n );\n const affectedPath = repoAbortTransactions(repo, path);\n repoRerunTransactions(repo, affectedPath);\n }\n );\n\n repo.onDisconnect_ = newSparseSnapshotTree();\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, newEmptyPath(), events);\n}\n\nexport function repoOnDisconnectCancel(\n repo: Repo,\n path: Path,\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n): void {\n repo.server_.onDisconnectCancel(path.toString(), (status, errorReason) => {\n if (status === 'ok') {\n sparseSnapshotTreeForget(repo.onDisconnect_, path);\n }\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\n });\n}\n\nexport function repoOnDisconnectSet(\n repo: Repo,\n path: Path,\n value: unknown,\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n): void {\n const newNode = nodeFromJSON(value);\n repo.server_.onDisconnectPut(\n path.toString(),\n newNode.val(/*export=*/ true),\n (status, errorReason) => {\n if (status === 'ok') {\n sparseSnapshotTreeRemember(repo.onDisconnect_, path, newNode);\n }\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\n }\n );\n}\n\nexport function repoOnDisconnectSetWithPriority(\n repo: Repo,\n path: Path,\n value: unknown,\n priority: unknown,\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n): void {\n const newNode = nodeFromJSON(value, priority);\n repo.server_.onDisconnectPut(\n path.toString(),\n newNode.val(/*export=*/ true),\n (status, errorReason) => {\n if (status === 'ok') {\n sparseSnapshotTreeRemember(repo.onDisconnect_, path, newNode);\n }\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\n }\n );\n}\n\nexport function repoOnDisconnectUpdate(\n repo: Repo,\n path: Path,\n childrenToMerge: { [k: string]: unknown },\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n): void {\n if (isEmpty(childrenToMerge)) {\n log(\"onDisconnect().update() called with empty data. Don't do anything.\");\n repoCallOnCompleteCallback(repo, onComplete, 'ok', undefined);\n return;\n }\n\n repo.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 sparseSnapshotTreeRemember(\n repo.onDisconnect_,\n pathChild(path, childName),\n newChildNode\n );\n });\n }\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\n }\n );\n}\n\nexport function repoAddEventCallbackForQuery(\n repo: Repo,\n query: QueryContext,\n eventRegistration: EventRegistration\n): void {\n let events;\n if (pathGetFront(query._path) === '.info') {\n events = syncTreeAddEventRegistration(\n repo.infoSyncTree_,\n query,\n eventRegistration\n );\n } else {\n events = syncTreeAddEventRegistration(\n repo.serverSyncTree_,\n query,\n eventRegistration\n );\n }\n eventQueueRaiseEventsAtPath(repo.eventQueue_, query._path, events);\n}\n\nexport function repoRemoveEventCallbackForQuery(\n repo: Repo,\n query: QueryContext,\n eventRegistration: EventRegistration\n): void {\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 (pathGetFront(query._path) === '.info') {\n events = syncTreeRemoveEventRegistration(\n repo.infoSyncTree_,\n query,\n eventRegistration\n );\n } else {\n events = syncTreeRemoveEventRegistration(\n repo.serverSyncTree_,\n query,\n eventRegistration\n );\n }\n eventQueueRaiseEventsAtPath(repo.eventQueue_, query._path, events);\n}\n\nexport function repoInterrupt(repo: Repo): void {\n if (repo.persistentConnection_) {\n repo.persistentConnection_.interrupt(INTERRUPT_REASON);\n }\n}\n\nexport function repoResume(repo: Repo): void {\n if (repo.persistentConnection_) {\n repo.persistentConnection_.resume(INTERRUPT_REASON);\n }\n}\n\nexport function repoStats(repo: Repo, showDelta: boolean = false): void {\n if (typeof console === 'undefined') {\n return;\n }\n\n let stats: { [k: string]: unknown };\n if (showDelta) {\n if (!repo.statsListener_) {\n repo.statsListener_ = new StatsListener(repo.stats_);\n }\n stats = repo.statsListener_.get();\n } else {\n stats = repo.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\nexport function repoStatsIncrementCounter(repo: Repo, metric: string): void {\n repo.stats_.incrementCounter(metric);\n statsReporterIncludeStat(repo.statsReporter_, metric);\n}\n\nfunction repoLog(repo: Repo, ...varArgs: unknown[]): void {\n let prefix = '';\n if (repo.persistentConnection_) {\n prefix = repo.persistentConnection_.id + ':';\n }\n log(prefix, ...varArgs);\n}\n\nexport function repoCallOnCompleteCallback(\n repo: Repo,\n callback: ((status: Error | null, errorReason?: string) => void) | null,\n status: string,\n errorReason?: string | null\n): void {\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\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/**\n * Creates a new transaction, adds it to the transactions we're tracking, and\n * sends it to the server if possible.\n *\n * @param path - Path at which to do transaction.\n * @param transactionUpdate - Update callback.\n * @param onComplete - Completion callback.\n * @param unwatcher - Function that will be called when the transaction no longer\n * need data updates for `path`.\n * @param applyLocally - Whether or not to make intermediate results visible\n */\nexport function repoStartTransaction(\n repo: Repo,\n path: Path,\n transactionUpdate: (a: unknown) => unknown,\n onComplete: ((error: Error, committed: boolean, node: Node) => void) | null,\n unwatcher: () => void,\n applyLocally: boolean\n): void {\n repoLog(repo, 'transaction on ' + path);\n\n // Initialize transaction.\n const transaction: Transaction = {\n path,\n update: transactionUpdate,\n onComplete,\n // One of TransactionStatus enums.\n status: null,\n // Used when combining transactions at different locations to figure out\n // which one goes first.\n order: LUIDGenerator(),\n // Whether to raise local events for this transaction.\n applyLocally,\n // Count of how many times we've retried the transaction.\n retryCount: 0,\n // Function to call to clean up our .on() listener.\n unwatcher,\n // Stores why a transaction was aborted.\n abortReason: null,\n currentWriteId: null,\n currentInputSnapshot: null,\n currentOutputSnapshotRaw: null,\n currentOutputSnapshotResolved: null\n };\n\n // Run transaction initially.\n const currentState = repoGetLatestState(repo, path, undefined);\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 transaction.onComplete(null, false, transaction.currentInputSnapshot);\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 = treeSubTree(repo.transactionQueueTree_, path);\n const nodeQueue = treeGetValue(queueNode) || [];\n nodeQueue.push(transaction);\n\n treeSetValue(queueNode, nodeQueue);\n\n // Update visibleData and raise events\n // Note: We intentionally raise events after updating all of our\n // transaction state, since the user could start new transactions from the\n // 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 syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path) ||\n ChildrenNode.EMPTY_NODE;\n priorityForNode = currentNode.getPriority().val();\n }\n\n const serverValues = repoGenerateServerValues(repo);\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 = repoGetNextWriteId(repo);\n\n const events = syncTreeApplyUserOverwrite(\n repo.serverSyncTree_,\n path,\n newNode,\n transaction.currentWriteId,\n transaction.applyLocally\n );\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\n\n repoSendReadyTransactions(repo, repo.transactionQueueTree_);\n }\n}\n\n/**\n * @param excludeSets - A specific set to exclude\n */\nfunction repoGetLatestState(\n repo: Repo,\n path: Path,\n excludeSets?: number[]\n): Node {\n return (\n syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path, excludeSets) ||\n ChildrenNode.EMPTY_NODE\n );\n}\n\n/**\n * Sends any already-run transactions that aren't waiting for outstanding\n * transactions to complete.\n *\n * Externally it's called with no arguments, but it calls itself recursively\n * with a particular transactionQueueTree node to recurse through the tree.\n *\n * @param node - transactionQueueTree node to start at.\n */\nfunction repoSendReadyTransactions(\n repo: Repo,\n node: Tree = repo.transactionQueueTree_\n): void {\n // Before recursing, make sure any completed transactions are removed.\n if (!node) {\n repoPruneCompletedTransactionsBelowNode(repo, node);\n }\n\n if (treeGetValue(node)) {\n const queue = repoBuildTransactionQueue(repo, 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 repoSendTransactionQueue(repo, treeGetPath(node), queue);\n }\n } else if (treeHasChildren(node)) {\n treeForEachChild(node, childNode => {\n repoSendReadyTransactions(repo, childNode);\n });\n }\n}\n\n/**\n * Given a list of run transactions, send them to the server and then handle\n * the result (success or failure).\n *\n * @param path - The location of the queue.\n * @param queue - Queue of transactions under the specified location.\n */\nfunction repoSendTransactionQueue(\n repo: Repo,\n path: Path,\n queue: Transaction[]\n): void {\n // Mark transactions as sent and increment retry count!\n const setsToIgnore = queue.map(txn => {\n return txn.currentWriteId;\n });\n const latestState = repoGetLatestState(repo, 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 = newRelativePath(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 repo.server_.put(\n pathToSend.toString(),\n dataToSend,\n (status: string) => {\n repoLog(repo, '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\n // transaction state, since the callback could trigger more\n // 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 syncTreeAckUserWrite(repo.serverSyncTree_, queue[i].currentWriteId)\n );\n if (queue[i].onComplete) {\n // We never unset the output snapshot, and given that this\n // transaction is complete, it should be set\n callbacks.push(() =>\n queue[i].onComplete(\n null,\n true,\n queue[i].currentOutputSnapshotResolved\n )\n );\n }\n queue[i].unwatcher();\n }\n\n // Now remove the completed transactions.\n repoPruneCompletedTransactionsBelowNode(\n repo,\n treeSubTree(repo.transactionQueueTree_, path)\n );\n // There may be pending transactions that we can now send.\n repoSendReadyTransactions(repo, repo.transactionQueueTree_);\n\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, 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 repoRerunTransactions(repo, 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\n * is the path at which events need to be raised for.\n *\n * @param changedPath - The path in mergedData that changed.\n * @returns The rootmost path that was affected by rerunning transactions.\n */\nfunction repoRerunTransactions(repo: Repo, changedPath: Path): Path {\n const rootMostTransactionNode = repoGetAncestorTransactionNode(\n repo,\n changedPath\n );\n const path = treeGetPath(rootMostTransactionNode);\n\n const queue = repoBuildTransactionQueue(repo, rootMostTransactionNode);\n repoRerunTransactionQueue(repo, queue, path);\n\n return path;\n}\n\n/**\n * Does all the work of rerunning transactions (as well as cleans up aborted\n * transactions and whatnot).\n *\n * @param queue - The queue of transactions to run.\n * @param path - The path the queue is for.\n */\nfunction repoRerunTransactionQueue(\n repo: Repo,\n queue: Transaction[],\n path: Path\n): void {\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\n // transaction state, since the callback could trigger more transactions or\n // 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 = newRelativePath(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 syncTreeAckUserWrite(\n repo.serverSyncTree_,\n transaction.currentWriteId,\n true\n )\n );\n } else if (transaction.status === TransactionStatus.RUN) {\n if (transaction.retryCount >= MAX_TRANSACTION_RETRIES) {\n abortTransaction = true;\n abortReason = 'maxretry';\n events = events.concat(\n syncTreeAckUserWrite(\n repo.serverSyncTree_,\n transaction.currentWriteId,\n true\n )\n );\n } else {\n // This code reruns a transaction\n const currentNode = repoGetLatestState(\n repo,\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 = repoGenerateServerValues(repo);\n const newNodeResolved = resolveDeferredValueSnapshot(\n newDataNode,\n currentNode,\n serverValues\n );\n\n transaction.currentOutputSnapshotRaw = newDataNode;\n transaction.currentOutputSnapshotResolved = newNodeResolved;\n transaction.currentWriteId = repoGetNextWriteId(repo);\n // Mutates setsToIgnore in place\n setsToIgnore.splice(setsToIgnore.indexOf(oldWriteId), 1);\n events = events.concat(\n syncTreeApplyUserOverwrite(\n repo.serverSyncTree_,\n transaction.path,\n newNodeResolved,\n transaction.currentWriteId,\n transaction.applyLocally\n )\n );\n events = events.concat(\n syncTreeAckUserWrite(repo.serverSyncTree_, oldWriteId, true)\n );\n } else {\n abortTransaction = true;\n abortReason = 'nodata';\n events = events.concat(\n syncTreeAckUserWrite(\n repo.serverSyncTree_,\n transaction.currentWriteId,\n true\n )\n );\n }\n }\n }\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, 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\n // mergedData/visibleData (as it prunes data). So defer the unwatcher\n // 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 callbacks.push(() =>\n queue[i].onComplete(null, false, queue[i].currentInputSnapshot)\n );\n } else {\n callbacks.push(() =>\n queue[i].onComplete(new Error(abortReason), false, null)\n );\n }\n }\n }\n }\n\n // Clean up completed transactions.\n repoPruneCompletedTransactionsBelowNode(repo, repo.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 repoSendReadyTransactions(repo, repo.transactionQueueTree_);\n}\n\n/**\n * Returns the rootmost ancestor node of the specified path that has a pending\n * transaction on it, or just returns the node for the given path if there are\n * no pending transactions on any ancestor.\n *\n * @param path - The location to start at.\n * @returns The rootmost node with a transaction.\n */\nfunction repoGetAncestorTransactionNode(\n repo: Repo,\n path: Path\n): Tree {\n let front;\n\n // Start at the root and walk deeper into the tree towards path until we\n // find a node with pending transactions.\n let transactionNode = repo.transactionQueueTree_;\n front = pathGetFront(path);\n while (front !== null && treeGetValue(transactionNode) === undefined) {\n transactionNode = treeSubTree(transactionNode, front);\n path = pathPopFront(path);\n front = pathGetFront(path);\n }\n\n return transactionNode;\n}\n\n/**\n * Builds the queue of all transactions at or below the specified\n * transactionNode.\n *\n * @param transactionNode\n * @returns The generated queue.\n */\nfunction repoBuildTransactionQueue(\n repo: Repo,\n transactionNode: Tree\n): Transaction[] {\n // Walk any child transaction queues and aggregate them into a single queue.\n const transactionQueue: Transaction[] = [];\n repoAggregateTransactionQueuesForNode(\n repo,\n transactionNode,\n transactionQueue\n );\n\n // Sort them by the order the transactions were created.\n transactionQueue.sort((a, b) => a.order - b.order);\n\n return transactionQueue;\n}\n\nfunction repoAggregateTransactionQueuesForNode(\n repo: Repo,\n node: Tree,\n queue: Transaction[]\n): void {\n const nodeQueue = treeGetValue(node);\n if (nodeQueue) {\n for (let i = 0; i < nodeQueue.length; i++) {\n queue.push(nodeQueue[i]);\n }\n }\n\n treeForEachChild(node, child => {\n repoAggregateTransactionQueuesForNode(repo, child, queue);\n });\n}\n\n/**\n * Remove COMPLETED transactions at or below this node in the transactionQueueTree_.\n */\nfunction repoPruneCompletedTransactionsBelowNode(\n repo: Repo,\n node: Tree\n): void {\n const queue = treeGetValue(node);\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 treeSetValue(node, queue.length > 0 ? queue : undefined);\n }\n\n treeForEachChild(node, childNode => {\n repoPruneCompletedTransactionsBelowNode(repo, childNode);\n });\n}\n\n/**\n * Aborts all transactions on ancestors or descendants of the specified path.\n * Called when doing a set() or update() since we consider them incompatible\n * with transactions.\n *\n * @param path - Path for which we want to abort related transactions.\n */\nfunction repoAbortTransactions(repo: Repo, path: Path): Path {\n const affectedPath = treeGetPath(repoGetAncestorTransactionNode(repo, path));\n\n const transactionNode = treeSubTree(repo.transactionQueueTree_, path);\n\n treeForEachAncestor(transactionNode, (node: Tree) => {\n repoAbortTransactionsOnNode(repo, node);\n });\n\n repoAbortTransactionsOnNode(repo, transactionNode);\n\n treeForEachDescendant(transactionNode, (node: Tree) => {\n repoAbortTransactionsOnNode(repo, node);\n });\n\n return affectedPath;\n}\n\n/**\n * Abort transactions stored in this transaction queue node.\n *\n * @param node - Node to abort transactions for.\n */\nfunction repoAbortTransactionsOnNode(\n repo: Repo,\n node: Tree\n): void {\n const queue = treeGetValue(node);\n if (queue) {\n // Queue up the callbacks and fire them after cleaning up all of our\n // transaction state, since the callback could trigger more transactions\n // or sets.\n const callbacks = [];\n\n // Go through queue. Any already-sent transactions must be marked for\n // abort, while the unsent ones 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 syncTreeAckUserWrite(\n repo.serverSyncTree_,\n queue[i].currentWriteId,\n true\n )\n );\n if (queue[i].onComplete) {\n callbacks.push(\n queue[i].onComplete.bind(null, new Error('set'), false, null)\n );\n }\n }\n }\n if (lastSent === -1) {\n // We're not waiting for any sent transactions. We can clear the queue.\n treeSetValue(node, undefined);\n } else {\n // Remove the transactions we aborted.\n queue.length = lastSent + 1;\n }\n\n // Now fire the callbacks.\n eventQueueRaiseEventsForChangedPath(\n repo.eventQueue_,\n treeGetPath(node),\n events\n );\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 { RepoInfo } from '../../RepoInfo';\nimport { Path } from '../Path';\nimport { warnIfPageIsSecure, warn, fatal } from '../util';\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 * @returns 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\nexport const parseRepoInfo = function (\n dataURL: string,\n nodeAdmin: boolean\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 .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://.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 nodeAdmin,\n /*persistenceKey=*/ '',\n /*includeNamespaceInQueryParams=*/ namespace !== parsedUrl.subdomain\n ),\n path: new Path(parsedUrl.pathString)\n };\n};\n\nexport const parseDatabaseURL = function (dataURL: string): {\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 { assert } from '@firebase/util';\n\nimport {\n tryParseInt,\n MAX_NAME,\n MIN_NAME,\n INTEGER_32_MIN,\n INTEGER_32_MAX\n} from '../util/util';\n\n// Modeled after base64 web-safe chars, but ordered by ASCII.\nconst PUSH_CHARS =\n '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';\n\nconst MIN_PUSH_CHAR = '-';\n\nconst MAX_PUSH_CHAR = 'z';\n\nconst MAX_KEY_LEN = 786;\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 // 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\nexport const successor = function (key: string) {\n if (key === '' + INTEGER_32_MAX) {\n // See https://firebase.google.com/docs/database/web/lists-of-data#data-order\n return MIN_PUSH_CHAR;\n }\n const keyAsInt: number = tryParseInt(key);\n if (keyAsInt != null) {\n return '' + (keyAsInt + 1);\n }\n const next = new Array(key.length);\n\n for (let i = 0; i < next.length; i++) {\n next[i] = key.charAt(i);\n }\n\n if (next.length < MAX_KEY_LEN) {\n next.push(MIN_PUSH_CHAR);\n return next.join('');\n }\n\n let i = next.length - 1;\n\n while (i >= 0 && next[i] === MAX_PUSH_CHAR) {\n i--;\n }\n\n // `successor` was called on the largest possible key, so return the\n // MAX_NAME, which sorts larger than all keys.\n if (i === -1) {\n return MAX_NAME;\n }\n\n const source = next[i];\n const sourcePlusOne = PUSH_CHARS.charAt(PUSH_CHARS.indexOf(source) + 1);\n next[i] = sourcePlusOne;\n\n return next.slice(0, i + 1).join('');\n};\n\n// `key` is assumed to be non-empty.\nexport const predecessor = function (key: string) {\n if (key === '' + INTEGER_32_MIN) {\n return MIN_NAME;\n }\n const keyAsInt: number = tryParseInt(key);\n if (keyAsInt != null) {\n return '' + (keyAsInt - 1);\n }\n const next = new Array(key.length);\n for (let i = 0; i < next.length; i++) {\n next[i] = key.charAt(i);\n }\n // If `key` ends in `MIN_PUSH_CHAR`, the largest key lexicographically\n // smaller than `key`, is `key[0:key.length - 1]`. The next key smaller\n // than that, `predecessor(predecessor(key))`, is\n //\n // `key[0:key.length - 2] + (key[key.length - 1] - 1) + \\\n // { MAX_PUSH_CHAR repeated MAX_KEY_LEN - (key.length - 1) times }\n //\n // analogous to increment/decrement for base-10 integers.\n //\n // This works because lexigographic comparison works character-by-character,\n // using length as a tie-breaker if one key is a prefix of the other.\n if (next[next.length - 1] === MIN_PUSH_CHAR) {\n if (next.length === 1) {\n // See https://firebase.google.com/docs/database/web/lists-of-data#orderbykey\n return '' + INTEGER_32_MAX;\n }\n delete next[next.length - 1];\n return next.join('');\n }\n // Replace the last character with it's immediate predecessor, and\n // fill the suffix of the key with MAX_PUSH_CHAR. This is the\n // lexicographically largest possible key smaller than `key`.\n next[next.length - 1] = PUSH_CHARS.charAt(\n PUSH_CHARS.indexOf(next[next.length - 1]) - 1\n );\n return next.join('') + MAX_PUSH_CHAR.repeat(MAX_KEY_LEN - next.length);\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';\n\nimport { DataSnapshot as ExpDataSnapshot } from '../../api/Reference_impl';\nimport { Path } from '../util/Path';\n\nimport { EventRegistration } from './EventRegistration';\n\n/**\n * Encapsulates the data needed to raise an event\n * @interface\n */\nexport interface Event {\n getPath(): Path;\n\n getEventType(): string;\n\n getEventRunner(): () => void;\n\n toString(): string;\n}\n\n/**\n * One of the following strings: \"value\", \"child_added\", \"child_changed\",\n * \"child_removed\", or \"child_moved.\"\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 */\nexport class DataEvent implements Event {\n /**\n * @param eventType - One of: value, child_added, child_changed, child_moved, child_removed\n * @param eventRegistration - The function to call to with the event data. User provided\n * @param snapshot - The data backing the event\n * @param 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: ExpDataSnapshot,\n public prevName?: string | null\n ) {}\n getPath(): Path {\n const ref = this.snapshot.ref;\n if (this.eventType === 'value') {\n return ref._path;\n } else {\n return ref.parent._path;\n }\n }\n getEventType(): string {\n return this.eventType;\n }\n getEventRunner(): () => void {\n return this.eventRegistration.getEventRunner(this);\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 constructor(\n public eventRegistration: EventRegistration,\n public error: Error,\n public path: Path\n ) {}\n getPath(): Path {\n return this.path;\n }\n getEventType(): string {\n return 'cancel';\n }\n getEventRunner(): () => void {\n return this.eventRegistration.getEventRunner(this);\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 { assert } from '@firebase/util';\n\nimport { DataSnapshot } from '../../api/Reference_impl';\nimport { Repo } from '../Repo';\nimport { Path } from '../util/Path';\n\nimport { Change } from './Change';\nimport { CancelEvent, Event } from './Event';\nimport { QueryParams } from './QueryParams';\n\n/**\n * A user callback. Callbacks issues from the Legacy SDK maintain references\n * to the original user-issued callbacks, which allows equality\n * comparison by reference even though this callbacks are wrapped before\n * they can be passed to the firebase@exp SDK.\n *\n * @internal\n */\nexport interface UserCallback {\n (dataSnapshot: DataSnapshot, previousChildName?: string | null): unknown;\n userCallback?: unknown;\n context?: object | null;\n}\n\n/**\n * A wrapper class that converts events from the database@exp SDK to the legacy\n * Database SDK. Events are not converted directly as event registration relies\n * on reference comparison of the original user callback (see `matches()`) and\n * relies on equality of the legacy SDK's `context` object.\n */\nexport class CallbackContext {\n constructor(\n private readonly snapshotCallback: UserCallback,\n private readonly cancelCallback?: (error: Error) => unknown\n ) {}\n\n onValue(\n expDataSnapshot: DataSnapshot,\n previousChildName?: string | null\n ): void {\n this.snapshotCallback.call(null, expDataSnapshot, previousChildName);\n }\n\n onCancel(error: Error): void {\n assert(\n this.hasCancelCallback,\n 'Raising a cancel event on a listener with no cancel callback'\n );\n return this.cancelCallback.call(null, error);\n }\n\n get hasCancelCallback(): boolean {\n return !!this.cancelCallback;\n }\n\n matches(other: CallbackContext): boolean {\n return (\n this.snapshotCallback === other.snapshotCallback ||\n (this.snapshotCallback.userCallback !== undefined &&\n this.snapshotCallback.userCallback ===\n other.snapshotCallback.userCallback &&\n this.snapshotCallback.context === other.snapshotCallback.context)\n );\n }\n}\n\nexport interface QueryContext {\n readonly _queryIdentifier: string;\n readonly _queryObject: object;\n readonly _repo: Repo;\n readonly _path: Path;\n readonly _queryParams: QueryParams;\n}\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 */\n respondsTo(eventType: string): boolean;\n\n createEvent(change: Change, query: QueryContext): Event;\n\n /**\n * Given event data, return a function to trigger the user's callback\n */\n getEventRunner(eventData: Event): () => void;\n\n createCancelEvent(error: Error, path: Path): CancelEvent | null;\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 */\n hasAnyCallback(): boolean;\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Deferred } from '@firebase/util';\n\nimport {\n Repo,\n repoOnDisconnectCancel,\n repoOnDisconnectSet,\n repoOnDisconnectSetWithPriority,\n repoOnDisconnectUpdate\n} from '../core/Repo';\nimport { Path } from '../core/util/Path';\nimport {\n validateFirebaseDataArg,\n validateFirebaseMergeDataArg,\n validatePriority,\n validateWritablePath\n} from '../core/util/validation';\n\n/**\n * The `onDisconnect` class allows you to write or clear data when your client\n * disconnects from the Database server. These updates occur whether your\n * client disconnects cleanly or not, so you can rely on them to clean up data\n * even if a connection is dropped or a client crashes.\n *\n * The `onDisconnect` class is most commonly used to manage presence in\n * applications where it is useful to detect how many clients are connected and\n * when other clients disconnect. See\n * {@link https://firebase.google.com/docs/database/web/offline-capabilities | Enabling Offline Capabilities in JavaScript}\n * for more information.\n *\n * To avoid problems when a connection is dropped before the requests can be\n * transferred to the Database server, these functions should be called before\n * writing any data.\n *\n * Note that `onDisconnect` operations are only triggered once. If you want an\n * operation to occur each time a disconnect occurs, you'll need to re-establish\n * the `onDisconnect` operations each time you reconnect.\n */\nexport class OnDisconnect {\n /** @hideconstructor */\n constructor(private _repo: Repo, private _path: Path) {}\n\n /**\n * Cancels all previously queued `onDisconnect()` set or update events for this\n * location and all children.\n *\n * If a write has been queued for this location via a `set()` or `update()` at a\n * parent location, the write at this location will be canceled, though writes\n * to sibling locations will still occur.\n *\n * @returns Resolves when synchronization to the server is complete.\n */\n cancel(): Promise {\n const deferred = new Deferred();\n repoOnDisconnectCancel(\n this._repo,\n this._path,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n }\n\n /**\n * Ensures the data at this location is deleted when the client is disconnected\n * (due to closing the browser, navigating to a new page, or network issues).\n *\n * @returns Resolves when synchronization to the server is complete.\n */\n remove(): Promise {\n validateWritablePath('OnDisconnect.remove', this._path);\n const deferred = new Deferred();\n repoOnDisconnectSet(\n this._repo,\n this._path,\n null,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n }\n\n /**\n * Ensures the data at this location is set to the specified value when the\n * client is disconnected (due to closing the browser, navigating to a new page,\n * or network issues).\n *\n * `set()` is especially useful for implementing \"presence\" systems, where a\n * value should be changed or cleared when a user disconnects so that they\n * appear \"offline\" to other users. See\n * {@link https://firebase.google.com/docs/database/web/offline-capabilities | Enabling Offline Capabilities in JavaScript}\n * for more information.\n *\n * Note that `onDisconnect` operations are only triggered once. If you want an\n * operation to occur each time a disconnect occurs, you'll need to re-establish\n * the `onDisconnect` operations each time.\n *\n * @param value - The value to be written to this location on disconnect (can\n * be an object, array, string, number, boolean, or null).\n * @returns Resolves when synchronization to the Database is complete.\n */\n set(value: unknown): Promise {\n validateWritablePath('OnDisconnect.set', this._path);\n validateFirebaseDataArg('OnDisconnect.set', value, this._path, false);\n const deferred = new Deferred();\n repoOnDisconnectSet(\n this._repo,\n this._path,\n value,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n }\n\n /**\n * Ensures the data at this location is set to the specified value and priority\n * when the client is disconnected (due to closing the browser, navigating to a\n * new page, or network issues).\n *\n * @param value - The value to be written to this location on disconnect (can\n * be an object, array, string, number, boolean, or null).\n * @param priority - The priority to be written (string, number, or null).\n * @returns Resolves when synchronization to the Database is complete.\n */\n setWithPriority(\n value: unknown,\n priority: number | string | null\n ): Promise {\n validateWritablePath('OnDisconnect.setWithPriority', this._path);\n validateFirebaseDataArg(\n 'OnDisconnect.setWithPriority',\n value,\n this._path,\n false\n );\n validatePriority('OnDisconnect.setWithPriority', priority, false);\n\n const deferred = new Deferred();\n repoOnDisconnectSetWithPriority(\n this._repo,\n this._path,\n value,\n priority,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n }\n\n /**\n * Writes multiple values at this location when the client is disconnected (due\n * to closing the browser, navigating to a new page, or network issues).\n *\n * The `values` argument contains multiple property-value pairs that will be\n * written to the Database together. Each child property can either be a simple\n * property (for example, \"name\") or a relative path (for example, \"name/first\")\n * from the current location to the data to update.\n *\n * As opposed to the `set()` method, `update()` can be use to selectively update\n * only the referenced properties at the current location (instead of replacing\n * all the child properties at the current location).\n *\n * @param values - Object containing multiple values.\n * @returns Resolves when synchronization to the Database is complete.\n */\n update(values: object): Promise {\n validateWritablePath('OnDisconnect.update', this._path);\n validateFirebaseMergeDataArg(\n 'OnDisconnect.update',\n values,\n this._path,\n false\n );\n const deferred = new Deferred();\n repoOnDisconnectUpdate(\n this._repo,\n this._path,\n values as Record,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, getModularInstance, Deferred } from '@firebase/util';\n\nimport {\n Repo,\n repoAddEventCallbackForQuery,\n repoGetValue,\n repoRemoveEventCallbackForQuery,\n repoServerTime,\n repoSetWithPriority,\n repoUpdate\n} from '../core/Repo';\nimport { ChildrenNode } from '../core/snap/ChildrenNode';\nimport { Index } from '../core/snap/indexes/Index';\nimport { KEY_INDEX } from '../core/snap/indexes/KeyIndex';\nimport { PathIndex } from '../core/snap/indexes/PathIndex';\nimport { PRIORITY_INDEX } from '../core/snap/indexes/PriorityIndex';\nimport { VALUE_INDEX } from '../core/snap/indexes/ValueIndex';\nimport { Node } from '../core/snap/Node';\nimport { syncPointSetReferenceConstructor } from '../core/SyncPoint';\nimport { syncTreeSetReferenceConstructor } from '../core/SyncTree';\nimport { parseRepoInfo } from '../core/util/libs/parser';\nimport { nextPushId } from '../core/util/NextPushId';\nimport {\n Path,\n pathEquals,\n pathGetBack,\n pathGetFront,\n pathChild,\n pathParent,\n pathToUrlEncodedString,\n pathIsEmpty\n} from '../core/util/Path';\nimport {\n fatal,\n MAX_NAME,\n MIN_NAME,\n ObjectToUniqueKey\n} from '../core/util/util';\nimport {\n isValidPriority,\n validateFirebaseDataArg,\n validateFirebaseMergeDataArg,\n validateKey,\n validatePathString,\n validatePriority,\n validateRootPathString,\n validateUrl,\n validateWritablePath\n} from '../core/util/validation';\nimport { Change } from '../core/view/Change';\nimport { CancelEvent, DataEvent, EventType } from '../core/view/Event';\nimport {\n CallbackContext,\n EventRegistration,\n QueryContext,\n UserCallback\n} from '../core/view/EventRegistration';\nimport {\n QueryParams,\n queryParamsEndAt,\n queryParamsEndBefore,\n queryParamsGetQueryObject,\n queryParamsLimitToFirst,\n queryParamsLimitToLast,\n queryParamsOrderBy,\n queryParamsStartAfter,\n queryParamsStartAt\n} from '../core/view/QueryParams';\n\nimport { Database } from './Database';\nimport { OnDisconnect } from './OnDisconnect';\nimport {\n ListenOptions,\n Query as Query,\n DatabaseReference,\n Unsubscribe,\n ThenableReference\n} from './Reference';\n\n/**\n * @internal\n */\nexport class QueryImpl implements Query, QueryContext {\n /**\n * @hideconstructor\n */\n constructor(\n readonly _repo: Repo,\n readonly _path: Path,\n readonly _queryParams: QueryParams,\n readonly _orderByCalled: boolean\n ) {}\n\n get key(): string | null {\n if (pathIsEmpty(this._path)) {\n return null;\n } else {\n return pathGetBack(this._path);\n }\n }\n\n get ref(): DatabaseReference {\n return new ReferenceImpl(this._repo, this._path);\n }\n\n get _queryIdentifier(): string {\n const obj = queryParamsGetQueryObject(this._queryParams);\n const id = ObjectToUniqueKey(obj);\n return id === '{}' ? 'default' : id;\n }\n\n /**\n * An object representation of the query parameters used by this Query.\n */\n get _queryObject(): object {\n return queryParamsGetQueryObject(this._queryParams);\n }\n\n isEqual(other: QueryImpl | null): boolean {\n other = getModularInstance(other);\n if (!(other instanceof QueryImpl)) {\n return false;\n }\n\n const sameRepo = this._repo === other._repo;\n const samePath = pathEquals(this._path, other._path);\n const sameQueryIdentifier =\n this._queryIdentifier === other._queryIdentifier;\n\n return sameRepo && samePath && sameQueryIdentifier;\n }\n\n toJSON(): string {\n return this.toString();\n }\n\n toString(): string {\n return this._repo.toString() + pathToUrlEncodedString(this._path);\n }\n}\n\n/**\n * Validates that no other order by call has been made\n */\nfunction validateNoPreviousOrderByCall(query: QueryImpl, fnName: string) {\n if (query._orderByCalled === true) {\n throw new Error(fnName + \": You can't combine multiple orderBy calls.\");\n }\n}\n\n/**\n * Validates start/end values for queries.\n */\nfunction 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(), startAfter(), ' +\n 'endAt(), endBefore(), 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 'startAfter() endAt(), endBefore(), or equalTo() must be a valid priority value ' +\n '(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(), startAfter(), endAt(), endBefore(), or ' +\n 'equalTo() cannot be an object.'\n );\n }\n }\n}\n\n/**\n * Validates that limit* has been called with the correct combination of parameters\n */\nfunction 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(), startAfter(), endAt(), endBefore(), and limit(). Use \" +\n 'limitToFirst() or limitToLast() instead.'\n );\n }\n}\n/**\n * @internal\n */\nexport class ReferenceImpl extends QueryImpl implements DatabaseReference {\n /** @hideconstructor */\n constructor(repo: Repo, path: Path) {\n super(repo, path, new QueryParams(), false);\n }\n\n get parent(): ReferenceImpl | null {\n const parentPath = pathParent(this._path);\n return parentPath === null\n ? null\n : new ReferenceImpl(this._repo, parentPath);\n }\n\n get root(): ReferenceImpl {\n let ref: ReferenceImpl = this;\n while (ref.parent !== null) {\n ref = ref.parent;\n }\n return ref;\n }\n}\n\n/**\n * A `DataSnapshot` contains data from a Database location.\n *\n * Any time you read data from the Database, you receive the data as a\n * `DataSnapshot`. A `DataSnapshot` is passed to the event callbacks you attach\n * with `on()` or `once()`. You can extract the contents of the snapshot as a\n * JavaScript object by calling the `val()` method. Alternatively, you can\n * traverse into the snapshot by calling `child()` to return child snapshots\n * (which you could then call `val()` on).\n *\n * A `DataSnapshot` is an efficiently generated, immutable copy of the data at\n * a Database location. It cannot be modified and will never change (to modify\n * data, you always call the `set()` method on a `Reference` directly).\n */\nexport class DataSnapshot {\n /**\n * @param _node - A SnapshotNode to wrap.\n * @param ref - The location this snapshot came from.\n * @param _index - The iteration order for this snapshot\n * @hideconstructor\n */\n constructor(\n readonly _node: Node,\n /**\n * The location of this DataSnapshot.\n */\n readonly ref: DatabaseReference,\n readonly _index: Index\n ) {}\n\n /**\n * Gets the priority value of the data in this `DataSnapshot`.\n *\n * Applications need not use priority but can order collections by\n * ordinary properties (see\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data |Sorting and filtering data}\n * ).\n */\n get priority(): string | number | null {\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 * The key (last part of the path) of the location of this `DataSnapshot`.\n *\n * The last token in a Database location is considered its key. For example,\n * \"ada\" is the key for the /users/ada/ node. Accessing the key on any\n * `DataSnapshot` will return the key for the location that generated it.\n * However, accessing the key on the root URL of a Database will return\n * `null`.\n */\n get key(): string | null {\n return this.ref.key;\n }\n\n /** Returns the number of child properties of this `DataSnapshot`. */\n get size(): number {\n return this._node.numChildren();\n }\n\n /**\n * Gets another `DataSnapshot` for the location at the specified relative path.\n *\n * Passing a relative path to the `child()` method of a DataSnapshot returns\n * another `DataSnapshot` for the location at the specified relative path. The\n * relative path can either be a simple child name (for example, \"ada\") or a\n * deeper, slash-separated path (for example, \"ada/name/first\"). If the child\n * location has no data, an empty `DataSnapshot` (that is, a `DataSnapshot`\n * whose value is `null`) is returned.\n *\n * @param path - A relative path to the location of child data.\n */\n child(path: string): DataSnapshot {\n const childPath = new Path(path);\n const childRef = child(this.ref, path);\n return new DataSnapshot(\n this._node.getChild(childPath),\n childRef,\n PRIORITY_INDEX\n );\n }\n /**\n * Returns true if this `DataSnapshot` contains any data. It is slightly more\n * efficient than using `snapshot.val() !== null`.\n */\n exists(): boolean {\n return !this._node.isEmpty();\n }\n\n /**\n * Exports the entire contents of the DataSnapshot as a JavaScript object.\n *\n * The `exportVal()` method is similar to `val()`, except priority information\n * is included (if available), making it suitable for backing up your data.\n *\n * @returns The DataSnapshot's contents as a JavaScript value (Object,\n * Array, string, number, boolean, or `null`).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n exportVal(): any {\n return this._node.val(true);\n }\n\n /**\n * Enumerates the top-level children in the `DataSnapshot`.\n *\n * Because of the way JavaScript objects work, the ordering of data in the\n * JavaScript object returned by `val()` is not guaranteed to match the\n * ordering on the server nor the ordering of `onChildAdded()` events. That is\n * where `forEach()` comes in handy. It guarantees the children of a\n * `DataSnapshot` will be iterated in their query order.\n *\n * If no explicit `orderBy*()` method is used, results are returned\n * ordered by key (unless priorities are used, in which case, results are\n * returned by priority).\n *\n * @param action - A function that will be called for each child DataSnapshot.\n * The callback can return true to cancel further enumeration.\n * @returns true if enumeration was canceled due to your callback returning\n * true.\n */\n forEach(action: (child: DataSnapshot) => boolean | void): boolean {\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, child(this.ref, key), PRIORITY_INDEX)\n );\n });\n }\n\n /**\n * Returns true if the specified child path has (non-null) data.\n *\n * @param path - A relative path to the location of a potential child.\n * @returns `true` if data exists at the specified child path; else\n * `false`.\n */\n hasChild(path: string): boolean {\n const childPath = new Path(path);\n return !this._node.getChild(childPath).isEmpty();\n }\n\n /**\n * Returns whether or not the `DataSnapshot` has any non-`null` child\n * properties.\n *\n * You can use `hasChildren()` to determine if a `DataSnapshot` has any\n * children. If it does, you can enumerate them using `forEach()`. If it\n * doesn't, then either this snapshot contains a primitive value (which can be\n * retrieved with `val()`) or it is empty (in which case, `val()` will return\n * `null`).\n *\n * @returns true if this snapshot has any children; else false.\n */\n hasChildren(): boolean {\n if (this._node.isLeafNode()) {\n return false;\n } else {\n return !this._node.isEmpty();\n }\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n */\n toJSON(): object | null {\n return this.exportVal();\n }\n\n /**\n * Extracts a JavaScript value from a `DataSnapshot`.\n *\n * Depending on the data in a `DataSnapshot`, the `val()` method may return a\n * scalar type (string, number, or boolean), an array, or an object. It may\n * also return null, indicating that the `DataSnapshot` is empty (contains no\n * data).\n *\n * @returns The DataSnapshot's contents as a JavaScript value (Object,\n * Array, string, number, boolean, or `null`).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n val(): any {\n return this._node.val();\n }\n}\n\n/**\n *\n * Returns a `Reference` representing the location in the Database\n * corresponding to the provided path. If no path is provided, the `Reference`\n * will point to the root of the Database.\n *\n * @param db - The database instance to obtain a reference for.\n * @param path - Optional path representing the location the returned\n * `Reference` will point. If not provided, the returned `Reference` will\n * point to the root of the Database.\n * @returns If a path is provided, a `Reference`\n * pointing to the provided path. Otherwise, a `Reference` pointing to the\n * root of the Database.\n */\nexport function ref(db: Database, path?: string): DatabaseReference {\n db = getModularInstance(db);\n db._checkNotDeleted('ref');\n return path !== undefined ? child(db._root, path) : db._root;\n}\n\n/**\n * Returns a `Reference` representing the location in the Database\n * corresponding to the provided Firebase URL.\n *\n * An exception is thrown if the URL is not a valid Firebase Database URL or it\n * has a different domain than the current `Database` instance.\n *\n * Note that all query parameters (`orderBy`, `limitToLast`, etc.) are ignored\n * and are not applied to the returned `Reference`.\n *\n * @param db - The database instance to obtain a reference for.\n * @param url - The Firebase URL at which the returned `Reference` will\n * point.\n * @returns A `Reference` pointing to the provided\n * Firebase URL.\n */\nexport function refFromURL(db: Database, url: string): DatabaseReference {\n db = getModularInstance(db);\n db._checkNotDeleted('refFromURL');\n const parsedURL = parseRepoInfo(url, db._repo.repoInfo_.nodeAdmin);\n validateUrl('refFromURL', parsedURL);\n\n const repoInfo = parsedURL.repoInfo;\n if (\n !db._repo.repoInfo_.isCustomHost() &&\n repoInfo.host !== db._repo.repoInfo_.host\n ) {\n fatal(\n 'refFromURL' +\n ': Host name does not match the current database: ' +\n '(found ' +\n repoInfo.host +\n ' but expected ' +\n db._repo.repoInfo_.host +\n ')'\n );\n }\n\n return ref(db, parsedURL.path.toString());\n}\n/**\n * Gets a `Reference` for the location at the specified relative path.\n *\n * The relative path can either be a simple child name (for example, \"ada\") or\n * a deeper slash-separated path (for example, \"ada/name/first\").\n *\n * @param parent - The parent location.\n * @param path - A relative path from this location to the desired child\n * location.\n * @returns The specified child location.\n */\nexport function child(\n parent: DatabaseReference,\n path: string\n): DatabaseReference {\n parent = getModularInstance(parent);\n if (pathGetFront(parent._path) === null) {\n validateRootPathString('child', 'path', path, false);\n } else {\n validatePathString('child', 'path', path, false);\n }\n return new ReferenceImpl(parent._repo, pathChild(parent._path, path));\n}\n\n/**\n * Returns an `OnDisconnect` object - see\n * {@link https://firebase.google.com/docs/database/web/offline-capabilities | Enabling Offline Capabilities in JavaScript}\n * for more information on how to use it.\n *\n * @param ref - The reference to add OnDisconnect triggers for.\n */\nexport function onDisconnect(ref: DatabaseReference): OnDisconnect {\n ref = getModularInstance(ref) as ReferenceImpl;\n return new OnDisconnect(ref._repo, ref._path);\n}\n\nexport interface ThenableReferenceImpl\n extends ReferenceImpl,\n Pick, 'then' | 'catch'> {}\n\n/**\n * Generates a new child location using a unique key and returns its\n * `Reference`.\n *\n * This is the most common pattern for adding data to a collection of items.\n *\n * If you provide a value to `push()`, the value is written to the\n * generated location. If you don't pass a value, nothing is written to the\n * database and the child remains empty (but you can use the `Reference`\n * elsewhere).\n *\n * The unique keys generated by `push()` are ordered by the current time, so the\n * resulting list of items is chronologically sorted. The keys are also\n * designed to be unguessable (they contain 72 random bits of entropy).\n *\n * See {@link https://firebase.google.com/docs/database/web/lists-of-data#append_to_a_list_of_data | Append to a list of data}.\n * See {@link https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html | The 2^120 Ways to Ensure Unique Identifiers}.\n *\n * @param parent - The parent location.\n * @param value - Optional value to be written at the generated location.\n * @returns Combined `Promise` and `Reference`; resolves when write is complete,\n * but can be used immediately as the `Reference` to the child location.\n */\nexport function push(\n parent: DatabaseReference,\n value?: unknown\n): ThenableReference {\n parent = getModularInstance(parent);\n validateWritablePath('push', parent._path);\n validateFirebaseDataArg('push', value, parent._path, true);\n const now = repoServerTime(parent._repo);\n const name = nextPushId(now);\n\n // push() returns a ThennableReference whose promise is fulfilled with a\n // regular Reference. We use child() to create handles to two different\n // references. The first is turned into a ThennableReference below by adding\n // then() and catch() methods and is used as the return value of push(). The\n // second remains a regular Reference and is used as the fulfilled value of\n // the first ThennableReference.\n const thennablePushRef: Partial = child(\n parent,\n name\n ) as ReferenceImpl;\n const pushRef = child(parent, name) as ReferenceImpl;\n\n let promise: Promise;\n if (value != null) {\n promise = set(pushRef, value).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 return thennablePushRef as ThenableReferenceImpl;\n}\n\n/**\n * Removes the data at this Database location.\n *\n * Any data at child locations will also be deleted.\n *\n * The effect of the remove will be visible immediately and the corresponding\n * event 'value' will be triggered. Synchronization of the remove to the\n * Firebase servers will also be started, and the returned Promise will resolve\n * when complete. If provided, the onComplete callback will be called\n * asynchronously after synchronization has finished.\n *\n * @param ref - The location to remove.\n * @returns Resolves when remove on server is complete.\n */\nexport function remove(ref: DatabaseReference): Promise {\n validateWritablePath('remove', ref._path);\n return set(ref, null);\n}\n\n/**\n * Writes data to this Database location.\n *\n * This will overwrite any data at this location and all child locations.\n *\n * The effect of the write will be visible immediately, and the corresponding\n * events (\"value\", \"child_added\", etc.) will be triggered. Synchronization of\n * the data to the Firebase servers will also be started, and the returned\n * Promise will resolve when complete. If provided, the `onComplete` callback\n * will be called asynchronously after synchronization has finished.\n *\n * Passing `null` for the new value is equivalent to calling `remove()`; namely,\n * all data at this location and all child locations will be deleted.\n *\n * `set()` will remove any priority stored at this location, so if priority is\n * meant to be preserved, you need to use `setWithPriority()` instead.\n *\n * Note that modifying data with `set()` will cancel any pending transactions\n * at that location, so extreme care should be taken if mixing `set()` and\n * `transaction()` to modify the same data.\n *\n * A single `set()` will generate a single \"value\" event at the location where\n * the `set()` was performed.\n *\n * @param ref - The location to write to.\n * @param value - The value to be written (string, number, boolean, object,\n * array, or null).\n * @returns Resolves when write to server is complete.\n */\nexport function set(ref: DatabaseReference, value: unknown): Promise {\n ref = getModularInstance(ref);\n validateWritablePath('set', ref._path);\n validateFirebaseDataArg('set', value, ref._path, false);\n const deferred = new Deferred();\n repoSetWithPriority(\n ref._repo,\n ref._path,\n value,\n /*priority=*/ null,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n}\n\n/**\n * Sets a priority for the data at this Database location.\n *\n * Applications need not use priority but can order collections by\n * ordinary properties (see\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data | Sorting and filtering data}\n * ).\n *\n * @param ref - The location to write to.\n * @param priority - The priority to be written (string, number, or null).\n * @returns Resolves when write to server is complete.\n */\nexport function setPriority(\n ref: DatabaseReference,\n priority: string | number | null\n): Promise {\n ref = getModularInstance(ref);\n validateWritablePath('setPriority', ref._path);\n validatePriority('setPriority', priority, false);\n const deferred = new Deferred();\n repoSetWithPriority(\n ref._repo,\n pathChild(ref._path, '.priority'),\n priority,\n null,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n}\n\n/**\n * Writes data the Database location. Like `set()` but also specifies the\n * priority for that data.\n *\n * Applications need not use priority but can order collections by\n * ordinary properties (see\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data | Sorting and filtering data}\n * ).\n *\n * @param ref - The location to write to.\n * @param value - The value to be written (string, number, boolean, object,\n * array, or null).\n * @param priority - The priority to be written (string, number, or null).\n * @returns Resolves when write to server is complete.\n */\nexport function setWithPriority(\n ref: DatabaseReference,\n value: unknown,\n priority: string | number | null\n): Promise {\n validateWritablePath('setWithPriority', ref._path);\n validateFirebaseDataArg('setWithPriority', value, ref._path, false);\n validatePriority('setWithPriority', priority, false);\n if (ref.key === '.length' || ref.key === '.keys') {\n throw 'setWithPriority failed: ' + ref.key + ' is a read-only object.';\n }\n\n const deferred = new Deferred();\n repoSetWithPriority(\n ref._repo,\n ref._path,\n value,\n priority,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n}\n\n/**\n * Writes multiple values to the Database at once.\n *\n * The `values` argument contains multiple property-value pairs that will be\n * written to the Database together. Each child property can either be a simple\n * property (for example, \"name\") or a relative path (for example,\n * \"name/first\") from the current location to the data to update.\n *\n * As opposed to the `set()` method, `update()` can be use to selectively update\n * only the referenced properties at the current location (instead of replacing\n * all the child properties at the current location).\n *\n * The effect of the write will be visible immediately, and the corresponding\n * events ('value', 'child_added', etc.) will be triggered. Synchronization of\n * the data to the Firebase servers will also be started, and the returned\n * Promise will resolve when complete. If provided, the `onComplete` callback\n * will be called asynchronously after synchronization has finished.\n *\n * A single `update()` will generate a single \"value\" event at the location\n * where the `update()` was performed, regardless of how many children were\n * modified.\n *\n * Note that modifying data with `update()` will cancel any pending\n * transactions at that location, so extreme care should be taken if mixing\n * `update()` and `transaction()` to modify the same data.\n *\n * Passing `null` to `update()` will remove the data at this location.\n *\n * See\n * {@link https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html | Introducing multi-location updates and more}.\n *\n * @param ref - The location to write to.\n * @param values - Object containing multiple values.\n * @returns Resolves when update on server is complete.\n */\nexport function update(ref: DatabaseReference, values: object): Promise {\n validateFirebaseMergeDataArg('update', values, ref._path, false);\n const deferred = new Deferred();\n repoUpdate(\n ref._repo,\n ref._path,\n values as Record,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n}\n\n/**\n * Gets the most up-to-date result for this query.\n *\n * @param query - The query to run.\n * @returns A `Promise` which resolves to the resulting DataSnapshot if a value is\n * available, or rejects if the client is unable to return a value (e.g., if the\n * server is unreachable and there is nothing cached).\n */\nexport function get(query: Query): Promise {\n query = getModularInstance(query) as QueryImpl;\n const callbackContext = new CallbackContext(() => {});\n const container = new ValueEventRegistration(callbackContext);\n return repoGetValue(query._repo, query, container).then(node => {\n return new DataSnapshot(\n node,\n new ReferenceImpl(query._repo, query._path),\n query._queryParams.getIndex()\n );\n });\n}\n/**\n * Represents registration for 'value' events.\n */\nexport class ValueEventRegistration implements EventRegistration {\n constructor(private callbackContext: CallbackContext) {}\n\n respondsTo(eventType: string): boolean {\n return eventType === 'value';\n }\n\n createEvent(change: Change, query: QueryContext): DataEvent {\n const index = query._queryParams.getIndex();\n return new DataEvent(\n 'value',\n this,\n new DataSnapshot(\n change.snapshotNode,\n new ReferenceImpl(query._repo, query._path),\n index\n )\n );\n }\n\n getEventRunner(eventData: CancelEvent | DataEvent): () => void {\n if (eventData.getEventType() === 'cancel') {\n return () =>\n this.callbackContext.onCancel((eventData as CancelEvent).error);\n } else {\n return () =>\n this.callbackContext.onValue((eventData as DataEvent).snapshot, null);\n }\n }\n\n createCancelEvent(error: Error, path: Path): CancelEvent | null {\n if (this.callbackContext.hasCancelCallback) {\n return new CancelEvent(this, error, path);\n } else {\n return null;\n }\n }\n\n matches(other: EventRegistration): boolean {\n if (!(other instanceof ValueEventRegistration)) {\n return false;\n } else if (!other.callbackContext || !this.callbackContext) {\n // If no callback specified, we consider it to match any callback.\n return true;\n } else {\n return other.callbackContext.matches(this.callbackContext);\n }\n }\n\n hasAnyCallback(): boolean {\n return this.callbackContext !== null;\n }\n}\n\n/**\n * Represents the registration of a child_x event.\n */\nexport class ChildEventRegistration implements EventRegistration {\n constructor(\n private eventType: string,\n private callbackContext: CallbackContext | null\n ) {}\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 this.eventType === eventToCheck;\n }\n\n createCancelEvent(error: Error, path: Path): CancelEvent | null {\n if (this.callbackContext.hasCancelCallback) {\n return new CancelEvent(this, error, path);\n } else {\n return null;\n }\n }\n\n createEvent(change: Change, query: QueryContext): DataEvent {\n assert(change.childName != null, 'Child events should have a childName.');\n const childRef = child(\n new ReferenceImpl(query._repo, query._path),\n change.childName\n );\n const index = query._queryParams.getIndex();\n return new DataEvent(\n change.type as EventType,\n this,\n new DataSnapshot(change.snapshotNode, childRef, index),\n change.prevName\n );\n }\n\n getEventRunner(eventData: CancelEvent | DataEvent): () => void {\n if (eventData.getEventType() === 'cancel') {\n return () =>\n this.callbackContext.onCancel((eventData as CancelEvent).error);\n } else {\n return () =>\n this.callbackContext.onValue(\n (eventData as DataEvent).snapshot,\n (eventData as DataEvent).prevName\n );\n }\n }\n\n matches(other: EventRegistration): boolean {\n if (other instanceof ChildEventRegistration) {\n return (\n this.eventType === other.eventType &&\n (!this.callbackContext ||\n !other.callbackContext ||\n this.callbackContext.matches(other.callbackContext))\n );\n }\n\n return false;\n }\n\n hasAnyCallback(): boolean {\n return !!this.callbackContext;\n }\n}\n\nfunction addEventListener(\n query: Query,\n eventType: EventType,\n callback: UserCallback,\n cancelCallbackOrListenOptions?: ((error: Error) => unknown) | ListenOptions,\n options?: ListenOptions\n) {\n let cancelCallback: ((error: Error) => unknown) | undefined;\n if (typeof cancelCallbackOrListenOptions === 'object') {\n cancelCallback = undefined;\n options = cancelCallbackOrListenOptions;\n }\n if (typeof cancelCallbackOrListenOptions === 'function') {\n cancelCallback = cancelCallbackOrListenOptions;\n }\n\n if (options && options.onlyOnce) {\n const userCallback = callback;\n const onceCallback: UserCallback = (dataSnapshot, previousChildName) => {\n repoRemoveEventCallbackForQuery(query._repo, query, container);\n userCallback(dataSnapshot, previousChildName);\n };\n onceCallback.userCallback = callback.userCallback;\n onceCallback.context = callback.context;\n callback = onceCallback;\n }\n\n const callbackContext = new CallbackContext(\n callback,\n cancelCallback || undefined\n );\n const container =\n eventType === 'value'\n ? new ValueEventRegistration(callbackContext)\n : new ChildEventRegistration(eventType, callbackContext);\n repoAddEventCallbackForQuery(query._repo, query, container);\n return () => repoRemoveEventCallbackForQuery(query._repo, query, container);\n}\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onValue` event will trigger once with the initial data stored at this\n * location, and then trigger again each time the data changes. The\n * `DataSnapshot` passed to the callback will be for the location at which\n * `on()` was called. It won't trigger until the entire contents has been\n * synchronized. If the location has no data, it will be triggered with an empty\n * `DataSnapshot` (`val()` will return `null`).\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs. The\n * callback will be passed a DataSnapshot.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onValue(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n cancelCallback?: (error: Error) => unknown\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onValue` event will trigger once with the initial data stored at this\n * location, and then trigger again each time the data changes. The\n * `DataSnapshot` passed to the callback will be for the location at which\n * `on()` was called. It won't trigger until the entire contents has been\n * synchronized. If the location has no data, it will be triggered with an empty\n * `DataSnapshot` (`val()` will return `null`).\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs. The\n * callback will be passed a DataSnapshot.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onValue(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onValue` event will trigger once with the initial data stored at this\n * location, and then trigger again each time the data changes. The\n * `DataSnapshot` passed to the callback will be for the location at which\n * `on()` was called. It won't trigger until the entire contents has been\n * synchronized. If the location has no data, it will be triggered with an empty\n * `DataSnapshot` (`val()` will return `null`).\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs. The\n * callback will be passed a DataSnapshot.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onValue(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n cancelCallback: (error: Error) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\nexport function onValue(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n cancelCallbackOrListenOptions?: ((error: Error) => unknown) | ListenOptions,\n options?: ListenOptions\n): Unsubscribe {\n return addEventListener(\n query,\n 'value',\n callback,\n cancelCallbackOrListenOptions,\n options\n );\n}\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildAdded` event will be triggered once for each initial child at this\n * location, and it will be triggered again every time a new child is added. The\n * `DataSnapshot` passed into the callback will reflect the data for the\n * relevant child. For ordering purposes, it is passed a second argument which\n * is a string containing the key of the previous sibling child by sort order,\n * or `null` if it is the first child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildAdded(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName?: string | null\n ) => unknown,\n cancelCallback?: (error: Error) => unknown\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildAdded` event will be triggered once for each initial child at this\n * location, and it will be triggered again every time a new child is added. The\n * `DataSnapshot` passed into the callback will reflect the data for the\n * relevant child. For ordering purposes, it is passed a second argument which\n * is a string containing the key of the previous sibling child by sort order,\n * or `null` if it is the first child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildAdded(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildAdded` event will be triggered once for each initial child at this\n * location, and it will be triggered again every time a new child is added. The\n * `DataSnapshot` passed into the callback will reflect the data for the\n * relevant child. For ordering purposes, it is passed a second argument which\n * is a string containing the key of the previous sibling child by sort order,\n * or `null` if it is the first child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildAdded(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallback: (error: Error) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\nexport function onChildAdded(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallbackOrListenOptions?: ((error: Error) => unknown) | ListenOptions,\n options?: ListenOptions\n): Unsubscribe {\n return addEventListener(\n query,\n 'child_added',\n callback,\n cancelCallbackOrListenOptions,\n options\n );\n}\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildChanged` event will be triggered when the data stored in a child\n * (or any of its descendants) changes. Note that a single `child_changed` event\n * may represent multiple changes to the child. The `DataSnapshot` passed to the\n * callback will contain the new child contents. For ordering purposes, the\n * callback is also passed a second argument which is a string containing the\n * key of the previous sibling child by sort order, or `null` if it is the first\n * child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildChanged(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallback?: (error: Error) => unknown\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildChanged` event will be triggered when the data stored in a child\n * (or any of its descendants) changes. Note that a single `child_changed` event\n * may represent multiple changes to the child. The `DataSnapshot` passed to the\n * callback will contain the new child contents. For ordering purposes, the\n * callback is also passed a second argument which is a string containing the\n * key of the previous sibling child by sort order, or `null` if it is the first\n * child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildChanged(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildChanged` event will be triggered when the data stored in a child\n * (or any of its descendants) changes. Note that a single `child_changed` event\n * may represent multiple changes to the child. The `DataSnapshot` passed to the\n * callback will contain the new child contents. For ordering purposes, the\n * callback is also passed a second argument which is a string containing the\n * key of the previous sibling child by sort order, or `null` if it is the first\n * child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildChanged(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallback: (error: Error) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\nexport function onChildChanged(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallbackOrListenOptions?: ((error: Error) => unknown) | ListenOptions,\n options?: ListenOptions\n): Unsubscribe {\n return addEventListener(\n query,\n 'child_changed',\n callback,\n cancelCallbackOrListenOptions,\n options\n );\n}\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildMoved` event will be triggered when a child's sort order changes\n * such that its position relative to its siblings changes. The `DataSnapshot`\n * passed to the callback will be for the data of the child that has moved. It\n * is also passed a second argument which is a string containing the key of the\n * previous sibling child by sort order, or `null` if it is the first child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildMoved(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallback?: (error: Error) => unknown\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildMoved` event will be triggered when a child's sort order changes\n * such that its position relative to its siblings changes. The `DataSnapshot`\n * passed to the callback will be for the data of the child that has moved. It\n * is also passed a second argument which is a string containing the key of the\n * previous sibling child by sort order, or `null` if it is the first child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildMoved(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildMoved` event will be triggered when a child's sort order changes\n * such that its position relative to its siblings changes. The `DataSnapshot`\n * passed to the callback will be for the data of the child that has moved. It\n * is also passed a second argument which is a string containing the key of the\n * previous sibling child by sort order, or `null` if it is the first child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildMoved(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallback: (error: Error) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\nexport function onChildMoved(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallbackOrListenOptions?: ((error: Error) => unknown) | ListenOptions,\n options?: ListenOptions\n): Unsubscribe {\n return addEventListener(\n query,\n 'child_moved',\n callback,\n cancelCallbackOrListenOptions,\n options\n );\n}\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildRemoved` event will be triggered once every time a child is\n * removed. The `DataSnapshot` passed into the callback will be the old data for\n * the child that was removed. A child will get removed when either:\n *\n * - a client explicitly calls `remove()` on that child or one of its ancestors\n * - a client calls `set(null)` on that child or one of its ancestors\n * - that child has all of its children removed\n * - there is a query in effect which now filters out the child (because it's\n * sort order changed or the max limit was hit)\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildRemoved(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n cancelCallback?: (error: Error) => unknown\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildRemoved` event will be triggered once every time a child is\n * removed. The `DataSnapshot` passed into the callback will be the old data for\n * the child that was removed. A child will get removed when either:\n *\n * - a client explicitly calls `remove()` on that child or one of its ancestors\n * - a client calls `set(null)` on that child or one of its ancestors\n * - that child has all of its children removed\n * - there is a query in effect which now filters out the child (because it's\n * sort order changed or the max limit was hit)\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildRemoved(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildRemoved` event will be triggered once every time a child is\n * removed. The `DataSnapshot` passed into the callback will be the old data for\n * the child that was removed. A child will get removed when either:\n *\n * - a client explicitly calls `remove()` on that child or one of its ancestors\n * - a client calls `set(null)` on that child or one of its ancestors\n * - that child has all of its children removed\n * - there is a query in effect which now filters out the child (because it's\n * sort order changed or the max limit was hit)\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildRemoved(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n cancelCallback: (error: Error) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\nexport function onChildRemoved(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n cancelCallbackOrListenOptions?: ((error: Error) => unknown) | ListenOptions,\n options?: ListenOptions\n): Unsubscribe {\n return addEventListener(\n query,\n 'child_removed',\n callback,\n cancelCallbackOrListenOptions,\n options\n );\n}\n\nexport { EventType };\n\n/**\n * Detaches a callback previously attached with the corresponding `on*()` (`onValue`, `onChildAdded`) listener.\n * Note: This is not the recommended way to remove a listener. Instead, please use the returned callback function from\n * the respective `on*` callbacks.\n *\n * Detach a callback previously attached with `on*()`. Calling `off()` on a parent listener\n * will not automatically remove listeners registered on child nodes, `off()`\n * must also be called on any child listeners to remove the callback.\n *\n * If a callback is not specified, all callbacks for the specified eventType\n * will be removed. Similarly, if no eventType is specified, all callbacks\n * for the `Reference` will be removed.\n *\n * Individual listeners can also be removed by invoking their unsubscribe\n * callbacks.\n *\n * @param query - The query that the listener was registered with.\n * @param eventType - One of the following strings: \"value\", \"child_added\",\n * \"child_changed\", \"child_removed\", or \"child_moved.\" If omitted, all callbacks\n * for the `Reference` will be removed.\n * @param callback - The callback function that was passed to `on()` or\n * `undefined` to remove all callbacks.\n */\nexport function off(\n query: Query,\n eventType?: EventType,\n callback?: (\n snapshot: DataSnapshot,\n previousChildName?: string | null\n ) => unknown\n): void {\n let container: EventRegistration | null = null;\n const expCallback = callback ? new CallbackContext(callback) : null;\n if (eventType === 'value') {\n container = new ValueEventRegistration(expCallback);\n } else if (eventType) {\n container = new ChildEventRegistration(eventType, expCallback);\n }\n repoRemoveEventCallbackForQuery(query._repo, query, container);\n}\n\n/** Describes the different query constraints available in this SDK. */\nexport type QueryConstraintType =\n | 'endAt'\n | 'endBefore'\n | 'startAt'\n | 'startAfter'\n | 'limitToFirst'\n | 'limitToLast'\n | 'orderByChild'\n | 'orderByKey'\n | 'orderByPriority'\n | 'orderByValue'\n | 'equalTo';\n\n/**\n * A `QueryConstraint` is used to narrow the set of documents returned by a\n * Database query. `QueryConstraint`s are created by invoking {@link endAt},\n * {@link endBefore}, {@link startAt}, {@link startAfter}, {@link\n * limitToFirst}, {@link limitToLast}, {@link orderByChild},\n * {@link orderByChild}, {@link orderByKey} , {@link orderByPriority} ,\n * {@link orderByValue} or {@link equalTo} and\n * can then be passed to {@link query} to create a new query instance that\n * also contains this `QueryConstraint`.\n */\nexport abstract class QueryConstraint {\n /** The type of this query constraints */\n abstract readonly type: QueryConstraintType;\n\n /**\n * Takes the provided `Query` and returns a copy of the `Query` with this\n * `QueryConstraint` applied.\n */\n abstract _apply(query: QueryImpl): QueryImpl;\n}\n\nclass QueryEndAtConstraint extends QueryConstraint {\n readonly type: 'endAt';\n\n constructor(\n private readonly _value: number | string | boolean | null,\n private readonly _key?: string\n ) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n validateFirebaseDataArg('endAt', this._value, query._path, true);\n const newParams = queryParamsEndAt(\n query._queryParams,\n this._value,\n this._key\n );\n validateLimit(newParams);\n validateQueryEndpoints(newParams);\n if (query._queryParams.hasEnd()) {\n throw new Error(\n 'endAt: Starting point was already set (by another call to endAt, ' +\n 'endBefore or equalTo).'\n );\n }\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n query._orderByCalled\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` with the specified ending point.\n *\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\n * allows you to choose arbitrary starting and ending points for your queries.\n *\n * The ending point is inclusive, so children with exactly the specified value\n * will be included in the query. The optional key argument can be used to\n * further limit the range of the query. If it is specified, then children that\n * have exactly the specified value must also have a key name less than or equal\n * to the specified key.\n *\n * You can read more about `endAt()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\n *\n * @param value - The value to end at. The argument type depends on which\n * `orderBy*()` function was used in this query. Specify a value that matches\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\n * value must be a string.\n * @param key - The child key to end at, among the children with the previously\n * specified priority. This argument is only allowed if ordering by child,\n * value, or priority.\n */\nexport function endAt(\n value: number | string | boolean | null,\n key?: string\n): QueryConstraint {\n validateKey('endAt', 'key', key, true);\n return new QueryEndAtConstraint(value, key);\n}\n\nclass QueryEndBeforeConstraint extends QueryConstraint {\n readonly type: 'endBefore';\n\n constructor(\n private readonly _value: number | string | boolean | null,\n private readonly _key?: string\n ) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n validateFirebaseDataArg('endBefore', this._value, query._path, false);\n const newParams = queryParamsEndBefore(\n query._queryParams,\n this._value,\n this._key\n );\n validateLimit(newParams);\n validateQueryEndpoints(newParams);\n if (query._queryParams.hasEnd()) {\n throw new Error(\n 'endBefore: Starting point was already set (by another call to endAt, ' +\n 'endBefore or equalTo).'\n );\n }\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n query._orderByCalled\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` with the specified ending point (exclusive).\n *\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\n * allows you to choose arbitrary starting and ending points for your queries.\n *\n * The ending point is exclusive. If only a value is provided, children\n * with a value less than the specified value will be included in the query.\n * If a key is specified, then children must have a value less than or equal\n * to the specified value and a key name less than the specified key.\n *\n * @param value - The value to end before. The argument type depends on which\n * `orderBy*()` function was used in this query. Specify a value that matches\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\n * value must be a string.\n * @param key - The child key to end before, among the children with the\n * previously specified priority. This argument is only allowed if ordering by\n * child, value, or priority.\n */\nexport function endBefore(\n value: number | string | boolean | null,\n key?: string\n): QueryConstraint {\n validateKey('endBefore', 'key', key, true);\n return new QueryEndBeforeConstraint(value, key);\n}\n\nclass QueryStartAtConstraint extends QueryConstraint {\n readonly type: 'startAt';\n\n constructor(\n private readonly _value: number | string | boolean | null,\n private readonly _key?: string\n ) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n validateFirebaseDataArg('startAt', this._value, query._path, true);\n const newParams = queryParamsStartAt(\n query._queryParams,\n this._value,\n this._key\n );\n validateLimit(newParams);\n validateQueryEndpoints(newParams);\n if (query._queryParams.hasStart()) {\n throw new Error(\n 'startAt: Starting point was already set (by another call to startAt, ' +\n 'startBefore or equalTo).'\n );\n }\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n query._orderByCalled\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` with the specified starting point.\n *\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\n * allows you to choose arbitrary starting and ending points for your queries.\n *\n * The starting point is inclusive, so children with exactly the specified value\n * will be included in the query. The optional key argument can be used to\n * further limit the range of the query. If it is specified, then children that\n * have exactly the specified value must also have a key name greater than or\n * equal to the specified key.\n *\n * You can read more about `startAt()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\n *\n * @param value - The value to start at. The argument type depends on which\n * `orderBy*()` function was used in this query. Specify a value that matches\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\n * value must be a string.\n * @param key - The child key to start at. This argument is only allowed if\n * ordering by child, value, or priority.\n */\nexport function startAt(\n value: number | string | boolean | null = null,\n key?: string\n): QueryConstraint {\n validateKey('startAt', 'key', key, true);\n return new QueryStartAtConstraint(value, key);\n}\n\nclass QueryStartAfterConstraint extends QueryConstraint {\n readonly type: 'startAfter';\n\n constructor(\n private readonly _value: number | string | boolean | null,\n private readonly _key?: string\n ) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n validateFirebaseDataArg('startAfter', this._value, query._path, false);\n const newParams = queryParamsStartAfter(\n query._queryParams,\n this._value,\n this._key\n );\n validateLimit(newParams);\n validateQueryEndpoints(newParams);\n if (query._queryParams.hasStart()) {\n throw new Error(\n 'startAfter: Starting point was already set (by another call to startAt, ' +\n 'startAfter, or equalTo).'\n );\n }\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n query._orderByCalled\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` with the specified starting point (exclusive).\n *\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\n * allows you to choose arbitrary starting and ending points for your queries.\n *\n * The starting point is exclusive. If only a value is provided, children\n * with a value greater than the specified value will be included in the query.\n * If a key is specified, then children must have a value greater than or equal\n * to the specified value and a a key name greater than the specified key.\n *\n * @param value - The value to start after. The argument type depends on which\n * `orderBy*()` function was used in this query. Specify a value that matches\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\n * value must be a string.\n * @param key - The child key to start after. This argument is only allowed if\n * ordering by child, value, or priority.\n */\nexport function startAfter(\n value: number | string | boolean | null,\n key?: string\n): QueryConstraint {\n validateKey('startAfter', 'key', key, true);\n return new QueryStartAfterConstraint(value, key);\n}\n\nclass QueryLimitToFirstConstraint extends QueryConstraint {\n readonly type: 'limitToFirst';\n\n constructor(private readonly _limit: number) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n if (query._queryParams.hasLimit()) {\n throw new Error(\n 'limitToFirst: Limit was already set (by another call to limitToFirst ' +\n 'or limitToLast).'\n );\n }\n return new QueryImpl(\n query._repo,\n query._path,\n queryParamsLimitToFirst(query._queryParams, this._limit),\n query._orderByCalled\n );\n }\n}\n\n/**\n * Creates a new `QueryConstraint` that if limited to the first specific number\n * of children.\n *\n * The `limitToFirst()` method is used to set a maximum number of children to be\n * synced for a given callback. If we set a limit of 100, we will initially only\n * receive up to 100 `child_added` events. If we have fewer than 100 messages\n * stored in our Database, a `child_added` event will fire for each message.\n * However, if we have over 100 messages, we will only receive a `child_added`\n * event for the first 100 ordered messages. As items change, we will receive\n * `child_removed` events for each item that drops out of the active list so\n * that the total number stays at 100.\n *\n * You can read more about `limitToFirst()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\n *\n * @param limit - The maximum number of nodes to include in this query.\n */\nexport function limitToFirst(limit: number): QueryConstraint {\n if (typeof limit !== 'number' || Math.floor(limit) !== limit || limit <= 0) {\n throw new Error('limitToFirst: First argument must be a positive integer.');\n }\n return new QueryLimitToFirstConstraint(limit);\n}\n\nclass QueryLimitToLastConstraint extends QueryConstraint {\n readonly type: 'limitToLast';\n\n constructor(private readonly _limit: number) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n if (query._queryParams.hasLimit()) {\n throw new Error(\n 'limitToLast: Limit was already set (by another call to limitToFirst ' +\n 'or limitToLast).'\n );\n }\n return new QueryImpl(\n query._repo,\n query._path,\n queryParamsLimitToLast(query._queryParams, this._limit),\n query._orderByCalled\n );\n }\n}\n\n/**\n * Creates a new `QueryConstraint` that is limited to return only the last\n * specified number of children.\n *\n * The `limitToLast()` method is used to set a maximum number of children to be\n * synced for a given callback. If we set a limit of 100, we will initially only\n * receive up to 100 `child_added` events. If we have fewer than 100 messages\n * stored in our Database, a `child_added` event will fire for each message.\n * However, if we have over 100 messages, we will only receive a `child_added`\n * event for the last 100 ordered messages. As items change, we will receive\n * `child_removed` events for each item that drops out of the active list so\n * that the total number stays at 100.\n *\n * You can read more about `limitToLast()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\n *\n * @param limit - The maximum number of nodes to include in this query.\n */\nexport function limitToLast(limit: number): QueryConstraint {\n if (typeof limit !== 'number' || Math.floor(limit) !== limit || limit <= 0) {\n throw new Error('limitToLast: First argument must be a positive integer.');\n }\n\n return new QueryLimitToLastConstraint(limit);\n}\n\nclass QueryOrderByChildConstraint extends QueryConstraint {\n readonly type: 'orderByChild';\n\n constructor(private readonly _path: string) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n validateNoPreviousOrderByCall(query, 'orderByChild');\n const parsedPath = new Path(this._path);\n if (pathIsEmpty(parsedPath)) {\n throw new Error(\n 'orderByChild: cannot pass in empty path. Use orderByValue() instead.'\n );\n }\n const index = new PathIndex(parsedPath);\n const newParams = queryParamsOrderBy(query._queryParams, index);\n validateQueryEndpoints(newParams);\n\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n /*orderByCalled=*/ true\n );\n }\n}\n\n/**\n * Creates a new `QueryConstraint` that orders by the specified child key.\n *\n * Queries can only order by one key at a time. Calling `orderByChild()`\n * multiple times on the same query is an error.\n *\n * Firebase queries allow you to order your data by any child key on the fly.\n * However, if you know in advance what your indexes will be, you can define\n * them via the .indexOn rule in your Security Rules for better performance. See\n * the{@link https://firebase.google.com/docs/database/security/indexing-data}\n * rule for more information.\n *\n * You can read more about `orderByChild()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\n *\n * @param path - The path to order by.\n */\nexport function orderByChild(path: string): QueryConstraint {\n if (path === '$key') {\n throw new Error(\n 'orderByChild: \"$key\" is invalid. Use orderByKey() instead.'\n );\n } else if (path === '$priority') {\n throw new Error(\n 'orderByChild: \"$priority\" is invalid. Use orderByPriority() instead.'\n );\n } else if (path === '$value') {\n throw new Error(\n 'orderByChild: \"$value\" is invalid. Use orderByValue() instead.'\n );\n }\n validatePathString('orderByChild', 'path', path, false);\n return new QueryOrderByChildConstraint(path);\n}\n\nclass QueryOrderByKeyConstraint extends QueryConstraint {\n readonly type: 'orderByKey';\n\n _apply(query: QueryImpl): QueryImpl {\n validateNoPreviousOrderByCall(query, 'orderByKey');\n const newParams = queryParamsOrderBy(query._queryParams, KEY_INDEX);\n validateQueryEndpoints(newParams);\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n /*orderByCalled=*/ true\n );\n }\n}\n\n/**\n * Creates a new `QueryConstraint` that orders by the key.\n *\n * Sorts the results of a query by their (ascending) key values.\n *\n * You can read more about `orderByKey()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\n */\nexport function orderByKey(): QueryConstraint {\n return new QueryOrderByKeyConstraint();\n}\n\nclass QueryOrderByPriorityConstraint extends QueryConstraint {\n readonly type: 'orderByPriority';\n\n _apply(query: QueryImpl): QueryImpl {\n validateNoPreviousOrderByCall(query, 'orderByPriority');\n const newParams = queryParamsOrderBy(query._queryParams, PRIORITY_INDEX);\n validateQueryEndpoints(newParams);\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n /*orderByCalled=*/ true\n );\n }\n}\n\n/**\n * Creates a new `QueryConstraint` that orders by priority.\n *\n * Applications need not use priority but can order collections by\n * ordinary properties (see\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}\n * for alternatives to priority.\n */\nexport function orderByPriority(): QueryConstraint {\n return new QueryOrderByPriorityConstraint();\n}\n\nclass QueryOrderByValueConstraint extends QueryConstraint {\n readonly type: 'orderByValue';\n\n _apply(query: QueryImpl): QueryImpl {\n validateNoPreviousOrderByCall(query, 'orderByValue');\n const newParams = queryParamsOrderBy(query._queryParams, VALUE_INDEX);\n validateQueryEndpoints(newParams);\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n /*orderByCalled=*/ true\n );\n }\n}\n\n/**\n * Creates a new `QueryConstraint` that orders by value.\n *\n * If the children of a query are all scalar values (string, number, or\n * boolean), you can order the results by their (ascending) values.\n *\n * You can read more about `orderByValue()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\n */\nexport function orderByValue(): QueryConstraint {\n return new QueryOrderByValueConstraint();\n}\n\nclass QueryEqualToValueConstraint extends QueryConstraint {\n readonly type: 'equalTo';\n\n constructor(\n private readonly _value: number | string | boolean | null,\n private readonly _key?: string\n ) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n validateFirebaseDataArg('equalTo', this._value, query._path, false);\n if (query._queryParams.hasStart()) {\n throw new Error(\n 'equalTo: Starting point was already set (by another call to startAt/startAfter or ' +\n 'equalTo).'\n );\n }\n if (query._queryParams.hasEnd()) {\n throw new Error(\n 'equalTo: Ending point was already set (by another call to endAt/endBefore or ' +\n 'equalTo).'\n );\n }\n return new QueryEndAtConstraint(this._value, this._key)._apply(\n new QueryStartAtConstraint(this._value, this._key)._apply(query)\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` that includes children that match the specified\n * value.\n *\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\n * allows you to choose arbitrary starting and ending points for your queries.\n *\n * The optional key argument can be used to further limit the range of the\n * query. If it is specified, then children that have exactly the specified\n * value must also have exactly the specified key as their key name. This can be\n * used to filter result sets with many matches for the same value.\n *\n * You can read more about `equalTo()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\n *\n * @param value - The value to match for. The argument type depends on which\n * `orderBy*()` function was used in this query. Specify a value that matches\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\n * value must be a string.\n * @param key - The child key to start at, among the children with the\n * previously specified priority. This argument is only allowed if ordering by\n * child, value, or priority.\n */\nexport function equalTo(\n value: number | string | boolean | null,\n key?: string\n): QueryConstraint {\n validateKey('equalTo', 'key', key, true);\n return new QueryEqualToValueConstraint(value, key);\n}\n\n/**\n * Creates a new immutable instance of `Query` that is extended to also include\n * additional query constraints.\n *\n * @param query - The Query instance to use as a base for the new constraints.\n * @param queryConstraints - The list of `QueryConstraint`s to apply.\n * @throws if any of the provided query constraints cannot be combined with the\n * existing or new constraints.\n */\nexport function query(\n query: Query,\n ...queryConstraints: QueryConstraint[]\n): Query {\n let queryImpl = getModularInstance(query) as QueryImpl;\n for (const constraint of queryConstraints) {\n queryImpl = constraint._apply(queryImpl);\n }\n return queryImpl;\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 */\nsyncPointSetReferenceConstructor(ReferenceImpl);\nsyncTreeSetReferenceConstructor(ReferenceImpl);\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n _FirebaseService,\n _getProvider,\n FirebaseApp,\n getApp\n} from '@firebase/app';\nimport { AppCheckInternalComponentName } from '@firebase/app-check-interop-types';\nimport { FirebaseAuthInternalName } from '@firebase/auth-interop-types';\nimport { Provider } from '@firebase/component';\nimport {\n getModularInstance,\n createMockUserToken,\n EmulatorMockTokenOptions,\n getDefaultEmulatorHostnameAndPort\n} from '@firebase/util';\n\nimport { AppCheckTokenProvider } from '../core/AppCheckTokenProvider';\nimport {\n AuthTokenProvider,\n EmulatorTokenProvider,\n FirebaseAuthTokenProvider\n} from '../core/AuthTokenProvider';\nimport { Repo, repoInterrupt, repoResume, repoStart } from '../core/Repo';\nimport { RepoInfo } from '../core/RepoInfo';\nimport { parseRepoInfo } from '../core/util/libs/parser';\nimport { newEmptyPath, pathIsEmpty } from '../core/util/Path';\nimport {\n warn,\n fatal,\n log,\n enableLogging as enableLoggingImpl\n} from '../core/util/util';\nimport { validateUrl } from '../core/util/validation';\nimport { BrowserPollConnection } from '../realtime/BrowserPollConnection';\nimport { TransportManager } from '../realtime/TransportManager';\nimport { WebSocketConnection } from '../realtime/WebSocketConnection';\n\nimport { ReferenceImpl } from './Reference_impl';\n\nexport { EmulatorMockTokenOptions } from '@firebase/util';\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\n/**\n * Creates and caches `Repo` instances.\n */\nconst repos: {\n [appName: string]: {\n [dbUrl: string]: Repo;\n };\n} = {};\n\n/**\n * If true, any new `Repo` will be created to use `ReadonlyRestClient` (for testing purposes).\n */\nlet useRestClient = false;\n\n/**\n * Update an existing `Repo` in place to point to a new host/port.\n */\nfunction repoManagerApplyEmulatorSettings(\n repo: Repo,\n host: string,\n port: number,\n tokenProvider?: AuthTokenProvider\n): void {\n repo.repoInfo_ = new RepoInfo(\n `${host}:${port}`,\n /* secure= */ false,\n repo.repoInfo_.namespace,\n repo.repoInfo_.webSocketOnly,\n repo.repoInfo_.nodeAdmin,\n repo.repoInfo_.persistenceKey,\n repo.repoInfo_.includeNamespaceInQueryParams\n );\n\n if (tokenProvider) {\n repo.authTokenProvider_ = tokenProvider;\n }\n}\n\n/**\n * This function should only ever be called to CREATE a new database instance.\n * @internal\n */\nexport function repoManagerDatabaseFromApp(\n app: FirebaseApp,\n authProvider: Provider,\n appCheckProvider?: Provider,\n url?: string,\n nodeAdmin?: boolean\n): Database {\n let dbUrl: string | undefined = url || app.options.databaseURL;\n if (dbUrl === undefined) {\n if (!app.options.projectId) {\n fatal(\n \"Can't determine Firebase Database URL. Be sure to include \" +\n ' a Project ID when calling firebase.initializeApp().'\n );\n }\n\n log('Using default host for project ', app.options.projectId);\n dbUrl = `${app.options.projectId}-default-rtdb.firebaseio.com`;\n }\n\n let parsedUrl = parseRepoInfo(dbUrl, nodeAdmin);\n let repoInfo = parsedUrl.repoInfo;\n\n let isEmulator: boolean;\n\n let dbEmulatorHost: string | undefined = undefined;\n if (typeof process !== 'undefined' && process.env) {\n dbEmulatorHost = process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR];\n }\n\n if (dbEmulatorHost) {\n isEmulator = true;\n dbUrl = `http://${dbEmulatorHost}?ns=${repoInfo.namespace}`;\n parsedUrl = parseRepoInfo(dbUrl, nodeAdmin);\n repoInfo = parsedUrl.repoInfo;\n } else {\n isEmulator = !parsedUrl.repoInfo.secure;\n }\n\n const authTokenProvider =\n nodeAdmin && isEmulator\n ? new EmulatorTokenProvider(EmulatorTokenProvider.OWNER)\n : new FirebaseAuthTokenProvider(app.name, app.options, authProvider);\n\n validateUrl('Invalid Firebase Database URL', parsedUrl);\n if (!pathIsEmpty(parsedUrl.path)) {\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 = repoManagerCreateRepo(\n repoInfo,\n app,\n authTokenProvider,\n new AppCheckTokenProvider(app.name, appCheckProvider)\n );\n return new Database(repo, app);\n}\n\n/**\n * Remove the repo and make sure it is disconnected.\n *\n */\nfunction repoManagerDeleteRepo(repo: Repo, appName: string): void {\n const appRepos = repos[appName];\n // This should never happen...\n if (!appRepos || appRepos[repo.key] !== repo) {\n fatal(`Database ${appName}(${repo.repoInfo_}) has already been deleted.`);\n }\n repoInterrupt(repo);\n delete appRepos[repo.key];\n}\n\n/**\n * Ensures a repo doesn't already exist and then creates one using the\n * provided app.\n *\n * @param repoInfo - The metadata about the Repo\n * @returns The Repo object for the specified server / repoName.\n */\nfunction repoManagerCreateRepo(\n repoInfo: RepoInfo,\n app: FirebaseApp,\n authTokenProvider: AuthTokenProvider,\n appCheckProvider: AppCheckTokenProvider\n): Repo {\n let appRepos = repos[app.name];\n\n if (!appRepos) {\n appRepos = {};\n repos[app.name] = appRepos;\n }\n\n let repo = 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, useRestClient, authTokenProvider, appCheckProvider);\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 */\nexport function repoManagerForceRestClient(forceRestClient: boolean): void {\n useRestClient = forceRestClient;\n}\n\n/**\n * Class representing a Firebase Realtime Database.\n */\nexport class Database implements _FirebaseService {\n /** Represents a `Database` instance. */\n readonly 'type' = 'database';\n\n /** Track if the instance has been used (root or repo accessed) */\n _instanceStarted: boolean = false;\n\n /** Backing state for root_ */\n private _rootInternal?: ReferenceImpl;\n\n /** @hideconstructor */\n constructor(\n public _repoInternal: Repo,\n /** The {@link @firebase/app#FirebaseApp} associated with this Realtime Database instance. */\n readonly app: FirebaseApp\n ) {}\n\n get _repo(): Repo {\n if (!this._instanceStarted) {\n repoStart(\n this._repoInternal,\n this.app.options.appId,\n this.app.options['databaseAuthVariableOverride']\n );\n this._instanceStarted = true;\n }\n return this._repoInternal;\n }\n\n get _root(): ReferenceImpl {\n if (!this._rootInternal) {\n this._rootInternal = new ReferenceImpl(this._repo, newEmptyPath());\n }\n return this._rootInternal;\n }\n\n _delete(): Promise {\n if (this._rootInternal !== null) {\n repoManagerDeleteRepo(this._repo, this.app.name);\n this._repoInternal = null;\n this._rootInternal = null;\n }\n return Promise.resolve();\n }\n\n _checkNotDeleted(apiName: string) {\n if (this._rootInternal === null) {\n fatal('Cannot call ' + apiName + ' on a deleted database.');\n }\n }\n}\n\nfunction checkTransportInit() {\n if (TransportManager.IS_TRANSPORT_INITIALIZED) {\n warn(\n 'Transport has already been initialized. Please call this function before calling ref or setting up a listener'\n );\n }\n}\n\n/**\n * Force the use of websockets instead of longPolling.\n */\nexport function forceWebSockets() {\n checkTransportInit();\n BrowserPollConnection.forceDisallow();\n}\n\n/**\n * Force the use of longPolling instead of websockets. This will be ignored if websocket protocol is used in databaseURL.\n */\nexport function forceLongPolling() {\n checkTransportInit();\n WebSocketConnection.forceDisallow();\n BrowserPollConnection.forceAllow();\n}\n\n/**\n * Returns the instance of the Realtime Database SDK that is associated\n * with the provided {@link @firebase/app#FirebaseApp}. Initializes a new instance with\n * with default settings if no instance exists or if the existing instance uses\n * a custom database URL.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} instance that the returned Realtime\n * Database instance is associated with.\n * @param url - The URL of the Realtime Database instance to connect to. If not\n * provided, the SDK connects to the default instance of the Firebase App.\n * @returns The `Database` instance of the provided app.\n */\nexport function getDatabase(\n app: FirebaseApp = getApp(),\n url?: string\n): Database {\n const db = _getProvider(app, 'database').getImmediate({\n identifier: url\n }) as Database;\n if (!db._instanceStarted) {\n const emulator = getDefaultEmulatorHostnameAndPort('database');\n if (emulator) {\n connectDatabaseEmulator(db, ...emulator);\n }\n }\n return db;\n}\n\n/**\n * Modify the provided instance to communicate with the Realtime Database\n * emulator.\n *\n *

Note: This method must be called before performing any other operation.\n *\n * @param db - The instance to modify.\n * @param host - The emulator host (ex: localhost)\n * @param port - The emulator port (ex: 8080)\n * @param options.mockUserToken - the mock auth token to use for unit testing Security Rules\n */\nexport function connectDatabaseEmulator(\n db: Database,\n host: string,\n port: number,\n options: {\n mockUserToken?: EmulatorMockTokenOptions | string;\n } = {}\n): void {\n db = getModularInstance(db);\n db._checkNotDeleted('useEmulator');\n if (db._instanceStarted) {\n fatal(\n 'Cannot call useEmulator() after instance has already been initialized.'\n );\n }\n\n const repo = db._repoInternal;\n let tokenProvider: EmulatorTokenProvider | undefined = undefined;\n if (repo.repoInfo_.nodeAdmin) {\n if (options.mockUserToken) {\n fatal(\n 'mockUserToken is not supported by the Admin SDK. For client access with mock users, please use the \"firebase\" package instead of \"firebase-admin\".'\n );\n }\n tokenProvider = new EmulatorTokenProvider(EmulatorTokenProvider.OWNER);\n } else if (options.mockUserToken) {\n const token =\n typeof options.mockUserToken === 'string'\n ? options.mockUserToken\n : createMockUserToken(options.mockUserToken, db.app.options.projectId);\n tokenProvider = new EmulatorTokenProvider(token);\n }\n\n // Modify the repo to apply emulator settings\n repoManagerApplyEmulatorSettings(repo, host, port, tokenProvider);\n}\n\n/**\n * Disconnects from the server (all Database operations will be completed\n * offline).\n *\n * The client automatically maintains a persistent connection to the Database\n * server, which will remain active indefinitely and reconnect when\n * disconnected. However, the `goOffline()` and `goOnline()` methods may be used\n * to control the client connection in cases where a persistent connection is\n * undesirable.\n *\n * While offline, the client will no longer receive data updates from the\n * Database. However, all Database operations performed locally will continue to\n * immediately fire events, allowing your application to continue behaving\n * normally. Additionally, each operation performed locally will automatically\n * be queued and retried upon reconnection to the Database server.\n *\n * To reconnect to the Database and begin receiving remote events, see\n * `goOnline()`.\n *\n * @param db - The instance to disconnect.\n */\nexport function goOffline(db: Database): void {\n db = getModularInstance(db);\n db._checkNotDeleted('goOffline');\n repoInterrupt(db._repo);\n}\n\n/**\n * Reconnects to the server and synchronizes the offline Database state\n * with the server state.\n *\n * This method should be used after disabling the active connection with\n * `goOffline()`. Once reconnected, the client will transmit the proper data\n * and fire the appropriate events so that your client \"catches up\"\n * automatically.\n *\n * @param db - The instance to reconnect.\n */\nexport function goOnline(db: Database): void {\n db = getModularInstance(db);\n db._checkNotDeleted('goOnline');\n repoResume(db._repo);\n}\n\n/**\n * Logs debugging information to the console.\n *\n * @param enabled - Enables logging if `true`, disables logging if `false`.\n * @param persistent - Remembers the logging state between page refreshes if\n * `true`.\n */\nexport function enableLogging(enabled: boolean, persistent?: boolean);\n\n/**\n * Logs debugging information to the console.\n *\n * @param logger - A custom logger function to control how things get logged.\n */\nexport function enableLogging(logger: (message: string) => unknown);\n\nexport function enableLogging(\n logger: boolean | ((message: string) => unknown),\n persistent?: boolean\n): void {\n enableLoggingImpl(logger, persistent);\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n _registerComponent,\n registerVersion,\n SDK_VERSION\n} from '@firebase/app';\nimport { Component, ComponentType } from '@firebase/component';\n\nimport { name, version } from '../package.json';\nimport { setSDKVersion } from '../src/core/version';\n\nimport { repoManagerDatabaseFromApp } from './api/Database';\n\nexport function registerDatabase(variant?: string): void {\n setSDKVersion(SDK_VERSION);\n _registerComponent(\n new Component(\n 'database',\n (container, { instanceIdentifier: url }) => {\n const app = container.getProvider('app').getImmediate()!;\n const authProvider = container.getProvider('auth-internal');\n const appCheckProvider = container.getProvider('app-check-internal');\n return repoManagerDatabaseFromApp(\n app,\n authProvider,\n appCheckProvider,\n url\n );\n },\n ComponentType.PUBLIC\n ).setMultipleInstances(true)\n );\n registerVersion(name, version, variant);\n // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\n registerVersion(name, version, '__BUILD_TARGET__');\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst SERVER_TIMESTAMP = {\n '.sv': 'timestamp'\n};\n\n/**\n * Returns a placeholder value for auto-populating the current timestamp (time\n * since the Unix epoch, in milliseconds) as determined by the Firebase\n * servers.\n */\nexport function serverTimestamp(): object {\n return SERVER_TIMESTAMP;\n}\n\n/**\n * Returns a placeholder value that can be used to atomically increment the\n * current database value by the provided delta.\n *\n * @param delta - the amount to modify the current value atomically.\n * @returns A placeholder value for modifying data atomically server-side.\n */\nexport function increment(delta: number): object {\n return {\n '.sv': {\n 'increment': delta\n }\n };\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getModularInstance, Deferred } from '@firebase/util';\n\nimport { repoStartTransaction } from '../core/Repo';\nimport { PRIORITY_INDEX } from '../core/snap/indexes/PriorityIndex';\nimport { Node } from '../core/snap/Node';\nimport { validateWritablePath } from '../core/util/validation';\n\nimport { DatabaseReference } from './Reference';\nimport { DataSnapshot, onValue, ReferenceImpl } from './Reference_impl';\n\n/** An options object to configure transactions. */\nexport interface TransactionOptions {\n /**\n * By default, events are raised each time the transaction update function\n * runs. So if it is run multiple times, you may see intermediate states. You\n * can set this to false to suppress these intermediate states and instead\n * wait until the transaction has completed before events are raised.\n */\n readonly applyLocally?: boolean;\n}\n\n/**\n * A type for the resolve value of {@link runTransaction}.\n */\nexport class TransactionResult {\n /** @hideconstructor */\n constructor(\n /** Whether the transaction was successfully committed. */\n readonly committed: boolean,\n /** The resulting data snapshot. */\n readonly snapshot: DataSnapshot\n ) {}\n\n /** Returns a JSON-serializable representation of this object. */\n toJSON(): object {\n return { committed: this.committed, snapshot: this.snapshot.toJSON() };\n }\n}\n\n/**\n * Atomically modifies the data at this location.\n *\n * Atomically modify the data at this location. Unlike a normal `set()`, which\n * just overwrites the data regardless of its previous value, `runTransaction()` is\n * used to modify the existing value to a new value, ensuring there are no\n * conflicts with other clients writing to the same location at the same time.\n *\n * To accomplish this, you pass `runTransaction()` an update function which is\n * used to transform the current value into a new value. If another client\n * writes to the location before your new value is successfully written, your\n * update function will be called again with the new current value, and the\n * write will be retried. This will happen repeatedly until your write succeeds\n * without conflict or you abort the transaction by not returning a value from\n * your update function.\n *\n * Note: Modifying data with `set()` will cancel any pending transactions at\n * that location, so extreme care should be taken if mixing `set()` and\n * `runTransaction()` to update the same data.\n *\n * Note: When using transactions with Security and Firebase Rules in place, be\n * aware that a client needs `.read` access in addition to `.write` access in\n * order to perform a transaction. This is because the client-side nature of\n * transactions requires the client to read the data in order to transactionally\n * update it.\n *\n * @param ref - The location to atomically modify.\n * @param transactionUpdate - A developer-supplied function which will be passed\n * the current data stored at this location (as a JavaScript object). The\n * function should return the new value it would like written (as a JavaScript\n * object). If `undefined` is returned (i.e. you return with no arguments) the\n * transaction will be aborted and the data at this location will not be\n * modified.\n * @param options - An options object to configure transactions.\n * @returns A `Promise` that can optionally be used instead of the `onComplete`\n * callback to handle success and failure.\n */\nexport function runTransaction(\n ref: DatabaseReference,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n transactionUpdate: (currentData: any) => unknown,\n options?: TransactionOptions\n): Promise {\n ref = getModularInstance(ref);\n\n validateWritablePath('Reference.transaction', ref._path);\n\n if (ref.key === '.length' || ref.key === '.keys') {\n throw (\n 'Reference.transaction failed: ' + ref.key + ' is a read-only object.'\n );\n }\n\n const applyLocally = options?.applyLocally ?? true;\n const deferred = new Deferred();\n\n const promiseComplete = (\n error: Error | null,\n committed: boolean,\n node: Node | null\n ) => {\n let dataSnapshot: DataSnapshot | null = null;\n if (error) {\n deferred.reject(error);\n } else {\n dataSnapshot = new DataSnapshot(\n node,\n new ReferenceImpl(ref._repo, ref._path),\n PRIORITY_INDEX\n );\n deferred.resolve(new TransactionResult(committed, dataSnapshot));\n }\n };\n\n // Add a watch to make sure we get server updates.\n const unwatcher = onValue(ref, () => {});\n\n repoStartTransaction(\n ref._repo,\n ref._path,\n transactionUpdate,\n promiseComplete,\n unwatcher,\n applyLocally\n );\n\n return deferred.promise;\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 { PersistentConnection } from '../core/PersistentConnection';\nimport { RepoInfo } from '../core/RepoInfo';\nimport { Connection } from '../realtime/Connection';\n\nimport { repoManagerForceRestClient } from './Database';\n\nexport const DataConnection = PersistentConnection;\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// 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 * @internal\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\nexport const ConnectionTarget = RepoInfo;\n\n/**\n * Forces the RepoManager to create Repos that use ReadonlyRestClient instead of PersistentConnection.\n * @internal\n */\nexport const forceRestClient = function (forceRestClient: boolean) {\n repoManagerForceRestClient(forceRestClient);\n};\n","/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Use default import to import a cjs library, so we can provide a esm entrypoint for Nodejs.\n// We can't use named import here because otherwise you will get the following error:\n// \"SyntaxError: Named export 'Client' not found. The requested module 'faye-websocket' is a CommonJS module\".\n// We can change back to using named imports once the lib provides an esm build, however they are not planning to.\n// see https://github.com/faye/faye-websocket-node/issues/82\nimport Websocket from 'faye-websocket';\n\nimport { setWebSocketImpl } from '../src/realtime/WebSocketConnection';\n\nimport { registerDatabase } from './register';\n\nsetWebSocketImpl(Websocket.Client);\n\nexport * from './api';\n\nregisterDatabase('node');\n"],"names":["enableLogging","MAX_NODE","setMaxNode","nodeFromJSON","setPriorityMaxNode","referenceConstructor","errorPrefixFxn","errorPrefix","enableLoggingImpl","SDK_VERSION"],"mappings":"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"}