{"version":3,"sources":["webpack:///./node_modules/@firebase/database/dist/index.esm.js"],"names":["name","version","SDK_VERSION","setSDKVersion","DOMStorageWrapper","domStorage_","this","prefix_","prototype","set","key","value","removeItem","prefixedName_","setItem","get","storedVal","getItem","remove","toString","MemoryStorage","cache_","isInMemoryStorage","createStoragefor","domStorageName","window","domStorage","e","PersistentStorage","SessionStorage","logClient","LUIDGenerator","id","sha1","str","utf8Bytes","update","sha1Bytes","digest","encodeByteArray","buildLogMessage_","varArgs","_i","arguments","length","message","i","arg","Array","isArray","apply","logger","firstLog_","enableLogging","logger_","persistent","logLevel","VERBOSE","log","bind","logWrapper","prefix","error","fatal","Error","warn","warnIfPageIsSecure","location","protocol","indexOf","isInvalidJSONNumber","data","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","executeWhenDOMReady","fn","document","readyState","called_1","wrappedFn_1","body","setTimeout","Math","floor","addEventListener","attachEvent","MIN_NAME","MAX_NAME","nameCompare","a","b","aAsInt","tryParseInt","bAsInt","stringCompare","requireKey","obj","ObjectToUniqueKey","keys","k","push","sort","splitStringBySize","segsize","len","dataSegs","c","substring","each","hasOwnProperty","doubleToIEEE754String","v","s","f","ln","ebits","fbits","bias","Infinity","abs","pow","min","LN2","round","bits","reverse","join","hexByteString","hexByte","parseInt","substr","toLowerCase","isChromeExtensionContentScript","test","href","isWindowsStoreApp","Windows","UI","errorForServerCode","code","query","reason","_path","toUpperCase","INTEGER_REGEXP_","RegExp","INTEGER_32_MIN","INTEGER_32_MAX","intVal","exceptionGuard","stack","beingCrawled","userAgent","search","setTimeoutNonBlocking","time","timeout","AppCheckTokenProvider","appName_","appCheckProvider","_this","appCheck","getImmediate","optional","then","getToken","forceRefresh","Promise","resolve","reject","addTokenChangeListener","listener","_a","addTokenListener","notifyForInvalidToken","FirebaseAuthTokenProvider","firebaseOptions_","authProvider_","auth_","onInit","auth","catch","addAuthTokenListener","removeTokenChangeListener","removeAuthTokenListener","errorMessage","EmulatorTokenProvider","accessToken","OWNER","PROTOCOL_VERSION","VERSION_PARAM","TRANSPORT_SESSION_PARAM","REFERER_PARAM","FORGE_REF","FORGE_DOMAIN_RE","LAST_SESSION_PARAM","APPLICATION_ID_PARAM","APP_CHECK_TOKEN_PARAM","WEBSOCKET","LONG_POLLING","RepoInfo","host","secure","namespace","webSocketOnly","nodeAdmin","persistenceKey","includeNamespaceInQueryParams","_host","_domain","internalHost","isCacheableHost","isCustomHost","Object","defineProperty","newHost","enumerable","configurable","toURLString","repoInfoNeedsQueryParam","repoInfo","repoInfoConnectionURL","type","params","connURL","pairs","StatsCollection","counters_","incrementCounter","amount","collections","reporters","statsManagerGetCollection","hashString","statsManagerGetOrCreateReporter","creatorFunction","PacketReceiver","onMessage_","pendingResponses","currentResponseNum","closeAfterResponse","onClose","closeAfter","responseNum","callback","handleResponse","requestNum","_loop_1","toProcess","this_1","_loop_2","state_1","FIREBASE_LONGPOLL_START_PARAM","FIREBASE_LONGPOLL_CLOSE_COMMAND","FIREBASE_LONGPOLL_COMMAND_CB_NAME","FIREBASE_LONGPOLL_DATA_CB_NAME","FIREBASE_LONGPOLL_ID_PARAM","FIREBASE_LONGPOLL_PW_PARAM","FIREBASE_LONGPOLL_SERIAL_PARAM","FIREBASE_LONGPOLL_CALLBACK_ID_PARAM","FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM","FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET","FIREBASE_LONGPOLL_DATA_PARAM","FIREBASE_LONGPOLL_DISCONN_FRAME_REQUEST_PARAM","MAX_URL_DATA_SIZE","SEG_HEADER_SIZE","MAX_PAYLOAD_SIZE","KEEPALIVE_REQUEST_INTERVAL","LP_CONNECT_TIMEOUT","BrowserPollConnection","connId","applicationId","appCheckToken","authToken","transportSessionId","lastSessionId","bytesSent","bytesReceived","everConnected_","log_","stats_","urlFn","open","onMessage","onDisconnect","curSegmentNum","onDisconnect_","myPacketOrderer","isClosed_","connectTimeoutTimer_","onClosed_","scriptTagHolder","FirebaseIFrameScriptHolder","args","command","arg1","arg2","incrementIncomingBytes_","clearTimeout","password","sendNewPolls","pN","urlParams","random","uniqueCallbackIdentifier","hostname","connectURL","addTag","start","startLongPoll","addDisconnectPingFrame","forceAllow","forceAllow_","forceDisallow","forceDisallow_","isAvailable","createElement","markConnectionHealthy","shutdown_","close","myDisconnFrame","removeChild","send","dataStr","base64data","enqueueSegment","pw","src","style","display","appendChild","commandCB","onMessageCB","outstandingRequests","Set","pendingSegs","currentSerial","myIFrame","createIFrame_","script","currentDomain","domain","iframeContents","doc","write","iframe","contentWindow","contentDocument","alive","innerHTML","myID","myPW","newRequest_","size","theURL","curDataString","nextSeg","d","theSeg","shift","seg","ts","addLongPollTag_","segnum","totalsegs","url","serial","add","doNewRequest","delete","keepaliveTimeout","readyStateCB","loadCB","doNodeLongPoll","newScript_1","async","onload","onreadystatechange","rstate","parentNode","onerror","WEBSOCKET_MAX_FRAME_SIZE","WEBSOCKET_KEEPALIVE_INTERVAL","WebSocketImpl","MozWebSocket","WebSocket","WebSocketConnection","keepaliveTimer","frames","totalFrames","connectionURL_","device","options","headers","process","platform","env","proxy","origin","mySock","onopen","onclose","onmessage","m","handleIncomingFrame","isOldAndroid","navigator","oldAndroidRegex","oldAndroidMatch","match","parseFloat","previouslyFailed","appendFrame_","fullMess","jsonMess","handleNewFrameCount_","frameCount","extractFrameCount_","isNaN","mess","resetKeepAlive","remainingData","sendString_","String","clearInterval","setInterval","responsesRequiredToBeHealthy","healthyTimeout","TransportManager","initTransports_","e_1","isWebSocketsAvailable","isSkipPollConnection","transports_","transports","_b","ALL_TRANSPORTS","_c","next","done","transport","e_1_1","return","call","initialTransport","upgradeTransport","UPGRADE_TIMEOUT","DELAY_BEFORE_SENDING_EXTRA_REQUESTS","BYTES_SENT_HEALTHY_OVERRIDE","BYTES_RECEIVED_HEALTHY_OVERRIDE","MESSAGE_TYPE","MESSAGE_DATA","CONTROL_SHUTDOWN","CONTROL_RESET","CONTROL_ERROR","CONTROL_PONG","SWITCH_ACK","END_TRANSMISSION","PING","SERVER_HELLO","Connection","repoInfo_","applicationId_","appCheckToken_","authToken_","onReady_","onKill_","connectionCount","pendingDataMessages","state_","transportManager_","start_","conn","conn_","nextTransportId_","primaryResponsesRequired_","onMessageReceived","connReceiver_","onConnectionLost","disconnReceiver_","tx_","rx_","secondaryConn_","isHealthy_","healthyTimeoutMS","healthyTimeout_","everConnected","onConnectionLost_","onSecondaryConnectionLost_","onPrimaryMessageReceived_","onSecondaryMessageReceived_","sendRequest","dataMsg","msg","t","sendData_","tryCleanupConnection","onSecondaryControl_","controlData","cmd","upgradeIfSecondaryHealthy_","secondaryResponsesRequired_","parsedData","layer","proceedWithUpgrade_","onControl_","onDataMessage_","onPrimaryResponse_","payload","onHandshake_","onConnectionShutdown_","onReset_","sendPingOnPrimaryIfNecessary_","handshake","timestamp","h","sessionId","onConnectionEstablished_","tryStartUpgrade_","startUpgrade_","closeConnections_","ServerActions","put","pathString","onComplete","hash","merge","refreshAuthToken","token","refreshAppCheckToken","onDisconnectPut","onDisconnectMerge","onDisconnectCancel","reportStats","stats","EventEmitter","allowedEvents_","listeners_","trigger","eventType","listeners","context","on","validateEventType_","eventData","getInitialEvent","off","splice","find","et","OnlineMonitor","_super","online_","getInstance","currentlyOnline","MAX_PATH_DEPTH","MAX_PATH_LENGTH_BYTES","Path","pathOrString","pieceNum","pieces_","split","copyTo","pieceNum_","newEmptyPath","pathGetFront","path","pathGetLength","pathPopFront","pathGetBack","pathToUrlEncodedString","encodeURIComponent","pathSlice","begin","slice","pathParent","pieces","pathChild","childPathObj","childPieces","pathIsEmpty","newRelativePath","outerPath","innerPath","outer","inner","pathCompare","left","right","leftKeys","rightKeys","cmp","pathEquals","other","j","pathContains","ValidationPath","errorPrefix_","parts_","byteLength_","max","validationPathCheckValid","validationPathPush","validationPath","child","validationPathPop","last","pop","validationPathToErrorString","__EMPTY_NODE","MAX_NODE$2","VisibilityMonitor","hidden","visibilityChange","visible_","visible","RECONNECT_MIN_DELAY","RECONNECT_MAX_DELAY_DEFAULT","GET_CONNECT_TIMEOUT","RECONNECT_MAX_DELAY_FOR_ADMINS","RECONNECT_DELAY_MULTIPLIER","RECONNECT_DELAY_RESET_TIMEOUT","SERVER_KILL_INTERRUPT_REASON","INVALID_TOKEN_THRESHOLD","PersistentConnection","onDataUpdate_","onConnectStatus_","onServerInfoUpdate_","authTokenProvider_","appCheckTokenProvider_","authOverride_","nextPersistentConnectionId_","interruptReasons_","listens","Map","outstandingPuts_","outstandingGets_","outstandingPutCount_","outstandingGetCount_","onDisconnectRequestQueue_","connected_","reconnectDelay_","maxReconnectDelay_","securityDebugCallback_","establishConnectionTimer_","requestCBHash_","requestNumber_","realtime_","forceTokenRefresh_","invalidAuthTokenCount_","invalidAppCheckTokenCount_","firstConnection_","lastConnectionAttemptTime_","lastConnectionEstablishedTime_","onVisible_","onOnline_","action","onResponse","curReqNum","r","initConnection_","deferred","request","p","q","_queryObject","outstandingGet","index","undefined","sendGet_","promise","listen","currentHashFn","tag","queryId","_queryIdentifier","has","_queryParams","isDefault","loadsAllData","listenSpec","hashFn","sendListen_","req","status","warnOnListenWarnings_","currentListenSpec","removeListen_","warnings","indexSpec","getIndex","indexPath","tryAuth","reduceReconnectDelayIfAdminCredential_","credential","isFirebaseSecret","tryAppCheck","token_1","authMethod","requestData","cred","res","onAuthRevoked_","onAppCheckRevoked_","unlisten","sendUnlisten_","queryObj","sendOnDisconnect_","response","putInternal","sendPut_","queued","result","errorReason","reqNum","onDataPush_","onListenRevoked_","onSecurityDebugPacket_","Date","getTime","handleTimestamp_","sendConnectStats_","restoreState_","scheduleConnect_","establishConnection_","online","onRealtimeDisconnect_","cancelSentTransactions_","shouldReconnect_","timeSinceLastConnectSucceeded","timeSinceLastConnectAttempt","reconnectDelay","onDataMessage","onReady","onDisconnect_1","canceled_1","connection_1","closeFn","sendRequestFn","error_1","label","nextConnectionId_","trys","all","sent","interrupt","resume","delta","serverTimeOffset","map","normalizedPathString","statusCode","explanation","console","replace","e_2","values","_d","queries","_e","_f","e_2_1","clientName","NamedNode","node","Wrap","Index","getCompare","compare","indexedValueChanged","oldNode","newNode","oldWrapped","newWrapped","minPost","MIN","KeyIndex","val","isDefinedOn","maxPost","makePost","indexValue","KEY_INDEX","SortedMapIterator","startKey","comparator","isReverse_","resultGenerator_","nodeStack_","isEmpty","getNext","hasNext","peek","LLRBNode","color","RED","SortedMap","EMPTY_NODE","copy","count","inorderTraversal","reverseTraversal","min_","minKey","maxKey","insert","n","fixUp_","removeMin_","isRed_","moveRedLeft_","smallest","rotateRight_","moveRedRight_","rotateLeft_","colorFlip_","nl","nr","checkMaxDepth_","blackDepth","check_","BLACK","LLRBEmptyNode","comparator_","root_","getPredecessorKey","rightParent","getIterator","resultGenerator","getIteratorFrom","getReverseIteratorFrom","getReverseIterator","NAME_ONLY_COMPARATOR","NAME_COMPARATOR","setMaxNode$1","__childrenNodeConstructor","nodeFromJSON$1","MAX_NODE$1","priorityHashText","priority","validatePriorityNode","priorityNode","isLeafNode","getPriority","LeafNode","value_","priorityNode_","lazyHash_","updatePriority","newPriorityNode","getImmediateChild","childName","getChild","hasChild","getPredecessorChildName","childNode","updateImmediateChild","newChildNode","updateChild","front","numChildren","forEachChild","exportFormat","getValue","toHash","compareTo","compareToLeafNode_","otherLeaf","otherLeafType","thisLeafType","otherIndex","VALUE_TYPE_ORDER","thisIndex","withIndex","isIndexed","equals","setNodeFromJSON","setMaxNode","_defaultIndexMap","PriorityIndex","aPriority","bPriority","indexCmp","PRIORITY_INDEX","LOG_2","Base12Num","logBase2","num","bitMask","current_","mask","bits_","nextBitIsOne","buildChildSet","childList","keyFn","mapSortFn","buildBalancedTree","low","high","namedNode","middle","buildFrom12Array","base12","root","buildPennant","chunkSize","childTree","attachPennant","pennant","isOne","fallbackObject","IndexMap","indexes_","indexSet_","indexKey","sortedMap","hasIndex","indexDefinition","addIndex","existingChildren","newIndex","sawIndexedValue","iter","indexName","newIndexSet","newIndexes","addToIndexes","indexedChildren","existingSnap","newChildren","removeFromIndexes","ChildrenNode","children_","indexMap_","Default","newIndexMap","newPriority","newImmediateChild","numKeys","allIntegerKeys","array","toHash_1","childHash","idx","resolveIndex_","predecessor","getFirstChildName","getFirstChild","getLastChildName","getLastChild","wrappedNode","startPost","iterator","endPost","MAX_NODE","otherChildrenNode","thisIter","otherIter","thisCurrent","otherCurrent","MaxNode","defineProperties","MAX","USE_HINZE","nodeFromJSON","json","jsonLeaf","node_1","childData","children_1","childrenHavePriority_1","hinzeJsonObj","childSet","sortedChildSet","PathIndex","indexPath_","extractChild","snap","aChild","bChild","valueNode","ValueIndex","VALUE_INDEX","PUSH_CHARS","MIN_PUSH_CHAR","MAX_PUSH_CHAR","MAX_KEY_LEN","nextPushId","lastPushTime","lastRandChars","now","duplicateTime","timeStampChars","charAt","successor","keyAsInt","i_1","source","sourcePlusOne","repeat","changeValue","snapshotNode","changeChildAdded","changeChildRemoved","changeChildChanged","oldSnap","changeChildMoved","IndexedFilter","index_","newChild","affectedPath","optChangeAccumulator","oldChild","trackChildChange","updateFullNode","newSnap","filtersNodes","getIndexedFilter","RangedFilter","indexedFilter_","startPost_","getStartPost_","endPost_","getEndPost_","getStartPost","getEndPost","matches","filtered","self","hasStart","startName","getIndexStartName","getIndexStartValue","hasEnd","endName","getIndexEndName","getIndexEndValue","LimitedFilter","rangedFilter_","limit_","getLimit","reverse_","isViewFromLeft","fullLimitUpdateChild_","inRange","indexCompare_1","foundStartPost","childKey","childSnap","changeAccumulator","indexCmp_1","oldEventCache","newChildNamedNode","windowBoundary","oldChildSnap","nextChild","getChildAfterChild","compareNext","remainsInWindow","newEventCache","nextChildInRange","QueryParams","limitSet_","startSet_","startNameSet_","startAfterSet_","endSet_","endNameSet_","endBeforeSet_","viewFrom_","indexStartValue_","indexStartName_","indexEndValue_","indexEndName_","hasStartAfter","hasEndBefore","hasLimit","hasAnchoredLimit","queryParamsGetNodeFilter","queryParams","queryParamsLimitToFirst","newLimit","newParams","queryParamsLimitToLast","queryParamsStartAt","queryParamsStartAfter","queryParamsEndAt","queryParamsEndBefore","queryParamsOrderBy","queryParamsToRestQueryStringParameters","orderBy","qs","queryParamsGetQueryObject","viewFrom","ReadonlyRestClient","listens_","getListenId_","listenId","thisListen","queryStringParameters","restRequest_","status_1","xhr","XMLHttpRequest","responseText","SnapshotHolder","rootNode_","getNode","updateSnapshot","newSnapshotNode","newSparseSnapshotTree","children","sparseSnapshotTreeRemember","sparseSnapshotTree","clear","sparseSnapshotTreeForget","tree","safeToRemove","sparseSnapshotTreeForEachTree","prefixPath","func","sparseSnapshotTreeForEachChild","forEach","OperationType","StatsListener","collection_","last_","newStats","stat","FIRST_STATS_MIN_TIME","FIRST_STATS_MAX_TIME","REPORT_STATS_INTERVAL","StatsReporter","collection","server_","statsToReport_","statsListener_","reportStats_","reportedStats","haveStatsToReport","statsReporterIncludeStat","reporter","newOperationSourceUser","fromUser","fromServer","tagged","newOperationSourceServer","newOperationSourceServerTaggedQuery","emptyChildrenSingleton","AckUserWrite","affectedTree","revert","ACK_USER_WRITE","operationForChild","subtree","ListenComplete","LISTEN_COMPLETE","Overwrite","OVERWRITE","Merge","MERGE","CacheNode","node_","fullyInitialized_","filtered_","isFullyInitialized","isFiltered","isCompleteForPath","isCompleteForChild","EventGenerator","query_","eventGeneratorGenerateEventsForChanges","eventGenerator","changes","eventCache","eventRegistrations","events","moves","change","eventGeneratorGenerateEventsForType","registrations","filteredChanges","filter","eventGeneratorCompareChanges","materializedChange","eventGeneratorMaterializeSingleChange","registration","respondsTo","createEvent","prevName","aWrapped","bWrapped","newViewCache","serverCache","viewCacheUpdateEventSnap","viewCache","eventSnap","complete","viewCacheUpdateServerSnap","serverSnap","viewCacheGetCompleteEventSnap","viewCacheGetCompleteServerSnap","EmptyChildren","ImmutableTree","fromObject","childPath","findRootMostMatchingPathAndValue","relativePath","predicate","childExistingPathAndValue","fullPath","findRootMostValueAndPath","toSet","setTree","newTree","fold","fold_","pathSoFar","accum","findOnPath","findOnPath_","pathToFollow","foreachOnPath","foreachOnPath_","currentRelativePath","foreach","foreach_","foreachChild","CompoundWrite","writeTree_","empty","compoundWriteAddWrite","compoundWrite","rootmost","rootMostPath","newWriteTree","compoundWriteAddWrites","updates","newWrite","compoundWriteRemoveWrite","compoundWriteHasCompleteWrite","compoundWriteGetCompleteNode","compoundWriteGetCompleteChildren","compoundWriteChildCompoundWrite","shadowingNode","compoundWriteIsEmpty","compoundWriteApply","applySubtreeWrite","writeTree","priorityWrite_1","writeTreeChildWrites","newWriteTreeRef","writeTreeAddOverwrite","writeId","lastWriteId","allWrites","visibleWrites","writeTreeAddMerge","changedChildren","writeTreeGetWrite","record","writeTreeRemoveWrite","findIndex","writeToRemove","removedWriteWasVisible","removedWriteOverlapsWithOtherWrites","currentWrite","writeTreeRecordContainsPath_","writeTreeResetTree_","writeRecord","writeTreeLayerTree_","writeTreeDefaultFilter_","writes","treeRoot","writePath","deepNode","writeTreeCalcCompleteEventCache","treePath","completeServerCache","writeIdsToExclude","includeHiddenWrites","mergeAtPath","layeredCache","subMerge","writeTreeCalcCompleteEventChildren","completeServerChildren","completeChildren","topLevelSet","merge_1","writeTreeCalcEventCacheAfterServerOverwrite","existingEventSnap","existingServerSnap","childMerge","writeTreeCalcCompleteChild","writeTreeShadowingWrite","writeTreeCalcIndexedSlice","completeServerData","toIterate","nodes","writeTreeRefCalcCompleteEventCache","writeTreeRef","writeTreeRefCalcCompleteEventChildren","writeTreeRefCalcEventCacheAfterServerOverwrite","writeTreeRefShadowingWrite","writeTreeRefCalcIndexedSlice","writeTreeRefCalcCompleteChild","existingServerCache","writeTreeRefChild","ChildChangeAccumulator","changeMap","oldChange","oldType","getChanges","from","NoCompleteChildSource_","getCompleteChild","NO_COMPLETE_CHILD_SOURCE","WriteTreeCompleteChildSource","writes_","viewCache_","optCompleteServerCache_","serverNode","newViewProcessor","viewProcessorAssertIndexed","viewProcessor","viewProcessorApplyOperation","oldViewCache","operation","writesCache","completeCache","filterServerNode","accumulator","overwrite","viewProcessorApplyUserOverwrite","viewProcessorApplyServerOverwrite","viewProcessorApplyUserMerge","viewProcessorApplyServerMerge","ackUserWrite","viewProcessorRevertUserWrite","viewProcessorAckUserWrite","viewProcessorListenComplete","viewProcessorMaybeAddValueEvent","isLeafOrEmpty","oldCompleteSnap","viewProcessorGenerateEventCacheAfterServerEvent","changePath","oldEventSnap","completeEventChildren","completeNode","oldEventNode","updatedPriority","childChangePath","newEventChild","eventChildUpdate","changedSnap","newServerCache","oldServerSnap","serverFilter","newServerNode","newEventSnap","viewProcessorCacheHasChild","curViewCache","viewProcessorApplyMerge","viewMergeTree","serverChild","childMergeTree","isUnknownDeepMerge","ackPath","changedChildren_1","changedChildren_2","mergePath","serverCachePath","oldServerNode","serverChildren","referenceConstructor$1","View","initialViewCache","eventRegistrations_","indexFilter","processor_","initialServerCache","initialEventCache","eventGenerator_","viewGetServerCache","view","viewGetCompleteNode","viewGetCompleteServerCache","cache","viewIsEmpty","viewAddEventRegistration","eventRegistration","viewRemoveEventRegistration","cancelError","cancelEvents","path_1","maybeEvent","createCancelEvent","remaining","existing","hasAnyCallback","concat","viewApplyOperation","viewGenerateEventsForChanges_","viewGetInitialEvents","initialChanges","eventNode","referenceConstructor","SyncPoint","views","syncPointSetReferenceConstructor","syncPointGetReferenceConstructor","syncPointIsEmpty","syncPoint","syncPointApplyOperation","optCompleteServerCache","syncPointGetView","serverCacheComplete","eventCacheComplete","syncPointAddEventRegistration","syncPointRemoveEventRegistration","removed","hadCompleteView","syncPointHasCompleteView","entries","viewQueryId","_repo","syncPointGetQueryViews","e_3","e_3_1","syncPointGetCompleteServerCache","e_4","e_4_1","syncPointViewForQuery","syncPointGetCompleteView","syncPointViewExistsForQuery","e_5","e_5_1","syncTreeSetReferenceConstructor","syncTreeGetReferenceConstructor","syncTreeNextQueryTag_","SyncTree","listenProvider_","syncPointTree_","pendingWriteTree_","tagToQueryMap","queryToTagMap","syncTreeApplyUserOverwrite","syncTree","newData","syncTreeApplyOperationToSyncPoints_","syncTreeApplyUserMerge","changeTree","syncTreeAckUserWrite","needToReevaluate","affectedTree_1","syncTreeApplyServerOverwrite","syncTreeApplyServerMerge","syncTreeApplyListenComplete","syncTreeApplyTaggedListenComplete","queryKey","syncTreeQueryKeyForTag_","syncTreeParseQueryKey_","queryPath","op","syncTreeApplyTaggedOperation_","syncTreeRemoveEventRegistration","maybeSyncPoint","removedAndEvents","removingDefault","covered","parentSyncPoint","newViews","syncTreeCollectDistinctViewsForSubTree_","newQuery","syncTreeCreateListenerForView_","startListening","syncTreeQueryForListening_","syncTreeTagForQuery_","defaultTag","stopListening","queryToRemove","tagToRemove","syncTreeMakeQueryKey_","syncTreeRemoveTags_","syncTreeApplyTaggedQueryOverwrite","syncTreeApplyTaggedQueryMerge","syncTreeAddEventRegistration","foundAncestorDefaultView","pathToSyncPoint","sp","childSyncPoint","viewAlreadyExists","syncTreeGetNextQueryTag_","syncTreeSetupListener_","syncTreeCalcCompleteEventCache","includeHiddenSets","syncTreeGetServerValue","serverCacheNode","syncTreeApplyOperationHelper_","syncPointTree","syncTreeApplyOperationDescendantsHelper_","childOperation","childServerCache","childWritesCache","splitIndex","maybeChildSyncPoint","childMap","completeView","views_1","_key","childViews","removedQuery","removedQueryKey","removedQueryTag","queriesToStop","queries_1","childQueries","queryToStop","ExistingValueProvider","DeferredValueProvider","syncTree_","path_","generateWithValues","resolveDeferredLeafValue","existingVal","serverValues","resolveScalarDeferredValue","resolveComplexDeferredValue","JSON","stringify","unused","existingNode","leaf","resolveDeferredValueTree","resolveDeferredValue","resolveDeferredValueSnapshot","rawPri","leafNode","childrenNode","Tree","parent","childCount","treeSubTree","pathObj","treeGetValue","treeSetValue","treeUpdateParents","treeHasChildren","treeIsEmpty","treeForEachChild","treeForEachDescendant","includeSelf","childrenFirst","treeForEachAncestor","treeGetPath","treeUpdateChild","childEmpty","childExists","INVALID_KEY_REGEX_","INVALID_PATH_REGEX_","MAX_LEAF_SIZE_","isValidKey","isValidPathString","isValidRootPathString","isValidPriority","validateFirebaseDataArg","fnName","validateFirebaseData","errorPrefix","hasDotValue_1","hasActualChild_1","validateFirebaseMergePaths","mergePaths","curPath","prevPath","validateFirebaseMergeDataArg","errorPrefix$1","validatePriority","validateEventType","validateKey","argumentName","validatePathString","validateRootPathString","validateWritablePath","validateUrl","parsedUrl","validateBoolean","bool","EventQueue","eventLists_","recursionDepth_","eventQueueQueueEvents","eventQueue","eventDataList","currList","getPath","eventQueueRaiseEventsAtPath","eventQueueRaiseQueuedEventsMatchingPredicate","eventPath","eventQueueRaiseEventsForChangedPath","changedPath","sentAll","eventList","eventListRaise","eventFn","getEventRunner","INTERRUPT_REASON","MAX_TRANSACTION_RETRIES","Repo","forceRestClient_","appCheckProvider_","dataUpdateCount","eventQueue_","nextWriteId_","interceptServerDataCallback_","transactionQueueTree_","persistentConnection_","repoStart","repo","appId","authOverride","isMerge","repoOnDataUpdate","repoOnConnectStatus","connectStatus","repoOnServerInfoUpdate","statsReporter_","infoData_","infoSyncTree_","infoEvents","repoUpdateInfo","serverSyncTree_","repoServerTime","offsetNode","offset","repoGenerateServerValues","taggedChildren","raw","taggedSnap","repoRerunTransactions","repoInterceptServerData","repoRunOnDisconnectEvents","repoGetNextWriteId","repoGetValue","cached","err","repoLog","repoSetWithPriority","newVal","newNodeUnresolved","success","clearEvents","repoCallOnCompleteCallback","repoAbortTransactions","repoUpdate","childrenToMerge","changedKey","changedValue","writeId_1","resolvedOnDisconnectTree","resolved","repoOnDisconnectCancel","repoOnDisconnectSet","repoOnDisconnectSetWithPriority","repoOnDisconnectUpdate","repoAddEventCallbackForQuery","repoRemoveEventCallbackForQuery","repoInterrupt","repoResume","repoStats","showDelta","longestName","reduce","previousValue","currentValue","paddedStat","repoStatsIncrementCounter","metric","repoStartTransaction","transactionUpdate","unwatcher","applyLocally","transaction","order","retryCount","abortReason","currentWriteId","currentInputSnapshot","currentOutputSnapshotRaw","currentOutputSnapshotResolved","currentState","repoGetLatestState","queueNode","nodeQueue","priorityForNode","currentNode","repoSendReadyTransactions","excludeSets","repoPruneCompletedTransactionsBelowNode","queue","repoBuildTransactionQueue","allRun","every","repoSendTransactionQueue","setsToIgnore","txn","latestState","snapToSend","latestHash","dataToSend","pathToSend","callbacks","rootMostTransactionNode","repoGetAncestorTransactionNode","repoRerunTransactionQueue","txnsToRerun","abortTransaction","newDataNode","hasExplicitPriority","oldWriteId","newNodeResolved","transactionNode","transactionQueue","repoAggregateTransactionQueuesForNode","to","repoAbortTransactionsOnNode","lastSent","decodePath","pathStringDecoded","piece","decodeURIComponent","decodeQuery","queryString","results","segment","kv","parseRepoInfo","dataURL","parseDatabaseURL","scheme","subdomain","port","colonInd","slashInd","questionMarkInd","hostWithoutPort","dotInd","DataEvent","snapshot","ref","getEventType","exportVal","CancelEvent","CallbackContext","snapshotCallback","cancelCallback","onValue","expDataSnapshot","previousChildName","onCancel","hasCancelCallback","userCallback","OnDisconnect$1","OnDisconnect","cancel","wrapCallback","setWithPriority","QueryImpl","_orderByCalled","ReferenceImpl","isEqual","sameRepo","samePath","sameQueryIdentifier","toJSON","validateNoPreviousOrderByCall","validateQueryEndpoints","startNode","endNode","tooManyArgsError","wrongArgTypeError","validateLimit","parentPath","DataSnapshot$1","DataSnapshot","_node","_index","childRef","exists","hasChildren","db","_checkNotDeleted","_root","refFromURL","parsedURL","thennablePushRef","pushRef","setPriority","ValueEventRegistration","callbackContext","ChildEventRegistration","eventToCheck","cancelCallbackOrListenOptions","onlyOnce","userCallback_1","onceCallback","dataSnapshot","container","onChildAdded","onChildChanged","onChildMoved","onChildRemoved","expCallback","QueryConstraint","QueryEndAtConstraint","_value","_apply","endAt","QueryEndBeforeConstraint","endBefore","QueryStartAtConstraint","startAt","QueryStartAfterConstraint","startAfter","QueryLimitToFirstConstraint","_limit","limitToFirst","limit","QueryLimitToLastConstraint","limitToLast","QueryOrderByChildConstraint","parsedPath","orderByChild","QueryOrderByKeyConstraint","orderByKey","QueryOrderByPriorityConstraint","orderByPriority","QueryOrderByValueConstraint","orderByValue","QueryEqualToValueConstraint","equalTo","queryConstraints","queryImpl","queryConstraints_1","queryConstraints_1_1","constraint","FIREBASE_DATABASE_EMULATOR_HOST_VAR","repos","useRestClient","repoManagerApplyEmulatorSettings","tokenProvider","repoManagerDatabaseFromApp","app","authProvider","dbUrl","databaseURL","projectId","isEmulator","dbEmulatorHost","authTokenProvider","repoManagerCreateRepo","Database$1","repoManagerDeleteRepo","appName","appRepos","repoManagerForceRestClient","forceRestClient","Database","_repoInternal","_instanceStarted","_rootInternal","_delete","apiName","connectDatabaseEmulator","mockUserToken","goOffline","goOnline","SERVER_TIMESTAMP","serverTimestamp","increment","TransactionResult$1","TransactionResult","committed","runTransaction","promiseComplete","_delegate","objectToMerge","newObjectToMerge","_database","getRef","Reference","Query","database","cancelCallbackOrContext","ret","getCancelAndContextArgs_","valueCallback","expSnapshot","once","failureCallbackOrContext","cancelOrContext","getKey","getParent","getRoot","transactionResult","expPromise","expRef","INTERNAL","useEmulator","ServerValue","TIMESTAMP","forceLongPolling","forceWebSockets","setSecurityDebugCallback","connection","statsIncrementCounter","interceptServerData","initStandalone","customAuthImpl","setComponent","instance","freeze","__proto__","DataConnection","simpleListen","echo","onEcho","RealTimeConnection","hijackHash","newHash","oldPut","ConnectionTarget","queryIdentifier","TEST_ACCESS","registerDatabase","registerComponent","instanceIdentifier","getProvider","setServiceProps","setMultipleInstances","registerVersion","module","exports"],"mappings":"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","file":"js/chunk-vendors~a4799ee8.285d8f3d.js","sourcesContent":["import firebase from '@firebase/app';\nimport { Provider, ComponentContainer, Component } from '@firebase/component';\nimport { stringify, jsonEval, contains, assert, isNodeSdk, base64, stringToByteArray, Sha1, deepCopy, base64Encode, isMobileCordova, stringLength, Deferred, safeGet, isAdmin, isValidFormat, isEmpty, isReactNative, assertionError, map, querystring, errorPrefix, getModularInstance, createMockUserToken, validateArgCount, validateCallback, validateContextObject } from '@firebase/util';\nimport { __spreadArray, __read, __values, __extends, __awaiter, __generator, __assign } from 'tslib';\nimport { Logger, LogLevel } from '@firebase/logger';\n\nvar name = \"@firebase/database\";\nvar version = \"0.11.0\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** The semver (www.semver.org) version of the SDK. */\r\nvar SDK_VERSION = '';\r\n// SDK_VERSION should be set before any database instance is created\r\nfunction setSDKVersion(version) {\r\n SDK_VERSION = version;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Wraps a DOM Storage object and:\r\n * - automatically encode objects as JSON strings before storing them to allow us to store arbitrary types.\r\n * - prefixes names with \"firebase:\" to avoid collisions with app data.\r\n *\r\n * We automatically (see storage.js) create two such wrappers, one for sessionStorage,\r\n * and one for localStorage.\r\n *\r\n */\r\nvar DOMStorageWrapper = /** @class */ (function () {\r\n /**\r\n * @param domStorage_ - The underlying storage object (e.g. localStorage or sessionStorage)\r\n */\r\n function DOMStorageWrapper(domStorage_) {\r\n this.domStorage_ = domStorage_;\r\n // Use a prefix to avoid collisions with other stuff saved by the app.\r\n this.prefix_ = 'firebase:';\r\n }\r\n /**\r\n * @param key - The key to save the value under\r\n * @param value - The value being stored, or null to remove the key.\r\n */\r\n DOMStorageWrapper.prototype.set = function (key, value) {\r\n if (value == null) {\r\n this.domStorage_.removeItem(this.prefixedName_(key));\r\n }\r\n else {\r\n this.domStorage_.setItem(this.prefixedName_(key), stringify(value));\r\n }\r\n };\r\n /**\r\n * @returns The value that was stored under this key, or null\r\n */\r\n DOMStorageWrapper.prototype.get = function (key) {\r\n var storedVal = this.domStorage_.getItem(this.prefixedName_(key));\r\n if (storedVal == null) {\r\n return null;\r\n }\r\n else {\r\n return jsonEval(storedVal);\r\n }\r\n };\r\n DOMStorageWrapper.prototype.remove = function (key) {\r\n this.domStorage_.removeItem(this.prefixedName_(key));\r\n };\r\n DOMStorageWrapper.prototype.prefixedName_ = function (name) {\r\n return this.prefix_ + name;\r\n };\r\n DOMStorageWrapper.prototype.toString = function () {\r\n return this.domStorage_.toString();\r\n };\r\n return DOMStorageWrapper;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An in-memory storage implementation that matches the API of DOMStorageWrapper\r\n * (TODO: create interface for both to implement).\r\n */\r\nvar MemoryStorage = /** @class */ (function () {\r\n function MemoryStorage() {\r\n this.cache_ = {};\r\n this.isInMemoryStorage = true;\r\n }\r\n MemoryStorage.prototype.set = function (key, value) {\r\n if (value == null) {\r\n delete this.cache_[key];\r\n }\r\n else {\r\n this.cache_[key] = value;\r\n }\r\n };\r\n MemoryStorage.prototype.get = function (key) {\r\n if (contains(this.cache_, key)) {\r\n return this.cache_[key];\r\n }\r\n return null;\r\n };\r\n MemoryStorage.prototype.remove = function (key) {\r\n delete this.cache_[key];\r\n };\r\n return MemoryStorage;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Helper to create a DOMStorageWrapper or else fall back to MemoryStorage.\r\n * TODO: Once MemoryStorage and DOMStorageWrapper have a shared interface this method annotation should change\r\n * to reflect this type\r\n *\r\n * @param domStorageName - Name of the underlying storage object\r\n * (e.g. 'localStorage' or 'sessionStorage').\r\n * @returns Turning off type information until a common interface is defined.\r\n */\r\nvar createStoragefor = function (domStorageName) {\r\n try {\r\n // NOTE: just accessing \"localStorage\" or \"window['localStorage']\" may throw a security exception,\r\n // so it must be inside the try/catch.\r\n if (typeof window !== 'undefined' &&\r\n typeof window[domStorageName] !== 'undefined') {\r\n // Need to test cache. Just because it's here doesn't mean it works\r\n var domStorage = window[domStorageName];\r\n domStorage.setItem('firebase:sentinel', 'cache');\r\n domStorage.removeItem('firebase:sentinel');\r\n return new DOMStorageWrapper(domStorage);\r\n }\r\n }\r\n catch (e) { }\r\n // Failed to create wrapper. Just return in-memory storage.\r\n // TODO: log?\r\n return new MemoryStorage();\r\n};\r\n/** A storage object that lasts across sessions */\r\nvar PersistentStorage = createStoragefor('localStorage');\r\n/** A storage object that only lasts one session */\r\nvar SessionStorage = createStoragefor('sessionStorage');\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar logClient = new Logger('@firebase/database');\r\n/**\r\n * Returns a locally-unique ID (generated by just incrementing up from 0 each time its called).\r\n */\r\nvar LUIDGenerator = (function () {\r\n var id = 1;\r\n return function () {\r\n return id++;\r\n };\r\n})();\r\n/**\r\n * Sha1 hash of the input string\r\n * @param str - The string to hash\r\n * @returns {!string} The resulting hash\r\n */\r\nvar sha1 = function (str) {\r\n var utf8Bytes = stringToByteArray(str);\r\n var sha1 = new Sha1();\r\n sha1.update(utf8Bytes);\r\n var sha1Bytes = sha1.digest();\r\n return base64.encodeByteArray(sha1Bytes);\r\n};\r\nvar buildLogMessage_ = function () {\r\n var varArgs = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n varArgs[_i] = arguments[_i];\r\n }\r\n var message = '';\r\n for (var i = 0; i < varArgs.length; i++) {\r\n var arg = varArgs[i];\r\n if (Array.isArray(arg) ||\r\n (arg &&\r\n typeof arg === 'object' &&\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n typeof arg.length === 'number')) {\r\n message += buildLogMessage_.apply(null, arg);\r\n }\r\n else if (typeof arg === 'object') {\r\n message += stringify(arg);\r\n }\r\n else {\r\n message += arg;\r\n }\r\n message += ' ';\r\n }\r\n return message;\r\n};\r\n/**\r\n * Use this for all debug messages in Firebase.\r\n */\r\nvar logger = null;\r\n/**\r\n * Flag to check for log availability on first log message\r\n */\r\nvar firstLog_ = true;\r\n/**\r\n * The implementation of Firebase.enableLogging (defined here to break dependencies)\r\n * @param logger_ - A flag to turn on logging, or a custom logger\r\n * @param persistent - Whether or not to persist logging settings across refreshes\r\n */\r\nvar enableLogging = function (logger_, persistent) {\r\n assert(!persistent || logger_ === true || logger_ === false, \"Can't turn on custom loggers persistently.\");\r\n if (logger_ === true) {\r\n logClient.logLevel = LogLevel.VERBOSE;\r\n logger = logClient.log.bind(logClient);\r\n if (persistent) {\r\n SessionStorage.set('logging_enabled', true);\r\n }\r\n }\r\n else if (typeof logger_ === 'function') {\r\n logger = logger_;\r\n }\r\n else {\r\n logger = null;\r\n SessionStorage.remove('logging_enabled');\r\n }\r\n};\r\nvar log = function () {\r\n var varArgs = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n varArgs[_i] = arguments[_i];\r\n }\r\n if (firstLog_ === true) {\r\n firstLog_ = false;\r\n if (logger === null && SessionStorage.get('logging_enabled') === true) {\r\n enableLogging(true);\r\n }\r\n }\r\n if (logger) {\r\n var message = buildLogMessage_.apply(null, varArgs);\r\n logger(message);\r\n }\r\n};\r\nvar logWrapper = function (prefix) {\r\n return function () {\r\n var varArgs = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n varArgs[_i] = arguments[_i];\r\n }\r\n log.apply(void 0, __spreadArray([prefix], __read(varArgs)));\r\n };\r\n};\r\nvar error = function () {\r\n var varArgs = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n varArgs[_i] = arguments[_i];\r\n }\r\n var message = 'FIREBASE INTERNAL ERROR: ' + buildLogMessage_.apply(void 0, __spreadArray([], __read(varArgs)));\r\n logClient.error(message);\r\n};\r\nvar fatal = function () {\r\n var varArgs = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n varArgs[_i] = arguments[_i];\r\n }\r\n var message = \"FIREBASE FATAL ERROR: \" + buildLogMessage_.apply(void 0, __spreadArray([], __read(varArgs)));\r\n logClient.error(message);\r\n throw new Error(message);\r\n};\r\nvar warn = function () {\r\n var varArgs = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n varArgs[_i] = arguments[_i];\r\n }\r\n var message = 'FIREBASE WARNING: ' + buildLogMessage_.apply(void 0, __spreadArray([], __read(varArgs)));\r\n logClient.warn(message);\r\n};\r\n/**\r\n * Logs a warning if the containing page uses https. Called when a call to new Firebase\r\n * does not use https.\r\n */\r\nvar warnIfPageIsSecure = function () {\r\n // Be very careful accessing browser globals. Who knows what may or may not exist.\r\n if (typeof window !== 'undefined' &&\r\n window.location &&\r\n window.location.protocol &&\r\n window.location.protocol.indexOf('https:') !== -1) {\r\n warn('Insecure Firebase access from a secure page. ' +\r\n 'Please use https in calls to new Firebase().');\r\n }\r\n};\r\n/**\r\n * Returns true if data is NaN, or +/- Infinity.\r\n */\r\nvar isInvalidJSONNumber = function (data) {\r\n return (typeof data === 'number' &&\r\n (data !== data || // NaN\r\n data === Number.POSITIVE_INFINITY ||\r\n data === Number.NEGATIVE_INFINITY));\r\n};\r\nvar executeWhenDOMReady = function (fn) {\r\n if (isNodeSdk() || document.readyState === 'complete') {\r\n fn();\r\n }\r\n else {\r\n // Modeled after jQuery. Try DOMContentLoaded and onreadystatechange (which\r\n // fire before onload), but fall back to onload.\r\n var called_1 = false;\r\n var wrappedFn_1 = function () {\r\n if (!document.body) {\r\n setTimeout(wrappedFn_1, Math.floor(10));\r\n return;\r\n }\r\n if (!called_1) {\r\n called_1 = true;\r\n fn();\r\n }\r\n };\r\n if (document.addEventListener) {\r\n document.addEventListener('DOMContentLoaded', wrappedFn_1, false);\r\n // fallback to onload.\r\n window.addEventListener('load', wrappedFn_1, false);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n }\r\n else if (document.attachEvent) {\r\n // IE.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n document.attachEvent('onreadystatechange', function () {\r\n if (document.readyState === 'complete') {\r\n wrappedFn_1();\r\n }\r\n });\r\n // fallback to onload.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n window.attachEvent('onload', wrappedFn_1);\r\n // jQuery has an extra hack for IE that we could employ (based on\r\n // http://javascript.nwbox.com/IEContentLoaded/) But it looks really old.\r\n // I'm hoping we don't need it.\r\n }\r\n }\r\n};\r\n/**\r\n * Minimum key name. Invalid for actual data, used as a marker to sort before any valid names\r\n */\r\nvar MIN_NAME = '[MIN_NAME]';\r\n/**\r\n * Maximum key name. Invalid for actual data, used as a marker to sort above any valid names\r\n */\r\nvar MAX_NAME = '[MAX_NAME]';\r\n/**\r\n * Compares valid Firebase key names, plus min and max name\r\n */\r\nvar nameCompare = function (a, b) {\r\n if (a === b) {\r\n return 0;\r\n }\r\n else if (a === MIN_NAME || b === MAX_NAME) {\r\n return -1;\r\n }\r\n else if (b === MIN_NAME || a === MAX_NAME) {\r\n return 1;\r\n }\r\n else {\r\n var aAsInt = tryParseInt(a), bAsInt = tryParseInt(b);\r\n if (aAsInt !== null) {\r\n if (bAsInt !== null) {\r\n return aAsInt - bAsInt === 0 ? a.length - b.length : aAsInt - bAsInt;\r\n }\r\n else {\r\n return -1;\r\n }\r\n }\r\n else if (bAsInt !== null) {\r\n return 1;\r\n }\r\n else {\r\n return a < b ? -1 : 1;\r\n }\r\n }\r\n};\r\n/**\r\n * @returns {!number} comparison result.\r\n */\r\nvar stringCompare = function (a, b) {\r\n if (a === b) {\r\n return 0;\r\n }\r\n else if (a < b) {\r\n return -1;\r\n }\r\n else {\r\n return 1;\r\n }\r\n};\r\nvar requireKey = function (key, obj) {\r\n if (obj && key in obj) {\r\n return obj[key];\r\n }\r\n else {\r\n throw new Error('Missing required key (' + key + ') in object: ' + stringify(obj));\r\n }\r\n};\r\nvar ObjectToUniqueKey = function (obj) {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return stringify(obj);\r\n }\r\n var keys = [];\r\n // eslint-disable-next-line guard-for-in\r\n for (var k in obj) {\r\n keys.push(k);\r\n }\r\n // Export as json, but with the keys sorted.\r\n keys.sort();\r\n var key = '{';\r\n for (var i = 0; i < keys.length; i++) {\r\n if (i !== 0) {\r\n key += ',';\r\n }\r\n key += stringify(keys[i]);\r\n key += ':';\r\n key += ObjectToUniqueKey(obj[keys[i]]);\r\n }\r\n key += '}';\r\n return key;\r\n};\r\n/**\r\n * Splits a string into a number of smaller segments of maximum size\r\n * @param str - The string\r\n * @param segsize - The maximum number of chars in the string.\r\n * @returns The string, split into appropriately-sized chunks\r\n */\r\nvar splitStringBySize = function (str, segsize) {\r\n var len = str.length;\r\n if (len <= segsize) {\r\n return [str];\r\n }\r\n var dataSegs = [];\r\n for (var c = 0; c < len; c += segsize) {\r\n if (c + segsize > len) {\r\n dataSegs.push(str.substring(c, len));\r\n }\r\n else {\r\n dataSegs.push(str.substring(c, c + segsize));\r\n }\r\n }\r\n return dataSegs;\r\n};\r\n/**\r\n * Apply a function to each (key, value) pair in an object or\r\n * apply a function to each (index, value) pair in an array\r\n * @param obj - The object or array to iterate over\r\n * @param fn - The function to apply\r\n */\r\nfunction each(obj, fn) {\r\n for (var key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n fn(key, obj[key]);\r\n }\r\n }\r\n}\r\n/**\r\n * Borrowed from http://hg.secondlife.com/llsd/src/tip/js/typedarray.js (MIT License)\r\n * I made one modification at the end and removed the NaN / Infinity\r\n * handling (since it seemed broken [caused an overflow] and we don't need it). See MJL comments.\r\n * @param v - A double\r\n *\r\n */\r\nvar doubleToIEEE754String = function (v) {\r\n assert(!isInvalidJSONNumber(v), 'Invalid JSON number'); // MJL\r\n var ebits = 11, fbits = 52;\r\n var bias = (1 << (ebits - 1)) - 1;\r\n var s, e, f, ln, i;\r\n // Compute sign, exponent, fraction\r\n // Skip NaN / Infinity handling --MJL.\r\n if (v === 0) {\r\n e = 0;\r\n f = 0;\r\n s = 1 / v === -Infinity ? 1 : 0;\r\n }\r\n else {\r\n s = v < 0;\r\n v = Math.abs(v);\r\n if (v >= Math.pow(2, 1 - bias)) {\r\n // Normalized\r\n ln = Math.min(Math.floor(Math.log(v) / Math.LN2), bias);\r\n e = ln + bias;\r\n f = Math.round(v * Math.pow(2, fbits - ln) - Math.pow(2, fbits));\r\n }\r\n else {\r\n // Denormalized\r\n e = 0;\r\n f = Math.round(v / Math.pow(2, 1 - bias - fbits));\r\n }\r\n }\r\n // Pack sign, exponent, fraction\r\n var bits = [];\r\n for (i = fbits; i; i -= 1) {\r\n bits.push(f % 2 ? 1 : 0);\r\n f = Math.floor(f / 2);\r\n }\r\n for (i = ebits; i; i -= 1) {\r\n bits.push(e % 2 ? 1 : 0);\r\n e = Math.floor(e / 2);\r\n }\r\n bits.push(s ? 1 : 0);\r\n bits.reverse();\r\n var str = bits.join('');\r\n // Return the data as a hex string. --MJL\r\n var hexByteString = '';\r\n for (i = 0; i < 64; i += 8) {\r\n var hexByte = parseInt(str.substr(i, 8), 2).toString(16);\r\n if (hexByte.length === 1) {\r\n hexByte = '0' + hexByte;\r\n }\r\n hexByteString = hexByteString + hexByte;\r\n }\r\n return hexByteString.toLowerCase();\r\n};\r\n/**\r\n * Used to detect if we're in a Chrome content script (which executes in an\r\n * isolated environment where long-polling doesn't work).\r\n */\r\nvar isChromeExtensionContentScript = function () {\r\n return !!(typeof window === 'object' &&\r\n window['chrome'] &&\r\n window['chrome']['extension'] &&\r\n !/^chrome/.test(window.location.href));\r\n};\r\n/**\r\n * Used to detect if we're in a Windows 8 Store app.\r\n */\r\nvar isWindowsStoreApp = function () {\r\n // Check for the presence of a couple WinRT globals\r\n return typeof Windows === 'object' && typeof Windows.UI === 'object';\r\n};\r\n/**\r\n * Converts a server error code to a Javascript Error\r\n */\r\nfunction errorForServerCode(code, query) {\r\n var reason = 'Unknown Error';\r\n if (code === 'too_big') {\r\n reason =\r\n 'The data requested exceeds the maximum size ' +\r\n 'that can be accessed with a single request.';\r\n }\r\n else if (code === 'permission_denied') {\r\n reason = \"Client doesn't have permission to access the desired data.\";\r\n }\r\n else if (code === 'unavailable') {\r\n reason = 'The service is unavailable';\r\n }\r\n var error = new Error(code + ' at ' + query._path.toString() + ': ' + reason);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error.code = code.toUpperCase();\r\n return error;\r\n}\r\n/**\r\n * Used to test for integer-looking strings\r\n */\r\nvar INTEGER_REGEXP_ = new RegExp('^-?(0*)\\\\d{1,10}$');\r\n/**\r\n * For use in keys, the minimum possible 32-bit integer.\r\n */\r\nvar INTEGER_32_MIN = -2147483648;\r\n/**\r\n * For use in kyes, the maximum possible 32-bit integer.\r\n */\r\nvar INTEGER_32_MAX = 2147483647;\r\n/**\r\n * If the string contains a 32-bit integer, return it. Else return null.\r\n */\r\nvar tryParseInt = function (str) {\r\n if (INTEGER_REGEXP_.test(str)) {\r\n var intVal = Number(str);\r\n if (intVal >= INTEGER_32_MIN && intVal <= INTEGER_32_MAX) {\r\n return intVal;\r\n }\r\n }\r\n return null;\r\n};\r\n/**\r\n * Helper to run some code but catch any exceptions and re-throw them later.\r\n * Useful for preventing user callbacks from breaking internal code.\r\n *\r\n * Re-throwing the exception from a setTimeout is a little evil, but it's very\r\n * convenient (we don't have to try to figure out when is a safe point to\r\n * re-throw it), and the behavior seems reasonable:\r\n *\r\n * * If you aren't pausing on exceptions, you get an error in the console with\r\n * the correct stack trace.\r\n * * If you're pausing on all exceptions, the debugger will pause on your\r\n * exception and then again when we rethrow it.\r\n * * If you're only pausing on uncaught exceptions, the debugger will only pause\r\n * on us re-throwing it.\r\n *\r\n * @param fn - The code to guard.\r\n */\r\nvar exceptionGuard = function (fn) {\r\n try {\r\n fn();\r\n }\r\n catch (e) {\r\n // Re-throw exception when it's safe.\r\n setTimeout(function () {\r\n // It used to be that \"throw e\" would result in a good console error with\r\n // relevant context, but as of Chrome 39, you just get the firebase.js\r\n // file/line number where we re-throw it, which is useless. So we log\r\n // e.stack explicitly.\r\n var stack = e.stack || '';\r\n warn('Exception was thrown by user callback.', stack);\r\n throw e;\r\n }, Math.floor(0));\r\n }\r\n};\r\n/**\r\n * @returns {boolean} true if we think we're currently being crawled.\r\n */\r\nvar beingCrawled = function () {\r\n var userAgent = (typeof window === 'object' &&\r\n window['navigator'] &&\r\n window['navigator']['userAgent']) ||\r\n '';\r\n // For now we whitelist the most popular crawlers. We should refine this to be the set of crawlers we\r\n // believe to support JavaScript/AJAX rendering.\r\n // NOTE: Google Webmaster Tools doesn't really belong, but their \"This is how a visitor to your website\r\n // would have seen the page\" is flaky if we don't treat it as a crawler.\r\n return (userAgent.search(/googlebot|google webmaster tools|bingbot|yahoo! slurp|baiduspider|yandexbot|duckduckbot/i) >= 0);\r\n};\r\n/**\r\n * Same as setTimeout() except on Node.JS it will /not/ prevent the process from exiting.\r\n *\r\n * It is removed with clearTimeout() as normal.\r\n *\r\n * @param fn - Function to run.\r\n * @param time - Milliseconds to wait before running.\r\n * @returns The setTimeout() return value.\r\n */\r\nvar setTimeoutNonBlocking = function (fn, time) {\r\n var timeout = setTimeout(fn, time);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n if (typeof timeout === 'object' && timeout['unref']) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n timeout['unref']();\r\n }\r\n return timeout;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Abstraction around AppCheck's token fetching capabilities.\r\n */\r\nvar AppCheckTokenProvider = /** @class */ (function () {\r\n function AppCheckTokenProvider(appName_, appCheckProvider) {\r\n var _this = this;\r\n this.appName_ = appName_;\r\n this.appCheckProvider = appCheckProvider;\r\n this.appCheck = appCheckProvider === null || appCheckProvider === void 0 ? void 0 : appCheckProvider.getImmediate({ optional: true });\r\n if (!this.appCheck) {\r\n appCheckProvider === null || appCheckProvider === void 0 ? void 0 : appCheckProvider.get().then(function (appCheck) { return (_this.appCheck = appCheck); });\r\n }\r\n }\r\n AppCheckTokenProvider.prototype.getToken = function (forceRefresh) {\r\n var _this = this;\r\n if (!this.appCheck) {\r\n return new Promise(function (resolve, reject) {\r\n // Support delayed initialization of FirebaseAppCheck. This allows our\r\n // customers to initialize the RTDB SDK before initializing Firebase\r\n // AppCheck and ensures that all requests are authenticated if a token\r\n // becomes available before the timoeout below expires.\r\n setTimeout(function () {\r\n if (_this.appCheck) {\r\n _this.getToken(forceRefresh).then(resolve, reject);\r\n }\r\n else {\r\n resolve(null);\r\n }\r\n }, 0);\r\n });\r\n }\r\n return this.appCheck.getToken(forceRefresh);\r\n };\r\n AppCheckTokenProvider.prototype.addTokenChangeListener = function (listener) {\r\n var _a;\r\n (_a = this.appCheckProvider) === null || _a === void 0 ? void 0 : _a.get().then(function (appCheck) { return appCheck.addTokenListener(listener); });\r\n };\r\n AppCheckTokenProvider.prototype.notifyForInvalidToken = function () {\r\n warn(\"Provided AppCheck credentials for the app named \\\"\" + this.appName_ + \"\\\" \" +\r\n 'are invalid. This usually indicates your app was not initialized correctly.');\r\n };\r\n return AppCheckTokenProvider;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Abstraction around FirebaseApp's token fetching capabilities.\r\n */\r\nvar FirebaseAuthTokenProvider = /** @class */ (function () {\r\n function FirebaseAuthTokenProvider(appName_, firebaseOptions_, authProvider_) {\r\n var _this = this;\r\n this.appName_ = appName_;\r\n this.firebaseOptions_ = firebaseOptions_;\r\n this.authProvider_ = authProvider_;\r\n this.auth_ = null;\r\n this.auth_ = authProvider_.getImmediate({ optional: true });\r\n if (!this.auth_) {\r\n authProvider_.onInit(function (auth) { return (_this.auth_ = auth); });\r\n }\r\n }\r\n FirebaseAuthTokenProvider.prototype.getToken = function (forceRefresh) {\r\n var _this = this;\r\n if (!this.auth_) {\r\n return new Promise(function (resolve, reject) {\r\n // Support delayed initialization of FirebaseAuth. This allows our\r\n // customers to initialize the RTDB SDK before initializing Firebase\r\n // Auth and ensures that all requests are authenticated if a token\r\n // becomes available before the timoeout below expires.\r\n setTimeout(function () {\r\n if (_this.auth_) {\r\n _this.getToken(forceRefresh).then(resolve, reject);\r\n }\r\n else {\r\n resolve(null);\r\n }\r\n }, 0);\r\n });\r\n }\r\n return this.auth_.getToken(forceRefresh).catch(function (error) {\r\n // TODO: Need to figure out all the cases this is raised and whether\r\n // this makes sense.\r\n if (error && error.code === 'auth/token-not-initialized') {\r\n log('Got auth/token-not-initialized error. Treating as null token.');\r\n return null;\r\n }\r\n else {\r\n return Promise.reject(error);\r\n }\r\n });\r\n };\r\n FirebaseAuthTokenProvider.prototype.addTokenChangeListener = function (listener) {\r\n // TODO: We might want to wrap the listener and call it with no args to\r\n // avoid a leaky abstraction, but that makes removing the listener harder.\r\n if (this.auth_) {\r\n this.auth_.addAuthTokenListener(listener);\r\n }\r\n else {\r\n this.authProvider_\r\n .get()\r\n .then(function (auth) { return auth.addAuthTokenListener(listener); });\r\n }\r\n };\r\n FirebaseAuthTokenProvider.prototype.removeTokenChangeListener = function (listener) {\r\n this.authProvider_\r\n .get()\r\n .then(function (auth) { return auth.removeAuthTokenListener(listener); });\r\n };\r\n FirebaseAuthTokenProvider.prototype.notifyForInvalidToken = function () {\r\n var errorMessage = 'Provided authentication credentials for the app named \"' +\r\n this.appName_ +\r\n '\" are invalid. This usually indicates your app was not ' +\r\n 'initialized correctly. ';\r\n if ('credential' in this.firebaseOptions_) {\r\n errorMessage +=\r\n 'Make sure the \"credential\" property provided to initializeApp() ' +\r\n 'is authorized to access the specified \"databaseURL\" and is from the correct ' +\r\n 'project.';\r\n }\r\n else if ('serviceAccount' in this.firebaseOptions_) {\r\n errorMessage +=\r\n 'Make sure the \"serviceAccount\" property provided to initializeApp() ' +\r\n 'is authorized to access the specified \"databaseURL\" and is from the correct ' +\r\n 'project.';\r\n }\r\n else {\r\n errorMessage +=\r\n 'Make sure the \"apiKey\" and \"databaseURL\" properties provided to ' +\r\n 'initializeApp() match the values provided for your app at ' +\r\n 'https://console.firebase.google.com/.';\r\n }\r\n warn(errorMessage);\r\n };\r\n return FirebaseAuthTokenProvider;\r\n}());\r\n/* AuthTokenProvider that supplies a constant token. Used by Admin SDK or mockUserToken with emulators. */\r\nvar EmulatorTokenProvider = /** @class */ (function () {\r\n function EmulatorTokenProvider(accessToken) {\r\n this.accessToken = accessToken;\r\n }\r\n EmulatorTokenProvider.prototype.getToken = function (forceRefresh) {\r\n return Promise.resolve({\r\n accessToken: this.accessToken\r\n });\r\n };\r\n EmulatorTokenProvider.prototype.addTokenChangeListener = function (listener) {\r\n // Invoke the listener immediately to match the behavior in Firebase Auth\r\n // (see packages/auth/src/auth.js#L1807)\r\n listener(this.accessToken);\r\n };\r\n EmulatorTokenProvider.prototype.removeTokenChangeListener = function (listener) { };\r\n EmulatorTokenProvider.prototype.notifyForInvalidToken = function () { };\r\n /** A string that is treated as an admin access token by the RTDB emulator. Used by Admin SDK. */\r\n EmulatorTokenProvider.OWNER = 'owner';\r\n return EmulatorTokenProvider;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar PROTOCOL_VERSION = '5';\r\nvar VERSION_PARAM = 'v';\r\nvar TRANSPORT_SESSION_PARAM = 's';\r\nvar REFERER_PARAM = 'r';\r\nvar FORGE_REF = 'f';\r\n// Matches console.firebase.google.com, firebase-console-*.corp.google.com and\r\n// firebase.corp.google.com\r\nvar FORGE_DOMAIN_RE = /(console\\.firebase|firebase-console-\\w+\\.corp|firebase\\.corp)\\.google\\.com/;\r\nvar LAST_SESSION_PARAM = 'ls';\r\nvar APPLICATION_ID_PARAM = 'p';\r\nvar APP_CHECK_TOKEN_PARAM = 'ac';\r\nvar WEBSOCKET = 'websocket';\r\nvar LONG_POLLING = 'long_polling';\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A class that holds metadata about a Repo object\r\n */\r\nvar RepoInfo = /** @class */ (function () {\r\n /**\r\n * @param host - Hostname portion of the url for the repo\r\n * @param secure - Whether or not this repo is accessed over ssl\r\n * @param namespace - The namespace represented by the repo\r\n * @param webSocketOnly - Whether to prefer websockets over all other transports (used by Nest).\r\n * @param nodeAdmin - Whether this instance uses Admin SDK credentials\r\n * @param persistenceKey - Override the default session persistence storage key\r\n */\r\n function RepoInfo(host, secure, namespace, webSocketOnly, nodeAdmin, persistenceKey, includeNamespaceInQueryParams) {\r\n if (nodeAdmin === void 0) { nodeAdmin = false; }\r\n if (persistenceKey === void 0) { persistenceKey = ''; }\r\n if (includeNamespaceInQueryParams === void 0) { includeNamespaceInQueryParams = false; }\r\n this.secure = secure;\r\n this.namespace = namespace;\r\n this.webSocketOnly = webSocketOnly;\r\n this.nodeAdmin = nodeAdmin;\r\n this.persistenceKey = persistenceKey;\r\n this.includeNamespaceInQueryParams = includeNamespaceInQueryParams;\r\n this._host = host.toLowerCase();\r\n this._domain = this._host.substr(this._host.indexOf('.') + 1);\r\n this.internalHost =\r\n PersistentStorage.get('host:' + host) || this._host;\r\n }\r\n RepoInfo.prototype.isCacheableHost = function () {\r\n return this.internalHost.substr(0, 2) === 's-';\r\n };\r\n RepoInfo.prototype.isCustomHost = function () {\r\n return (this._domain !== 'firebaseio.com' &&\r\n this._domain !== 'firebaseio-demo.com');\r\n };\r\n Object.defineProperty(RepoInfo.prototype, \"host\", {\r\n get: function () {\r\n return this._host;\r\n },\r\n set: function (newHost) {\r\n if (newHost !== this.internalHost) {\r\n this.internalHost = newHost;\r\n if (this.isCacheableHost()) {\r\n PersistentStorage.set('host:' + this._host, this.internalHost);\r\n }\r\n }\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n RepoInfo.prototype.toString = function () {\r\n var str = this.toURLString();\r\n if (this.persistenceKey) {\r\n str += '<' + this.persistenceKey + '>';\r\n }\r\n return str;\r\n };\r\n RepoInfo.prototype.toURLString = function () {\r\n var protocol = this.secure ? 'https://' : 'http://';\r\n var query = this.includeNamespaceInQueryParams\r\n ? \"?ns=\" + this.namespace\r\n : '';\r\n return \"\" + protocol + this.host + \"/\" + query;\r\n };\r\n return RepoInfo;\r\n}());\r\nfunction repoInfoNeedsQueryParam(repoInfo) {\r\n return (repoInfo.host !== repoInfo.internalHost ||\r\n repoInfo.isCustomHost() ||\r\n repoInfo.includeNamespaceInQueryParams);\r\n}\r\n/**\r\n * Returns the websocket URL for this repo\r\n * @param repoInfo - RepoInfo object\r\n * @param type - of connection\r\n * @param params - list\r\n * @returns The URL for this repo\r\n */\r\nfunction repoInfoConnectionURL(repoInfo, type, params) {\r\n assert(typeof type === 'string', 'typeof type must == string');\r\n assert(typeof params === 'object', 'typeof params must == object');\r\n var connURL;\r\n if (type === WEBSOCKET) {\r\n connURL =\r\n (repoInfo.secure ? 'wss://' : 'ws://') + repoInfo.internalHost + '/.ws?';\r\n }\r\n else if (type === LONG_POLLING) {\r\n connURL =\r\n (repoInfo.secure ? 'https://' : 'http://') +\r\n repoInfo.internalHost +\r\n '/.lp?';\r\n }\r\n else {\r\n throw new Error('Unknown connection type: ' + type);\r\n }\r\n if (repoInfoNeedsQueryParam(repoInfo)) {\r\n params['ns'] = repoInfo.namespace;\r\n }\r\n var pairs = [];\r\n each(params, function (key, value) {\r\n pairs.push(key + '=' + value);\r\n });\r\n return connURL + pairs.join('&');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Tracks a collection of stats.\r\n */\r\nvar StatsCollection = /** @class */ (function () {\r\n function StatsCollection() {\r\n this.counters_ = {};\r\n }\r\n StatsCollection.prototype.incrementCounter = function (name, amount) {\r\n if (amount === void 0) { amount = 1; }\r\n if (!contains(this.counters_, name)) {\r\n this.counters_[name] = 0;\r\n }\r\n this.counters_[name] += amount;\r\n };\r\n StatsCollection.prototype.get = function () {\r\n return deepCopy(this.counters_);\r\n };\r\n return StatsCollection;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar collections = {};\r\nvar reporters = {};\r\nfunction statsManagerGetCollection(repoInfo) {\r\n var hashString = repoInfo.toString();\r\n if (!collections[hashString]) {\r\n collections[hashString] = new StatsCollection();\r\n }\r\n return collections[hashString];\r\n}\r\nfunction statsManagerGetOrCreateReporter(repoInfo, creatorFunction) {\r\n var hashString = repoInfo.toString();\r\n if (!reporters[hashString]) {\r\n reporters[hashString] = creatorFunction();\r\n }\r\n return reporters[hashString];\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * This class ensures the packets from the server arrive in order\r\n * This class takes data from the server and ensures it gets passed into the callbacks in order.\r\n */\r\nvar PacketReceiver = /** @class */ (function () {\r\n /**\r\n * @param onMessage_\r\n */\r\n function PacketReceiver(onMessage_) {\r\n this.onMessage_ = onMessage_;\r\n this.pendingResponses = [];\r\n this.currentResponseNum = 0;\r\n this.closeAfterResponse = -1;\r\n this.onClose = null;\r\n }\r\n PacketReceiver.prototype.closeAfter = function (responseNum, callback) {\r\n this.closeAfterResponse = responseNum;\r\n this.onClose = callback;\r\n if (this.closeAfterResponse < this.currentResponseNum) {\r\n this.onClose();\r\n this.onClose = null;\r\n }\r\n };\r\n /**\r\n * Each message from the server comes with a response number, and an array of data. The responseNumber\r\n * allows us to ensure that we process them in the right order, since we can't be guaranteed that all\r\n * browsers will respond in the same order as the requests we sent\r\n */\r\n PacketReceiver.prototype.handleResponse = function (requestNum, data) {\r\n var _this = this;\r\n this.pendingResponses[requestNum] = data;\r\n var _loop_1 = function () {\r\n var toProcess = this_1.pendingResponses[this_1.currentResponseNum];\r\n delete this_1.pendingResponses[this_1.currentResponseNum];\r\n var _loop_2 = function (i) {\r\n if (toProcess[i]) {\r\n exceptionGuard(function () {\r\n _this.onMessage_(toProcess[i]);\r\n });\r\n }\r\n };\r\n for (var i = 0; i < toProcess.length; ++i) {\r\n _loop_2(i);\r\n }\r\n if (this_1.currentResponseNum === this_1.closeAfterResponse) {\r\n if (this_1.onClose) {\r\n this_1.onClose();\r\n this_1.onClose = null;\r\n }\r\n return \"break\";\r\n }\r\n this_1.currentResponseNum++;\r\n };\r\n var this_1 = this;\r\n while (this.pendingResponses[this.currentResponseNum]) {\r\n var state_1 = _loop_1();\r\n if (state_1 === \"break\")\r\n break;\r\n }\r\n };\r\n return PacketReceiver;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// URL query parameters associated with longpolling\r\nvar FIREBASE_LONGPOLL_START_PARAM = 'start';\r\nvar FIREBASE_LONGPOLL_CLOSE_COMMAND = 'close';\r\nvar FIREBASE_LONGPOLL_COMMAND_CB_NAME = 'pLPCommand';\r\nvar FIREBASE_LONGPOLL_DATA_CB_NAME = 'pRTLPCB';\r\nvar FIREBASE_LONGPOLL_ID_PARAM = 'id';\r\nvar FIREBASE_LONGPOLL_PW_PARAM = 'pw';\r\nvar FIREBASE_LONGPOLL_SERIAL_PARAM = 'ser';\r\nvar FIREBASE_LONGPOLL_CALLBACK_ID_PARAM = 'cb';\r\nvar FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM = 'seg';\r\nvar FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET = 'ts';\r\nvar FIREBASE_LONGPOLL_DATA_PARAM = 'd';\r\nvar FIREBASE_LONGPOLL_DISCONN_FRAME_REQUEST_PARAM = 'dframe';\r\n//Data size constants.\r\n//TODO: Perf: the maximum length actually differs from browser to browser.\r\n// We should check what browser we're on and set accordingly.\r\nvar MAX_URL_DATA_SIZE = 1870;\r\nvar SEG_HEADER_SIZE = 30; //ie: &seg=8299234&ts=982389123&d=\r\nvar MAX_PAYLOAD_SIZE = MAX_URL_DATA_SIZE - SEG_HEADER_SIZE;\r\n/**\r\n * Keepalive period\r\n * send a fresh request at minimum every 25 seconds. Opera has a maximum request\r\n * length of 30 seconds that we can't exceed.\r\n */\r\nvar KEEPALIVE_REQUEST_INTERVAL = 25000;\r\n/**\r\n * How long to wait before aborting a long-polling connection attempt.\r\n */\r\nvar LP_CONNECT_TIMEOUT = 30000;\r\n/**\r\n * This class manages a single long-polling connection.\r\n */\r\nvar BrowserPollConnection = /** @class */ (function () {\r\n /**\r\n * @param connId An identifier for this connection, used for logging\r\n * @param repoInfo The info for the endpoint to send data to.\r\n * @param applicationId The Firebase App ID for this project.\r\n * @param appCheckToken The AppCheck token for this client.\r\n * @param authToken The AuthToken to use for this connection.\r\n * @param transportSessionId Optional transportSessionid if we are\r\n * reconnecting for an existing transport session\r\n * @param lastSessionId Optional lastSessionId if the PersistentConnection has\r\n * already created a connection previously\r\n */\r\n function BrowserPollConnection(connId, repoInfo, applicationId, appCheckToken, authToken, transportSessionId, lastSessionId) {\r\n var _this = this;\r\n this.connId = connId;\r\n this.repoInfo = repoInfo;\r\n this.applicationId = applicationId;\r\n this.appCheckToken = appCheckToken;\r\n this.authToken = authToken;\r\n this.transportSessionId = transportSessionId;\r\n this.lastSessionId = lastSessionId;\r\n this.bytesSent = 0;\r\n this.bytesReceived = 0;\r\n this.everConnected_ = false;\r\n this.log_ = logWrapper(connId);\r\n this.stats_ = statsManagerGetCollection(repoInfo);\r\n this.urlFn = function (params) {\r\n // Always add the token if we have one.\r\n if (_this.appCheckToken) {\r\n params[APP_CHECK_TOKEN_PARAM] = _this.appCheckToken;\r\n }\r\n return repoInfoConnectionURL(repoInfo, LONG_POLLING, params);\r\n };\r\n }\r\n /**\r\n * @param onMessage - Callback when messages arrive\r\n * @param onDisconnect - Callback with connection lost.\r\n */\r\n BrowserPollConnection.prototype.open = function (onMessage, onDisconnect) {\r\n var _this = this;\r\n this.curSegmentNum = 0;\r\n this.onDisconnect_ = onDisconnect;\r\n this.myPacketOrderer = new PacketReceiver(onMessage);\r\n this.isClosed_ = false;\r\n this.connectTimeoutTimer_ = setTimeout(function () {\r\n _this.log_('Timed out trying to connect.');\r\n // Make sure we clear the host cache\r\n _this.onClosed_();\r\n _this.connectTimeoutTimer_ = null;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n }, Math.floor(LP_CONNECT_TIMEOUT));\r\n // Ensure we delay the creation of the iframe until the DOM is loaded.\r\n executeWhenDOMReady(function () {\r\n if (_this.isClosed_) {\r\n return;\r\n }\r\n //Set up a callback that gets triggered once a connection is set up.\r\n _this.scriptTagHolder = new FirebaseIFrameScriptHolder(function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var _a = __read(args, 5), command = _a[0], arg1 = _a[1], arg2 = _a[2]; _a[3]; _a[4];\r\n _this.incrementIncomingBytes_(args);\r\n if (!_this.scriptTagHolder) {\r\n return; // we closed the connection.\r\n }\r\n if (_this.connectTimeoutTimer_) {\r\n clearTimeout(_this.connectTimeoutTimer_);\r\n _this.connectTimeoutTimer_ = null;\r\n }\r\n _this.everConnected_ = true;\r\n if (command === FIREBASE_LONGPOLL_START_PARAM) {\r\n _this.id = arg1;\r\n _this.password = arg2;\r\n }\r\n else if (command === FIREBASE_LONGPOLL_CLOSE_COMMAND) {\r\n // Don't clear the host cache. We got a response from the server, so we know it's reachable\r\n if (arg1) {\r\n // We aren't expecting any more data (other than what the server's already in the process of sending us\r\n // through our already open polls), so don't send any more.\r\n _this.scriptTagHolder.sendNewPolls = false;\r\n // arg1 in this case is the last response number sent by the server. We should try to receive\r\n // all of the responses up to this one before closing\r\n _this.myPacketOrderer.closeAfter(arg1, function () {\r\n _this.onClosed_();\r\n });\r\n }\r\n else {\r\n _this.onClosed_();\r\n }\r\n }\r\n else {\r\n throw new Error('Unrecognized command received: ' + command);\r\n }\r\n }, function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var _a = __read(args, 2), pN = _a[0], data = _a[1];\r\n _this.incrementIncomingBytes_(args);\r\n _this.myPacketOrderer.handleResponse(pN, data);\r\n }, function () {\r\n _this.onClosed_();\r\n }, _this.urlFn);\r\n //Send the initial request to connect. The serial number is simply to keep the browser from pulling previous results\r\n //from cache.\r\n var urlParams = {};\r\n urlParams[FIREBASE_LONGPOLL_START_PARAM] = 't';\r\n urlParams[FIREBASE_LONGPOLL_SERIAL_PARAM] = Math.floor(Math.random() * 100000000);\r\n if (_this.scriptTagHolder.uniqueCallbackIdentifier) {\r\n urlParams[FIREBASE_LONGPOLL_CALLBACK_ID_PARAM] = _this.scriptTagHolder.uniqueCallbackIdentifier;\r\n }\r\n urlParams[VERSION_PARAM] = PROTOCOL_VERSION;\r\n if (_this.transportSessionId) {\r\n urlParams[TRANSPORT_SESSION_PARAM] = _this.transportSessionId;\r\n }\r\n if (_this.lastSessionId) {\r\n urlParams[LAST_SESSION_PARAM] = _this.lastSessionId;\r\n }\r\n if (_this.applicationId) {\r\n urlParams[APPLICATION_ID_PARAM] = _this.applicationId;\r\n }\r\n if (_this.appCheckToken) {\r\n urlParams[APP_CHECK_TOKEN_PARAM] = _this.appCheckToken;\r\n }\r\n if (typeof location !== 'undefined' &&\r\n location.hostname &&\r\n FORGE_DOMAIN_RE.test(location.hostname)) {\r\n urlParams[REFERER_PARAM] = FORGE_REF;\r\n }\r\n var connectURL = _this.urlFn(urlParams);\r\n _this.log_('Connecting via long-poll to ' + connectURL);\r\n _this.scriptTagHolder.addTag(connectURL, function () {\r\n /* do nothing */\r\n });\r\n });\r\n };\r\n /**\r\n * Call this when a handshake has completed successfully and we want to consider the connection established\r\n */\r\n BrowserPollConnection.prototype.start = function () {\r\n this.scriptTagHolder.startLongPoll(this.id, this.password);\r\n this.addDisconnectPingFrame(this.id, this.password);\r\n };\r\n /**\r\n * Forces long polling to be considered as a potential transport\r\n */\r\n BrowserPollConnection.forceAllow = function () {\r\n BrowserPollConnection.forceAllow_ = true;\r\n };\r\n /**\r\n * Forces longpolling to not be considered as a potential transport\r\n */\r\n BrowserPollConnection.forceDisallow = function () {\r\n BrowserPollConnection.forceDisallow_ = true;\r\n };\r\n // Static method, use string literal so it can be accessed in a generic way\r\n BrowserPollConnection.isAvailable = function () {\r\n if (isNodeSdk()) {\r\n return false;\r\n }\r\n else if (BrowserPollConnection.forceAllow_) {\r\n return true;\r\n }\r\n else {\r\n // NOTE: In React-Native there's normally no 'document', but if you debug a React-Native app in\r\n // the Chrome debugger, 'document' is defined, but document.createElement is null (2015/06/08).\r\n return (!BrowserPollConnection.forceDisallow_ &&\r\n typeof document !== 'undefined' &&\r\n document.createElement != null &&\r\n !isChromeExtensionContentScript() &&\r\n !isWindowsStoreApp());\r\n }\r\n };\r\n /**\r\n * No-op for polling\r\n */\r\n BrowserPollConnection.prototype.markConnectionHealthy = function () { };\r\n /**\r\n * Stops polling and cleans up the iframe\r\n */\r\n BrowserPollConnection.prototype.shutdown_ = function () {\r\n this.isClosed_ = true;\r\n if (this.scriptTagHolder) {\r\n this.scriptTagHolder.close();\r\n this.scriptTagHolder = null;\r\n }\r\n //remove the disconnect frame, which will trigger an XHR call to the server to tell it we're leaving.\r\n if (this.myDisconnFrame) {\r\n document.body.removeChild(this.myDisconnFrame);\r\n this.myDisconnFrame = null;\r\n }\r\n if (this.connectTimeoutTimer_) {\r\n clearTimeout(this.connectTimeoutTimer_);\r\n this.connectTimeoutTimer_ = null;\r\n }\r\n };\r\n /**\r\n * Triggered when this transport is closed\r\n */\r\n BrowserPollConnection.prototype.onClosed_ = function () {\r\n if (!this.isClosed_) {\r\n this.log_('Longpoll is closing itself');\r\n this.shutdown_();\r\n if (this.onDisconnect_) {\r\n this.onDisconnect_(this.everConnected_);\r\n this.onDisconnect_ = null;\r\n }\r\n }\r\n };\r\n /**\r\n * External-facing close handler. RealTime has requested we shut down. Kill our connection and tell the server\r\n * that we've left.\r\n */\r\n BrowserPollConnection.prototype.close = function () {\r\n if (!this.isClosed_) {\r\n this.log_('Longpoll is being closed.');\r\n this.shutdown_();\r\n }\r\n };\r\n /**\r\n * Send the JSON object down to the server. It will need to be stringified, base64 encoded, and then\r\n * broken into chunks (since URLs have a small maximum length).\r\n * @param data - The JSON data to transmit.\r\n */\r\n BrowserPollConnection.prototype.send = function (data) {\r\n var dataStr = stringify(data);\r\n this.bytesSent += dataStr.length;\r\n this.stats_.incrementCounter('bytes_sent', dataStr.length);\r\n //first, lets get the base64-encoded data\r\n var base64data = base64Encode(dataStr);\r\n //We can only fit a certain amount in each URL, so we need to split this request\r\n //up into multiple pieces if it doesn't fit in one request.\r\n var dataSegs = splitStringBySize(base64data, MAX_PAYLOAD_SIZE);\r\n //Enqueue each segment for transmission. We assign each chunk a sequential ID and a total number\r\n //of segments so that we can reassemble the packet on the server.\r\n for (var i = 0; i < dataSegs.length; i++) {\r\n this.scriptTagHolder.enqueueSegment(this.curSegmentNum, dataSegs.length, dataSegs[i]);\r\n this.curSegmentNum++;\r\n }\r\n };\r\n /**\r\n * This is how we notify the server that we're leaving.\r\n * We aren't able to send requests with DHTML on a window close event, but we can\r\n * trigger XHR requests in some browsers (everything but Opera basically).\r\n */\r\n BrowserPollConnection.prototype.addDisconnectPingFrame = function (id, pw) {\r\n if (isNodeSdk()) {\r\n return;\r\n }\r\n this.myDisconnFrame = document.createElement('iframe');\r\n var urlParams = {};\r\n urlParams[FIREBASE_LONGPOLL_DISCONN_FRAME_REQUEST_PARAM] = 't';\r\n urlParams[FIREBASE_LONGPOLL_ID_PARAM] = id;\r\n urlParams[FIREBASE_LONGPOLL_PW_PARAM] = pw;\r\n this.myDisconnFrame.src = this.urlFn(urlParams);\r\n this.myDisconnFrame.style.display = 'none';\r\n document.body.appendChild(this.myDisconnFrame);\r\n };\r\n /**\r\n * Used to track the bytes received by this client\r\n */\r\n BrowserPollConnection.prototype.incrementIncomingBytes_ = function (args) {\r\n // TODO: This is an annoying perf hit just to track the number of incoming bytes. Maybe it should be opt-in.\r\n var bytesReceived = stringify(args).length;\r\n this.bytesReceived += bytesReceived;\r\n this.stats_.incrementCounter('bytes_received', bytesReceived);\r\n };\r\n return BrowserPollConnection;\r\n}());\r\n/*********************************************************************************************\r\n * A wrapper around an iframe that is used as a long-polling script holder.\r\n *********************************************************************************************/\r\nvar FirebaseIFrameScriptHolder = /** @class */ (function () {\r\n /**\r\n * @param commandCB - The callback to be called when control commands are recevied from the server.\r\n * @param onMessageCB - The callback to be triggered when responses arrive from the server.\r\n * @param onDisconnect - The callback to be triggered when this tag holder is closed\r\n * @param urlFn - A function that provides the URL of the endpoint to send data to.\r\n */\r\n function FirebaseIFrameScriptHolder(commandCB, onMessageCB, onDisconnect, urlFn) {\r\n this.onDisconnect = onDisconnect;\r\n this.urlFn = urlFn;\r\n //We maintain a count of all of the outstanding requests, because if we have too many active at once it can cause\r\n //problems in some browsers.\r\n this.outstandingRequests = new Set();\r\n //A queue of the pending segments waiting for transmission to the server.\r\n this.pendingSegs = [];\r\n //A serial number. We use this for two things:\r\n // 1) A way to ensure the browser doesn't cache responses to polls\r\n // 2) A way to make the server aware when long-polls arrive in a different order than we started them. The\r\n // server needs to release both polls in this case or it will cause problems in Opera since Opera can only execute\r\n // JSONP code in the order it was added to the iframe.\r\n this.currentSerial = Math.floor(Math.random() * 100000000);\r\n // This gets set to false when we're \"closing down\" the connection (e.g. we're switching transports but there's still\r\n // incoming data from the server that we're waiting for).\r\n this.sendNewPolls = true;\r\n if (!isNodeSdk()) {\r\n //Each script holder registers a couple of uniquely named callbacks with the window. These are called from the\r\n //iframes where we put the long-polling script tags. We have two callbacks:\r\n // 1) Command Callback - Triggered for control issues, like starting a connection.\r\n // 2) Message Callback - Triggered when new data arrives.\r\n this.uniqueCallbackIdentifier = LUIDGenerator();\r\n window[FIREBASE_LONGPOLL_COMMAND_CB_NAME + this.uniqueCallbackIdentifier] = commandCB;\r\n window[FIREBASE_LONGPOLL_DATA_CB_NAME + this.uniqueCallbackIdentifier] = onMessageCB;\r\n //Create an iframe for us to add script tags to.\r\n this.myIFrame = FirebaseIFrameScriptHolder.createIFrame_();\r\n // Set the iframe's contents.\r\n var script = '';\r\n // if we set a javascript url, it's IE and we need to set the document domain. The javascript url is sufficient\r\n // for ie9, but ie8 needs to do it again in the document itself.\r\n if (this.myIFrame.src &&\r\n this.myIFrame.src.substr(0, 'javascript:'.length) === 'javascript:') {\r\n var currentDomain = document.domain;\r\n script = '';\r\n }\r\n var iframeContents = '' + script + '';\r\n try {\r\n this.myIFrame.doc.open();\r\n this.myIFrame.doc.write(iframeContents);\r\n this.myIFrame.doc.close();\r\n }\r\n catch (e) {\r\n log('frame writing exception');\r\n if (e.stack) {\r\n log(e.stack);\r\n }\r\n log(e);\r\n }\r\n }\r\n else {\r\n this.commandCB = commandCB;\r\n this.onMessageCB = onMessageCB;\r\n }\r\n }\r\n /**\r\n * Each browser has its own funny way to handle iframes. Here we mush them all together into one object that I can\r\n * actually use.\r\n */\r\n FirebaseIFrameScriptHolder.createIFrame_ = function () {\r\n var iframe = document.createElement('iframe');\r\n iframe.style.display = 'none';\r\n // This is necessary in order to initialize the document inside the iframe\r\n if (document.body) {\r\n document.body.appendChild(iframe);\r\n try {\r\n // If document.domain has been modified in IE, this will throw an error, and we need to set the\r\n // domain of the iframe's document manually. We can do this via a javascript: url as the src attribute\r\n // Also note that we must do this *after* the iframe has been appended to the page. Otherwise it doesn't work.\r\n var a = iframe.contentWindow.document;\r\n if (!a) {\r\n // Apologies for the log-spam, I need to do something to keep closure from optimizing out the assignment above.\r\n log('No IE domain setting required');\r\n }\r\n }\r\n catch (e) {\r\n var domain = document.domain;\r\n iframe.src =\r\n \"javascript:void((function(){document.open();document.domain='\" +\r\n domain +\r\n \"';document.close();})())\";\r\n }\r\n }\r\n else {\r\n // LongPollConnection attempts to delay initialization until the document is ready, so hopefully this\r\n // never gets hit.\r\n throw 'Document body has not initialized. Wait to initialize Firebase until after the document is ready.';\r\n }\r\n // Get the document of the iframe in a browser-specific way.\r\n if (iframe.contentDocument) {\r\n iframe.doc = iframe.contentDocument; // Firefox, Opera, Safari\r\n }\r\n else if (iframe.contentWindow) {\r\n iframe.doc = iframe.contentWindow.document; // Internet Explorer\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n }\r\n else if (iframe.document) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n iframe.doc = iframe.document; //others?\r\n }\r\n return iframe;\r\n };\r\n /**\r\n * Cancel all outstanding queries and remove the frame.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.close = function () {\r\n var _this = this;\r\n //Mark this iframe as dead, so no new requests are sent.\r\n this.alive = false;\r\n if (this.myIFrame) {\r\n //We have to actually remove all of the html inside this iframe before removing it from the\r\n //window, or IE will continue loading and executing the script tags we've already added, which\r\n //can lead to some errors being thrown. Setting innerHTML seems to be the easiest way to do this.\r\n this.myIFrame.doc.body.innerHTML = '';\r\n setTimeout(function () {\r\n if (_this.myIFrame !== null) {\r\n document.body.removeChild(_this.myIFrame);\r\n _this.myIFrame = null;\r\n }\r\n }, Math.floor(0));\r\n }\r\n // Protect from being called recursively.\r\n var onDisconnect = this.onDisconnect;\r\n if (onDisconnect) {\r\n this.onDisconnect = null;\r\n onDisconnect();\r\n }\r\n };\r\n /**\r\n * Actually start the long-polling session by adding the first script tag(s) to the iframe.\r\n * @param id - The ID of this connection\r\n * @param pw - The password for this connection\r\n */\r\n FirebaseIFrameScriptHolder.prototype.startLongPoll = function (id, pw) {\r\n this.myID = id;\r\n this.myPW = pw;\r\n this.alive = true;\r\n //send the initial request. If there are requests queued, make sure that we transmit as many as we are currently able to.\r\n while (this.newRequest_()) { }\r\n };\r\n /**\r\n * This is called any time someone might want a script tag to be added. It adds a script tag when there aren't\r\n * too many outstanding requests and we are still alive.\r\n *\r\n * If there are outstanding packet segments to send, it sends one. If there aren't, it sends a long-poll anyways if\r\n * needed.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.newRequest_ = function () {\r\n // We keep one outstanding request open all the time to receive data, but if we need to send data\r\n // (pendingSegs.length > 0) then we create a new request to send the data. The server will automatically\r\n // close the old request.\r\n if (this.alive &&\r\n this.sendNewPolls &&\r\n this.outstandingRequests.size < (this.pendingSegs.length > 0 ? 2 : 1)) {\r\n //construct our url\r\n this.currentSerial++;\r\n var urlParams = {};\r\n urlParams[FIREBASE_LONGPOLL_ID_PARAM] = this.myID;\r\n urlParams[FIREBASE_LONGPOLL_PW_PARAM] = this.myPW;\r\n urlParams[FIREBASE_LONGPOLL_SERIAL_PARAM] = this.currentSerial;\r\n var theURL = this.urlFn(urlParams);\r\n //Now add as much data as we can.\r\n var curDataString = '';\r\n var i = 0;\r\n while (this.pendingSegs.length > 0) {\r\n //first, lets see if the next segment will fit.\r\n var nextSeg = this.pendingSegs[0];\r\n if (nextSeg.d.length +\r\n SEG_HEADER_SIZE +\r\n curDataString.length <=\r\n MAX_URL_DATA_SIZE) {\r\n //great, the segment will fit. Lets append it.\r\n var theSeg = this.pendingSegs.shift();\r\n curDataString =\r\n curDataString +\r\n '&' +\r\n FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM +\r\n i +\r\n '=' +\r\n theSeg.seg +\r\n '&' +\r\n FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET +\r\n i +\r\n '=' +\r\n theSeg.ts +\r\n '&' +\r\n FIREBASE_LONGPOLL_DATA_PARAM +\r\n i +\r\n '=' +\r\n theSeg.d;\r\n i++;\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n theURL = theURL + curDataString;\r\n this.addLongPollTag_(theURL, this.currentSerial);\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n /**\r\n * Queue a packet for transmission to the server.\r\n * @param segnum - A sequential id for this packet segment used for reassembly\r\n * @param totalsegs - The total number of segments in this packet\r\n * @param data - The data for this segment.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.enqueueSegment = function (segnum, totalsegs, data) {\r\n //add this to the queue of segments to send.\r\n this.pendingSegs.push({ seg: segnum, ts: totalsegs, d: data });\r\n //send the data immediately if there isn't already data being transmitted, unless\r\n //startLongPoll hasn't been called yet.\r\n if (this.alive) {\r\n this.newRequest_();\r\n }\r\n };\r\n /**\r\n * Add a script tag for a regular long-poll request.\r\n * @param url - The URL of the script tag.\r\n * @param serial - The serial number of the request.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.addLongPollTag_ = function (url, serial) {\r\n var _this = this;\r\n //remember that we sent this request.\r\n this.outstandingRequests.add(serial);\r\n var doNewRequest = function () {\r\n _this.outstandingRequests.delete(serial);\r\n _this.newRequest_();\r\n };\r\n // If this request doesn't return on its own accord (by the server sending us some data), we'll\r\n // create a new one after the KEEPALIVE interval to make sure we always keep a fresh request open.\r\n var keepaliveTimeout = setTimeout(doNewRequest, Math.floor(KEEPALIVE_REQUEST_INTERVAL));\r\n var readyStateCB = function () {\r\n // Request completed. Cancel the keepalive.\r\n clearTimeout(keepaliveTimeout);\r\n // Trigger a new request so we can continue receiving data.\r\n doNewRequest();\r\n };\r\n this.addTag(url, readyStateCB);\r\n };\r\n /**\r\n * Add an arbitrary script tag to the iframe.\r\n * @param url - The URL for the script tag source.\r\n * @param loadCB - A callback to be triggered once the script has loaded.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.addTag = function (url, loadCB) {\r\n var _this = this;\r\n if (isNodeSdk()) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n this.doNodeLongPoll(url, loadCB);\r\n }\r\n else {\r\n setTimeout(function () {\r\n try {\r\n // if we're already closed, don't add this poll\r\n if (!_this.sendNewPolls) {\r\n return;\r\n }\r\n var newScript_1 = _this.myIFrame.doc.createElement('script');\r\n newScript_1.type = 'text/javascript';\r\n newScript_1.async = true;\r\n newScript_1.src = url;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n newScript_1.onload = newScript_1.onreadystatechange = function () {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n var rstate = newScript_1.readyState;\r\n if (!rstate || rstate === 'loaded' || rstate === 'complete') {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n newScript_1.onload = newScript_1.onreadystatechange = null;\r\n if (newScript_1.parentNode) {\r\n newScript_1.parentNode.removeChild(newScript_1);\r\n }\r\n loadCB();\r\n }\r\n };\r\n newScript_1.onerror = function () {\r\n log('Long-poll script failed to load: ' + url);\r\n _this.sendNewPolls = false;\r\n _this.close();\r\n };\r\n _this.myIFrame.doc.body.appendChild(newScript_1);\r\n }\r\n catch (e) {\r\n // TODO: we should make this error visible somehow\r\n }\r\n }, Math.floor(1));\r\n }\r\n };\r\n return FirebaseIFrameScriptHolder;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar WEBSOCKET_MAX_FRAME_SIZE = 16384;\r\nvar WEBSOCKET_KEEPALIVE_INTERVAL = 45000;\r\nvar WebSocketImpl = null;\r\nif (typeof MozWebSocket !== 'undefined') {\r\n WebSocketImpl = MozWebSocket;\r\n}\r\nelse if (typeof WebSocket !== 'undefined') {\r\n WebSocketImpl = WebSocket;\r\n}\r\n/**\r\n * Create a new websocket connection with the given callbacks.\r\n */\r\nvar WebSocketConnection = /** @class */ (function () {\r\n /**\r\n * @param connId identifier for this transport\r\n * @param repoInfo The info for the websocket endpoint.\r\n * @param applicationId The Firebase App ID for this project.\r\n * @param appCheckToken The App Check Token for this client.\r\n * @param authToken The Auth Token for this client.\r\n * @param transportSessionId Optional transportSessionId if this is connecting\r\n * to an existing transport session\r\n * @param lastSessionId Optional lastSessionId if there was a previous\r\n * connection\r\n */\r\n function WebSocketConnection(connId, repoInfo, applicationId, appCheckToken, authToken, transportSessionId, lastSessionId) {\r\n this.connId = connId;\r\n this.applicationId = applicationId;\r\n this.appCheckToken = appCheckToken;\r\n this.authToken = authToken;\r\n this.keepaliveTimer = null;\r\n this.frames = null;\r\n this.totalFrames = 0;\r\n this.bytesSent = 0;\r\n this.bytesReceived = 0;\r\n this.log_ = logWrapper(this.connId);\r\n this.stats_ = statsManagerGetCollection(repoInfo);\r\n this.connURL = WebSocketConnection.connectionURL_(repoInfo, transportSessionId, lastSessionId, appCheckToken);\r\n this.nodeAdmin = repoInfo.nodeAdmin;\r\n }\r\n /**\r\n * @param repoInfo - The info for the websocket endpoint.\r\n * @param transportSessionId - Optional transportSessionId if this is connecting to an existing transport\r\n * session\r\n * @param lastSessionId - Optional lastSessionId if there was a previous connection\r\n * @returns connection url\r\n */\r\n WebSocketConnection.connectionURL_ = function (repoInfo, transportSessionId, lastSessionId, appCheckToken) {\r\n var urlParams = {};\r\n urlParams[VERSION_PARAM] = PROTOCOL_VERSION;\r\n if (!isNodeSdk() &&\r\n typeof location !== 'undefined' &&\r\n location.hostname &&\r\n FORGE_DOMAIN_RE.test(location.hostname)) {\r\n urlParams[REFERER_PARAM] = FORGE_REF;\r\n }\r\n if (transportSessionId) {\r\n urlParams[TRANSPORT_SESSION_PARAM] = transportSessionId;\r\n }\r\n if (lastSessionId) {\r\n urlParams[LAST_SESSION_PARAM] = lastSessionId;\r\n }\r\n if (appCheckToken) {\r\n urlParams[APP_CHECK_TOKEN_PARAM] = appCheckToken;\r\n }\r\n return repoInfoConnectionURL(repoInfo, WEBSOCKET, urlParams);\r\n };\r\n /**\r\n * @param onMessage - Callback when messages arrive\r\n * @param onDisconnect - Callback with connection lost.\r\n */\r\n WebSocketConnection.prototype.open = function (onMessage, onDisconnect) {\r\n var _this = this;\r\n this.onDisconnect = onDisconnect;\r\n this.onMessage = onMessage;\r\n this.log_('Websocket connecting to ' + this.connURL);\r\n this.everConnected_ = false;\r\n // Assume failure until proven otherwise.\r\n PersistentStorage.set('previous_websocket_failure', true);\r\n try {\r\n if (isNodeSdk()) {\r\n var device = this.nodeAdmin ? 'AdminNode' : 'Node';\r\n // UA Format: Firebase////\r\n var options = {\r\n headers: {\r\n 'User-Agent': \"Firebase/\" + PROTOCOL_VERSION + \"/\" + SDK_VERSION + \"/\" + process.platform + \"/\" + device,\r\n 'X-Firebase-GMPID': this.applicationId || ''\r\n }\r\n };\r\n // If using Node with admin creds, AppCheck-related checks are unnecessary.\r\n // Note that we send the credentials here even if they aren't admin credentials, which is\r\n // not a problem.\r\n // Note that this header is just used to bypass appcheck, and the token should still be sent\r\n // through the websocket connection once it is established.\r\n if (this.authToken) {\r\n options.headers['Authorization'] = \"Bearer \" + this.authToken;\r\n }\r\n if (this.appCheckToken) {\r\n options.headers['X-Firebase-AppCheck'] = this.appCheckToken;\r\n }\r\n // Plumb appropriate http_proxy environment variable into faye-websocket if it exists.\r\n var env = process['env'];\r\n var proxy = this.connURL.indexOf('wss://') === 0\r\n ? env['HTTPS_PROXY'] || env['https_proxy']\r\n : env['HTTP_PROXY'] || env['http_proxy'];\r\n if (proxy) {\r\n options['proxy'] = { origin: proxy };\r\n }\r\n this.mySock = new WebSocketImpl(this.connURL, [], options);\r\n }\r\n else {\r\n var options = {\r\n headers: {\r\n 'X-Firebase-GMPID': this.applicationId || '',\r\n 'X-Firebase-AppCheck': this.appCheckToken || ''\r\n }\r\n };\r\n this.mySock = new WebSocketImpl(this.connURL, [], options);\r\n }\r\n }\r\n catch (e) {\r\n this.log_('Error instantiating WebSocket.');\r\n var error = e.message || e.data;\r\n if (error) {\r\n this.log_(error);\r\n }\r\n this.onClosed_();\r\n return;\r\n }\r\n this.mySock.onopen = function () {\r\n _this.log_('Websocket connected.');\r\n _this.everConnected_ = true;\r\n };\r\n this.mySock.onclose = function () {\r\n _this.log_('Websocket connection was disconnected.');\r\n _this.mySock = null;\r\n _this.onClosed_();\r\n };\r\n this.mySock.onmessage = function (m) {\r\n _this.handleIncomingFrame(m);\r\n };\r\n this.mySock.onerror = function (e) {\r\n _this.log_('WebSocket error. Closing connection.');\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n var error = e.message || e.data;\r\n if (error) {\r\n _this.log_(error);\r\n }\r\n _this.onClosed_();\r\n };\r\n };\r\n /**\r\n * No-op for websockets, we don't need to do anything once the connection is confirmed as open\r\n */\r\n WebSocketConnection.prototype.start = function () { };\r\n WebSocketConnection.forceDisallow = function () {\r\n WebSocketConnection.forceDisallow_ = true;\r\n };\r\n WebSocketConnection.isAvailable = function () {\r\n var isOldAndroid = false;\r\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\r\n var oldAndroidRegex = /Android ([0-9]{0,}\\.[0-9]{0,})/;\r\n var oldAndroidMatch = navigator.userAgent.match(oldAndroidRegex);\r\n if (oldAndroidMatch && oldAndroidMatch.length > 1) {\r\n if (parseFloat(oldAndroidMatch[1]) < 4.4) {\r\n isOldAndroid = true;\r\n }\r\n }\r\n }\r\n return (!isOldAndroid &&\r\n WebSocketImpl !== null &&\r\n !WebSocketConnection.forceDisallow_);\r\n };\r\n /**\r\n * Returns true if we previously failed to connect with this transport.\r\n */\r\n WebSocketConnection.previouslyFailed = function () {\r\n // If our persistent storage is actually only in-memory storage,\r\n // we default to assuming that it previously failed to be safe.\r\n return (PersistentStorage.isInMemoryStorage ||\r\n PersistentStorage.get('previous_websocket_failure') === true);\r\n };\r\n WebSocketConnection.prototype.markConnectionHealthy = function () {\r\n PersistentStorage.remove('previous_websocket_failure');\r\n };\r\n WebSocketConnection.prototype.appendFrame_ = function (data) {\r\n this.frames.push(data);\r\n if (this.frames.length === this.totalFrames) {\r\n var fullMess = this.frames.join('');\r\n this.frames = null;\r\n var jsonMess = jsonEval(fullMess);\r\n //handle the message\r\n this.onMessage(jsonMess);\r\n }\r\n };\r\n /**\r\n * @param frameCount - The number of frames we are expecting from the server\r\n */\r\n WebSocketConnection.prototype.handleNewFrameCount_ = function (frameCount) {\r\n this.totalFrames = frameCount;\r\n this.frames = [];\r\n };\r\n /**\r\n * Attempts to parse a frame count out of some text. If it can't, assumes a value of 1\r\n * @returns Any remaining data to be process, or null if there is none\r\n */\r\n WebSocketConnection.prototype.extractFrameCount_ = function (data) {\r\n assert(this.frames === null, 'We already have a frame buffer');\r\n // TODO: The server is only supposed to send up to 9999 frames (i.e. length <= 4), but that isn't being enforced\r\n // currently. So allowing larger frame counts (length <= 6). See https://app.asana.com/0/search/8688598998380/8237608042508\r\n if (data.length <= 6) {\r\n var frameCount = Number(data);\r\n if (!isNaN(frameCount)) {\r\n this.handleNewFrameCount_(frameCount);\r\n return null;\r\n }\r\n }\r\n this.handleNewFrameCount_(1);\r\n return data;\r\n };\r\n /**\r\n * Process a websocket frame that has arrived from the server.\r\n * @param mess - The frame data\r\n */\r\n WebSocketConnection.prototype.handleIncomingFrame = function (mess) {\r\n if (this.mySock === null) {\r\n return; // Chrome apparently delivers incoming packets even after we .close() the connection sometimes.\r\n }\r\n var data = mess['data'];\r\n this.bytesReceived += data.length;\r\n this.stats_.incrementCounter('bytes_received', data.length);\r\n this.resetKeepAlive();\r\n if (this.frames !== null) {\r\n // we're buffering\r\n this.appendFrame_(data);\r\n }\r\n else {\r\n // try to parse out a frame count, otherwise, assume 1 and process it\r\n var remainingData = this.extractFrameCount_(data);\r\n if (remainingData !== null) {\r\n this.appendFrame_(remainingData);\r\n }\r\n }\r\n };\r\n /**\r\n * Send a message to the server\r\n * @param data - The JSON object to transmit\r\n */\r\n WebSocketConnection.prototype.send = function (data) {\r\n this.resetKeepAlive();\r\n var dataStr = stringify(data);\r\n this.bytesSent += dataStr.length;\r\n this.stats_.incrementCounter('bytes_sent', dataStr.length);\r\n //We can only fit a certain amount in each websocket frame, so we need to split this request\r\n //up into multiple pieces if it doesn't fit in one request.\r\n var dataSegs = splitStringBySize(dataStr, WEBSOCKET_MAX_FRAME_SIZE);\r\n //Send the length header\r\n if (dataSegs.length > 1) {\r\n this.sendString_(String(dataSegs.length));\r\n }\r\n //Send the actual data in segments.\r\n for (var i = 0; i < dataSegs.length; i++) {\r\n this.sendString_(dataSegs[i]);\r\n }\r\n };\r\n WebSocketConnection.prototype.shutdown_ = function () {\r\n this.isClosed_ = true;\r\n if (this.keepaliveTimer) {\r\n clearInterval(this.keepaliveTimer);\r\n this.keepaliveTimer = null;\r\n }\r\n if (this.mySock) {\r\n this.mySock.close();\r\n this.mySock = null;\r\n }\r\n };\r\n WebSocketConnection.prototype.onClosed_ = function () {\r\n if (!this.isClosed_) {\r\n this.log_('WebSocket is closing itself');\r\n this.shutdown_();\r\n // since this is an internal close, trigger the close listener\r\n if (this.onDisconnect) {\r\n this.onDisconnect(this.everConnected_);\r\n this.onDisconnect = null;\r\n }\r\n }\r\n };\r\n /**\r\n * External-facing close handler.\r\n * Close the websocket and kill the connection.\r\n */\r\n WebSocketConnection.prototype.close = function () {\r\n if (!this.isClosed_) {\r\n this.log_('WebSocket is being closed');\r\n this.shutdown_();\r\n }\r\n };\r\n /**\r\n * Kill the current keepalive timer and start a new one, to ensure that it always fires N seconds after\r\n * the last activity.\r\n */\r\n WebSocketConnection.prototype.resetKeepAlive = function () {\r\n var _this = this;\r\n clearInterval(this.keepaliveTimer);\r\n this.keepaliveTimer = setInterval(function () {\r\n //If there has been no websocket activity for a while, send a no-op\r\n if (_this.mySock) {\r\n _this.sendString_('0');\r\n }\r\n _this.resetKeepAlive();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n }, Math.floor(WEBSOCKET_KEEPALIVE_INTERVAL));\r\n };\r\n /**\r\n * Send a string over the websocket.\r\n *\r\n * @param str - String to send.\r\n */\r\n WebSocketConnection.prototype.sendString_ = function (str) {\r\n // Firefox seems to sometimes throw exceptions (NS_ERROR_UNEXPECTED) from websocket .send()\r\n // calls for some unknown reason. We treat these as an error and disconnect.\r\n // See https://app.asana.com/0/58926111402292/68021340250410\r\n try {\r\n this.mySock.send(str);\r\n }\r\n catch (e) {\r\n this.log_('Exception thrown from WebSocket.send():', e.message || e.data, 'Closing connection.');\r\n setTimeout(this.onClosed_.bind(this), 0);\r\n }\r\n };\r\n /**\r\n * Number of response before we consider the connection \"healthy.\"\r\n */\r\n WebSocketConnection.responsesRequiredToBeHealthy = 2;\r\n /**\r\n * Time to wait for the connection te become healthy before giving up.\r\n */\r\n WebSocketConnection.healthyTimeout = 30000;\r\n return WebSocketConnection;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Currently simplistic, this class manages what transport a Connection should use at various stages of its\r\n * lifecycle.\r\n *\r\n * It starts with longpolling in a browser, and httppolling on node. It then upgrades to websockets if\r\n * they are available.\r\n */\r\nvar TransportManager = /** @class */ (function () {\r\n /**\r\n * @param repoInfo - Metadata around the namespace we're connecting to\r\n */\r\n function TransportManager(repoInfo) {\r\n this.initTransports_(repoInfo);\r\n }\r\n Object.defineProperty(TransportManager, \"ALL_TRANSPORTS\", {\r\n get: function () {\r\n return [BrowserPollConnection, WebSocketConnection];\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n TransportManager.prototype.initTransports_ = function (repoInfo) {\r\n var e_1, _a;\r\n var isWebSocketsAvailable = WebSocketConnection && WebSocketConnection['isAvailable']();\r\n var isSkipPollConnection = isWebSocketsAvailable && !WebSocketConnection.previouslyFailed();\r\n if (repoInfo.webSocketOnly) {\r\n if (!isWebSocketsAvailable) {\r\n warn(\"wss:// URL used, but browser isn't known to support websockets. Trying anyway.\");\r\n }\r\n isSkipPollConnection = true;\r\n }\r\n if (isSkipPollConnection) {\r\n this.transports_ = [WebSocketConnection];\r\n }\r\n else {\r\n var transports = (this.transports_ = []);\r\n try {\r\n for (var _b = __values(TransportManager.ALL_TRANSPORTS), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var transport = _c.value;\r\n if (transport && transport['isAvailable']()) {\r\n transports.push(transport);\r\n }\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n }\r\n };\r\n /**\r\n * @returns The constructor for the initial transport to use\r\n */\r\n TransportManager.prototype.initialTransport = function () {\r\n if (this.transports_.length > 0) {\r\n return this.transports_[0];\r\n }\r\n else {\r\n throw new Error('No transports available');\r\n }\r\n };\r\n /**\r\n * @returns The constructor for the next transport, or null\r\n */\r\n TransportManager.prototype.upgradeTransport = function () {\r\n if (this.transports_.length > 1) {\r\n return this.transports_[1];\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n return TransportManager;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Abort upgrade attempt if it takes longer than 60s.\r\nvar UPGRADE_TIMEOUT = 60000;\r\n// For some transports (WebSockets), we need to \"validate\" the transport by exchanging a few requests and responses.\r\n// If we haven't sent enough requests within 5s, we'll start sending noop ping requests.\r\nvar DELAY_BEFORE_SENDING_EXTRA_REQUESTS = 5000;\r\n// If the initial data sent triggers a lot of bandwidth (i.e. it's a large put or a listen for a large amount of data)\r\n// then we may not be able to exchange our ping/pong requests within the healthy timeout. So if we reach the timeout\r\n// but we've sent/received enough bytes, we don't cancel the connection.\r\nvar BYTES_SENT_HEALTHY_OVERRIDE = 10 * 1024;\r\nvar BYTES_RECEIVED_HEALTHY_OVERRIDE = 100 * 1024;\r\nvar MESSAGE_TYPE = 't';\r\nvar MESSAGE_DATA = 'd';\r\nvar CONTROL_SHUTDOWN = 's';\r\nvar CONTROL_RESET = 'r';\r\nvar CONTROL_ERROR = 'e';\r\nvar CONTROL_PONG = 'o';\r\nvar SWITCH_ACK = 'a';\r\nvar END_TRANSMISSION = 'n';\r\nvar PING = 'p';\r\nvar SERVER_HELLO = 'h';\r\n/**\r\n * Creates a new real-time connection to the server using whichever method works\r\n * best in the current browser.\r\n */\r\nvar Connection = /** @class */ (function () {\r\n /**\r\n * @param id - an id for this connection\r\n * @param repoInfo_ - the info for the endpoint to connect to\r\n * @param applicationId_ - the Firebase App ID for this project\r\n * @param appCheckToken_ - The App Check Token for this device.\r\n * @param authToken_ - The auth token for this session.\r\n * @param onMessage_ - the callback to be triggered when a server-push message arrives\r\n * @param onReady_ - the callback to be triggered when this connection is ready to send messages.\r\n * @param onDisconnect_ - the callback to be triggered when a connection was lost\r\n * @param onKill_ - the callback to be triggered when this connection has permanently shut down.\r\n * @param lastSessionId - last session id in persistent connection. is used to clean up old session in real-time server\r\n */\r\n function Connection(id, repoInfo_, applicationId_, appCheckToken_, authToken_, onMessage_, onReady_, onDisconnect_, onKill_, lastSessionId) {\r\n this.id = id;\r\n this.repoInfo_ = repoInfo_;\r\n this.applicationId_ = applicationId_;\r\n this.appCheckToken_ = appCheckToken_;\r\n this.authToken_ = authToken_;\r\n this.onMessage_ = onMessage_;\r\n this.onReady_ = onReady_;\r\n this.onDisconnect_ = onDisconnect_;\r\n this.onKill_ = onKill_;\r\n this.lastSessionId = lastSessionId;\r\n this.connectionCount = 0;\r\n this.pendingDataMessages = [];\r\n this.state_ = 0 /* CONNECTING */;\r\n this.log_ = logWrapper('c:' + this.id + ':');\r\n this.transportManager_ = new TransportManager(repoInfo_);\r\n this.log_('Connection created');\r\n this.start_();\r\n }\r\n /**\r\n * Starts a connection attempt\r\n */\r\n Connection.prototype.start_ = function () {\r\n var _this = this;\r\n var conn = this.transportManager_.initialTransport();\r\n this.conn_ = new conn(this.nextTransportId_(), this.repoInfo_, this.applicationId_, this.appCheckToken_, this.authToken_, null, this.lastSessionId);\r\n // For certain transports (WebSockets), we need to send and receive several messages back and forth before we\r\n // can consider the transport healthy.\r\n this.primaryResponsesRequired_ = conn['responsesRequiredToBeHealthy'] || 0;\r\n var onMessageReceived = this.connReceiver_(this.conn_);\r\n var onConnectionLost = this.disconnReceiver_(this.conn_);\r\n this.tx_ = this.conn_;\r\n this.rx_ = this.conn_;\r\n this.secondaryConn_ = null;\r\n this.isHealthy_ = false;\r\n /*\r\n * Firefox doesn't like when code from one iframe tries to create another iframe by way of the parent frame.\r\n * This can occur in the case of a redirect, i.e. we guessed wrong on what server to connect to and received a reset.\r\n * Somehow, setTimeout seems to make this ok. That doesn't make sense from a security perspective, since you should\r\n * still have the context of your originating frame.\r\n */\r\n setTimeout(function () {\r\n // this.conn_ gets set to null in some of the tests. Check to make sure it still exists before using it\r\n _this.conn_ && _this.conn_.open(onMessageReceived, onConnectionLost);\r\n }, Math.floor(0));\r\n var healthyTimeoutMS = conn['healthyTimeout'] || 0;\r\n if (healthyTimeoutMS > 0) {\r\n this.healthyTimeout_ = setTimeoutNonBlocking(function () {\r\n _this.healthyTimeout_ = null;\r\n if (!_this.isHealthy_) {\r\n if (_this.conn_ &&\r\n _this.conn_.bytesReceived > BYTES_RECEIVED_HEALTHY_OVERRIDE) {\r\n _this.log_('Connection exceeded healthy timeout but has received ' +\r\n _this.conn_.bytesReceived +\r\n ' bytes. Marking connection healthy.');\r\n _this.isHealthy_ = true;\r\n _this.conn_.markConnectionHealthy();\r\n }\r\n else if (_this.conn_ &&\r\n _this.conn_.bytesSent > BYTES_SENT_HEALTHY_OVERRIDE) {\r\n _this.log_('Connection exceeded healthy timeout but has sent ' +\r\n _this.conn_.bytesSent +\r\n ' bytes. Leaving connection alive.');\r\n // NOTE: We don't want to mark it healthy, since we have no guarantee that the bytes have made it to\r\n // the server.\r\n }\r\n else {\r\n _this.log_('Closing unhealthy connection after timeout.');\r\n _this.close();\r\n }\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n }, Math.floor(healthyTimeoutMS));\r\n }\r\n };\r\n Connection.prototype.nextTransportId_ = function () {\r\n return 'c:' + this.id + ':' + this.connectionCount++;\r\n };\r\n Connection.prototype.disconnReceiver_ = function (conn) {\r\n var _this = this;\r\n return function (everConnected) {\r\n if (conn === _this.conn_) {\r\n _this.onConnectionLost_(everConnected);\r\n }\r\n else if (conn === _this.secondaryConn_) {\r\n _this.log_('Secondary connection lost.');\r\n _this.onSecondaryConnectionLost_();\r\n }\r\n else {\r\n _this.log_('closing an old connection');\r\n }\r\n };\r\n };\r\n Connection.prototype.connReceiver_ = function (conn) {\r\n var _this = this;\r\n return function (message) {\r\n if (_this.state_ !== 2 /* DISCONNECTED */) {\r\n if (conn === _this.rx_) {\r\n _this.onPrimaryMessageReceived_(message);\r\n }\r\n else if (conn === _this.secondaryConn_) {\r\n _this.onSecondaryMessageReceived_(message);\r\n }\r\n else {\r\n _this.log_('message on old connection');\r\n }\r\n }\r\n };\r\n };\r\n /**\r\n * @param dataMsg - An arbitrary data message to be sent to the server\r\n */\r\n Connection.prototype.sendRequest = function (dataMsg) {\r\n // wrap in a data message envelope and send it on\r\n var msg = { t: 'd', d: dataMsg };\r\n this.sendData_(msg);\r\n };\r\n Connection.prototype.tryCleanupConnection = function () {\r\n if (this.tx_ === this.secondaryConn_ && this.rx_ === this.secondaryConn_) {\r\n this.log_('cleaning up and promoting a connection: ' + this.secondaryConn_.connId);\r\n this.conn_ = this.secondaryConn_;\r\n this.secondaryConn_ = null;\r\n // the server will shutdown the old connection\r\n }\r\n };\r\n Connection.prototype.onSecondaryControl_ = function (controlData) {\r\n if (MESSAGE_TYPE in controlData) {\r\n var cmd = controlData[MESSAGE_TYPE];\r\n if (cmd === SWITCH_ACK) {\r\n this.upgradeIfSecondaryHealthy_();\r\n }\r\n else if (cmd === CONTROL_RESET) {\r\n // Most likely the session wasn't valid. Abandon the switch attempt\r\n this.log_('Got a reset on secondary, closing it');\r\n this.secondaryConn_.close();\r\n // If we were already using this connection for something, than we need to fully close\r\n if (this.tx_ === this.secondaryConn_ ||\r\n this.rx_ === this.secondaryConn_) {\r\n this.close();\r\n }\r\n }\r\n else if (cmd === CONTROL_PONG) {\r\n this.log_('got pong on secondary.');\r\n this.secondaryResponsesRequired_--;\r\n this.upgradeIfSecondaryHealthy_();\r\n }\r\n }\r\n };\r\n Connection.prototype.onSecondaryMessageReceived_ = function (parsedData) {\r\n var layer = requireKey('t', parsedData);\r\n var data = requireKey('d', parsedData);\r\n if (layer === 'c') {\r\n this.onSecondaryControl_(data);\r\n }\r\n else if (layer === 'd') {\r\n // got a data message, but we're still second connection. Need to buffer it up\r\n this.pendingDataMessages.push(data);\r\n }\r\n else {\r\n throw new Error('Unknown protocol layer: ' + layer);\r\n }\r\n };\r\n Connection.prototype.upgradeIfSecondaryHealthy_ = function () {\r\n if (this.secondaryResponsesRequired_ <= 0) {\r\n this.log_('Secondary connection is healthy.');\r\n this.isHealthy_ = true;\r\n this.secondaryConn_.markConnectionHealthy();\r\n this.proceedWithUpgrade_();\r\n }\r\n else {\r\n // Send a ping to make sure the connection is healthy.\r\n this.log_('sending ping on secondary.');\r\n this.secondaryConn_.send({ t: 'c', d: { t: PING, d: {} } });\r\n }\r\n };\r\n Connection.prototype.proceedWithUpgrade_ = function () {\r\n // tell this connection to consider itself open\r\n this.secondaryConn_.start();\r\n // send ack\r\n this.log_('sending client ack on secondary');\r\n this.secondaryConn_.send({ t: 'c', d: { t: SWITCH_ACK, d: {} } });\r\n // send end packet on primary transport, switch to sending on this one\r\n // can receive on this one, buffer responses until end received on primary transport\r\n this.log_('Ending transmission on primary');\r\n this.conn_.send({ t: 'c', d: { t: END_TRANSMISSION, d: {} } });\r\n this.tx_ = this.secondaryConn_;\r\n this.tryCleanupConnection();\r\n };\r\n Connection.prototype.onPrimaryMessageReceived_ = function (parsedData) {\r\n // Must refer to parsedData properties in quotes, so closure doesn't touch them.\r\n var layer = requireKey('t', parsedData);\r\n var data = requireKey('d', parsedData);\r\n if (layer === 'c') {\r\n this.onControl_(data);\r\n }\r\n else if (layer === 'd') {\r\n this.onDataMessage_(data);\r\n }\r\n };\r\n Connection.prototype.onDataMessage_ = function (message) {\r\n this.onPrimaryResponse_();\r\n // We don't do anything with data messages, just kick them up a level\r\n this.onMessage_(message);\r\n };\r\n Connection.prototype.onPrimaryResponse_ = function () {\r\n if (!this.isHealthy_) {\r\n this.primaryResponsesRequired_--;\r\n if (this.primaryResponsesRequired_ <= 0) {\r\n this.log_('Primary connection is healthy.');\r\n this.isHealthy_ = true;\r\n this.conn_.markConnectionHealthy();\r\n }\r\n }\r\n };\r\n Connection.prototype.onControl_ = function (controlData) {\r\n var cmd = requireKey(MESSAGE_TYPE, controlData);\r\n if (MESSAGE_DATA in controlData) {\r\n var payload = controlData[MESSAGE_DATA];\r\n if (cmd === SERVER_HELLO) {\r\n this.onHandshake_(payload);\r\n }\r\n else if (cmd === END_TRANSMISSION) {\r\n this.log_('recvd end transmission on primary');\r\n this.rx_ = this.secondaryConn_;\r\n for (var i = 0; i < this.pendingDataMessages.length; ++i) {\r\n this.onDataMessage_(this.pendingDataMessages[i]);\r\n }\r\n this.pendingDataMessages = [];\r\n this.tryCleanupConnection();\r\n }\r\n else if (cmd === CONTROL_SHUTDOWN) {\r\n // This was previously the 'onKill' callback passed to the lower-level connection\r\n // payload in this case is the reason for the shutdown. Generally a human-readable error\r\n this.onConnectionShutdown_(payload);\r\n }\r\n else if (cmd === CONTROL_RESET) {\r\n // payload in this case is the host we should contact\r\n this.onReset_(payload);\r\n }\r\n else if (cmd === CONTROL_ERROR) {\r\n error('Server Error: ' + payload);\r\n }\r\n else if (cmd === CONTROL_PONG) {\r\n this.log_('got pong on primary.');\r\n this.onPrimaryResponse_();\r\n this.sendPingOnPrimaryIfNecessary_();\r\n }\r\n else {\r\n error('Unknown control packet command: ' + cmd);\r\n }\r\n }\r\n };\r\n /**\r\n * @param handshake - The handshake data returned from the server\r\n */\r\n Connection.prototype.onHandshake_ = function (handshake) {\r\n var timestamp = handshake.ts;\r\n var version = handshake.v;\r\n var host = handshake.h;\r\n this.sessionId = handshake.s;\r\n this.repoInfo_.host = host;\r\n // if we've already closed the connection, then don't bother trying to progress further\r\n if (this.state_ === 0 /* CONNECTING */) {\r\n this.conn_.start();\r\n this.onConnectionEstablished_(this.conn_, timestamp);\r\n if (PROTOCOL_VERSION !== version) {\r\n warn('Protocol version mismatch detected');\r\n }\r\n // TODO: do we want to upgrade? when? maybe a delay?\r\n this.tryStartUpgrade_();\r\n }\r\n };\r\n Connection.prototype.tryStartUpgrade_ = function () {\r\n var conn = this.transportManager_.upgradeTransport();\r\n if (conn) {\r\n this.startUpgrade_(conn);\r\n }\r\n };\r\n Connection.prototype.startUpgrade_ = function (conn) {\r\n var _this = this;\r\n this.secondaryConn_ = new conn(this.nextTransportId_(), this.repoInfo_, this.applicationId_, this.appCheckToken_, this.authToken_, this.sessionId);\r\n // For certain transports (WebSockets), we need to send and receive several messages back and forth before we\r\n // can consider the transport healthy.\r\n this.secondaryResponsesRequired_ =\r\n conn['responsesRequiredToBeHealthy'] || 0;\r\n var onMessage = this.connReceiver_(this.secondaryConn_);\r\n var onDisconnect = this.disconnReceiver_(this.secondaryConn_);\r\n this.secondaryConn_.open(onMessage, onDisconnect);\r\n // If we haven't successfully upgraded after UPGRADE_TIMEOUT, give up and kill the secondary.\r\n setTimeoutNonBlocking(function () {\r\n if (_this.secondaryConn_) {\r\n _this.log_('Timed out trying to upgrade.');\r\n _this.secondaryConn_.close();\r\n }\r\n }, Math.floor(UPGRADE_TIMEOUT));\r\n };\r\n Connection.prototype.onReset_ = function (host) {\r\n this.log_('Reset packet received. New host: ' + host);\r\n this.repoInfo_.host = host;\r\n // TODO: if we're already \"connected\", we need to trigger a disconnect at the next layer up.\r\n // We don't currently support resets after the connection has already been established\r\n if (this.state_ === 1 /* CONNECTED */) {\r\n this.close();\r\n }\r\n else {\r\n // Close whatever connections we have open and start again.\r\n this.closeConnections_();\r\n this.start_();\r\n }\r\n };\r\n Connection.prototype.onConnectionEstablished_ = function (conn, timestamp) {\r\n var _this = this;\r\n this.log_('Realtime connection established.');\r\n this.conn_ = conn;\r\n this.state_ = 1 /* CONNECTED */;\r\n if (this.onReady_) {\r\n this.onReady_(timestamp, this.sessionId);\r\n this.onReady_ = null;\r\n }\r\n // If after 5 seconds we haven't sent enough requests to the server to get the connection healthy,\r\n // send some pings.\r\n if (this.primaryResponsesRequired_ === 0) {\r\n this.log_('Primary connection is healthy.');\r\n this.isHealthy_ = true;\r\n }\r\n else {\r\n setTimeoutNonBlocking(function () {\r\n _this.sendPingOnPrimaryIfNecessary_();\r\n }, Math.floor(DELAY_BEFORE_SENDING_EXTRA_REQUESTS));\r\n }\r\n };\r\n Connection.prototype.sendPingOnPrimaryIfNecessary_ = function () {\r\n // If the connection isn't considered healthy yet, we'll send a noop ping packet request.\r\n if (!this.isHealthy_ && this.state_ === 1 /* CONNECTED */) {\r\n this.log_('sending ping on primary.');\r\n this.sendData_({ t: 'c', d: { t: PING, d: {} } });\r\n }\r\n };\r\n Connection.prototype.onSecondaryConnectionLost_ = function () {\r\n var conn = this.secondaryConn_;\r\n this.secondaryConn_ = null;\r\n if (this.tx_ === conn || this.rx_ === conn) {\r\n // we are relying on this connection already in some capacity. Therefore, a failure is real\r\n this.close();\r\n }\r\n };\r\n /**\r\n * @param everConnected - Whether or not the connection ever reached a server. Used to determine if\r\n * we should flush the host cache\r\n */\r\n Connection.prototype.onConnectionLost_ = function (everConnected) {\r\n this.conn_ = null;\r\n // NOTE: IF you're seeing a Firefox error for this line, I think it might be because it's getting\r\n // called on window close and RealtimeState.CONNECTING is no longer defined. Just a guess.\r\n if (!everConnected && this.state_ === 0 /* CONNECTING */) {\r\n this.log_('Realtime connection failed.');\r\n // Since we failed to connect at all, clear any cached entry for this namespace in case the machine went away\r\n if (this.repoInfo_.isCacheableHost()) {\r\n PersistentStorage.remove('host:' + this.repoInfo_.host);\r\n // reset the internal host to what we would show the user, i.e. .firebaseio.com\r\n this.repoInfo_.internalHost = this.repoInfo_.host;\r\n }\r\n }\r\n else if (this.state_ === 1 /* CONNECTED */) {\r\n this.log_('Realtime connection lost.');\r\n }\r\n this.close();\r\n };\r\n Connection.prototype.onConnectionShutdown_ = function (reason) {\r\n this.log_('Connection shutdown command received. Shutting down...');\r\n if (this.onKill_) {\r\n this.onKill_(reason);\r\n this.onKill_ = null;\r\n }\r\n // We intentionally don't want to fire onDisconnect (kill is a different case),\r\n // so clear the callback.\r\n this.onDisconnect_ = null;\r\n this.close();\r\n };\r\n Connection.prototype.sendData_ = function (data) {\r\n if (this.state_ !== 1 /* CONNECTED */) {\r\n throw 'Connection is not connected';\r\n }\r\n else {\r\n this.tx_.send(data);\r\n }\r\n };\r\n /**\r\n * Cleans up this connection, calling the appropriate callbacks\r\n */\r\n Connection.prototype.close = function () {\r\n if (this.state_ !== 2 /* DISCONNECTED */) {\r\n this.log_('Closing realtime connection.');\r\n this.state_ = 2 /* DISCONNECTED */;\r\n this.closeConnections_();\r\n if (this.onDisconnect_) {\r\n this.onDisconnect_();\r\n this.onDisconnect_ = null;\r\n }\r\n }\r\n };\r\n Connection.prototype.closeConnections_ = function () {\r\n this.log_('Shutting down all connections');\r\n if (this.conn_) {\r\n this.conn_.close();\r\n this.conn_ = null;\r\n }\r\n if (this.secondaryConn_) {\r\n this.secondaryConn_.close();\r\n this.secondaryConn_ = null;\r\n }\r\n if (this.healthyTimeout_) {\r\n clearTimeout(this.healthyTimeout_);\r\n this.healthyTimeout_ = null;\r\n }\r\n };\r\n return Connection;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Interface defining the set of actions that can be performed against the Firebase server\r\n * (basically corresponds to our wire protocol).\r\n *\r\n * @interface\r\n */\r\nvar ServerActions = /** @class */ (function () {\r\n function ServerActions() {\r\n }\r\n ServerActions.prototype.put = function (pathString, data, onComplete, hash) { };\r\n ServerActions.prototype.merge = function (pathString, data, onComplete, hash) { };\r\n /**\r\n * Refreshes the auth token for the current connection.\r\n * @param token - The authentication token\r\n */\r\n ServerActions.prototype.refreshAuthToken = function (token) { };\r\n /**\r\n * Refreshes the app check token for the current connection.\r\n * @param token The app check token\r\n */\r\n ServerActions.prototype.refreshAppCheckToken = function (token) { };\r\n ServerActions.prototype.onDisconnectPut = function (pathString, data, onComplete) { };\r\n ServerActions.prototype.onDisconnectMerge = function (pathString, data, onComplete) { };\r\n ServerActions.prototype.onDisconnectCancel = function (pathString, onComplete) { };\r\n ServerActions.prototype.reportStats = function (stats) { };\r\n return ServerActions;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Base class to be used if you want to emit events. Call the constructor with\r\n * the set of allowed event names.\r\n */\r\nvar EventEmitter = /** @class */ (function () {\r\n function EventEmitter(allowedEvents_) {\r\n this.allowedEvents_ = allowedEvents_;\r\n this.listeners_ = {};\r\n assert(Array.isArray(allowedEvents_) && allowedEvents_.length > 0, 'Requires a non-empty array');\r\n }\r\n /**\r\n * To be called by derived classes to trigger events.\r\n */\r\n EventEmitter.prototype.trigger = function (eventType) {\r\n var varArgs = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n varArgs[_i - 1] = arguments[_i];\r\n }\r\n if (Array.isArray(this.listeners_[eventType])) {\r\n // Clone the list, since callbacks could add/remove listeners.\r\n var listeners = __spreadArray([], __read(this.listeners_[eventType]));\r\n for (var i = 0; i < listeners.length; i++) {\r\n listeners[i].callback.apply(listeners[i].context, varArgs);\r\n }\r\n }\r\n };\r\n EventEmitter.prototype.on = function (eventType, callback, context) {\r\n this.validateEventType_(eventType);\r\n this.listeners_[eventType] = this.listeners_[eventType] || [];\r\n this.listeners_[eventType].push({ callback: callback, context: context });\r\n var eventData = this.getInitialEvent(eventType);\r\n if (eventData) {\r\n callback.apply(context, eventData);\r\n }\r\n };\r\n EventEmitter.prototype.off = function (eventType, callback, context) {\r\n this.validateEventType_(eventType);\r\n var listeners = this.listeners_[eventType] || [];\r\n for (var i = 0; i < listeners.length; i++) {\r\n if (listeners[i].callback === callback &&\r\n (!context || context === listeners[i].context)) {\r\n listeners.splice(i, 1);\r\n return;\r\n }\r\n }\r\n };\r\n EventEmitter.prototype.validateEventType_ = function (eventType) {\r\n assert(this.allowedEvents_.find(function (et) {\r\n return et === eventType;\r\n }), 'Unknown event: ' + eventType);\r\n };\r\n return EventEmitter;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Monitors online state (as reported by window.online/offline events).\r\n *\r\n * The expectation is that this could have many false positives (thinks we are online\r\n * when we're not), but no false negatives. So we can safely use it to determine when\r\n * we definitely cannot reach the internet.\r\n */\r\nvar OnlineMonitor = /** @class */ (function (_super) {\r\n __extends(OnlineMonitor, _super);\r\n function OnlineMonitor() {\r\n var _this = _super.call(this, ['online']) || this;\r\n _this.online_ = true;\r\n // We've had repeated complaints that Cordova apps can get stuck \"offline\", e.g.\r\n // https://forum.ionicframework.com/t/firebase-connection-is-lost-and-never-come-back/43810\r\n // It would seem that the 'online' event does not always fire consistently. So we disable it\r\n // for Cordova.\r\n if (typeof window !== 'undefined' &&\r\n typeof window.addEventListener !== 'undefined' &&\r\n !isMobileCordova()) {\r\n window.addEventListener('online', function () {\r\n if (!_this.online_) {\r\n _this.online_ = true;\r\n _this.trigger('online', true);\r\n }\r\n }, false);\r\n window.addEventListener('offline', function () {\r\n if (_this.online_) {\r\n _this.online_ = false;\r\n _this.trigger('online', false);\r\n }\r\n }, false);\r\n }\r\n return _this;\r\n }\r\n OnlineMonitor.getInstance = function () {\r\n return new OnlineMonitor();\r\n };\r\n OnlineMonitor.prototype.getInitialEvent = function (eventType) {\r\n assert(eventType === 'online', 'Unknown event type: ' + eventType);\r\n return [this.online_];\r\n };\r\n OnlineMonitor.prototype.currentlyOnline = function () {\r\n return this.online_;\r\n };\r\n return OnlineMonitor;\r\n}(EventEmitter));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** Maximum key depth. */\r\nvar MAX_PATH_DEPTH = 32;\r\n/** Maximum number of (UTF8) bytes in a Firebase path. */\r\nvar MAX_PATH_LENGTH_BYTES = 768;\r\n/**\r\n * An immutable object representing a parsed path. It's immutable so that you\r\n * can pass them around to other functions without worrying about them changing\r\n * it.\r\n */\r\nvar Path = /** @class */ (function () {\r\n /**\r\n * @param pathOrString - Path string to parse, or another path, or the raw\r\n * tokens array\r\n */\r\n function Path(pathOrString, pieceNum) {\r\n if (pieceNum === void 0) {\r\n this.pieces_ = pathOrString.split('/');\r\n // Remove empty pieces.\r\n var copyTo = 0;\r\n for (var i = 0; i < this.pieces_.length; i++) {\r\n if (this.pieces_[i].length > 0) {\r\n this.pieces_[copyTo] = this.pieces_[i];\r\n copyTo++;\r\n }\r\n }\r\n this.pieces_.length = copyTo;\r\n this.pieceNum_ = 0;\r\n }\r\n else {\r\n this.pieces_ = pathOrString;\r\n this.pieceNum_ = pieceNum;\r\n }\r\n }\r\n Path.prototype.toString = function () {\r\n var pathString = '';\r\n for (var i = this.pieceNum_; i < this.pieces_.length; i++) {\r\n if (this.pieces_[i] !== '') {\r\n pathString += '/' + this.pieces_[i];\r\n }\r\n }\r\n return pathString || '/';\r\n };\r\n return Path;\r\n}());\r\nfunction newEmptyPath() {\r\n return new Path('');\r\n}\r\nfunction pathGetFront(path) {\r\n if (path.pieceNum_ >= path.pieces_.length) {\r\n return null;\r\n }\r\n return path.pieces_[path.pieceNum_];\r\n}\r\n/**\r\n * @returns The number of segments in this path\r\n */\r\nfunction pathGetLength(path) {\r\n return path.pieces_.length - path.pieceNum_;\r\n}\r\nfunction pathPopFront(path) {\r\n var pieceNum = path.pieceNum_;\r\n if (pieceNum < path.pieces_.length) {\r\n pieceNum++;\r\n }\r\n return new Path(path.pieces_, pieceNum);\r\n}\r\nfunction pathGetBack(path) {\r\n if (path.pieceNum_ < path.pieces_.length) {\r\n return path.pieces_[path.pieces_.length - 1];\r\n }\r\n return null;\r\n}\r\nfunction pathToUrlEncodedString(path) {\r\n var pathString = '';\r\n for (var i = path.pieceNum_; i < path.pieces_.length; i++) {\r\n if (path.pieces_[i] !== '') {\r\n pathString += '/' + encodeURIComponent(String(path.pieces_[i]));\r\n }\r\n }\r\n return pathString || '/';\r\n}\r\n/**\r\n * Shallow copy of the parts of the path.\r\n *\r\n */\r\nfunction pathSlice(path, begin) {\r\n if (begin === void 0) { begin = 0; }\r\n return path.pieces_.slice(path.pieceNum_ + begin);\r\n}\r\nfunction pathParent(path) {\r\n if (path.pieceNum_ >= path.pieces_.length) {\r\n return null;\r\n }\r\n var pieces = [];\r\n for (var i = path.pieceNum_; i < path.pieces_.length - 1; i++) {\r\n pieces.push(path.pieces_[i]);\r\n }\r\n return new Path(pieces, 0);\r\n}\r\nfunction pathChild(path, childPathObj) {\r\n var pieces = [];\r\n for (var i = path.pieceNum_; i < path.pieces_.length; i++) {\r\n pieces.push(path.pieces_[i]);\r\n }\r\n if (childPathObj instanceof Path) {\r\n for (var i = childPathObj.pieceNum_; i < childPathObj.pieces_.length; i++) {\r\n pieces.push(childPathObj.pieces_[i]);\r\n }\r\n }\r\n else {\r\n var childPieces = childPathObj.split('/');\r\n for (var i = 0; i < childPieces.length; i++) {\r\n if (childPieces[i].length > 0) {\r\n pieces.push(childPieces[i]);\r\n }\r\n }\r\n }\r\n return new Path(pieces, 0);\r\n}\r\n/**\r\n * @returns True if there are no segments in this path\r\n */\r\nfunction pathIsEmpty(path) {\r\n return path.pieceNum_ >= path.pieces_.length;\r\n}\r\n/**\r\n * @returns The path from outerPath to innerPath\r\n */\r\nfunction newRelativePath(outerPath, innerPath) {\r\n var outer = pathGetFront(outerPath), inner = pathGetFront(innerPath);\r\n if (outer === null) {\r\n return innerPath;\r\n }\r\n else if (outer === inner) {\r\n return newRelativePath(pathPopFront(outerPath), pathPopFront(innerPath));\r\n }\r\n else {\r\n throw new Error('INTERNAL ERROR: innerPath (' +\r\n innerPath +\r\n ') is not within ' +\r\n 'outerPath (' +\r\n outerPath +\r\n ')');\r\n }\r\n}\r\n/**\r\n * @returns -1, 0, 1 if left is less, equal, or greater than the right.\r\n */\r\nfunction pathCompare(left, right) {\r\n var leftKeys = pathSlice(left, 0);\r\n var rightKeys = pathSlice(right, 0);\r\n for (var i = 0; i < leftKeys.length && i < rightKeys.length; i++) {\r\n var cmp = nameCompare(leftKeys[i], rightKeys[i]);\r\n if (cmp !== 0) {\r\n return cmp;\r\n }\r\n }\r\n if (leftKeys.length === rightKeys.length) {\r\n return 0;\r\n }\r\n return leftKeys.length < rightKeys.length ? -1 : 1;\r\n}\r\n/**\r\n * @returns true if paths are the same.\r\n */\r\nfunction pathEquals(path, other) {\r\n if (pathGetLength(path) !== pathGetLength(other)) {\r\n return false;\r\n }\r\n for (var i = path.pieceNum_, j = other.pieceNum_; i <= path.pieces_.length; i++, j++) {\r\n if (path.pieces_[i] !== other.pieces_[j]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n/**\r\n * @returns True if this path is a parent (or the same as) other\r\n */\r\nfunction pathContains(path, other) {\r\n var i = path.pieceNum_;\r\n var j = other.pieceNum_;\r\n if (pathGetLength(path) > pathGetLength(other)) {\r\n return false;\r\n }\r\n while (i < path.pieces_.length) {\r\n if (path.pieces_[i] !== other.pieces_[j]) {\r\n return false;\r\n }\r\n ++i;\r\n ++j;\r\n }\r\n return true;\r\n}\r\n/**\r\n * Dynamic (mutable) path used to count path lengths.\r\n *\r\n * This class is used to efficiently check paths for valid\r\n * length (in UTF8 bytes) and depth (used in path validation).\r\n *\r\n * Throws Error exception if path is ever invalid.\r\n *\r\n * The definition of a path always begins with '/'.\r\n */\r\nvar ValidationPath = /** @class */ (function () {\r\n /**\r\n * @param path - Initial Path.\r\n * @param errorPrefix_ - Prefix for any error messages.\r\n */\r\n function ValidationPath(path, errorPrefix_) {\r\n this.errorPrefix_ = errorPrefix_;\r\n this.parts_ = pathSlice(path, 0);\r\n /** Initialize to number of '/' chars needed in path. */\r\n this.byteLength_ = Math.max(1, this.parts_.length);\r\n for (var i = 0; i < this.parts_.length; i++) {\r\n this.byteLength_ += stringLength(this.parts_[i]);\r\n }\r\n validationPathCheckValid(this);\r\n }\r\n return ValidationPath;\r\n}());\r\nfunction validationPathPush(validationPath, child) {\r\n // Count the needed '/'\r\n if (validationPath.parts_.length > 0) {\r\n validationPath.byteLength_ += 1;\r\n }\r\n validationPath.parts_.push(child);\r\n validationPath.byteLength_ += stringLength(child);\r\n validationPathCheckValid(validationPath);\r\n}\r\nfunction validationPathPop(validationPath) {\r\n var last = validationPath.parts_.pop();\r\n validationPath.byteLength_ -= stringLength(last);\r\n // Un-count the previous '/'\r\n if (validationPath.parts_.length > 0) {\r\n validationPath.byteLength_ -= 1;\r\n }\r\n}\r\nfunction validationPathCheckValid(validationPath) {\r\n if (validationPath.byteLength_ > MAX_PATH_LENGTH_BYTES) {\r\n throw new Error(validationPath.errorPrefix_ +\r\n 'has a key path longer than ' +\r\n MAX_PATH_LENGTH_BYTES +\r\n ' bytes (' +\r\n validationPath.byteLength_ +\r\n ').');\r\n }\r\n if (validationPath.parts_.length > MAX_PATH_DEPTH) {\r\n throw new Error(validationPath.errorPrefix_ +\r\n 'path specified exceeds the maximum depth that can be written (' +\r\n MAX_PATH_DEPTH +\r\n ') or object contains a cycle ' +\r\n validationPathToErrorString(validationPath));\r\n }\r\n}\r\n/**\r\n * String for use in error messages - uses '.' notation for path.\r\n */\r\nfunction validationPathToErrorString(validationPath) {\r\n if (validationPath.parts_.length === 0) {\r\n return '';\r\n }\r\n return \"in property '\" + validationPath.parts_.join('.') + \"'\";\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar VisibilityMonitor = /** @class */ (function (_super) {\r\n __extends(VisibilityMonitor, _super);\r\n function VisibilityMonitor() {\r\n var _this = _super.call(this, ['visible']) || this;\r\n var hidden;\r\n var visibilityChange;\r\n if (typeof document !== 'undefined' &&\r\n typeof document.addEventListener !== 'undefined') {\r\n if (typeof document['hidden'] !== 'undefined') {\r\n // Opera 12.10 and Firefox 18 and later support\r\n visibilityChange = 'visibilitychange';\r\n hidden = 'hidden';\r\n }\r\n else if (typeof document['mozHidden'] !== 'undefined') {\r\n visibilityChange = 'mozvisibilitychange';\r\n hidden = 'mozHidden';\r\n }\r\n else if (typeof document['msHidden'] !== 'undefined') {\r\n visibilityChange = 'msvisibilitychange';\r\n hidden = 'msHidden';\r\n }\r\n else if (typeof document['webkitHidden'] !== 'undefined') {\r\n visibilityChange = 'webkitvisibilitychange';\r\n hidden = 'webkitHidden';\r\n }\r\n }\r\n // Initially, we always assume we are visible. This ensures that in browsers\r\n // without page visibility support or in cases where we are never visible\r\n // (e.g. chrome extension), we act as if we are visible, i.e. don't delay\r\n // reconnects\r\n _this.visible_ = true;\r\n if (visibilityChange) {\r\n document.addEventListener(visibilityChange, function () {\r\n var visible = !document[hidden];\r\n if (visible !== _this.visible_) {\r\n _this.visible_ = visible;\r\n _this.trigger('visible', visible);\r\n }\r\n }, false);\r\n }\r\n return _this;\r\n }\r\n VisibilityMonitor.getInstance = function () {\r\n return new VisibilityMonitor();\r\n };\r\n VisibilityMonitor.prototype.getInitialEvent = function (eventType) {\r\n assert(eventType === 'visible', 'Unknown event type: ' + eventType);\r\n return [this.visible_];\r\n };\r\n return VisibilityMonitor;\r\n}(EventEmitter));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar RECONNECT_MIN_DELAY = 1000;\r\nvar RECONNECT_MAX_DELAY_DEFAULT = 60 * 5 * 1000; // 5 minutes in milliseconds (Case: 1858)\r\nvar GET_CONNECT_TIMEOUT = 3 * 1000;\r\nvar RECONNECT_MAX_DELAY_FOR_ADMINS = 30 * 1000; // 30 seconds for admin clients (likely to be a backend server)\r\nvar RECONNECT_DELAY_MULTIPLIER = 1.3;\r\nvar RECONNECT_DELAY_RESET_TIMEOUT = 30000; // Reset delay back to MIN_DELAY after being connected for 30sec.\r\nvar SERVER_KILL_INTERRUPT_REASON = 'server_kill';\r\n// If auth fails repeatedly, we'll assume something is wrong and log a warning / back off.\r\nvar INVALID_TOKEN_THRESHOLD = 3;\r\n/**\r\n * Firebase connection. Abstracts wire protocol and handles reconnecting.\r\n *\r\n * NOTE: All JSON objects sent to the realtime connection must have property names enclosed\r\n * in quotes to make sure the closure compiler does not minify them.\r\n */\r\nvar PersistentConnection = /** @class */ (function (_super) {\r\n __extends(PersistentConnection, _super);\r\n /**\r\n * @param repoInfo_ - Data about the namespace we are connecting to\r\n * @param applicationId_ - The Firebase App ID for this project\r\n * @param onDataUpdate_ - A callback for new data from the server\r\n */\r\n function PersistentConnection(repoInfo_, applicationId_, onDataUpdate_, onConnectStatus_, onServerInfoUpdate_, authTokenProvider_, appCheckTokenProvider_, authOverride_) {\r\n var _this = _super.call(this) || this;\r\n _this.repoInfo_ = repoInfo_;\r\n _this.applicationId_ = applicationId_;\r\n _this.onDataUpdate_ = onDataUpdate_;\r\n _this.onConnectStatus_ = onConnectStatus_;\r\n _this.onServerInfoUpdate_ = onServerInfoUpdate_;\r\n _this.authTokenProvider_ = authTokenProvider_;\r\n _this.appCheckTokenProvider_ = appCheckTokenProvider_;\r\n _this.authOverride_ = authOverride_;\r\n // Used for diagnostic logging.\r\n _this.id = PersistentConnection.nextPersistentConnectionId_++;\r\n _this.log_ = logWrapper('p:' + _this.id + ':');\r\n _this.interruptReasons_ = {};\r\n _this.listens = new Map();\r\n _this.outstandingPuts_ = [];\r\n _this.outstandingGets_ = [];\r\n _this.outstandingPutCount_ = 0;\r\n _this.outstandingGetCount_ = 0;\r\n _this.onDisconnectRequestQueue_ = [];\r\n _this.connected_ = false;\r\n _this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n _this.maxReconnectDelay_ = RECONNECT_MAX_DELAY_DEFAULT;\r\n _this.securityDebugCallback_ = null;\r\n _this.lastSessionId = null;\r\n _this.establishConnectionTimer_ = null;\r\n _this.visible_ = false;\r\n // Before we get connected, we keep a queue of pending messages to send.\r\n _this.requestCBHash_ = {};\r\n _this.requestNumber_ = 0;\r\n _this.realtime_ = null;\r\n _this.authToken_ = null;\r\n _this.appCheckToken_ = null;\r\n _this.forceTokenRefresh_ = false;\r\n _this.invalidAuthTokenCount_ = 0;\r\n _this.invalidAppCheckTokenCount_ = 0;\r\n _this.firstConnection_ = true;\r\n _this.lastConnectionAttemptTime_ = null;\r\n _this.lastConnectionEstablishedTime_ = null;\r\n if (authOverride_ && !isNodeSdk()) {\r\n throw new Error('Auth override specified in options, but not supported on non Node.js platforms');\r\n }\r\n VisibilityMonitor.getInstance().on('visible', _this.onVisible_, _this);\r\n if (repoInfo_.host.indexOf('fblocal') === -1) {\r\n OnlineMonitor.getInstance().on('online', _this.onOnline_, _this);\r\n }\r\n return _this;\r\n }\r\n PersistentConnection.prototype.sendRequest = function (action, body, onResponse) {\r\n var curReqNum = ++this.requestNumber_;\r\n var msg = { r: curReqNum, a: action, b: body };\r\n this.log_(stringify(msg));\r\n assert(this.connected_, \"sendRequest call when we're not connected not allowed.\");\r\n this.realtime_.sendRequest(msg);\r\n if (onResponse) {\r\n this.requestCBHash_[curReqNum] = onResponse;\r\n }\r\n };\r\n PersistentConnection.prototype.get = function (query) {\r\n var _this = this;\r\n this.initConnection_();\r\n var deferred = new Deferred();\r\n var request = {\r\n p: query._path.toString(),\r\n q: query._queryObject\r\n };\r\n var outstandingGet = {\r\n action: 'g',\r\n request: request,\r\n onComplete: function (message) {\r\n var payload = message['d'];\r\n if (message['s'] === 'ok') {\r\n _this.onDataUpdate_(request['p'], payload, \r\n /*isMerge*/ false, \r\n /*tag*/ null);\r\n deferred.resolve(payload);\r\n }\r\n else {\r\n deferred.reject(payload);\r\n }\r\n }\r\n };\r\n this.outstandingGets_.push(outstandingGet);\r\n this.outstandingGetCount_++;\r\n var index = this.outstandingGets_.length - 1;\r\n if (!this.connected_) {\r\n setTimeout(function () {\r\n var get = _this.outstandingGets_[index];\r\n if (get === undefined || outstandingGet !== get) {\r\n return;\r\n }\r\n delete _this.outstandingGets_[index];\r\n _this.outstandingGetCount_--;\r\n if (_this.outstandingGetCount_ === 0) {\r\n _this.outstandingGets_ = [];\r\n }\r\n _this.log_('get ' + index + ' timed out on connection');\r\n deferred.reject(new Error('Client is offline.'));\r\n }, GET_CONNECT_TIMEOUT);\r\n }\r\n if (this.connected_) {\r\n this.sendGet_(index);\r\n }\r\n return deferred.promise;\r\n };\r\n PersistentConnection.prototype.listen = function (query, currentHashFn, tag, onComplete) {\r\n this.initConnection_();\r\n var queryId = query._queryIdentifier;\r\n var pathString = query._path.toString();\r\n this.log_('Listen called for ' + pathString + ' ' + queryId);\r\n if (!this.listens.has(pathString)) {\r\n this.listens.set(pathString, new Map());\r\n }\r\n assert(query._queryParams.isDefault() || !query._queryParams.loadsAllData(), 'listen() called for non-default but complete query');\r\n assert(!this.listens.get(pathString).has(queryId), 'listen() called twice for same path/queryId.');\r\n var listenSpec = {\r\n onComplete: onComplete,\r\n hashFn: currentHashFn,\r\n query: query,\r\n tag: tag\r\n };\r\n this.listens.get(pathString).set(queryId, listenSpec);\r\n if (this.connected_) {\r\n this.sendListen_(listenSpec);\r\n }\r\n };\r\n PersistentConnection.prototype.sendGet_ = function (index) {\r\n var _this = this;\r\n var get = this.outstandingGets_[index];\r\n this.sendRequest('g', get.request, function (message) {\r\n delete _this.outstandingGets_[index];\r\n _this.outstandingGetCount_--;\r\n if (_this.outstandingGetCount_ === 0) {\r\n _this.outstandingGets_ = [];\r\n }\r\n if (get.onComplete) {\r\n get.onComplete(message);\r\n }\r\n });\r\n };\r\n PersistentConnection.prototype.sendListen_ = function (listenSpec) {\r\n var _this = this;\r\n var query = listenSpec.query;\r\n var pathString = query._path.toString();\r\n var queryId = query._queryIdentifier;\r\n this.log_('Listen on ' + pathString + ' for ' + queryId);\r\n var req = { /*path*/ p: pathString };\r\n var action = 'q';\r\n // Only bother to send query if it's non-default.\r\n if (listenSpec.tag) {\r\n req['q'] = query._queryObject;\r\n req['t'] = listenSpec.tag;\r\n }\r\n req[ /*hash*/'h'] = listenSpec.hashFn();\r\n this.sendRequest(action, req, function (message) {\r\n var payload = message[ /*data*/'d'];\r\n var status = message[ /*status*/'s'];\r\n // print warnings in any case...\r\n PersistentConnection.warnOnListenWarnings_(payload, query);\r\n var currentListenSpec = _this.listens.get(pathString) &&\r\n _this.listens.get(pathString).get(queryId);\r\n // only trigger actions if the listen hasn't been removed and readded\r\n if (currentListenSpec === listenSpec) {\r\n _this.log_('listen response', message);\r\n if (status !== 'ok') {\r\n _this.removeListen_(pathString, queryId);\r\n }\r\n if (listenSpec.onComplete) {\r\n listenSpec.onComplete(status, payload);\r\n }\r\n }\r\n });\r\n };\r\n PersistentConnection.warnOnListenWarnings_ = function (payload, query) {\r\n if (payload && typeof payload === 'object' && contains(payload, 'w')) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n var warnings = safeGet(payload, 'w');\r\n if (Array.isArray(warnings) && ~warnings.indexOf('no_index')) {\r\n var indexSpec = '\".indexOn\": \"' + query._queryParams.getIndex().toString() + '\"';\r\n var indexPath = query._path.toString();\r\n warn(\"Using an unspecified index. Your data will be downloaded and \" +\r\n (\"filtered on the client. Consider adding \" + indexSpec + \" at \") +\r\n (indexPath + \" to your security rules for better performance.\"));\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.refreshAuthToken = function (token) {\r\n this.authToken_ = token;\r\n this.log_('Auth token refreshed');\r\n if (this.authToken_) {\r\n this.tryAuth();\r\n }\r\n else {\r\n //If we're connected we want to let the server know to unauthenticate us. If we're not connected, simply delete\r\n //the credential so we dont become authenticated next time we connect.\r\n if (this.connected_) {\r\n this.sendRequest('unauth', {}, function () { });\r\n }\r\n }\r\n this.reduceReconnectDelayIfAdminCredential_(token);\r\n };\r\n PersistentConnection.prototype.reduceReconnectDelayIfAdminCredential_ = function (credential) {\r\n // NOTE: This isn't intended to be bulletproof (a malicious developer can always just modify the client).\r\n // Additionally, we don't bother resetting the max delay back to the default if auth fails / expires.\r\n var isFirebaseSecret = credential && credential.length === 40;\r\n if (isFirebaseSecret || isAdmin(credential)) {\r\n this.log_('Admin auth credential detected. Reducing max reconnect time.');\r\n this.maxReconnectDelay_ = RECONNECT_MAX_DELAY_FOR_ADMINS;\r\n }\r\n };\r\n PersistentConnection.prototype.refreshAppCheckToken = function (token) {\r\n this.appCheckToken_ = token;\r\n this.log_('App check token refreshed');\r\n if (this.appCheckToken_) {\r\n this.tryAppCheck();\r\n }\r\n else {\r\n //If we're connected we want to let the server know to unauthenticate us.\r\n //If we're not connected, simply delete the credential so we dont become\r\n // authenticated next time we connect.\r\n if (this.connected_) {\r\n this.sendRequest('unappeck', {}, function () { });\r\n }\r\n }\r\n };\r\n /**\r\n * Attempts to authenticate with the given credentials. If the authentication attempt fails, it's triggered like\r\n * a auth revoked (the connection is closed).\r\n */\r\n PersistentConnection.prototype.tryAuth = function () {\r\n var _this = this;\r\n if (this.connected_ && this.authToken_) {\r\n var token_1 = this.authToken_;\r\n var authMethod = isValidFormat(token_1) ? 'auth' : 'gauth';\r\n var requestData = { cred: token_1 };\r\n if (this.authOverride_ === null) {\r\n requestData['noauth'] = true;\r\n }\r\n else if (typeof this.authOverride_ === 'object') {\r\n requestData['authvar'] = this.authOverride_;\r\n }\r\n this.sendRequest(authMethod, requestData, function (res) {\r\n var status = res[ /*status*/'s'];\r\n var data = res[ /*data*/'d'] || 'error';\r\n if (_this.authToken_ === token_1) {\r\n if (status === 'ok') {\r\n _this.invalidAuthTokenCount_ = 0;\r\n }\r\n else {\r\n // Triggers reconnect and force refresh for auth token\r\n _this.onAuthRevoked_(status, data);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * Attempts to authenticate with the given token. If the authentication\r\n * attempt fails, it's triggered like the token was revoked (the connection is\r\n * closed).\r\n */\r\n PersistentConnection.prototype.tryAppCheck = function () {\r\n var _this = this;\r\n if (this.connected_ && this.appCheckToken_) {\r\n this.sendRequest('appcheck', { 'token': this.appCheckToken_ }, function (res) {\r\n var status = res[ /*status*/'s'];\r\n var data = res[ /*data*/'d'] || 'error';\r\n if (status === 'ok') {\r\n _this.invalidAppCheckTokenCount_ = 0;\r\n }\r\n else {\r\n _this.onAppCheckRevoked_(status, data);\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PersistentConnection.prototype.unlisten = function (query, tag) {\r\n var pathString = query._path.toString();\r\n var queryId = query._queryIdentifier;\r\n this.log_('Unlisten called for ' + pathString + ' ' + queryId);\r\n assert(query._queryParams.isDefault() || !query._queryParams.loadsAllData(), 'unlisten() called for non-default but complete query');\r\n var listen = this.removeListen_(pathString, queryId);\r\n if (listen && this.connected_) {\r\n this.sendUnlisten_(pathString, queryId, query._queryObject, tag);\r\n }\r\n };\r\n PersistentConnection.prototype.sendUnlisten_ = function (pathString, queryId, queryObj, tag) {\r\n this.log_('Unlisten on ' + pathString + ' for ' + queryId);\r\n var req = { /*path*/ p: pathString };\r\n var action = 'n';\r\n // Only bother sending queryId if it's non-default.\r\n if (tag) {\r\n req['q'] = queryObj;\r\n req['t'] = tag;\r\n }\r\n this.sendRequest(action, req);\r\n };\r\n PersistentConnection.prototype.onDisconnectPut = function (pathString, data, onComplete) {\r\n this.initConnection_();\r\n if (this.connected_) {\r\n this.sendOnDisconnect_('o', pathString, data, onComplete);\r\n }\r\n else {\r\n this.onDisconnectRequestQueue_.push({\r\n pathString: pathString,\r\n action: 'o',\r\n data: data,\r\n onComplete: onComplete\r\n });\r\n }\r\n };\r\n PersistentConnection.prototype.onDisconnectMerge = function (pathString, data, onComplete) {\r\n this.initConnection_();\r\n if (this.connected_) {\r\n this.sendOnDisconnect_('om', pathString, data, onComplete);\r\n }\r\n else {\r\n this.onDisconnectRequestQueue_.push({\r\n pathString: pathString,\r\n action: 'om',\r\n data: data,\r\n onComplete: onComplete\r\n });\r\n }\r\n };\r\n PersistentConnection.prototype.onDisconnectCancel = function (pathString, onComplete) {\r\n this.initConnection_();\r\n if (this.connected_) {\r\n this.sendOnDisconnect_('oc', pathString, null, onComplete);\r\n }\r\n else {\r\n this.onDisconnectRequestQueue_.push({\r\n pathString: pathString,\r\n action: 'oc',\r\n data: null,\r\n onComplete: onComplete\r\n });\r\n }\r\n };\r\n PersistentConnection.prototype.sendOnDisconnect_ = function (action, pathString, data, onComplete) {\r\n var request = { /*path*/ p: pathString, /*data*/ d: data };\r\n this.log_('onDisconnect ' + action, request);\r\n this.sendRequest(action, request, function (response) {\r\n if (onComplete) {\r\n setTimeout(function () {\r\n onComplete(response[ /*status*/'s'], response[ /* data */'d']);\r\n }, Math.floor(0));\r\n }\r\n });\r\n };\r\n PersistentConnection.prototype.put = function (pathString, data, onComplete, hash) {\r\n this.putInternal('p', pathString, data, onComplete, hash);\r\n };\r\n PersistentConnection.prototype.merge = function (pathString, data, onComplete, hash) {\r\n this.putInternal('m', pathString, data, onComplete, hash);\r\n };\r\n PersistentConnection.prototype.putInternal = function (action, pathString, data, onComplete, hash) {\r\n this.initConnection_();\r\n var request = {\r\n /*path*/ p: pathString,\r\n /*data*/ d: data\r\n };\r\n if (hash !== undefined) {\r\n request[ /*hash*/'h'] = hash;\r\n }\r\n // TODO: Only keep track of the most recent put for a given path?\r\n this.outstandingPuts_.push({\r\n action: action,\r\n request: request,\r\n onComplete: onComplete\r\n });\r\n this.outstandingPutCount_++;\r\n var index = this.outstandingPuts_.length - 1;\r\n if (this.connected_) {\r\n this.sendPut_(index);\r\n }\r\n else {\r\n this.log_('Buffering put: ' + pathString);\r\n }\r\n };\r\n PersistentConnection.prototype.sendPut_ = function (index) {\r\n var _this = this;\r\n var action = this.outstandingPuts_[index].action;\r\n var request = this.outstandingPuts_[index].request;\r\n var onComplete = this.outstandingPuts_[index].onComplete;\r\n this.outstandingPuts_[index].queued = this.connected_;\r\n this.sendRequest(action, request, function (message) {\r\n _this.log_(action + ' response', message);\r\n delete _this.outstandingPuts_[index];\r\n _this.outstandingPutCount_--;\r\n // Clean up array occasionally.\r\n if (_this.outstandingPutCount_ === 0) {\r\n _this.outstandingPuts_ = [];\r\n }\r\n if (onComplete) {\r\n onComplete(message[ /*status*/'s'], message[ /* data */'d']);\r\n }\r\n });\r\n };\r\n PersistentConnection.prototype.reportStats = function (stats) {\r\n var _this = this;\r\n // If we're not connected, we just drop the stats.\r\n if (this.connected_) {\r\n var request = { /*counters*/ c: stats };\r\n this.log_('reportStats', request);\r\n this.sendRequest(/*stats*/ 's', request, function (result) {\r\n var status = result[ /*status*/'s'];\r\n if (status !== 'ok') {\r\n var errorReason = result[ /* data */'d'];\r\n _this.log_('reportStats', 'Error sending stats: ' + errorReason);\r\n }\r\n });\r\n }\r\n };\r\n PersistentConnection.prototype.onDataMessage_ = function (message) {\r\n if ('r' in message) {\r\n // this is a response\r\n this.log_('from server: ' + stringify(message));\r\n var reqNum = message['r'];\r\n var onResponse = this.requestCBHash_[reqNum];\r\n if (onResponse) {\r\n delete this.requestCBHash_[reqNum];\r\n onResponse(message[ /*body*/'b']);\r\n }\r\n }\r\n else if ('error' in message) {\r\n throw 'A server-side error has occurred: ' + message['error'];\r\n }\r\n else if ('a' in message) {\r\n // a and b are action and body, respectively\r\n this.onDataPush_(message['a'], message['b']);\r\n }\r\n };\r\n PersistentConnection.prototype.onDataPush_ = function (action, body) {\r\n this.log_('handleServerMessage', action, body);\r\n if (action === 'd') {\r\n this.onDataUpdate_(body[ /*path*/'p'], body[ /*data*/'d'], \r\n /*isMerge*/ false, body['t']);\r\n }\r\n else if (action === 'm') {\r\n this.onDataUpdate_(body[ /*path*/'p'], body[ /*data*/'d'], \r\n /*isMerge=*/ true, body['t']);\r\n }\r\n else if (action === 'c') {\r\n this.onListenRevoked_(body[ /*path*/'p'], body[ /*query*/'q']);\r\n }\r\n else if (action === 'ac') {\r\n this.onAuthRevoked_(body[ /*status code*/'s'], body[ /* explanation */'d']);\r\n }\r\n else if (action === 'apc') {\r\n this.onAppCheckRevoked_(body[ /*status code*/'s'], body[ /* explanation */'d']);\r\n }\r\n else if (action === 'sd') {\r\n this.onSecurityDebugPacket_(body);\r\n }\r\n else {\r\n error('Unrecognized action received from server: ' +\r\n stringify(action) +\r\n '\\nAre you using the latest client?');\r\n }\r\n };\r\n PersistentConnection.prototype.onReady_ = function (timestamp, sessionId) {\r\n this.log_('connection ready');\r\n this.connected_ = true;\r\n this.lastConnectionEstablishedTime_ = new Date().getTime();\r\n this.handleTimestamp_(timestamp);\r\n this.lastSessionId = sessionId;\r\n if (this.firstConnection_) {\r\n this.sendConnectStats_();\r\n }\r\n this.restoreState_();\r\n this.firstConnection_ = false;\r\n this.onConnectStatus_(true);\r\n };\r\n PersistentConnection.prototype.scheduleConnect_ = function (timeout) {\r\n var _this = this;\r\n assert(!this.realtime_, \"Scheduling a connect when we're already connected/ing?\");\r\n if (this.establishConnectionTimer_) {\r\n clearTimeout(this.establishConnectionTimer_);\r\n }\r\n // NOTE: Even when timeout is 0, it's important to do a setTimeout to work around an infuriating \"Security Error\" in\r\n // Firefox when trying to write to our long-polling iframe in some scenarios (e.g. Forge or our unit tests).\r\n this.establishConnectionTimer_ = setTimeout(function () {\r\n _this.establishConnectionTimer_ = null;\r\n _this.establishConnection_();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n }, Math.floor(timeout));\r\n };\r\n PersistentConnection.prototype.initConnection_ = function () {\r\n if (!this.realtime_ && this.firstConnection_) {\r\n this.scheduleConnect_(0);\r\n }\r\n };\r\n PersistentConnection.prototype.onVisible_ = function (visible) {\r\n // NOTE: Tabbing away and back to a window will defeat our reconnect backoff, but I think that's fine.\r\n if (visible &&\r\n !this.visible_ &&\r\n this.reconnectDelay_ === this.maxReconnectDelay_) {\r\n this.log_('Window became visible. Reducing delay.');\r\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n if (!this.realtime_) {\r\n this.scheduleConnect_(0);\r\n }\r\n }\r\n this.visible_ = visible;\r\n };\r\n PersistentConnection.prototype.onOnline_ = function (online) {\r\n if (online) {\r\n this.log_('Browser went online.');\r\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n if (!this.realtime_) {\r\n this.scheduleConnect_(0);\r\n }\r\n }\r\n else {\r\n this.log_('Browser went offline. Killing connection.');\r\n if (this.realtime_) {\r\n this.realtime_.close();\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.onRealtimeDisconnect_ = function () {\r\n this.log_('data client disconnected');\r\n this.connected_ = false;\r\n this.realtime_ = null;\r\n // Since we don't know if our sent transactions succeeded or not, we need to cancel them.\r\n this.cancelSentTransactions_();\r\n // Clear out the pending requests.\r\n this.requestCBHash_ = {};\r\n if (this.shouldReconnect_()) {\r\n if (!this.visible_) {\r\n this.log_(\"Window isn't visible. Delaying reconnect.\");\r\n this.reconnectDelay_ = this.maxReconnectDelay_;\r\n this.lastConnectionAttemptTime_ = new Date().getTime();\r\n }\r\n else if (this.lastConnectionEstablishedTime_) {\r\n // If we've been connected long enough, reset reconnect delay to minimum.\r\n var timeSinceLastConnectSucceeded = new Date().getTime() - this.lastConnectionEstablishedTime_;\r\n if (timeSinceLastConnectSucceeded > RECONNECT_DELAY_RESET_TIMEOUT) {\r\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n }\r\n this.lastConnectionEstablishedTime_ = null;\r\n }\r\n var timeSinceLastConnectAttempt = new Date().getTime() - this.lastConnectionAttemptTime_;\r\n var reconnectDelay = Math.max(0, this.reconnectDelay_ - timeSinceLastConnectAttempt);\r\n reconnectDelay = Math.random() * reconnectDelay;\r\n this.log_('Trying to reconnect in ' + reconnectDelay + 'ms');\r\n this.scheduleConnect_(reconnectDelay);\r\n // Adjust reconnect delay for next time.\r\n this.reconnectDelay_ = Math.min(this.maxReconnectDelay_, this.reconnectDelay_ * RECONNECT_DELAY_MULTIPLIER);\r\n }\r\n this.onConnectStatus_(false);\r\n };\r\n PersistentConnection.prototype.establishConnection_ = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var onDataMessage, onReady, onDisconnect_1, connId, lastSessionId, canceled_1, connection_1, closeFn, sendRequestFn, forceRefresh, _a, authToken, appCheckToken, error_1;\r\n var _this = this;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n if (!this.shouldReconnect_()) return [3 /*break*/, 4];\r\n this.log_('Making a connection attempt');\r\n this.lastConnectionAttemptTime_ = new Date().getTime();\r\n this.lastConnectionEstablishedTime_ = null;\r\n onDataMessage = this.onDataMessage_.bind(this);\r\n onReady = this.onReady_.bind(this);\r\n onDisconnect_1 = this.onRealtimeDisconnect_.bind(this);\r\n connId = this.id + ':' + PersistentConnection.nextConnectionId_++;\r\n lastSessionId = this.lastSessionId;\r\n canceled_1 = false;\r\n connection_1 = null;\r\n closeFn = function () {\r\n if (connection_1) {\r\n connection_1.close();\r\n }\r\n else {\r\n canceled_1 = true;\r\n onDisconnect_1();\r\n }\r\n };\r\n sendRequestFn = function (msg) {\r\n assert(connection_1, \"sendRequest call when we're not connected not allowed.\");\r\n connection_1.sendRequest(msg);\r\n };\r\n this.realtime_ = {\r\n close: closeFn,\r\n sendRequest: sendRequestFn\r\n };\r\n forceRefresh = this.forceTokenRefresh_;\r\n this.forceTokenRefresh_ = false;\r\n _b.label = 1;\r\n case 1:\r\n _b.trys.push([1, 3, , 4]);\r\n return [4 /*yield*/, Promise.all([\r\n this.authTokenProvider_.getToken(forceRefresh),\r\n this.appCheckTokenProvider_.getToken(forceRefresh)\r\n ])];\r\n case 2:\r\n _a = __read.apply(void 0, [_b.sent(), 2]), authToken = _a[0], appCheckToken = _a[1];\r\n if (!canceled_1) {\r\n log('getToken() completed. Creating connection.');\r\n this.authToken_ = authToken && authToken.accessToken;\r\n this.appCheckToken_ = appCheckToken && appCheckToken.token;\r\n connection_1 = new Connection(connId, this.repoInfo_, this.applicationId_, this.appCheckToken_, this.authToken_, onDataMessage, onReady, onDisconnect_1, \r\n /* onKill= */ function (reason) {\r\n warn(reason + ' (' + _this.repoInfo_.toString() + ')');\r\n _this.interrupt(SERVER_KILL_INTERRUPT_REASON);\r\n }, lastSessionId);\r\n }\r\n else {\r\n log('getToken() completed but was canceled');\r\n }\r\n return [3 /*break*/, 4];\r\n case 3:\r\n error_1 = _b.sent();\r\n this.log_('Failed to get token: ' + error_1);\r\n if (!canceled_1) {\r\n if (this.repoInfo_.nodeAdmin) {\r\n // This may be a critical error for the Admin Node.js SDK, so log a warning.\r\n // But getToken() may also just have temporarily failed, so we still want to\r\n // continue retrying.\r\n warn(error_1);\r\n }\r\n closeFn();\r\n }\r\n return [3 /*break*/, 4];\r\n case 4: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n PersistentConnection.prototype.interrupt = function (reason) {\r\n log('Interrupting connection for reason: ' + reason);\r\n this.interruptReasons_[reason] = true;\r\n if (this.realtime_) {\r\n this.realtime_.close();\r\n }\r\n else {\r\n if (this.establishConnectionTimer_) {\r\n clearTimeout(this.establishConnectionTimer_);\r\n this.establishConnectionTimer_ = null;\r\n }\r\n if (this.connected_) {\r\n this.onRealtimeDisconnect_();\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.resume = function (reason) {\r\n log('Resuming connection for reason: ' + reason);\r\n delete this.interruptReasons_[reason];\r\n if (isEmpty(this.interruptReasons_)) {\r\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n if (!this.realtime_) {\r\n this.scheduleConnect_(0);\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.handleTimestamp_ = function (timestamp) {\r\n var delta = timestamp - new Date().getTime();\r\n this.onServerInfoUpdate_({ serverTimeOffset: delta });\r\n };\r\n PersistentConnection.prototype.cancelSentTransactions_ = function () {\r\n for (var i = 0; i < this.outstandingPuts_.length; i++) {\r\n var put = this.outstandingPuts_[i];\r\n if (put && /*hash*/ 'h' in put.request && put.queued) {\r\n if (put.onComplete) {\r\n put.onComplete('disconnect');\r\n }\r\n delete this.outstandingPuts_[i];\r\n this.outstandingPutCount_--;\r\n }\r\n }\r\n // Clean up array occasionally.\r\n if (this.outstandingPutCount_ === 0) {\r\n this.outstandingPuts_ = [];\r\n }\r\n };\r\n PersistentConnection.prototype.onListenRevoked_ = function (pathString, query) {\r\n // Remove the listen and manufacture a \"permission_denied\" error for the failed listen.\r\n var queryId;\r\n if (!query) {\r\n queryId = 'default';\r\n }\r\n else {\r\n queryId = query.map(function (q) { return ObjectToUniqueKey(q); }).join('$');\r\n }\r\n var listen = this.removeListen_(pathString, queryId);\r\n if (listen && listen.onComplete) {\r\n listen.onComplete('permission_denied');\r\n }\r\n };\r\n PersistentConnection.prototype.removeListen_ = function (pathString, queryId) {\r\n var normalizedPathString = new Path(pathString).toString(); // normalize path.\r\n var listen;\r\n if (this.listens.has(normalizedPathString)) {\r\n var map = this.listens.get(normalizedPathString);\r\n listen = map.get(queryId);\r\n map.delete(queryId);\r\n if (map.size === 0) {\r\n this.listens.delete(normalizedPathString);\r\n }\r\n }\r\n else {\r\n // all listens for this path has already been removed\r\n listen = undefined;\r\n }\r\n return listen;\r\n };\r\n PersistentConnection.prototype.onAuthRevoked_ = function (statusCode, explanation) {\r\n log('Auth token revoked: ' + statusCode + '/' + explanation);\r\n this.authToken_ = null;\r\n this.forceTokenRefresh_ = true;\r\n this.realtime_.close();\r\n if (statusCode === 'invalid_token' || statusCode === 'permission_denied') {\r\n // We'll wait a couple times before logging the warning / increasing the\r\n // retry period since oauth tokens will report as \"invalid\" if they're\r\n // just expired. Plus there may be transient issues that resolve themselves.\r\n this.invalidAuthTokenCount_++;\r\n if (this.invalidAuthTokenCount_ >= INVALID_TOKEN_THRESHOLD) {\r\n // Set a long reconnect delay because recovery is unlikely\r\n this.reconnectDelay_ = RECONNECT_MAX_DELAY_FOR_ADMINS;\r\n // Notify the auth token provider that the token is invalid, which will log\r\n // a warning\r\n this.authTokenProvider_.notifyForInvalidToken();\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.onAppCheckRevoked_ = function (statusCode, explanation) {\r\n log('App check token revoked: ' + statusCode + '/' + explanation);\r\n this.appCheckToken_ = null;\r\n this.forceTokenRefresh_ = true;\r\n // Note: We don't close the connection as the developer may not have\r\n // enforcement enabled. The backend closes connections with enforcements.\r\n if (statusCode === 'invalid_token' || statusCode === 'permission_denied') {\r\n // We'll wait a couple times before logging the warning / increasing the\r\n // retry period since oauth tokens will report as \"invalid\" if they're\r\n // just expired. Plus there may be transient issues that resolve themselves.\r\n this.invalidAppCheckTokenCount_++;\r\n if (this.invalidAppCheckTokenCount_ >= INVALID_TOKEN_THRESHOLD) {\r\n this.appCheckTokenProvider_.notifyForInvalidToken();\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.onSecurityDebugPacket_ = function (body) {\r\n if (this.securityDebugCallback_) {\r\n this.securityDebugCallback_(body);\r\n }\r\n else {\r\n if ('msg' in body) {\r\n console.log('FIREBASE: ' + body['msg'].replace('\\n', '\\nFIREBASE: '));\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.restoreState_ = function () {\r\n var e_1, _a, e_2, _b;\r\n //Re-authenticate ourselves if we have a credential stored.\r\n this.tryAuth();\r\n this.tryAppCheck();\r\n try {\r\n // Puts depend on having received the corresponding data update from the server before they complete, so we must\r\n // make sure to send listens before puts.\r\n for (var _c = __values(this.listens.values()), _d = _c.next(); !_d.done; _d = _c.next()) {\r\n var queries = _d.value;\r\n try {\r\n for (var _e = (e_2 = void 0, __values(queries.values())), _f = _e.next(); !_f.done; _f = _e.next()) {\r\n var listenSpec = _f.value;\r\n this.sendListen_(listenSpec);\r\n }\r\n }\r\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\r\n finally {\r\n try {\r\n if (_f && !_f.done && (_b = _e.return)) _b.call(_e);\r\n }\r\n finally { if (e_2) throw e_2.error; }\r\n }\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n for (var i = 0; i < this.outstandingPuts_.length; i++) {\r\n if (this.outstandingPuts_[i]) {\r\n this.sendPut_(i);\r\n }\r\n }\r\n while (this.onDisconnectRequestQueue_.length) {\r\n var request = this.onDisconnectRequestQueue_.shift();\r\n this.sendOnDisconnect_(request.action, request.pathString, request.data, request.onComplete);\r\n }\r\n for (var i = 0; i < this.outstandingGets_.length; i++) {\r\n if (this.outstandingGets_[i]) {\r\n this.sendGet_(i);\r\n }\r\n }\r\n };\r\n /**\r\n * Sends client stats for first connection\r\n */\r\n PersistentConnection.prototype.sendConnectStats_ = function () {\r\n var stats = {};\r\n var clientName = 'js';\r\n if (isNodeSdk()) {\r\n if (this.repoInfo_.nodeAdmin) {\r\n clientName = 'admin_node';\r\n }\r\n else {\r\n clientName = 'node';\r\n }\r\n }\r\n stats['sdk.' + clientName + '.' + SDK_VERSION.replace(/\\./g, '-')] = 1;\r\n if (isMobileCordova()) {\r\n stats['framework.cordova'] = 1;\r\n }\r\n else if (isReactNative()) {\r\n stats['framework.reactnative'] = 1;\r\n }\r\n this.reportStats(stats);\r\n };\r\n PersistentConnection.prototype.shouldReconnect_ = function () {\r\n var online = OnlineMonitor.getInstance().currentlyOnline();\r\n return isEmpty(this.interruptReasons_) && online;\r\n };\r\n PersistentConnection.nextPersistentConnectionId_ = 0;\r\n /**\r\n * Counter for number of connections created. Mainly used for tagging in the logs\r\n */\r\n PersistentConnection.nextConnectionId_ = 0;\r\n return PersistentConnection;\r\n}(ServerActions));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar NamedNode = /** @class */ (function () {\r\n function NamedNode(name, node) {\r\n this.name = name;\r\n this.node = node;\r\n }\r\n NamedNode.Wrap = function (name, node) {\r\n return new NamedNode(name, node);\r\n };\r\n return NamedNode;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar Index = /** @class */ (function () {\r\n function Index() {\r\n }\r\n /**\r\n * @returns A standalone comparison function for\r\n * this index\r\n */\r\n Index.prototype.getCompare = function () {\r\n return this.compare.bind(this);\r\n };\r\n /**\r\n * Given a before and after value for a node, determine if the indexed value has changed. Even if they are different,\r\n * it's possible that the changes are isolated to parts of the snapshot that are not indexed.\r\n *\r\n *\r\n * @returns True if the portion of the snapshot being indexed changed between oldNode and newNode\r\n */\r\n Index.prototype.indexedValueChanged = function (oldNode, newNode) {\r\n var oldWrapped = new NamedNode(MIN_NAME, oldNode);\r\n var newWrapped = new NamedNode(MIN_NAME, newNode);\r\n return this.compare(oldWrapped, newWrapped) !== 0;\r\n };\r\n /**\r\n * @returns a node wrapper that will sort equal to or less than\r\n * any other node wrapper, using this index\r\n */\r\n Index.prototype.minPost = function () {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return NamedNode.MIN;\r\n };\r\n return Index;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar __EMPTY_NODE;\r\nvar KeyIndex = /** @class */ (function (_super) {\r\n __extends(KeyIndex, _super);\r\n function KeyIndex() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n Object.defineProperty(KeyIndex, \"__EMPTY_NODE\", {\r\n get: function () {\r\n return __EMPTY_NODE;\r\n },\r\n set: function (val) {\r\n __EMPTY_NODE = val;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n KeyIndex.prototype.compare = function (a, b) {\r\n return nameCompare(a.name, b.name);\r\n };\r\n KeyIndex.prototype.isDefinedOn = function (node) {\r\n // We could probably return true here (since every node has a key), but it's never called\r\n // so just leaving unimplemented for now.\r\n throw assertionError('KeyIndex.isDefinedOn not expected to be called.');\r\n };\r\n KeyIndex.prototype.indexedValueChanged = function (oldNode, newNode) {\r\n return false; // The key for a node never changes.\r\n };\r\n KeyIndex.prototype.minPost = function () {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return NamedNode.MIN;\r\n };\r\n KeyIndex.prototype.maxPost = function () {\r\n // TODO: This should really be created once and cached in a static property, but\r\n // NamedNode isn't defined yet, so I can't use it in a static. Bleh.\r\n return new NamedNode(MAX_NAME, __EMPTY_NODE);\r\n };\r\n KeyIndex.prototype.makePost = function (indexValue, name) {\r\n assert(typeof indexValue === 'string', 'KeyIndex indexValue must always be a string.');\r\n // We just use empty node, but it'll never be compared, since our comparator only looks at name.\r\n return new NamedNode(indexValue, __EMPTY_NODE);\r\n };\r\n /**\r\n * @returns String representation for inclusion in a query spec\r\n */\r\n KeyIndex.prototype.toString = function () {\r\n return '.key';\r\n };\r\n return KeyIndex;\r\n}(Index));\r\nvar KEY_INDEX = new KeyIndex();\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An iterator over an LLRBNode.\r\n */\r\nvar SortedMapIterator = /** @class */ (function () {\r\n /**\r\n * @param node - Node to iterate.\r\n * @param isReverse_ - Whether or not to iterate in reverse\r\n */\r\n function SortedMapIterator(node, startKey, comparator, isReverse_, resultGenerator_) {\r\n if (resultGenerator_ === void 0) { resultGenerator_ = null; }\r\n this.isReverse_ = isReverse_;\r\n this.resultGenerator_ = resultGenerator_;\r\n this.nodeStack_ = [];\r\n var cmp = 1;\r\n while (!node.isEmpty()) {\r\n node = node;\r\n cmp = startKey ? comparator(node.key, startKey) : 1;\r\n // flip the comparison if we're going in reverse\r\n if (isReverse_) {\r\n cmp *= -1;\r\n }\r\n if (cmp < 0) {\r\n // This node is less than our start key. ignore it\r\n if (this.isReverse_) {\r\n node = node.left;\r\n }\r\n else {\r\n node = node.right;\r\n }\r\n }\r\n else if (cmp === 0) {\r\n // This node is exactly equal to our start key. Push it on the stack, but stop iterating;\r\n this.nodeStack_.push(node);\r\n break;\r\n }\r\n else {\r\n // This node is greater than our start key, add it to the stack and move to the next one\r\n this.nodeStack_.push(node);\r\n if (this.isReverse_) {\r\n node = node.right;\r\n }\r\n else {\r\n node = node.left;\r\n }\r\n }\r\n }\r\n }\r\n SortedMapIterator.prototype.getNext = function () {\r\n if (this.nodeStack_.length === 0) {\r\n return null;\r\n }\r\n var node = this.nodeStack_.pop();\r\n var result;\r\n if (this.resultGenerator_) {\r\n result = this.resultGenerator_(node.key, node.value);\r\n }\r\n else {\r\n result = { key: node.key, value: node.value };\r\n }\r\n if (this.isReverse_) {\r\n node = node.left;\r\n while (!node.isEmpty()) {\r\n this.nodeStack_.push(node);\r\n node = node.right;\r\n }\r\n }\r\n else {\r\n node = node.right;\r\n while (!node.isEmpty()) {\r\n this.nodeStack_.push(node);\r\n node = node.left;\r\n }\r\n }\r\n return result;\r\n };\r\n SortedMapIterator.prototype.hasNext = function () {\r\n return this.nodeStack_.length > 0;\r\n };\r\n SortedMapIterator.prototype.peek = function () {\r\n if (this.nodeStack_.length === 0) {\r\n return null;\r\n }\r\n var node = this.nodeStack_[this.nodeStack_.length - 1];\r\n if (this.resultGenerator_) {\r\n return this.resultGenerator_(node.key, node.value);\r\n }\r\n else {\r\n return { key: node.key, value: node.value };\r\n }\r\n };\r\n return SortedMapIterator;\r\n}());\r\n/**\r\n * Represents a node in a Left-leaning Red-Black tree.\r\n */\r\nvar LLRBNode = /** @class */ (function () {\r\n /**\r\n * @param key - Key associated with this node.\r\n * @param value - Value associated with this node.\r\n * @param color - Whether this node is red.\r\n * @param left - Left child.\r\n * @param right - Right child.\r\n */\r\n function LLRBNode(key, value, color, left, right) {\r\n this.key = key;\r\n this.value = value;\r\n this.color = color != null ? color : LLRBNode.RED;\r\n this.left =\r\n left != null ? left : SortedMap.EMPTY_NODE;\r\n this.right =\r\n right != null ? right : SortedMap.EMPTY_NODE;\r\n }\r\n /**\r\n * Returns a copy of the current node, optionally replacing pieces of it.\r\n *\r\n * @param key - New key for the node, or null.\r\n * @param value - New value for the node, or null.\r\n * @param color - New color for the node, or null.\r\n * @param left - New left child for the node, or null.\r\n * @param right - New right child for the node, or null.\r\n * @returns The node copy.\r\n */\r\n LLRBNode.prototype.copy = function (key, value, color, left, right) {\r\n return new LLRBNode(key != null ? key : this.key, value != null ? value : this.value, color != null ? color : this.color, left != null ? left : this.left, right != null ? right : this.right);\r\n };\r\n /**\r\n * @returns The total number of nodes in the tree.\r\n */\r\n LLRBNode.prototype.count = function () {\r\n return this.left.count() + 1 + this.right.count();\r\n };\r\n /**\r\n * @returns True if the tree is empty.\r\n */\r\n LLRBNode.prototype.isEmpty = function () {\r\n return false;\r\n };\r\n /**\r\n * Traverses the tree in key order and calls the specified action function\r\n * for each node.\r\n *\r\n * @param action - Callback function to be called for each\r\n * node. If it returns true, traversal is aborted.\r\n * @returns The first truthy value returned by action, or the last falsey\r\n * value returned by action\r\n */\r\n LLRBNode.prototype.inorderTraversal = function (action) {\r\n return (this.left.inorderTraversal(action) ||\r\n !!action(this.key, this.value) ||\r\n this.right.inorderTraversal(action));\r\n };\r\n /**\r\n * Traverses the tree in reverse key order and calls the specified action function\r\n * for each node.\r\n *\r\n * @param action - Callback function to be called for each\r\n * node. If it returns true, traversal is aborted.\r\n * @returns True if traversal was aborted.\r\n */\r\n LLRBNode.prototype.reverseTraversal = function (action) {\r\n return (this.right.reverseTraversal(action) ||\r\n action(this.key, this.value) ||\r\n this.left.reverseTraversal(action));\r\n };\r\n /**\r\n * @returns The minimum node in the tree.\r\n */\r\n LLRBNode.prototype.min_ = function () {\r\n if (this.left.isEmpty()) {\r\n return this;\r\n }\r\n else {\r\n return this.left.min_();\r\n }\r\n };\r\n /**\r\n * @returns The maximum key in the tree.\r\n */\r\n LLRBNode.prototype.minKey = function () {\r\n return this.min_().key;\r\n };\r\n /**\r\n * @returns The maximum key in the tree.\r\n */\r\n LLRBNode.prototype.maxKey = function () {\r\n if (this.right.isEmpty()) {\r\n return this.key;\r\n }\r\n else {\r\n return this.right.maxKey();\r\n }\r\n };\r\n /**\r\n * @param key - Key to insert.\r\n * @param value - Value to insert.\r\n * @param comparator - Comparator.\r\n * @returns New tree, with the key/value added.\r\n */\r\n LLRBNode.prototype.insert = function (key, value, comparator) {\r\n var n = this;\r\n var cmp = comparator(key, n.key);\r\n if (cmp < 0) {\r\n n = n.copy(null, null, null, n.left.insert(key, value, comparator), null);\r\n }\r\n else if (cmp === 0) {\r\n n = n.copy(null, value, null, null, null);\r\n }\r\n else {\r\n n = n.copy(null, null, null, null, n.right.insert(key, value, comparator));\r\n }\r\n return n.fixUp_();\r\n };\r\n /**\r\n * @returns New tree, with the minimum key removed.\r\n */\r\n LLRBNode.prototype.removeMin_ = function () {\r\n if (this.left.isEmpty()) {\r\n return SortedMap.EMPTY_NODE;\r\n }\r\n var n = this;\r\n if (!n.left.isRed_() && !n.left.left.isRed_()) {\r\n n = n.moveRedLeft_();\r\n }\r\n n = n.copy(null, null, null, n.left.removeMin_(), null);\r\n return n.fixUp_();\r\n };\r\n /**\r\n * @param key - The key of the item to remove.\r\n * @param comparator - Comparator.\r\n * @returns New tree, with the specified item removed.\r\n */\r\n LLRBNode.prototype.remove = function (key, comparator) {\r\n var n, smallest;\r\n n = this;\r\n if (comparator(key, n.key) < 0) {\r\n if (!n.left.isEmpty() && !n.left.isRed_() && !n.left.left.isRed_()) {\r\n n = n.moveRedLeft_();\r\n }\r\n n = n.copy(null, null, null, n.left.remove(key, comparator), null);\r\n }\r\n else {\r\n if (n.left.isRed_()) {\r\n n = n.rotateRight_();\r\n }\r\n if (!n.right.isEmpty() && !n.right.isRed_() && !n.right.left.isRed_()) {\r\n n = n.moveRedRight_();\r\n }\r\n if (comparator(key, n.key) === 0) {\r\n if (n.right.isEmpty()) {\r\n return SortedMap.EMPTY_NODE;\r\n }\r\n else {\r\n smallest = n.right.min_();\r\n n = n.copy(smallest.key, smallest.value, null, null, n.right.removeMin_());\r\n }\r\n }\r\n n = n.copy(null, null, null, null, n.right.remove(key, comparator));\r\n }\r\n return n.fixUp_();\r\n };\r\n /**\r\n * @returns Whether this is a RED node.\r\n */\r\n LLRBNode.prototype.isRed_ = function () {\r\n return this.color;\r\n };\r\n /**\r\n * @returns New tree after performing any needed rotations.\r\n */\r\n LLRBNode.prototype.fixUp_ = function () {\r\n var n = this;\r\n if (n.right.isRed_() && !n.left.isRed_()) {\r\n n = n.rotateLeft_();\r\n }\r\n if (n.left.isRed_() && n.left.left.isRed_()) {\r\n n = n.rotateRight_();\r\n }\r\n if (n.left.isRed_() && n.right.isRed_()) {\r\n n = n.colorFlip_();\r\n }\r\n return n;\r\n };\r\n /**\r\n * @returns New tree, after moveRedLeft.\r\n */\r\n LLRBNode.prototype.moveRedLeft_ = function () {\r\n var n = this.colorFlip_();\r\n if (n.right.left.isRed_()) {\r\n n = n.copy(null, null, null, null, n.right.rotateRight_());\r\n n = n.rotateLeft_();\r\n n = n.colorFlip_();\r\n }\r\n return n;\r\n };\r\n /**\r\n * @returns New tree, after moveRedRight.\r\n */\r\n LLRBNode.prototype.moveRedRight_ = function () {\r\n var n = this.colorFlip_();\r\n if (n.left.left.isRed_()) {\r\n n = n.rotateRight_();\r\n n = n.colorFlip_();\r\n }\r\n return n;\r\n };\r\n /**\r\n * @returns New tree, after rotateLeft.\r\n */\r\n LLRBNode.prototype.rotateLeft_ = function () {\r\n var nl = this.copy(null, null, LLRBNode.RED, null, this.right.left);\r\n return this.right.copy(null, null, this.color, nl, null);\r\n };\r\n /**\r\n * @returns New tree, after rotateRight.\r\n */\r\n LLRBNode.prototype.rotateRight_ = function () {\r\n var nr = this.copy(null, null, LLRBNode.RED, this.left.right, null);\r\n return this.left.copy(null, null, this.color, null, nr);\r\n };\r\n /**\r\n * @returns Newt ree, after colorFlip.\r\n */\r\n LLRBNode.prototype.colorFlip_ = function () {\r\n var left = this.left.copy(null, null, !this.left.color, null, null);\r\n var right = this.right.copy(null, null, !this.right.color, null, null);\r\n return this.copy(null, null, !this.color, left, right);\r\n };\r\n /**\r\n * For testing.\r\n *\r\n * @returns True if all is well.\r\n */\r\n LLRBNode.prototype.checkMaxDepth_ = function () {\r\n var blackDepth = this.check_();\r\n return Math.pow(2.0, blackDepth) <= this.count() + 1;\r\n };\r\n LLRBNode.prototype.check_ = function () {\r\n if (this.isRed_() && this.left.isRed_()) {\r\n throw new Error('Red node has red child(' + this.key + ',' + this.value + ')');\r\n }\r\n if (this.right.isRed_()) {\r\n throw new Error('Right child of (' + this.key + ',' + this.value + ') is red');\r\n }\r\n var blackDepth = this.left.check_();\r\n if (blackDepth !== this.right.check_()) {\r\n throw new Error('Black depths differ');\r\n }\r\n else {\r\n return blackDepth + (this.isRed_() ? 0 : 1);\r\n }\r\n };\r\n LLRBNode.RED = true;\r\n LLRBNode.BLACK = false;\r\n return LLRBNode;\r\n}());\r\n/**\r\n * Represents an empty node (a leaf node in the Red-Black Tree).\r\n */\r\nvar LLRBEmptyNode = /** @class */ (function () {\r\n function LLRBEmptyNode() {\r\n }\r\n /**\r\n * Returns a copy of the current node.\r\n *\r\n * @returns The node copy.\r\n */\r\n LLRBEmptyNode.prototype.copy = function (key, value, color, left, right) {\r\n return this;\r\n };\r\n /**\r\n * Returns a copy of the tree, with the specified key/value added.\r\n *\r\n * @param key - Key to be added.\r\n * @param value - Value to be added.\r\n * @param comparator - Comparator.\r\n * @returns New tree, with item added.\r\n */\r\n LLRBEmptyNode.prototype.insert = function (key, value, comparator) {\r\n return new LLRBNode(key, value, null);\r\n };\r\n /**\r\n * Returns a copy of the tree, with the specified key removed.\r\n *\r\n * @param key - The key to remove.\r\n * @param comparator - Comparator.\r\n * @returns New tree, with item removed.\r\n */\r\n LLRBEmptyNode.prototype.remove = function (key, comparator) {\r\n return this;\r\n };\r\n /**\r\n * @returns The total number of nodes in the tree.\r\n */\r\n LLRBEmptyNode.prototype.count = function () {\r\n return 0;\r\n };\r\n /**\r\n * @returns True if the tree is empty.\r\n */\r\n LLRBEmptyNode.prototype.isEmpty = function () {\r\n return true;\r\n };\r\n /**\r\n * Traverses the tree in key order and calls the specified action function\r\n * for each node.\r\n *\r\n * @param action - Callback function to be called for each\r\n * node. If it returns true, traversal is aborted.\r\n * @returns True if traversal was aborted.\r\n */\r\n LLRBEmptyNode.prototype.inorderTraversal = function (action) {\r\n return false;\r\n };\r\n /**\r\n * Traverses the tree in reverse key order and calls the specified action function\r\n * for each node.\r\n *\r\n * @param action - Callback function to be called for each\r\n * node. If it returns true, traversal is aborted.\r\n * @returns True if traversal was aborted.\r\n */\r\n LLRBEmptyNode.prototype.reverseTraversal = function (action) {\r\n return false;\r\n };\r\n LLRBEmptyNode.prototype.minKey = function () {\r\n return null;\r\n };\r\n LLRBEmptyNode.prototype.maxKey = function () {\r\n return null;\r\n };\r\n LLRBEmptyNode.prototype.check_ = function () {\r\n return 0;\r\n };\r\n /**\r\n * @returns Whether this node is red.\r\n */\r\n LLRBEmptyNode.prototype.isRed_ = function () {\r\n return false;\r\n };\r\n return LLRBEmptyNode;\r\n}());\r\n/**\r\n * An immutable sorted map implementation, based on a Left-leaning Red-Black\r\n * tree.\r\n */\r\nvar SortedMap = /** @class */ (function () {\r\n /**\r\n * @param comparator_ - Key comparator.\r\n * @param root_ - Optional root node for the map.\r\n */\r\n function SortedMap(comparator_, root_) {\r\n if (root_ === void 0) { root_ = SortedMap.EMPTY_NODE; }\r\n this.comparator_ = comparator_;\r\n this.root_ = root_;\r\n }\r\n /**\r\n * Returns a copy of the map, with the specified key/value added or replaced.\r\n * (TODO: We should perhaps rename this method to 'put')\r\n *\r\n * @param key - Key to be added.\r\n * @param value - Value to be added.\r\n * @returns New map, with item added.\r\n */\r\n SortedMap.prototype.insert = function (key, value) {\r\n return new SortedMap(this.comparator_, this.root_\r\n .insert(key, value, this.comparator_)\r\n .copy(null, null, LLRBNode.BLACK, null, null));\r\n };\r\n /**\r\n * Returns a copy of the map, with the specified key removed.\r\n *\r\n * @param key - The key to remove.\r\n * @returns New map, with item removed.\r\n */\r\n SortedMap.prototype.remove = function (key) {\r\n return new SortedMap(this.comparator_, this.root_\r\n .remove(key, this.comparator_)\r\n .copy(null, null, LLRBNode.BLACK, null, null));\r\n };\r\n /**\r\n * Returns the value of the node with the given key, or null.\r\n *\r\n * @param key - The key to look up.\r\n * @returns The value of the node with the given key, or null if the\r\n * key doesn't exist.\r\n */\r\n SortedMap.prototype.get = function (key) {\r\n var cmp;\r\n var node = this.root_;\r\n while (!node.isEmpty()) {\r\n cmp = this.comparator_(key, node.key);\r\n if (cmp === 0) {\r\n return node.value;\r\n }\r\n else if (cmp < 0) {\r\n node = node.left;\r\n }\r\n else if (cmp > 0) {\r\n node = node.right;\r\n }\r\n }\r\n return null;\r\n };\r\n /**\r\n * Returns the key of the item *before* the specified key, or null if key is the first item.\r\n * @param key - The key to find the predecessor of\r\n * @returns The predecessor key.\r\n */\r\n SortedMap.prototype.getPredecessorKey = function (key) {\r\n var cmp, node = this.root_, rightParent = null;\r\n while (!node.isEmpty()) {\r\n cmp = this.comparator_(key, node.key);\r\n if (cmp === 0) {\r\n if (!node.left.isEmpty()) {\r\n node = node.left;\r\n while (!node.right.isEmpty()) {\r\n node = node.right;\r\n }\r\n return node.key;\r\n }\r\n else if (rightParent) {\r\n return rightParent.key;\r\n }\r\n else {\r\n return null; // first item.\r\n }\r\n }\r\n else if (cmp < 0) {\r\n node = node.left;\r\n }\r\n else if (cmp > 0) {\r\n rightParent = node;\r\n node = node.right;\r\n }\r\n }\r\n throw new Error('Attempted to find predecessor key for a nonexistent key. What gives?');\r\n };\r\n /**\r\n * @returns True if the map is empty.\r\n */\r\n SortedMap.prototype.isEmpty = function () {\r\n return this.root_.isEmpty();\r\n };\r\n /**\r\n * @returns The total number of nodes in the map.\r\n */\r\n SortedMap.prototype.count = function () {\r\n return this.root_.count();\r\n };\r\n /**\r\n * @returns The minimum key in the map.\r\n */\r\n SortedMap.prototype.minKey = function () {\r\n return this.root_.minKey();\r\n };\r\n /**\r\n * @returns The maximum key in the map.\r\n */\r\n SortedMap.prototype.maxKey = function () {\r\n return this.root_.maxKey();\r\n };\r\n /**\r\n * Traverses the map in key order and calls the specified action function\r\n * for each key/value pair.\r\n *\r\n * @param action - Callback function to be called\r\n * for each key/value pair. If action returns true, traversal is aborted.\r\n * @returns The first truthy value returned by action, or the last falsey\r\n * value returned by action\r\n */\r\n SortedMap.prototype.inorderTraversal = function (action) {\r\n return this.root_.inorderTraversal(action);\r\n };\r\n /**\r\n * Traverses the map in reverse key order and calls the specified action function\r\n * for each key/value pair.\r\n *\r\n * @param action - Callback function to be called\r\n * for each key/value pair. If action returns true, traversal is aborted.\r\n * @returns True if the traversal was aborted.\r\n */\r\n SortedMap.prototype.reverseTraversal = function (action) {\r\n return this.root_.reverseTraversal(action);\r\n };\r\n /**\r\n * Returns an iterator over the SortedMap.\r\n * @returns The iterator.\r\n */\r\n SortedMap.prototype.getIterator = function (resultGenerator) {\r\n return new SortedMapIterator(this.root_, null, this.comparator_, false, resultGenerator);\r\n };\r\n SortedMap.prototype.getIteratorFrom = function (key, resultGenerator) {\r\n return new SortedMapIterator(this.root_, key, this.comparator_, false, resultGenerator);\r\n };\r\n SortedMap.prototype.getReverseIteratorFrom = function (key, resultGenerator) {\r\n return new SortedMapIterator(this.root_, key, this.comparator_, true, resultGenerator);\r\n };\r\n SortedMap.prototype.getReverseIterator = function (resultGenerator) {\r\n return new SortedMapIterator(this.root_, null, this.comparator_, true, resultGenerator);\r\n };\r\n /**\r\n * Always use the same empty node, to reduce memory.\r\n */\r\n SortedMap.EMPTY_NODE = new LLRBEmptyNode();\r\n return SortedMap;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction NAME_ONLY_COMPARATOR(left, right) {\r\n return nameCompare(left.name, right.name);\r\n}\r\nfunction NAME_COMPARATOR(left, right) {\r\n return nameCompare(left, right);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar MAX_NODE$2;\r\nfunction setMaxNode$1(val) {\r\n MAX_NODE$2 = val;\r\n}\r\nvar priorityHashText = function (priority) {\r\n if (typeof priority === 'number') {\r\n return 'number:' + doubleToIEEE754String(priority);\r\n }\r\n else {\r\n return 'string:' + priority;\r\n }\r\n};\r\n/**\r\n * Validates that a priority snapshot Node is valid.\r\n */\r\nvar validatePriorityNode = function (priorityNode) {\r\n if (priorityNode.isLeafNode()) {\r\n var val = priorityNode.val();\r\n assert(typeof val === 'string' ||\r\n typeof val === 'number' ||\r\n (typeof val === 'object' && contains(val, '.sv')), 'Priority must be a string or number.');\r\n }\r\n else {\r\n assert(priorityNode === MAX_NODE$2 || priorityNode.isEmpty(), 'priority of unexpected type.');\r\n }\r\n // Don't call getPriority() on MAX_NODE to avoid hitting assertion.\r\n assert(priorityNode === MAX_NODE$2 || priorityNode.getPriority().isEmpty(), \"Priority nodes can't have a priority of their own.\");\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar __childrenNodeConstructor;\r\n/**\r\n * LeafNode is a class for storing leaf nodes in a DataSnapshot. It\r\n * implements Node and stores the value of the node (a string,\r\n * number, or boolean) accessible via getValue().\r\n */\r\nvar LeafNode = /** @class */ (function () {\r\n /**\r\n * @param value_ - The value to store in this leaf node. The object type is\r\n * possible in the event of a deferred value\r\n * @param priorityNode_ - The priority of this node.\r\n */\r\n function LeafNode(value_, priorityNode_) {\r\n if (priorityNode_ === void 0) { priorityNode_ = LeafNode.__childrenNodeConstructor.EMPTY_NODE; }\r\n this.value_ = value_;\r\n this.priorityNode_ = priorityNode_;\r\n this.lazyHash_ = null;\r\n assert(this.value_ !== undefined && this.value_ !== null, \"LeafNode shouldn't be created with null/undefined value.\");\r\n validatePriorityNode(this.priorityNode_);\r\n }\r\n Object.defineProperty(LeafNode, \"__childrenNodeConstructor\", {\r\n get: function () {\r\n return __childrenNodeConstructor;\r\n },\r\n set: function (val) {\r\n __childrenNodeConstructor = val;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n /** @inheritDoc */\r\n LeafNode.prototype.isLeafNode = function () {\r\n return true;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.getPriority = function () {\r\n return this.priorityNode_;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.updatePriority = function (newPriorityNode) {\r\n return new LeafNode(this.value_, newPriorityNode);\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.getImmediateChild = function (childName) {\r\n // Hack to treat priority as a regular child\r\n if (childName === '.priority') {\r\n return this.priorityNode_;\r\n }\r\n else {\r\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE;\r\n }\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.getChild = function (path) {\r\n if (pathIsEmpty(path)) {\r\n return this;\r\n }\r\n else if (pathGetFront(path) === '.priority') {\r\n return this.priorityNode_;\r\n }\r\n else {\r\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE;\r\n }\r\n };\r\n LeafNode.prototype.hasChild = function () {\r\n return false;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.getPredecessorChildName = function (childName, childNode) {\r\n return null;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.updateImmediateChild = function (childName, newChildNode) {\r\n if (childName === '.priority') {\r\n return this.updatePriority(newChildNode);\r\n }\r\n else if (newChildNode.isEmpty() && childName !== '.priority') {\r\n return this;\r\n }\r\n else {\r\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE.updateImmediateChild(childName, newChildNode).updatePriority(this.priorityNode_);\r\n }\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.updateChild = function (path, newChildNode) {\r\n var front = pathGetFront(path);\r\n if (front === null) {\r\n return newChildNode;\r\n }\r\n else if (newChildNode.isEmpty() && front !== '.priority') {\r\n return this;\r\n }\r\n else {\r\n assert(front !== '.priority' || pathGetLength(path) === 1, '.priority must be the last token in a path');\r\n return this.updateImmediateChild(front, LeafNode.__childrenNodeConstructor.EMPTY_NODE.updateChild(pathPopFront(path), newChildNode));\r\n }\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.isEmpty = function () {\r\n return false;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.numChildren = function () {\r\n return 0;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.forEachChild = function (index, action) {\r\n return false;\r\n };\r\n LeafNode.prototype.val = function (exportFormat) {\r\n if (exportFormat && !this.getPriority().isEmpty()) {\r\n return {\r\n '.value': this.getValue(),\r\n '.priority': this.getPriority().val()\r\n };\r\n }\r\n else {\r\n return this.getValue();\r\n }\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.hash = function () {\r\n if (this.lazyHash_ === null) {\r\n var toHash = '';\r\n if (!this.priorityNode_.isEmpty()) {\r\n toHash +=\r\n 'priority:' +\r\n priorityHashText(this.priorityNode_.val()) +\r\n ':';\r\n }\r\n var type = typeof this.value_;\r\n toHash += type + ':';\r\n if (type === 'number') {\r\n toHash += doubleToIEEE754String(this.value_);\r\n }\r\n else {\r\n toHash += this.value_;\r\n }\r\n this.lazyHash_ = sha1(toHash);\r\n }\r\n return this.lazyHash_;\r\n };\r\n /**\r\n * Returns the value of the leaf node.\r\n * @returns The value of the node.\r\n */\r\n LeafNode.prototype.getValue = function () {\r\n return this.value_;\r\n };\r\n LeafNode.prototype.compareTo = function (other) {\r\n if (other === LeafNode.__childrenNodeConstructor.EMPTY_NODE) {\r\n return 1;\r\n }\r\n else if (other instanceof LeafNode.__childrenNodeConstructor) {\r\n return -1;\r\n }\r\n else {\r\n assert(other.isLeafNode(), 'Unknown node type');\r\n return this.compareToLeafNode_(other);\r\n }\r\n };\r\n /**\r\n * Comparison specifically for two leaf nodes\r\n */\r\n LeafNode.prototype.compareToLeafNode_ = function (otherLeaf) {\r\n var otherLeafType = typeof otherLeaf.value_;\r\n var thisLeafType = typeof this.value_;\r\n var otherIndex = LeafNode.VALUE_TYPE_ORDER.indexOf(otherLeafType);\r\n var thisIndex = LeafNode.VALUE_TYPE_ORDER.indexOf(thisLeafType);\r\n assert(otherIndex >= 0, 'Unknown leaf type: ' + otherLeafType);\r\n assert(thisIndex >= 0, 'Unknown leaf type: ' + thisLeafType);\r\n if (otherIndex === thisIndex) {\r\n // Same type, compare values\r\n if (thisLeafType === 'object') {\r\n // Deferred value nodes are all equal, but we should also never get to this point...\r\n return 0;\r\n }\r\n else {\r\n // Note that this works because true > false, all others are number or string comparisons\r\n if (this.value_ < otherLeaf.value_) {\r\n return -1;\r\n }\r\n else if (this.value_ === otherLeaf.value_) {\r\n return 0;\r\n }\r\n else {\r\n return 1;\r\n }\r\n }\r\n }\r\n else {\r\n return thisIndex - otherIndex;\r\n }\r\n };\r\n LeafNode.prototype.withIndex = function () {\r\n return this;\r\n };\r\n LeafNode.prototype.isIndexed = function () {\r\n return true;\r\n };\r\n LeafNode.prototype.equals = function (other) {\r\n if (other === this) {\r\n return true;\r\n }\r\n else if (other.isLeafNode()) {\r\n var otherLeaf = other;\r\n return (this.value_ === otherLeaf.value_ &&\r\n this.priorityNode_.equals(otherLeaf.priorityNode_));\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n /**\r\n * The sort order for comparing leaf nodes of different types. If two leaf nodes have\r\n * the same type, the comparison falls back to their value\r\n */\r\n LeafNode.VALUE_TYPE_ORDER = ['object', 'boolean', 'number', 'string'];\r\n return LeafNode;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar nodeFromJSON$1;\r\nvar MAX_NODE$1;\r\nfunction setNodeFromJSON(val) {\r\n nodeFromJSON$1 = val;\r\n}\r\nfunction setMaxNode(val) {\r\n MAX_NODE$1 = val;\r\n}\r\nvar PriorityIndex = /** @class */ (function (_super) {\r\n __extends(PriorityIndex, _super);\r\n function PriorityIndex() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n PriorityIndex.prototype.compare = function (a, b) {\r\n var aPriority = a.node.getPriority();\r\n var bPriority = b.node.getPriority();\r\n var indexCmp = aPriority.compareTo(bPriority);\r\n if (indexCmp === 0) {\r\n return nameCompare(a.name, b.name);\r\n }\r\n else {\r\n return indexCmp;\r\n }\r\n };\r\n PriorityIndex.prototype.isDefinedOn = function (node) {\r\n return !node.getPriority().isEmpty();\r\n };\r\n PriorityIndex.prototype.indexedValueChanged = function (oldNode, newNode) {\r\n return !oldNode.getPriority().equals(newNode.getPriority());\r\n };\r\n PriorityIndex.prototype.minPost = function () {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return NamedNode.MIN;\r\n };\r\n PriorityIndex.prototype.maxPost = function () {\r\n return new NamedNode(MAX_NAME, new LeafNode('[PRIORITY-POST]', MAX_NODE$1));\r\n };\r\n PriorityIndex.prototype.makePost = function (indexValue, name) {\r\n var priorityNode = nodeFromJSON$1(indexValue);\r\n return new NamedNode(name, new LeafNode('[PRIORITY-POST]', priorityNode));\r\n };\r\n /**\r\n * @returns String representation for inclusion in a query spec\r\n */\r\n PriorityIndex.prototype.toString = function () {\r\n return '.priority';\r\n };\r\n return PriorityIndex;\r\n}(Index));\r\nvar PRIORITY_INDEX = new PriorityIndex();\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar LOG_2 = Math.log(2);\r\nvar Base12Num = /** @class */ (function () {\r\n function Base12Num(length) {\r\n var logBase2 = function (num) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return parseInt((Math.log(num) / LOG_2), 10);\r\n };\r\n var bitMask = function (bits) { return parseInt(Array(bits + 1).join('1'), 2); };\r\n this.count = logBase2(length + 1);\r\n this.current_ = this.count - 1;\r\n var mask = bitMask(this.count);\r\n this.bits_ = (length + 1) & mask;\r\n }\r\n Base12Num.prototype.nextBitIsOne = function () {\r\n //noinspection JSBitwiseOperatorUsage\r\n var result = !(this.bits_ & (0x1 << this.current_));\r\n this.current_--;\r\n return result;\r\n };\r\n return Base12Num;\r\n}());\r\n/**\r\n * Takes a list of child nodes and constructs a SortedSet using the given comparison\r\n * function\r\n *\r\n * Uses the algorithm described in the paper linked here:\r\n * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.46.1458\r\n *\r\n * @param childList - Unsorted list of children\r\n * @param cmp - The comparison method to be used\r\n * @param keyFn - An optional function to extract K from a node wrapper, if K's\r\n * type is not NamedNode\r\n * @param mapSortFn - An optional override for comparator used by the generated sorted map\r\n */\r\nvar buildChildSet = function (childList, cmp, keyFn, mapSortFn) {\r\n childList.sort(cmp);\r\n var buildBalancedTree = function (low, high) {\r\n var length = high - low;\r\n var namedNode;\r\n var key;\r\n if (length === 0) {\r\n return null;\r\n }\r\n else if (length === 1) {\r\n namedNode = childList[low];\r\n key = keyFn ? keyFn(namedNode) : namedNode;\r\n return new LLRBNode(key, namedNode.node, LLRBNode.BLACK, null, null);\r\n }\r\n else {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n var middle = parseInt((length / 2), 10) + low;\r\n var left = buildBalancedTree(low, middle);\r\n var right = buildBalancedTree(middle + 1, high);\r\n namedNode = childList[middle];\r\n key = keyFn ? keyFn(namedNode) : namedNode;\r\n return new LLRBNode(key, namedNode.node, LLRBNode.BLACK, left, right);\r\n }\r\n };\r\n var buildFrom12Array = function (base12) {\r\n var node = null;\r\n var root = null;\r\n var index = childList.length;\r\n var buildPennant = function (chunkSize, color) {\r\n var low = index - chunkSize;\r\n var high = index;\r\n index -= chunkSize;\r\n var childTree = buildBalancedTree(low + 1, high);\r\n var namedNode = childList[low];\r\n var key = keyFn ? keyFn(namedNode) : namedNode;\r\n attachPennant(new LLRBNode(key, namedNode.node, color, null, childTree));\r\n };\r\n var attachPennant = function (pennant) {\r\n if (node) {\r\n node.left = pennant;\r\n node = pennant;\r\n }\r\n else {\r\n root = pennant;\r\n node = pennant;\r\n }\r\n };\r\n for (var i = 0; i < base12.count; ++i) {\r\n var isOne = base12.nextBitIsOne();\r\n // The number of nodes taken in each slice is 2^(arr.length - (i + 1))\r\n var chunkSize = Math.pow(2, base12.count - (i + 1));\r\n if (isOne) {\r\n buildPennant(chunkSize, LLRBNode.BLACK);\r\n }\r\n else {\r\n // current == 2\r\n buildPennant(chunkSize, LLRBNode.BLACK);\r\n buildPennant(chunkSize, LLRBNode.RED);\r\n }\r\n }\r\n return root;\r\n };\r\n var base12 = new Base12Num(childList.length);\r\n var root = buildFrom12Array(base12);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return new SortedMap(mapSortFn || cmp, root);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar _defaultIndexMap;\r\nvar fallbackObject = {};\r\nvar IndexMap = /** @class */ (function () {\r\n function IndexMap(indexes_, indexSet_) {\r\n this.indexes_ = indexes_;\r\n this.indexSet_ = indexSet_;\r\n }\r\n Object.defineProperty(IndexMap, \"Default\", {\r\n /**\r\n * The default IndexMap for nodes without a priority\r\n */\r\n get: function () {\r\n assert(fallbackObject && PRIORITY_INDEX, 'ChildrenNode.ts has not been loaded');\r\n _defaultIndexMap =\r\n _defaultIndexMap ||\r\n new IndexMap({ '.priority': fallbackObject }, { '.priority': PRIORITY_INDEX });\r\n return _defaultIndexMap;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n IndexMap.prototype.get = function (indexKey) {\r\n var sortedMap = safeGet(this.indexes_, indexKey);\r\n if (!sortedMap) {\r\n throw new Error('No index defined for ' + indexKey);\r\n }\r\n if (sortedMap instanceof SortedMap) {\r\n return sortedMap;\r\n }\r\n else {\r\n // The index exists, but it falls back to just name comparison. Return null so that the calling code uses the\r\n // regular child map\r\n return null;\r\n }\r\n };\r\n IndexMap.prototype.hasIndex = function (indexDefinition) {\r\n return contains(this.indexSet_, indexDefinition.toString());\r\n };\r\n IndexMap.prototype.addIndex = function (indexDefinition, existingChildren) {\r\n assert(indexDefinition !== KEY_INDEX, \"KeyIndex always exists and isn't meant to be added to the IndexMap.\");\r\n var childList = [];\r\n var sawIndexedValue = false;\r\n var iter = existingChildren.getIterator(NamedNode.Wrap);\r\n var next = iter.getNext();\r\n while (next) {\r\n sawIndexedValue =\r\n sawIndexedValue || indexDefinition.isDefinedOn(next.node);\r\n childList.push(next);\r\n next = iter.getNext();\r\n }\r\n var newIndex;\r\n if (sawIndexedValue) {\r\n newIndex = buildChildSet(childList, indexDefinition.getCompare());\r\n }\r\n else {\r\n newIndex = fallbackObject;\r\n }\r\n var indexName = indexDefinition.toString();\r\n var newIndexSet = __assign({}, this.indexSet_);\r\n newIndexSet[indexName] = indexDefinition;\r\n var newIndexes = __assign({}, this.indexes_);\r\n newIndexes[indexName] = newIndex;\r\n return new IndexMap(newIndexes, newIndexSet);\r\n };\r\n /**\r\n * Ensure that this node is properly tracked in any indexes that we're maintaining\r\n */\r\n IndexMap.prototype.addToIndexes = function (namedNode, existingChildren) {\r\n var _this = this;\r\n var newIndexes = map(this.indexes_, function (indexedChildren, indexName) {\r\n var index = safeGet(_this.indexSet_, indexName);\r\n assert(index, 'Missing index implementation for ' + indexName);\r\n if (indexedChildren === fallbackObject) {\r\n // Check to see if we need to index everything\r\n if (index.isDefinedOn(namedNode.node)) {\r\n // We need to build this index\r\n var childList = [];\r\n var iter = existingChildren.getIterator(NamedNode.Wrap);\r\n var next = iter.getNext();\r\n while (next) {\r\n if (next.name !== namedNode.name) {\r\n childList.push(next);\r\n }\r\n next = iter.getNext();\r\n }\r\n childList.push(namedNode);\r\n return buildChildSet(childList, index.getCompare());\r\n }\r\n else {\r\n // No change, this remains a fallback\r\n return fallbackObject;\r\n }\r\n }\r\n else {\r\n var existingSnap = existingChildren.get(namedNode.name);\r\n var newChildren = indexedChildren;\r\n if (existingSnap) {\r\n newChildren = newChildren.remove(new NamedNode(namedNode.name, existingSnap));\r\n }\r\n return newChildren.insert(namedNode, namedNode.node);\r\n }\r\n });\r\n return new IndexMap(newIndexes, this.indexSet_);\r\n };\r\n /**\r\n * Create a new IndexMap instance with the given value removed\r\n */\r\n IndexMap.prototype.removeFromIndexes = function (namedNode, existingChildren) {\r\n var newIndexes = map(this.indexes_, function (indexedChildren) {\r\n if (indexedChildren === fallbackObject) {\r\n // This is the fallback. Just return it, nothing to do in this case\r\n return indexedChildren;\r\n }\r\n else {\r\n var existingSnap = existingChildren.get(namedNode.name);\r\n if (existingSnap) {\r\n return indexedChildren.remove(new NamedNode(namedNode.name, existingSnap));\r\n }\r\n else {\r\n // No record of this child\r\n return indexedChildren;\r\n }\r\n }\r\n });\r\n return new IndexMap(newIndexes, this.indexSet_);\r\n };\r\n return IndexMap;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// TODO: For memory savings, don't store priorityNode_ if it's empty.\r\nvar EMPTY_NODE;\r\n/**\r\n * ChildrenNode is a class for storing internal nodes in a DataSnapshot\r\n * (i.e. nodes with children). It implements Node and stores the\r\n * list of children in the children property, sorted by child name.\r\n */\r\nvar ChildrenNode = /** @class */ (function () {\r\n /**\r\n * @param children_ - List of children of this node..\r\n * @param priorityNode_ - The priority of this node (as a snapshot node).\r\n */\r\n function ChildrenNode(children_, priorityNode_, indexMap_) {\r\n this.children_ = children_;\r\n this.priorityNode_ = priorityNode_;\r\n this.indexMap_ = indexMap_;\r\n this.lazyHash_ = null;\r\n /**\r\n * Note: The only reason we allow null priority is for EMPTY_NODE, since we can't use\r\n * EMPTY_NODE as the priority of EMPTY_NODE. We might want to consider making EMPTY_NODE its own\r\n * class instead of an empty ChildrenNode.\r\n */\r\n if (this.priorityNode_) {\r\n validatePriorityNode(this.priorityNode_);\r\n }\r\n if (this.children_.isEmpty()) {\r\n assert(!this.priorityNode_ || this.priorityNode_.isEmpty(), 'An empty node cannot have a priority');\r\n }\r\n }\r\n Object.defineProperty(ChildrenNode, \"EMPTY_NODE\", {\r\n get: function () {\r\n return (EMPTY_NODE ||\r\n (EMPTY_NODE = new ChildrenNode(new SortedMap(NAME_COMPARATOR), null, IndexMap.Default)));\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.isLeafNode = function () {\r\n return false;\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.getPriority = function () {\r\n return this.priorityNode_ || EMPTY_NODE;\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.updatePriority = function (newPriorityNode) {\r\n if (this.children_.isEmpty()) {\r\n // Don't allow priorities on empty nodes\r\n return this;\r\n }\r\n else {\r\n return new ChildrenNode(this.children_, newPriorityNode, this.indexMap_);\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.getImmediateChild = function (childName) {\r\n // Hack to treat priority as a regular child\r\n if (childName === '.priority') {\r\n return this.getPriority();\r\n }\r\n else {\r\n var child = this.children_.get(childName);\r\n return child === null ? EMPTY_NODE : child;\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.getChild = function (path) {\r\n var front = pathGetFront(path);\r\n if (front === null) {\r\n return this;\r\n }\r\n return this.getImmediateChild(front).getChild(pathPopFront(path));\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.hasChild = function (childName) {\r\n return this.children_.get(childName) !== null;\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.updateImmediateChild = function (childName, newChildNode) {\r\n assert(newChildNode, 'We should always be passing snapshot nodes');\r\n if (childName === '.priority') {\r\n return this.updatePriority(newChildNode);\r\n }\r\n else {\r\n var namedNode = new NamedNode(childName, newChildNode);\r\n var newChildren = void 0, newIndexMap = void 0;\r\n if (newChildNode.isEmpty()) {\r\n newChildren = this.children_.remove(childName);\r\n newIndexMap = this.indexMap_.removeFromIndexes(namedNode, this.children_);\r\n }\r\n else {\r\n newChildren = this.children_.insert(childName, newChildNode);\r\n newIndexMap = this.indexMap_.addToIndexes(namedNode, this.children_);\r\n }\r\n var newPriority = newChildren.isEmpty()\r\n ? EMPTY_NODE\r\n : this.priorityNode_;\r\n return new ChildrenNode(newChildren, newPriority, newIndexMap);\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.updateChild = function (path, newChildNode) {\r\n var front = pathGetFront(path);\r\n if (front === null) {\r\n return newChildNode;\r\n }\r\n else {\r\n assert(pathGetFront(path) !== '.priority' || pathGetLength(path) === 1, '.priority must be the last token in a path');\r\n var newImmediateChild = this.getImmediateChild(front).updateChild(pathPopFront(path), newChildNode);\r\n return this.updateImmediateChild(front, newImmediateChild);\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.isEmpty = function () {\r\n return this.children_.isEmpty();\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.numChildren = function () {\r\n return this.children_.count();\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.val = function (exportFormat) {\r\n if (this.isEmpty()) {\r\n return null;\r\n }\r\n var obj = {};\r\n var numKeys = 0, maxKey = 0, allIntegerKeys = true;\r\n this.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n obj[key] = childNode.val(exportFormat);\r\n numKeys++;\r\n if (allIntegerKeys && ChildrenNode.INTEGER_REGEXP_.test(key)) {\r\n maxKey = Math.max(maxKey, Number(key));\r\n }\r\n else {\r\n allIntegerKeys = false;\r\n }\r\n });\r\n if (!exportFormat && allIntegerKeys && maxKey < 2 * numKeys) {\r\n // convert to array.\r\n var array = [];\r\n // eslint-disable-next-line guard-for-in\r\n for (var key in obj) {\r\n array[key] = obj[key];\r\n }\r\n return array;\r\n }\r\n else {\r\n if (exportFormat && !this.getPriority().isEmpty()) {\r\n obj['.priority'] = this.getPriority().val();\r\n }\r\n return obj;\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.hash = function () {\r\n if (this.lazyHash_ === null) {\r\n var toHash_1 = '';\r\n if (!this.getPriority().isEmpty()) {\r\n toHash_1 +=\r\n 'priority:' +\r\n priorityHashText(this.getPriority().val()) +\r\n ':';\r\n }\r\n this.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n var childHash = childNode.hash();\r\n if (childHash !== '') {\r\n toHash_1 += ':' + key + ':' + childHash;\r\n }\r\n });\r\n this.lazyHash_ = toHash_1 === '' ? '' : sha1(toHash_1);\r\n }\r\n return this.lazyHash_;\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.getPredecessorChildName = function (childName, childNode, index) {\r\n var idx = this.resolveIndex_(index);\r\n if (idx) {\r\n var predecessor = idx.getPredecessorKey(new NamedNode(childName, childNode));\r\n return predecessor ? predecessor.name : null;\r\n }\r\n else {\r\n return this.children_.getPredecessorKey(childName);\r\n }\r\n };\r\n ChildrenNode.prototype.getFirstChildName = function (indexDefinition) {\r\n var idx = this.resolveIndex_(indexDefinition);\r\n if (idx) {\r\n var minKey = idx.minKey();\r\n return minKey && minKey.name;\r\n }\r\n else {\r\n return this.children_.minKey();\r\n }\r\n };\r\n ChildrenNode.prototype.getFirstChild = function (indexDefinition) {\r\n var minKey = this.getFirstChildName(indexDefinition);\r\n if (minKey) {\r\n return new NamedNode(minKey, this.children_.get(minKey));\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n /**\r\n * Given an index, return the key name of the largest value we have, according to that index\r\n */\r\n ChildrenNode.prototype.getLastChildName = function (indexDefinition) {\r\n var idx = this.resolveIndex_(indexDefinition);\r\n if (idx) {\r\n var maxKey = idx.maxKey();\r\n return maxKey && maxKey.name;\r\n }\r\n else {\r\n return this.children_.maxKey();\r\n }\r\n };\r\n ChildrenNode.prototype.getLastChild = function (indexDefinition) {\r\n var maxKey = this.getLastChildName(indexDefinition);\r\n if (maxKey) {\r\n return new NamedNode(maxKey, this.children_.get(maxKey));\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n ChildrenNode.prototype.forEachChild = function (index, action) {\r\n var idx = this.resolveIndex_(index);\r\n if (idx) {\r\n return idx.inorderTraversal(function (wrappedNode) {\r\n return action(wrappedNode.name, wrappedNode.node);\r\n });\r\n }\r\n else {\r\n return this.children_.inorderTraversal(action);\r\n }\r\n };\r\n ChildrenNode.prototype.getIterator = function (indexDefinition) {\r\n return this.getIteratorFrom(indexDefinition.minPost(), indexDefinition);\r\n };\r\n ChildrenNode.prototype.getIteratorFrom = function (startPost, indexDefinition) {\r\n var idx = this.resolveIndex_(indexDefinition);\r\n if (idx) {\r\n return idx.getIteratorFrom(startPost, function (key) { return key; });\r\n }\r\n else {\r\n var iterator = this.children_.getIteratorFrom(startPost.name, NamedNode.Wrap);\r\n var next = iterator.peek();\r\n while (next != null && indexDefinition.compare(next, startPost) < 0) {\r\n iterator.getNext();\r\n next = iterator.peek();\r\n }\r\n return iterator;\r\n }\r\n };\r\n ChildrenNode.prototype.getReverseIterator = function (indexDefinition) {\r\n return this.getReverseIteratorFrom(indexDefinition.maxPost(), indexDefinition);\r\n };\r\n ChildrenNode.prototype.getReverseIteratorFrom = function (endPost, indexDefinition) {\r\n var idx = this.resolveIndex_(indexDefinition);\r\n if (idx) {\r\n return idx.getReverseIteratorFrom(endPost, function (key) {\r\n return key;\r\n });\r\n }\r\n else {\r\n var iterator = this.children_.getReverseIteratorFrom(endPost.name, NamedNode.Wrap);\r\n var next = iterator.peek();\r\n while (next != null && indexDefinition.compare(next, endPost) > 0) {\r\n iterator.getNext();\r\n next = iterator.peek();\r\n }\r\n return iterator;\r\n }\r\n };\r\n ChildrenNode.prototype.compareTo = function (other) {\r\n if (this.isEmpty()) {\r\n if (other.isEmpty()) {\r\n return 0;\r\n }\r\n else {\r\n return -1;\r\n }\r\n }\r\n else if (other.isLeafNode() || other.isEmpty()) {\r\n return 1;\r\n }\r\n else if (other === MAX_NODE) {\r\n return -1;\r\n }\r\n else {\r\n // Must be another node with children.\r\n return 0;\r\n }\r\n };\r\n ChildrenNode.prototype.withIndex = function (indexDefinition) {\r\n if (indexDefinition === KEY_INDEX ||\r\n this.indexMap_.hasIndex(indexDefinition)) {\r\n return this;\r\n }\r\n else {\r\n var newIndexMap = this.indexMap_.addIndex(indexDefinition, this.children_);\r\n return new ChildrenNode(this.children_, this.priorityNode_, newIndexMap);\r\n }\r\n };\r\n ChildrenNode.prototype.isIndexed = function (index) {\r\n return index === KEY_INDEX || this.indexMap_.hasIndex(index);\r\n };\r\n ChildrenNode.prototype.equals = function (other) {\r\n if (other === this) {\r\n return true;\r\n }\r\n else if (other.isLeafNode()) {\r\n return false;\r\n }\r\n else {\r\n var otherChildrenNode = other;\r\n if (!this.getPriority().equals(otherChildrenNode.getPriority())) {\r\n return false;\r\n }\r\n else if (this.children_.count() === otherChildrenNode.children_.count()) {\r\n var thisIter = this.getIterator(PRIORITY_INDEX);\r\n var otherIter = otherChildrenNode.getIterator(PRIORITY_INDEX);\r\n var thisCurrent = thisIter.getNext();\r\n var otherCurrent = otherIter.getNext();\r\n while (thisCurrent && otherCurrent) {\r\n if (thisCurrent.name !== otherCurrent.name ||\r\n !thisCurrent.node.equals(otherCurrent.node)) {\r\n return false;\r\n }\r\n thisCurrent = thisIter.getNext();\r\n otherCurrent = otherIter.getNext();\r\n }\r\n return thisCurrent === null && otherCurrent === null;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n };\r\n /**\r\n * Returns a SortedMap ordered by index, or null if the default (by-key) ordering can be used\r\n * instead.\r\n *\r\n */\r\n ChildrenNode.prototype.resolveIndex_ = function (indexDefinition) {\r\n if (indexDefinition === KEY_INDEX) {\r\n return null;\r\n }\r\n else {\r\n return this.indexMap_.get(indexDefinition.toString());\r\n }\r\n };\r\n ChildrenNode.INTEGER_REGEXP_ = /^(0|[1-9]\\d*)$/;\r\n return ChildrenNode;\r\n}());\r\nvar MaxNode = /** @class */ (function (_super) {\r\n __extends(MaxNode, _super);\r\n function MaxNode() {\r\n return _super.call(this, new SortedMap(NAME_COMPARATOR), ChildrenNode.EMPTY_NODE, IndexMap.Default) || this;\r\n }\r\n MaxNode.prototype.compareTo = function (other) {\r\n if (other === this) {\r\n return 0;\r\n }\r\n else {\r\n return 1;\r\n }\r\n };\r\n MaxNode.prototype.equals = function (other) {\r\n // Not that we every compare it, but MAX_NODE is only ever equal to itself\r\n return other === this;\r\n };\r\n MaxNode.prototype.getPriority = function () {\r\n return this;\r\n };\r\n MaxNode.prototype.getImmediateChild = function (childName) {\r\n return ChildrenNode.EMPTY_NODE;\r\n };\r\n MaxNode.prototype.isEmpty = function () {\r\n return false;\r\n };\r\n return MaxNode;\r\n}(ChildrenNode));\r\n/**\r\n * Marker that will sort higher than any other snapshot.\r\n */\r\nvar MAX_NODE = new MaxNode();\r\nObject.defineProperties(NamedNode, {\r\n MIN: {\r\n value: new NamedNode(MIN_NAME, ChildrenNode.EMPTY_NODE)\r\n },\r\n MAX: {\r\n value: new NamedNode(MAX_NAME, MAX_NODE)\r\n }\r\n});\r\n/**\r\n * Reference Extensions\r\n */\r\nKeyIndex.__EMPTY_NODE = ChildrenNode.EMPTY_NODE;\r\nLeafNode.__childrenNodeConstructor = ChildrenNode;\r\nsetMaxNode$1(MAX_NODE);\r\nsetMaxNode(MAX_NODE);\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar USE_HINZE = true;\r\n/**\r\n * Constructs a snapshot node representing the passed JSON and returns it.\r\n * @param json - JSON to create a node for.\r\n * @param priority - Optional priority to use. This will be ignored if the\r\n * passed JSON contains a .priority property.\r\n */\r\nfunction nodeFromJSON(json, priority) {\r\n if (priority === void 0) { priority = null; }\r\n if (json === null) {\r\n return ChildrenNode.EMPTY_NODE;\r\n }\r\n if (typeof json === 'object' && '.priority' in json) {\r\n priority = json['.priority'];\r\n }\r\n assert(priority === null ||\r\n typeof priority === 'string' ||\r\n typeof priority === 'number' ||\r\n (typeof priority === 'object' && '.sv' in priority), 'Invalid priority type found: ' + typeof priority);\r\n if (typeof json === 'object' && '.value' in json && json['.value'] !== null) {\r\n json = json['.value'];\r\n }\r\n // Valid leaf nodes include non-objects or server-value wrapper objects\r\n if (typeof json !== 'object' || '.sv' in json) {\r\n var jsonLeaf = json;\r\n return new LeafNode(jsonLeaf, nodeFromJSON(priority));\r\n }\r\n if (!(json instanceof Array) && USE_HINZE) {\r\n var children_1 = [];\r\n var childrenHavePriority_1 = false;\r\n var hinzeJsonObj = json;\r\n each(hinzeJsonObj, function (key, child) {\r\n if (key.substring(0, 1) !== '.') {\r\n // Ignore metadata nodes\r\n var childNode = nodeFromJSON(child);\r\n if (!childNode.isEmpty()) {\r\n childrenHavePriority_1 =\r\n childrenHavePriority_1 || !childNode.getPriority().isEmpty();\r\n children_1.push(new NamedNode(key, childNode));\r\n }\r\n }\r\n });\r\n if (children_1.length === 0) {\r\n return ChildrenNode.EMPTY_NODE;\r\n }\r\n var childSet = buildChildSet(children_1, NAME_ONLY_COMPARATOR, function (namedNode) { return namedNode.name; }, NAME_COMPARATOR);\r\n if (childrenHavePriority_1) {\r\n var sortedChildSet = buildChildSet(children_1, PRIORITY_INDEX.getCompare());\r\n return new ChildrenNode(childSet, nodeFromJSON(priority), new IndexMap({ '.priority': sortedChildSet }, { '.priority': PRIORITY_INDEX }));\r\n }\r\n else {\r\n return new ChildrenNode(childSet, nodeFromJSON(priority), IndexMap.Default);\r\n }\r\n }\r\n else {\r\n var node_1 = ChildrenNode.EMPTY_NODE;\r\n each(json, function (key, childData) {\r\n if (contains(json, key)) {\r\n if (key.substring(0, 1) !== '.') {\r\n // ignore metadata nodes.\r\n var childNode = nodeFromJSON(childData);\r\n if (childNode.isLeafNode() || !childNode.isEmpty()) {\r\n node_1 = node_1.updateImmediateChild(key, childNode);\r\n }\r\n }\r\n }\r\n });\r\n return node_1.updatePriority(nodeFromJSON(priority));\r\n }\r\n}\r\nsetNodeFromJSON(nodeFromJSON);\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar PathIndex = /** @class */ (function (_super) {\r\n __extends(PathIndex, _super);\r\n function PathIndex(indexPath_) {\r\n var _this = _super.call(this) || this;\r\n _this.indexPath_ = indexPath_;\r\n assert(!pathIsEmpty(indexPath_) && pathGetFront(indexPath_) !== '.priority', \"Can't create PathIndex with empty path or .priority key\");\r\n return _this;\r\n }\r\n PathIndex.prototype.extractChild = function (snap) {\r\n return snap.getChild(this.indexPath_);\r\n };\r\n PathIndex.prototype.isDefinedOn = function (node) {\r\n return !node.getChild(this.indexPath_).isEmpty();\r\n };\r\n PathIndex.prototype.compare = function (a, b) {\r\n var aChild = this.extractChild(a.node);\r\n var bChild = this.extractChild(b.node);\r\n var indexCmp = aChild.compareTo(bChild);\r\n if (indexCmp === 0) {\r\n return nameCompare(a.name, b.name);\r\n }\r\n else {\r\n return indexCmp;\r\n }\r\n };\r\n PathIndex.prototype.makePost = function (indexValue, name) {\r\n var valueNode = nodeFromJSON(indexValue);\r\n var node = ChildrenNode.EMPTY_NODE.updateChild(this.indexPath_, valueNode);\r\n return new NamedNode(name, node);\r\n };\r\n PathIndex.prototype.maxPost = function () {\r\n var node = ChildrenNode.EMPTY_NODE.updateChild(this.indexPath_, MAX_NODE);\r\n return new NamedNode(MAX_NAME, node);\r\n };\r\n PathIndex.prototype.toString = function () {\r\n return pathSlice(this.indexPath_, 0).join('/');\r\n };\r\n return PathIndex;\r\n}(Index));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar ValueIndex = /** @class */ (function (_super) {\r\n __extends(ValueIndex, _super);\r\n function ValueIndex() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n ValueIndex.prototype.compare = function (a, b) {\r\n var indexCmp = a.node.compareTo(b.node);\r\n if (indexCmp === 0) {\r\n return nameCompare(a.name, b.name);\r\n }\r\n else {\r\n return indexCmp;\r\n }\r\n };\r\n ValueIndex.prototype.isDefinedOn = function (node) {\r\n return true;\r\n };\r\n ValueIndex.prototype.indexedValueChanged = function (oldNode, newNode) {\r\n return !oldNode.equals(newNode);\r\n };\r\n ValueIndex.prototype.minPost = function () {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return NamedNode.MIN;\r\n };\r\n ValueIndex.prototype.maxPost = function () {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return NamedNode.MAX;\r\n };\r\n ValueIndex.prototype.makePost = function (indexValue, name) {\r\n var valueNode = nodeFromJSON(indexValue);\r\n return new NamedNode(name, valueNode);\r\n };\r\n /**\r\n * @returns String representation for inclusion in a query spec\r\n */\r\n ValueIndex.prototype.toString = function () {\r\n return '.value';\r\n };\r\n return ValueIndex;\r\n}(Index));\r\nvar VALUE_INDEX = new ValueIndex();\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Modeled after base64 web-safe chars, but ordered by ASCII.\r\nvar PUSH_CHARS = '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';\r\nvar MIN_PUSH_CHAR = '-';\r\nvar MAX_PUSH_CHAR = 'z';\r\nvar MAX_KEY_LEN = 786;\r\n/**\r\n * Fancy ID generator that creates 20-character string identifiers with the\r\n * following properties:\r\n *\r\n * 1. They're based on timestamp so that they sort *after* any existing ids.\r\n * 2. They contain 72-bits of random data after the timestamp so that IDs won't\r\n * collide with other clients' IDs.\r\n * 3. They sort *lexicographically* (so the timestamp is converted to characters\r\n * that will sort properly).\r\n * 4. They're monotonically increasing. Even if you generate more than one in\r\n * the same timestamp, the latter ones will sort after the former ones. We do\r\n * this by using the previous random bits but \"incrementing\" them by 1 (only\r\n * in the case of a timestamp collision).\r\n */\r\nvar nextPushId = (function () {\r\n // Timestamp of last push, used to prevent local collisions if you push twice\r\n // in one ms.\r\n var lastPushTime = 0;\r\n // We generate 72-bits of randomness which get turned into 12 characters and\r\n // appended to the timestamp to prevent collisions with other clients. We\r\n // store the last characters we generated because in the event of a collision,\r\n // we'll use those same characters except \"incremented\" by one.\r\n var lastRandChars = [];\r\n return function (now) {\r\n var duplicateTime = now === lastPushTime;\r\n lastPushTime = now;\r\n var i;\r\n var timeStampChars = new Array(8);\r\n for (i = 7; i >= 0; i--) {\r\n timeStampChars[i] = PUSH_CHARS.charAt(now % 64);\r\n // NOTE: Can't use << here because javascript will convert to int and lose\r\n // the upper bits.\r\n now = Math.floor(now / 64);\r\n }\r\n assert(now === 0, 'Cannot push at time == 0');\r\n var id = timeStampChars.join('');\r\n if (!duplicateTime) {\r\n for (i = 0; i < 12; i++) {\r\n lastRandChars[i] = Math.floor(Math.random() * 64);\r\n }\r\n }\r\n else {\r\n // If the timestamp hasn't changed since last push, use the same random\r\n // number, except incremented by 1.\r\n for (i = 11; i >= 0 && lastRandChars[i] === 63; i--) {\r\n lastRandChars[i] = 0;\r\n }\r\n lastRandChars[i]++;\r\n }\r\n for (i = 0; i < 12; i++) {\r\n id += PUSH_CHARS.charAt(lastRandChars[i]);\r\n }\r\n assert(id.length === 20, 'nextPushId: Length should be 20.');\r\n return id;\r\n };\r\n})();\r\nvar successor = function (key) {\r\n if (key === '' + INTEGER_32_MAX) {\r\n // See https://firebase.google.com/docs/database/web/lists-of-data#data-order\r\n return MIN_PUSH_CHAR;\r\n }\r\n var keyAsInt = tryParseInt(key);\r\n if (keyAsInt != null) {\r\n return '' + (keyAsInt + 1);\r\n }\r\n var next = new Array(key.length);\r\n for (var i_1 = 0; i_1 < next.length; i_1++) {\r\n next[i_1] = key.charAt(i_1);\r\n }\r\n if (next.length < MAX_KEY_LEN) {\r\n next.push(MIN_PUSH_CHAR);\r\n return next.join('');\r\n }\r\n var i = next.length - 1;\r\n while (i >= 0 && next[i] === MAX_PUSH_CHAR) {\r\n i--;\r\n }\r\n // `successor` was called on the largest possible key, so return the\r\n // MAX_NAME, which sorts larger than all keys.\r\n if (i === -1) {\r\n return MAX_NAME;\r\n }\r\n var source = next[i];\r\n var sourcePlusOne = PUSH_CHARS.charAt(PUSH_CHARS.indexOf(source) + 1);\r\n next[i] = sourcePlusOne;\r\n return next.slice(0, i + 1).join('');\r\n};\r\n// `key` is assumed to be non-empty.\r\nvar predecessor = function (key) {\r\n if (key === '' + INTEGER_32_MIN) {\r\n return MIN_NAME;\r\n }\r\n var keyAsInt = tryParseInt(key);\r\n if (keyAsInt != null) {\r\n return '' + (keyAsInt - 1);\r\n }\r\n var next = new Array(key.length);\r\n for (var i = 0; i < next.length; i++) {\r\n next[i] = key.charAt(i);\r\n }\r\n // If `key` ends in `MIN_PUSH_CHAR`, the largest key lexicographically\r\n // smaller than `key`, is `key[0:key.length - 1]`. The next key smaller\r\n // than that, `predecessor(predecessor(key))`, is\r\n //\r\n // `key[0:key.length - 2] + (key[key.length - 1] - 1) + \\\r\n // { MAX_PUSH_CHAR repeated MAX_KEY_LEN - (key.length - 1) times }\r\n //\r\n // analogous to increment/decrement for base-10 integers.\r\n //\r\n // This works because lexigographic comparison works character-by-character,\r\n // using length as a tie-breaker if one key is a prefix of the other.\r\n if (next[next.length - 1] === MIN_PUSH_CHAR) {\r\n if (next.length === 1) {\r\n // See https://firebase.google.com/docs/database/web/lists-of-data#orderbykey\r\n return '' + INTEGER_32_MAX;\r\n }\r\n delete next[next.length - 1];\r\n return next.join('');\r\n }\r\n // Replace the last character with it's immediate predecessor, and\r\n // fill the suffix of the key with MAX_PUSH_CHAR. This is the\r\n // lexicographically largest possible key smaller than `key`.\r\n next[next.length - 1] = PUSH_CHARS.charAt(PUSH_CHARS.indexOf(next[next.length - 1]) - 1);\r\n return next.join('') + MAX_PUSH_CHAR.repeat(MAX_KEY_LEN - next.length);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction changeValue(snapshotNode) {\r\n return { type: \"value\" /* VALUE */, snapshotNode: snapshotNode };\r\n}\r\nfunction changeChildAdded(childName, snapshotNode) {\r\n return { type: \"child_added\" /* CHILD_ADDED */, snapshotNode: snapshotNode, childName: childName };\r\n}\r\nfunction changeChildRemoved(childName, snapshotNode) {\r\n return { type: \"child_removed\" /* CHILD_REMOVED */, snapshotNode: snapshotNode, childName: childName };\r\n}\r\nfunction changeChildChanged(childName, snapshotNode, oldSnap) {\r\n return {\r\n type: \"child_changed\" /* CHILD_CHANGED */,\r\n snapshotNode: snapshotNode,\r\n childName: childName,\r\n oldSnap: oldSnap\r\n };\r\n}\r\nfunction changeChildMoved(childName, snapshotNode) {\r\n return { type: \"child_moved\" /* CHILD_MOVED */, snapshotNode: snapshotNode, childName: childName };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Doesn't really filter nodes but applies an index to the node and keeps track of any changes\r\n */\r\nvar IndexedFilter = /** @class */ (function () {\r\n function IndexedFilter(index_) {\r\n this.index_ = index_;\r\n }\r\n IndexedFilter.prototype.updateChild = function (snap, key, newChild, affectedPath, source, optChangeAccumulator) {\r\n assert(snap.isIndexed(this.index_), 'A node must be indexed if only a child is updated');\r\n var oldChild = snap.getImmediateChild(key);\r\n // Check if anything actually changed.\r\n if (oldChild.getChild(affectedPath).equals(newChild.getChild(affectedPath))) {\r\n // There's an edge case where a child can enter or leave the view because affectedPath was set to null.\r\n // In this case, affectedPath will appear null in both the old and new snapshots. So we need\r\n // to avoid treating these cases as \"nothing changed.\"\r\n if (oldChild.isEmpty() === newChild.isEmpty()) {\r\n // Nothing changed.\r\n // This assert should be valid, but it's expensive (can dominate perf testing) so don't actually do it.\r\n //assert(oldChild.equals(newChild), 'Old and new snapshots should be equal.');\r\n return snap;\r\n }\r\n }\r\n if (optChangeAccumulator != null) {\r\n if (newChild.isEmpty()) {\r\n if (snap.hasChild(key)) {\r\n optChangeAccumulator.trackChildChange(changeChildRemoved(key, oldChild));\r\n }\r\n else {\r\n assert(snap.isLeafNode(), 'A child remove without an old child only makes sense on a leaf node');\r\n }\r\n }\r\n else if (oldChild.isEmpty()) {\r\n optChangeAccumulator.trackChildChange(changeChildAdded(key, newChild));\r\n }\r\n else {\r\n optChangeAccumulator.trackChildChange(changeChildChanged(key, newChild, oldChild));\r\n }\r\n }\r\n if (snap.isLeafNode() && newChild.isEmpty()) {\r\n return snap;\r\n }\r\n else {\r\n // Make sure the node is indexed\r\n return snap.updateImmediateChild(key, newChild).withIndex(this.index_);\r\n }\r\n };\r\n IndexedFilter.prototype.updateFullNode = function (oldSnap, newSnap, optChangeAccumulator) {\r\n if (optChangeAccumulator != null) {\r\n if (!oldSnap.isLeafNode()) {\r\n oldSnap.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n if (!newSnap.hasChild(key)) {\r\n optChangeAccumulator.trackChildChange(changeChildRemoved(key, childNode));\r\n }\r\n });\r\n }\r\n if (!newSnap.isLeafNode()) {\r\n newSnap.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n if (oldSnap.hasChild(key)) {\r\n var oldChild = oldSnap.getImmediateChild(key);\r\n if (!oldChild.equals(childNode)) {\r\n optChangeAccumulator.trackChildChange(changeChildChanged(key, childNode, oldChild));\r\n }\r\n }\r\n else {\r\n optChangeAccumulator.trackChildChange(changeChildAdded(key, childNode));\r\n }\r\n });\r\n }\r\n }\r\n return newSnap.withIndex(this.index_);\r\n };\r\n IndexedFilter.prototype.updatePriority = function (oldSnap, newPriority) {\r\n if (oldSnap.isEmpty()) {\r\n return ChildrenNode.EMPTY_NODE;\r\n }\r\n else {\r\n return oldSnap.updatePriority(newPriority);\r\n }\r\n };\r\n IndexedFilter.prototype.filtersNodes = function () {\r\n return false;\r\n };\r\n IndexedFilter.prototype.getIndexedFilter = function () {\r\n return this;\r\n };\r\n IndexedFilter.prototype.getIndex = function () {\r\n return this.index_;\r\n };\r\n return IndexedFilter;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Filters nodes by range and uses an IndexFilter to track any changes after filtering the node\r\n */\r\nvar RangedFilter = /** @class */ (function () {\r\n function RangedFilter(params) {\r\n this.indexedFilter_ = new IndexedFilter(params.getIndex());\r\n this.index_ = params.getIndex();\r\n this.startPost_ = RangedFilter.getStartPost_(params);\r\n this.endPost_ = RangedFilter.getEndPost_(params);\r\n }\r\n RangedFilter.prototype.getStartPost = function () {\r\n return this.startPost_;\r\n };\r\n RangedFilter.prototype.getEndPost = function () {\r\n return this.endPost_;\r\n };\r\n RangedFilter.prototype.matches = function (node) {\r\n return (this.index_.compare(this.getStartPost(), node) <= 0 &&\r\n this.index_.compare(node, this.getEndPost()) <= 0);\r\n };\r\n RangedFilter.prototype.updateChild = function (snap, key, newChild, affectedPath, source, optChangeAccumulator) {\r\n if (!this.matches(new NamedNode(key, newChild))) {\r\n newChild = ChildrenNode.EMPTY_NODE;\r\n }\r\n return this.indexedFilter_.updateChild(snap, key, newChild, affectedPath, source, optChangeAccumulator);\r\n };\r\n RangedFilter.prototype.updateFullNode = function (oldSnap, newSnap, optChangeAccumulator) {\r\n if (newSnap.isLeafNode()) {\r\n // Make sure we have a children node with the correct index, not a leaf node;\r\n newSnap = ChildrenNode.EMPTY_NODE;\r\n }\r\n var filtered = newSnap.withIndex(this.index_);\r\n // Don't support priorities on queries\r\n filtered = filtered.updatePriority(ChildrenNode.EMPTY_NODE);\r\n var self = this;\r\n newSnap.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n if (!self.matches(new NamedNode(key, childNode))) {\r\n filtered = filtered.updateImmediateChild(key, ChildrenNode.EMPTY_NODE);\r\n }\r\n });\r\n return this.indexedFilter_.updateFullNode(oldSnap, filtered, optChangeAccumulator);\r\n };\r\n RangedFilter.prototype.updatePriority = function (oldSnap, newPriority) {\r\n // Don't support priorities on queries\r\n return oldSnap;\r\n };\r\n RangedFilter.prototype.filtersNodes = function () {\r\n return true;\r\n };\r\n RangedFilter.prototype.getIndexedFilter = function () {\r\n return this.indexedFilter_;\r\n };\r\n RangedFilter.prototype.getIndex = function () {\r\n return this.index_;\r\n };\r\n RangedFilter.getStartPost_ = function (params) {\r\n if (params.hasStart()) {\r\n var startName = params.getIndexStartName();\r\n return params.getIndex().makePost(params.getIndexStartValue(), startName);\r\n }\r\n else {\r\n return params.getIndex().minPost();\r\n }\r\n };\r\n RangedFilter.getEndPost_ = function (params) {\r\n if (params.hasEnd()) {\r\n var endName = params.getIndexEndName();\r\n return params.getIndex().makePost(params.getIndexEndValue(), endName);\r\n }\r\n else {\r\n return params.getIndex().maxPost();\r\n }\r\n };\r\n return RangedFilter;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Applies a limit and a range to a node and uses RangedFilter to do the heavy lifting where possible\r\n */\r\nvar LimitedFilter = /** @class */ (function () {\r\n function LimitedFilter(params) {\r\n this.rangedFilter_ = new RangedFilter(params);\r\n this.index_ = params.getIndex();\r\n this.limit_ = params.getLimit();\r\n this.reverse_ = !params.isViewFromLeft();\r\n }\r\n LimitedFilter.prototype.updateChild = function (snap, key, newChild, affectedPath, source, optChangeAccumulator) {\r\n if (!this.rangedFilter_.matches(new NamedNode(key, newChild))) {\r\n newChild = ChildrenNode.EMPTY_NODE;\r\n }\r\n if (snap.getImmediateChild(key).equals(newChild)) {\r\n // No change\r\n return snap;\r\n }\r\n else if (snap.numChildren() < this.limit_) {\r\n return this.rangedFilter_\r\n .getIndexedFilter()\r\n .updateChild(snap, key, newChild, affectedPath, source, optChangeAccumulator);\r\n }\r\n else {\r\n return this.fullLimitUpdateChild_(snap, key, newChild, source, optChangeAccumulator);\r\n }\r\n };\r\n LimitedFilter.prototype.updateFullNode = function (oldSnap, newSnap, optChangeAccumulator) {\r\n var filtered;\r\n if (newSnap.isLeafNode() || newSnap.isEmpty()) {\r\n // Make sure we have a children node with the correct index, not a leaf node;\r\n filtered = ChildrenNode.EMPTY_NODE.withIndex(this.index_);\r\n }\r\n else {\r\n if (this.limit_ * 2 < newSnap.numChildren() &&\r\n newSnap.isIndexed(this.index_)) {\r\n // Easier to build up a snapshot, since what we're given has more than twice the elements we want\r\n filtered = ChildrenNode.EMPTY_NODE.withIndex(this.index_);\r\n // anchor to the startPost, endPost, or last element as appropriate\r\n var iterator = void 0;\r\n if (this.reverse_) {\r\n iterator = newSnap.getReverseIteratorFrom(this.rangedFilter_.getEndPost(), this.index_);\r\n }\r\n else {\r\n iterator = newSnap.getIteratorFrom(this.rangedFilter_.getStartPost(), this.index_);\r\n }\r\n var count = 0;\r\n while (iterator.hasNext() && count < this.limit_) {\r\n var next = iterator.getNext();\r\n var inRange = void 0;\r\n if (this.reverse_) {\r\n inRange =\r\n this.index_.compare(this.rangedFilter_.getStartPost(), next) <= 0;\r\n }\r\n else {\r\n inRange =\r\n this.index_.compare(next, this.rangedFilter_.getEndPost()) <= 0;\r\n }\r\n if (inRange) {\r\n filtered = filtered.updateImmediateChild(next.name, next.node);\r\n count++;\r\n }\r\n else {\r\n // if we have reached the end post, we cannot keep adding elemments\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n // The snap contains less than twice the limit. Faster to delete from the snap than build up a new one\r\n filtered = newSnap.withIndex(this.index_);\r\n // Don't support priorities on queries\r\n filtered = filtered.updatePriority(ChildrenNode.EMPTY_NODE);\r\n var startPost = void 0;\r\n var endPost = void 0;\r\n var cmp = void 0;\r\n var iterator = void 0;\r\n if (this.reverse_) {\r\n iterator = filtered.getReverseIterator(this.index_);\r\n startPost = this.rangedFilter_.getEndPost();\r\n endPost = this.rangedFilter_.getStartPost();\r\n var indexCompare_1 = this.index_.getCompare();\r\n cmp = function (a, b) { return indexCompare_1(b, a); };\r\n }\r\n else {\r\n iterator = filtered.getIterator(this.index_);\r\n startPost = this.rangedFilter_.getStartPost();\r\n endPost = this.rangedFilter_.getEndPost();\r\n cmp = this.index_.getCompare();\r\n }\r\n var count = 0;\r\n var foundStartPost = false;\r\n while (iterator.hasNext()) {\r\n var next = iterator.getNext();\r\n if (!foundStartPost && cmp(startPost, next) <= 0) {\r\n // start adding\r\n foundStartPost = true;\r\n }\r\n var inRange = foundStartPost && count < this.limit_ && cmp(next, endPost) <= 0;\r\n if (inRange) {\r\n count++;\r\n }\r\n else {\r\n filtered = filtered.updateImmediateChild(next.name, ChildrenNode.EMPTY_NODE);\r\n }\r\n }\r\n }\r\n }\r\n return this.rangedFilter_\r\n .getIndexedFilter()\r\n .updateFullNode(oldSnap, filtered, optChangeAccumulator);\r\n };\r\n LimitedFilter.prototype.updatePriority = function (oldSnap, newPriority) {\r\n // Don't support priorities on queries\r\n return oldSnap;\r\n };\r\n LimitedFilter.prototype.filtersNodes = function () {\r\n return true;\r\n };\r\n LimitedFilter.prototype.getIndexedFilter = function () {\r\n return this.rangedFilter_.getIndexedFilter();\r\n };\r\n LimitedFilter.prototype.getIndex = function () {\r\n return this.index_;\r\n };\r\n LimitedFilter.prototype.fullLimitUpdateChild_ = function (snap, childKey, childSnap, source, changeAccumulator) {\r\n // TODO: rename all cache stuff etc to general snap terminology\r\n var cmp;\r\n if (this.reverse_) {\r\n var indexCmp_1 = this.index_.getCompare();\r\n cmp = function (a, b) { return indexCmp_1(b, a); };\r\n }\r\n else {\r\n cmp = this.index_.getCompare();\r\n }\r\n var oldEventCache = snap;\r\n assert(oldEventCache.numChildren() === this.limit_, '');\r\n var newChildNamedNode = new NamedNode(childKey, childSnap);\r\n var windowBoundary = this.reverse_\r\n ? oldEventCache.getFirstChild(this.index_)\r\n : oldEventCache.getLastChild(this.index_);\r\n var inRange = this.rangedFilter_.matches(newChildNamedNode);\r\n if (oldEventCache.hasChild(childKey)) {\r\n var oldChildSnap = oldEventCache.getImmediateChild(childKey);\r\n var nextChild = source.getChildAfterChild(this.index_, windowBoundary, this.reverse_);\r\n while (nextChild != null &&\r\n (nextChild.name === childKey || oldEventCache.hasChild(nextChild.name))) {\r\n // There is a weird edge case where a node is updated as part of a merge in the write tree, but hasn't\r\n // been applied to the limited filter yet. Ignore this next child which will be updated later in\r\n // the limited filter...\r\n nextChild = source.getChildAfterChild(this.index_, nextChild, this.reverse_);\r\n }\r\n var compareNext = nextChild == null ? 1 : cmp(nextChild, newChildNamedNode);\r\n var remainsInWindow = inRange && !childSnap.isEmpty() && compareNext >= 0;\r\n if (remainsInWindow) {\r\n if (changeAccumulator != null) {\r\n changeAccumulator.trackChildChange(changeChildChanged(childKey, childSnap, oldChildSnap));\r\n }\r\n return oldEventCache.updateImmediateChild(childKey, childSnap);\r\n }\r\n else {\r\n if (changeAccumulator != null) {\r\n changeAccumulator.trackChildChange(changeChildRemoved(childKey, oldChildSnap));\r\n }\r\n var newEventCache = oldEventCache.updateImmediateChild(childKey, ChildrenNode.EMPTY_NODE);\r\n var nextChildInRange = nextChild != null && this.rangedFilter_.matches(nextChild);\r\n if (nextChildInRange) {\r\n if (changeAccumulator != null) {\r\n changeAccumulator.trackChildChange(changeChildAdded(nextChild.name, nextChild.node));\r\n }\r\n return newEventCache.updateImmediateChild(nextChild.name, nextChild.node);\r\n }\r\n else {\r\n return newEventCache;\r\n }\r\n }\r\n }\r\n else if (childSnap.isEmpty()) {\r\n // we're deleting a node, but it was not in the window, so ignore it\r\n return snap;\r\n }\r\n else if (inRange) {\r\n if (cmp(windowBoundary, newChildNamedNode) >= 0) {\r\n if (changeAccumulator != null) {\r\n changeAccumulator.trackChildChange(changeChildRemoved(windowBoundary.name, windowBoundary.node));\r\n changeAccumulator.trackChildChange(changeChildAdded(childKey, childSnap));\r\n }\r\n return oldEventCache\r\n .updateImmediateChild(childKey, childSnap)\r\n .updateImmediateChild(windowBoundary.name, ChildrenNode.EMPTY_NODE);\r\n }\r\n else {\r\n return snap;\r\n }\r\n }\r\n else {\r\n return snap;\r\n }\r\n };\r\n return LimitedFilter;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * This class is an immutable-from-the-public-api struct containing a set of query parameters defining a\r\n * range to be returned for a particular location. It is assumed that validation of parameters is done at the\r\n * user-facing API level, so it is not done here.\r\n */\r\nvar QueryParams = /** @class */ (function () {\r\n function QueryParams() {\r\n this.limitSet_ = false;\r\n this.startSet_ = false;\r\n this.startNameSet_ = false;\r\n this.startAfterSet_ = false;\r\n this.endSet_ = false;\r\n this.endNameSet_ = false;\r\n this.endBeforeSet_ = false;\r\n this.limit_ = 0;\r\n this.viewFrom_ = '';\r\n this.indexStartValue_ = null;\r\n this.indexStartName_ = '';\r\n this.indexEndValue_ = null;\r\n this.indexEndName_ = '';\r\n this.index_ = PRIORITY_INDEX;\r\n }\r\n QueryParams.prototype.hasStart = function () {\r\n return this.startSet_;\r\n };\r\n QueryParams.prototype.hasStartAfter = function () {\r\n return this.startAfterSet_;\r\n };\r\n QueryParams.prototype.hasEndBefore = function () {\r\n return this.endBeforeSet_;\r\n };\r\n /**\r\n * @returns True if it would return from left.\r\n */\r\n QueryParams.prototype.isViewFromLeft = function () {\r\n if (this.viewFrom_ === '') {\r\n // limit(), rather than limitToFirst or limitToLast was called.\r\n // This means that only one of startSet_ and endSet_ is true. Use them\r\n // to calculate which side of the view to anchor to. If neither is set,\r\n // anchor to the end.\r\n return this.startSet_;\r\n }\r\n else {\r\n return this.viewFrom_ === \"l\" /* VIEW_FROM_LEFT */;\r\n }\r\n };\r\n /**\r\n * Only valid to call if hasStart() returns true\r\n */\r\n QueryParams.prototype.getIndexStartValue = function () {\r\n assert(this.startSet_, 'Only valid if start has been set');\r\n return this.indexStartValue_;\r\n };\r\n /**\r\n * Only valid to call if hasStart() returns true.\r\n * Returns the starting key name for the range defined by these query parameters\r\n */\r\n QueryParams.prototype.getIndexStartName = function () {\r\n assert(this.startSet_, 'Only valid if start has been set');\r\n if (this.startNameSet_) {\r\n return this.indexStartName_;\r\n }\r\n else {\r\n return MIN_NAME;\r\n }\r\n };\r\n QueryParams.prototype.hasEnd = function () {\r\n return this.endSet_;\r\n };\r\n /**\r\n * Only valid to call if hasEnd() returns true.\r\n */\r\n QueryParams.prototype.getIndexEndValue = function () {\r\n assert(this.endSet_, 'Only valid if end has been set');\r\n return this.indexEndValue_;\r\n };\r\n /**\r\n * Only valid to call if hasEnd() returns true.\r\n * Returns the end key name for the range defined by these query parameters\r\n */\r\n QueryParams.prototype.getIndexEndName = function () {\r\n assert(this.endSet_, 'Only valid if end has been set');\r\n if (this.endNameSet_) {\r\n return this.indexEndName_;\r\n }\r\n else {\r\n return MAX_NAME;\r\n }\r\n };\r\n QueryParams.prototype.hasLimit = function () {\r\n return this.limitSet_;\r\n };\r\n /**\r\n * @returns True if a limit has been set and it has been explicitly anchored\r\n */\r\n QueryParams.prototype.hasAnchoredLimit = function () {\r\n return this.limitSet_ && this.viewFrom_ !== '';\r\n };\r\n /**\r\n * Only valid to call if hasLimit() returns true\r\n */\r\n QueryParams.prototype.getLimit = function () {\r\n assert(this.limitSet_, 'Only valid if limit has been set');\r\n return this.limit_;\r\n };\r\n QueryParams.prototype.getIndex = function () {\r\n return this.index_;\r\n };\r\n QueryParams.prototype.loadsAllData = function () {\r\n return !(this.startSet_ || this.endSet_ || this.limitSet_);\r\n };\r\n QueryParams.prototype.isDefault = function () {\r\n return this.loadsAllData() && this.index_ === PRIORITY_INDEX;\r\n };\r\n QueryParams.prototype.copy = function () {\r\n var copy = new QueryParams();\r\n copy.limitSet_ = this.limitSet_;\r\n copy.limit_ = this.limit_;\r\n copy.startSet_ = this.startSet_;\r\n copy.indexStartValue_ = this.indexStartValue_;\r\n copy.startNameSet_ = this.startNameSet_;\r\n copy.indexStartName_ = this.indexStartName_;\r\n copy.endSet_ = this.endSet_;\r\n copy.indexEndValue_ = this.indexEndValue_;\r\n copy.endNameSet_ = this.endNameSet_;\r\n copy.indexEndName_ = this.indexEndName_;\r\n copy.index_ = this.index_;\r\n copy.viewFrom_ = this.viewFrom_;\r\n return copy;\r\n };\r\n return QueryParams;\r\n}());\r\nfunction queryParamsGetNodeFilter(queryParams) {\r\n if (queryParams.loadsAllData()) {\r\n return new IndexedFilter(queryParams.getIndex());\r\n }\r\n else if (queryParams.hasLimit()) {\r\n return new LimitedFilter(queryParams);\r\n }\r\n else {\r\n return new RangedFilter(queryParams);\r\n }\r\n}\r\nfunction queryParamsLimitToFirst(queryParams, newLimit) {\r\n var newParams = queryParams.copy();\r\n newParams.limitSet_ = true;\r\n newParams.limit_ = newLimit;\r\n newParams.viewFrom_ = \"l\" /* VIEW_FROM_LEFT */;\r\n return newParams;\r\n}\r\nfunction queryParamsLimitToLast(queryParams, newLimit) {\r\n var newParams = queryParams.copy();\r\n newParams.limitSet_ = true;\r\n newParams.limit_ = newLimit;\r\n newParams.viewFrom_ = \"r\" /* VIEW_FROM_RIGHT */;\r\n return newParams;\r\n}\r\nfunction queryParamsStartAt(queryParams, indexValue, key) {\r\n var newParams = queryParams.copy();\r\n newParams.startSet_ = true;\r\n if (indexValue === undefined) {\r\n indexValue = null;\r\n }\r\n newParams.indexStartValue_ = indexValue;\r\n if (key != null) {\r\n newParams.startNameSet_ = true;\r\n newParams.indexStartName_ = key;\r\n }\r\n else {\r\n newParams.startNameSet_ = false;\r\n newParams.indexStartName_ = '';\r\n }\r\n return newParams;\r\n}\r\nfunction queryParamsStartAfter(queryParams, indexValue, key) {\r\n var params;\r\n if (queryParams.index_ === KEY_INDEX) {\r\n if (typeof indexValue === 'string') {\r\n indexValue = successor(indexValue);\r\n }\r\n params = queryParamsStartAt(queryParams, indexValue, key);\r\n }\r\n else {\r\n var childKey = void 0;\r\n if (key == null) {\r\n childKey = MAX_NAME;\r\n }\r\n else {\r\n childKey = successor(key);\r\n }\r\n params = queryParamsStartAt(queryParams, indexValue, childKey);\r\n }\r\n params.startAfterSet_ = true;\r\n return params;\r\n}\r\nfunction queryParamsEndAt(queryParams, indexValue, key) {\r\n var newParams = queryParams.copy();\r\n newParams.endSet_ = true;\r\n if (indexValue === undefined) {\r\n indexValue = null;\r\n }\r\n newParams.indexEndValue_ = indexValue;\r\n if (key !== undefined) {\r\n newParams.endNameSet_ = true;\r\n newParams.indexEndName_ = key;\r\n }\r\n else {\r\n newParams.endNameSet_ = false;\r\n newParams.indexEndName_ = '';\r\n }\r\n return newParams;\r\n}\r\nfunction queryParamsEndBefore(queryParams, indexValue, key) {\r\n var childKey;\r\n var params;\r\n if (queryParams.index_ === KEY_INDEX) {\r\n if (typeof indexValue === 'string') {\r\n indexValue = predecessor(indexValue);\r\n }\r\n params = queryParamsEndAt(queryParams, indexValue, key);\r\n }\r\n else {\r\n if (key == null) {\r\n childKey = MIN_NAME;\r\n }\r\n else {\r\n childKey = predecessor(key);\r\n }\r\n params = queryParamsEndAt(queryParams, indexValue, childKey);\r\n }\r\n params.endBeforeSet_ = true;\r\n return params;\r\n}\r\nfunction queryParamsOrderBy(queryParams, index) {\r\n var newParams = queryParams.copy();\r\n newParams.index_ = index;\r\n return newParams;\r\n}\r\n/**\r\n * Returns a set of REST query string parameters representing this query.\r\n *\r\n * @returns query string parameters\r\n */\r\nfunction queryParamsToRestQueryStringParameters(queryParams) {\r\n var qs = {};\r\n if (queryParams.isDefault()) {\r\n return qs;\r\n }\r\n var orderBy;\r\n if (queryParams.index_ === PRIORITY_INDEX) {\r\n orderBy = \"$priority\" /* PRIORITY_INDEX */;\r\n }\r\n else if (queryParams.index_ === VALUE_INDEX) {\r\n orderBy = \"$value\" /* VALUE_INDEX */;\r\n }\r\n else if (queryParams.index_ === KEY_INDEX) {\r\n orderBy = \"$key\" /* KEY_INDEX */;\r\n }\r\n else {\r\n assert(queryParams.index_ instanceof PathIndex, 'Unrecognized index type!');\r\n orderBy = queryParams.index_.toString();\r\n }\r\n qs[\"orderBy\" /* ORDER_BY */] = stringify(orderBy);\r\n if (queryParams.startSet_) {\r\n qs[\"startAt\" /* START_AT */] = stringify(queryParams.indexStartValue_);\r\n if (queryParams.startNameSet_) {\r\n qs[\"startAt\" /* START_AT */] +=\r\n ',' + stringify(queryParams.indexStartName_);\r\n }\r\n }\r\n if (queryParams.endSet_) {\r\n qs[\"endAt\" /* END_AT */] = stringify(queryParams.indexEndValue_);\r\n if (queryParams.endNameSet_) {\r\n qs[\"endAt\" /* END_AT */] +=\r\n ',' + stringify(queryParams.indexEndName_);\r\n }\r\n }\r\n if (queryParams.limitSet_) {\r\n if (queryParams.isViewFromLeft()) {\r\n qs[\"limitToFirst\" /* LIMIT_TO_FIRST */] = queryParams.limit_;\r\n }\r\n else {\r\n qs[\"limitToLast\" /* LIMIT_TO_LAST */] = queryParams.limit_;\r\n }\r\n }\r\n return qs;\r\n}\r\nfunction queryParamsGetQueryObject(queryParams) {\r\n var obj = {};\r\n if (queryParams.startSet_) {\r\n obj[\"sp\" /* INDEX_START_VALUE */] =\r\n queryParams.indexStartValue_;\r\n if (queryParams.startNameSet_) {\r\n obj[\"sn\" /* INDEX_START_NAME */] =\r\n queryParams.indexStartName_;\r\n }\r\n }\r\n if (queryParams.endSet_) {\r\n obj[\"ep\" /* INDEX_END_VALUE */] = queryParams.indexEndValue_;\r\n if (queryParams.endNameSet_) {\r\n obj[\"en\" /* INDEX_END_NAME */] = queryParams.indexEndName_;\r\n }\r\n }\r\n if (queryParams.limitSet_) {\r\n obj[\"l\" /* LIMIT */] = queryParams.limit_;\r\n var viewFrom = queryParams.viewFrom_;\r\n if (viewFrom === '') {\r\n if (queryParams.isViewFromLeft()) {\r\n viewFrom = \"l\" /* VIEW_FROM_LEFT */;\r\n }\r\n else {\r\n viewFrom = \"r\" /* VIEW_FROM_RIGHT */;\r\n }\r\n }\r\n obj[\"vf\" /* VIEW_FROM */] = viewFrom;\r\n }\r\n // For now, priority index is the default, so we only specify if it's some other index\r\n if (queryParams.index_ !== PRIORITY_INDEX) {\r\n obj[\"i\" /* INDEX */] = queryParams.index_.toString();\r\n }\r\n return obj;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An implementation of ServerActions that communicates with the server via REST requests.\r\n * This is mostly useful for compatibility with crawlers, where we don't want to spin up a full\r\n * persistent connection (using WebSockets or long-polling)\r\n */\r\nvar ReadonlyRestClient = /** @class */ (function (_super) {\r\n __extends(ReadonlyRestClient, _super);\r\n /**\r\n * @param repoInfo_ - Data about the namespace we are connecting to\r\n * @param onDataUpdate_ - A callback for new data from the server\r\n */\r\n function ReadonlyRestClient(repoInfo_, onDataUpdate_, authTokenProvider_, appCheckTokenProvider_) {\r\n var _this = _super.call(this) || this;\r\n _this.repoInfo_ = repoInfo_;\r\n _this.onDataUpdate_ = onDataUpdate_;\r\n _this.authTokenProvider_ = authTokenProvider_;\r\n _this.appCheckTokenProvider_ = appCheckTokenProvider_;\r\n /** @private {function(...[*])} */\r\n _this.log_ = logWrapper('p:rest:');\r\n /**\r\n * We don't actually need to track listens, except to prevent us calling an onComplete for a listen\r\n * that's been removed. :-/\r\n */\r\n _this.listens_ = {};\r\n return _this;\r\n }\r\n ReadonlyRestClient.prototype.reportStats = function (stats) {\r\n throw new Error('Method not implemented.');\r\n };\r\n ReadonlyRestClient.getListenId_ = function (query, tag) {\r\n if (tag !== undefined) {\r\n return 'tag$' + tag;\r\n }\r\n else {\r\n assert(query._queryParams.isDefault(), \"should have a tag if it's not a default query.\");\r\n return query._path.toString();\r\n }\r\n };\r\n /** @inheritDoc */\r\n ReadonlyRestClient.prototype.listen = function (query, currentHashFn, tag, onComplete) {\r\n var _this = this;\r\n var pathString = query._path.toString();\r\n this.log_('Listen called for ' + pathString + ' ' + query._queryIdentifier);\r\n // Mark this listener so we can tell if it's removed.\r\n var listenId = ReadonlyRestClient.getListenId_(query, tag);\r\n var thisListen = {};\r\n this.listens_[listenId] = thisListen;\r\n var queryStringParameters = queryParamsToRestQueryStringParameters(query._queryParams);\r\n this.restRequest_(pathString + '.json', queryStringParameters, function (error, result) {\r\n var data = result;\r\n if (error === 404) {\r\n data = null;\r\n error = null;\r\n }\r\n if (error === null) {\r\n _this.onDataUpdate_(pathString, data, /*isMerge=*/ false, tag);\r\n }\r\n if (safeGet(_this.listens_, listenId) === thisListen) {\r\n var status_1;\r\n if (!error) {\r\n status_1 = 'ok';\r\n }\r\n else if (error === 401) {\r\n status_1 = 'permission_denied';\r\n }\r\n else {\r\n status_1 = 'rest_error:' + error;\r\n }\r\n onComplete(status_1, null);\r\n }\r\n });\r\n };\r\n /** @inheritDoc */\r\n ReadonlyRestClient.prototype.unlisten = function (query, tag) {\r\n var listenId = ReadonlyRestClient.getListenId_(query, tag);\r\n delete this.listens_[listenId];\r\n };\r\n ReadonlyRestClient.prototype.get = function (query) {\r\n var _this = this;\r\n var queryStringParameters = queryParamsToRestQueryStringParameters(query._queryParams);\r\n var pathString = query._path.toString();\r\n var deferred = new Deferred();\r\n this.restRequest_(pathString + '.json', queryStringParameters, function (error, result) {\r\n var data = result;\r\n if (error === 404) {\r\n data = null;\r\n error = null;\r\n }\r\n if (error === null) {\r\n _this.onDataUpdate_(pathString, data, \r\n /*isMerge=*/ false, \r\n /*tag=*/ null);\r\n deferred.resolve(data);\r\n }\r\n else {\r\n deferred.reject(new Error(data));\r\n }\r\n });\r\n return deferred.promise;\r\n };\r\n /** @inheritDoc */\r\n ReadonlyRestClient.prototype.refreshAuthToken = function (token) {\r\n // no-op since we just always call getToken.\r\n };\r\n /**\r\n * Performs a REST request to the given path, with the provided query string parameters,\r\n * and any auth credentials we have.\r\n */\r\n ReadonlyRestClient.prototype.restRequest_ = function (pathString, queryStringParameters, callback) {\r\n var _this = this;\r\n if (queryStringParameters === void 0) { queryStringParameters = {}; }\r\n queryStringParameters['format'] = 'export';\r\n return Promise.all([\r\n this.authTokenProvider_.getToken(/*forceRefresh=*/ false),\r\n this.appCheckTokenProvider_.getToken(/*forceRefresh=*/ false)\r\n ]).then(function (_a) {\r\n var _b = __read(_a, 2), authToken = _b[0], appCheckToken = _b[1];\r\n if (authToken && authToken.accessToken) {\r\n queryStringParameters['auth'] = authToken.accessToken;\r\n }\r\n if (appCheckToken && appCheckToken.token) {\r\n queryStringParameters['ac'] = appCheckToken.token;\r\n }\r\n var url = (_this.repoInfo_.secure ? 'https://' : 'http://') +\r\n _this.repoInfo_.host +\r\n pathString +\r\n '?' +\r\n 'ns=' +\r\n _this.repoInfo_.namespace +\r\n querystring(queryStringParameters);\r\n _this.log_('Sending REST request for ' + url);\r\n var xhr = new XMLHttpRequest();\r\n xhr.onreadystatechange = function () {\r\n if (callback && xhr.readyState === 4) {\r\n _this.log_('REST Response for ' + url + ' received. status:', xhr.status, 'response:', xhr.responseText);\r\n var res = null;\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n try {\r\n res = jsonEval(xhr.responseText);\r\n }\r\n catch (e) {\r\n warn('Failed to parse JSON response for ' +\r\n url +\r\n ': ' +\r\n xhr.responseText);\r\n }\r\n callback(null, res);\r\n }\r\n else {\r\n // 401 and 404 are expected.\r\n if (xhr.status !== 401 && xhr.status !== 404) {\r\n warn('Got unsuccessful REST response for ' +\r\n url +\r\n ' Status: ' +\r\n xhr.status);\r\n }\r\n callback(xhr.status);\r\n }\r\n callback = null;\r\n }\r\n };\r\n xhr.open('GET', url, /*asynchronous=*/ true);\r\n xhr.send();\r\n });\r\n };\r\n return ReadonlyRestClient;\r\n}(ServerActions));\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Mutable object which basically just stores a reference to the \"latest\" immutable snapshot.\r\n */\r\nvar SnapshotHolder = /** @class */ (function () {\r\n function SnapshotHolder() {\r\n this.rootNode_ = ChildrenNode.EMPTY_NODE;\r\n }\r\n SnapshotHolder.prototype.getNode = function (path) {\r\n return this.rootNode_.getChild(path);\r\n };\r\n SnapshotHolder.prototype.updateSnapshot = function (path, newSnapshotNode) {\r\n this.rootNode_ = this.rootNode_.updateChild(path, newSnapshotNode);\r\n };\r\n return SnapshotHolder;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction newSparseSnapshotTree() {\r\n return {\r\n value: null,\r\n children: new Map()\r\n };\r\n}\r\n/**\r\n * Stores the given node at the specified path. If there is already a node\r\n * at a shallower path, it merges the new data into that snapshot node.\r\n *\r\n * @param path - Path to look up snapshot for.\r\n * @param data - The new data, or null.\r\n */\r\nfunction sparseSnapshotTreeRemember(sparseSnapshotTree, path, data) {\r\n if (pathIsEmpty(path)) {\r\n sparseSnapshotTree.value = data;\r\n sparseSnapshotTree.children.clear();\r\n }\r\n else if (sparseSnapshotTree.value !== null) {\r\n sparseSnapshotTree.value = sparseSnapshotTree.value.updateChild(path, data);\r\n }\r\n else {\r\n var childKey = pathGetFront(path);\r\n if (!sparseSnapshotTree.children.has(childKey)) {\r\n sparseSnapshotTree.children.set(childKey, newSparseSnapshotTree());\r\n }\r\n var child = sparseSnapshotTree.children.get(childKey);\r\n path = pathPopFront(path);\r\n sparseSnapshotTreeRemember(child, path, data);\r\n }\r\n}\r\n/**\r\n * Purge the data at path from the cache.\r\n *\r\n * @param path - Path to look up snapshot for.\r\n * @returns True if this node should now be removed.\r\n */\r\nfunction sparseSnapshotTreeForget(sparseSnapshotTree, path) {\r\n if (pathIsEmpty(path)) {\r\n sparseSnapshotTree.value = null;\r\n sparseSnapshotTree.children.clear();\r\n return true;\r\n }\r\n else {\r\n if (sparseSnapshotTree.value !== null) {\r\n if (sparseSnapshotTree.value.isLeafNode()) {\r\n // We're trying to forget a node that doesn't exist\r\n return false;\r\n }\r\n else {\r\n var value = sparseSnapshotTree.value;\r\n sparseSnapshotTree.value = null;\r\n value.forEachChild(PRIORITY_INDEX, function (key, tree) {\r\n sparseSnapshotTreeRemember(sparseSnapshotTree, new Path(key), tree);\r\n });\r\n return sparseSnapshotTreeForget(sparseSnapshotTree, path);\r\n }\r\n }\r\n else if (sparseSnapshotTree.children.size > 0) {\r\n var childKey = pathGetFront(path);\r\n path = pathPopFront(path);\r\n if (sparseSnapshotTree.children.has(childKey)) {\r\n var safeToRemove = sparseSnapshotTreeForget(sparseSnapshotTree.children.get(childKey), path);\r\n if (safeToRemove) {\r\n sparseSnapshotTree.children.delete(childKey);\r\n }\r\n }\r\n return sparseSnapshotTree.children.size === 0;\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n}\r\n/**\r\n * Recursively iterates through all of the stored tree and calls the\r\n * callback on each one.\r\n *\r\n * @param prefixPath - Path to look up node for.\r\n * @param func - The function to invoke for each tree.\r\n */\r\nfunction sparseSnapshotTreeForEachTree(sparseSnapshotTree, prefixPath, func) {\r\n if (sparseSnapshotTree.value !== null) {\r\n func(prefixPath, sparseSnapshotTree.value);\r\n }\r\n else {\r\n sparseSnapshotTreeForEachChild(sparseSnapshotTree, function (key, tree) {\r\n var path = new Path(prefixPath.toString() + '/' + key);\r\n sparseSnapshotTreeForEachTree(tree, path, func);\r\n });\r\n }\r\n}\r\n/**\r\n * Iterates through each immediate child and triggers the callback.\r\n * Only seems to be used in tests.\r\n *\r\n * @param func - The function to invoke for each child.\r\n */\r\nfunction sparseSnapshotTreeForEachChild(sparseSnapshotTree, func) {\r\n sparseSnapshotTree.children.forEach(function (tree, key) {\r\n func(key, tree);\r\n });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns the delta from the previous call to get stats.\r\n *\r\n * @param collection_ - The collection to \"listen\" to.\r\n */\r\nvar StatsListener = /** @class */ (function () {\r\n function StatsListener(collection_) {\r\n this.collection_ = collection_;\r\n this.last_ = null;\r\n }\r\n StatsListener.prototype.get = function () {\r\n var newStats = this.collection_.get();\r\n var delta = __assign({}, newStats);\r\n if (this.last_) {\r\n each(this.last_, function (stat, value) {\r\n delta[stat] = delta[stat] - value;\r\n });\r\n }\r\n this.last_ = newStats;\r\n return delta;\r\n };\r\n return StatsListener;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Assuming some apps may have a short amount of time on page, and a bulk of firebase operations probably\r\n// happen on page load, we try to report our first set of stats pretty quickly, but we wait at least 10\r\n// seconds to try to ensure the Firebase connection is established / settled.\r\nvar FIRST_STATS_MIN_TIME = 10 * 1000;\r\nvar FIRST_STATS_MAX_TIME = 30 * 1000;\r\n// We'll continue to report stats on average every 5 minutes.\r\nvar REPORT_STATS_INTERVAL = 5 * 60 * 1000;\r\nvar StatsReporter = /** @class */ (function () {\r\n function StatsReporter(collection, server_) {\r\n this.server_ = server_;\r\n this.statsToReport_ = {};\r\n this.statsListener_ = new StatsListener(collection);\r\n var timeout = FIRST_STATS_MIN_TIME +\r\n (FIRST_STATS_MAX_TIME - FIRST_STATS_MIN_TIME) * Math.random();\r\n setTimeoutNonBlocking(this.reportStats_.bind(this), Math.floor(timeout));\r\n }\r\n StatsReporter.prototype.reportStats_ = function () {\r\n var _this = this;\r\n var stats = this.statsListener_.get();\r\n var reportedStats = {};\r\n var haveStatsToReport = false;\r\n each(stats, function (stat, value) {\r\n if (value > 0 && contains(_this.statsToReport_, stat)) {\r\n reportedStats[stat] = value;\r\n haveStatsToReport = true;\r\n }\r\n });\r\n if (haveStatsToReport) {\r\n this.server_.reportStats(reportedStats);\r\n }\r\n // queue our next run.\r\n setTimeoutNonBlocking(this.reportStats_.bind(this), Math.floor(Math.random() * 2 * REPORT_STATS_INTERVAL));\r\n };\r\n return StatsReporter;\r\n}());\r\nfunction statsReporterIncludeStat(reporter, stat) {\r\n reporter.statsToReport_[stat] = true;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n *\r\n * @enum\r\n */\r\nvar OperationType;\r\n(function (OperationType) {\r\n OperationType[OperationType[\"OVERWRITE\"] = 0] = \"OVERWRITE\";\r\n OperationType[OperationType[\"MERGE\"] = 1] = \"MERGE\";\r\n OperationType[OperationType[\"ACK_USER_WRITE\"] = 2] = \"ACK_USER_WRITE\";\r\n OperationType[OperationType[\"LISTEN_COMPLETE\"] = 3] = \"LISTEN_COMPLETE\";\r\n})(OperationType || (OperationType = {}));\r\nfunction newOperationSourceUser() {\r\n return {\r\n fromUser: true,\r\n fromServer: false,\r\n queryId: null,\r\n tagged: false\r\n };\r\n}\r\nfunction newOperationSourceServer() {\r\n return {\r\n fromUser: false,\r\n fromServer: true,\r\n queryId: null,\r\n tagged: false\r\n };\r\n}\r\nfunction newOperationSourceServerTaggedQuery(queryId) {\r\n return {\r\n fromUser: false,\r\n fromServer: true,\r\n queryId: queryId,\r\n tagged: true\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar AckUserWrite = /** @class */ (function () {\r\n /**\r\n * @param affectedTree - A tree containing true for each affected path. Affected paths can't overlap.\r\n */\r\n function AckUserWrite(\r\n /** @inheritDoc */ path, \r\n /** @inheritDoc */ affectedTree, \r\n /** @inheritDoc */ revert) {\r\n this.path = path;\r\n this.affectedTree = affectedTree;\r\n this.revert = revert;\r\n /** @inheritDoc */\r\n this.type = OperationType.ACK_USER_WRITE;\r\n /** @inheritDoc */\r\n this.source = newOperationSourceUser();\r\n }\r\n AckUserWrite.prototype.operationForChild = function (childName) {\r\n if (!pathIsEmpty(this.path)) {\r\n assert(pathGetFront(this.path) === childName, 'operationForChild called for unrelated child.');\r\n return new AckUserWrite(pathPopFront(this.path), this.affectedTree, this.revert);\r\n }\r\n else if (this.affectedTree.value != null) {\r\n assert(this.affectedTree.children.isEmpty(), 'affectedTree should not have overlapping affected paths.');\r\n // All child locations are affected as well; just return same operation.\r\n return this;\r\n }\r\n else {\r\n var childTree = this.affectedTree.subtree(new Path(childName));\r\n return new AckUserWrite(newEmptyPath(), childTree, this.revert);\r\n }\r\n };\r\n return AckUserWrite;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar ListenComplete = /** @class */ (function () {\r\n function ListenComplete(source, path) {\r\n this.source = source;\r\n this.path = path;\r\n /** @inheritDoc */\r\n this.type = OperationType.LISTEN_COMPLETE;\r\n }\r\n ListenComplete.prototype.operationForChild = function (childName) {\r\n if (pathIsEmpty(this.path)) {\r\n return new ListenComplete(this.source, newEmptyPath());\r\n }\r\n else {\r\n return new ListenComplete(this.source, pathPopFront(this.path));\r\n }\r\n };\r\n return ListenComplete;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar Overwrite = /** @class */ (function () {\r\n function Overwrite(source, path, snap) {\r\n this.source = source;\r\n this.path = path;\r\n this.snap = snap;\r\n /** @inheritDoc */\r\n this.type = OperationType.OVERWRITE;\r\n }\r\n Overwrite.prototype.operationForChild = function (childName) {\r\n if (pathIsEmpty(this.path)) {\r\n return new Overwrite(this.source, newEmptyPath(), this.snap.getImmediateChild(childName));\r\n }\r\n else {\r\n return new Overwrite(this.source, pathPopFront(this.path), this.snap);\r\n }\r\n };\r\n return Overwrite;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar Merge = /** @class */ (function () {\r\n function Merge(\r\n /** @inheritDoc */ source, \r\n /** @inheritDoc */ path, \r\n /** @inheritDoc */ children) {\r\n this.source = source;\r\n this.path = path;\r\n this.children = children;\r\n /** @inheritDoc */\r\n this.type = OperationType.MERGE;\r\n }\r\n Merge.prototype.operationForChild = function (childName) {\r\n if (pathIsEmpty(this.path)) {\r\n var childTree = this.children.subtree(new Path(childName));\r\n if (childTree.isEmpty()) {\r\n // This child is unaffected\r\n return null;\r\n }\r\n else if (childTree.value) {\r\n // We have a snapshot for the child in question. This becomes an overwrite of the child.\r\n return new Overwrite(this.source, newEmptyPath(), childTree.value);\r\n }\r\n else {\r\n // This is a merge at a deeper level\r\n return new Merge(this.source, newEmptyPath(), childTree);\r\n }\r\n }\r\n else {\r\n assert(pathGetFront(this.path) === childName, \"Can't get a merge for a child not on the path of the operation\");\r\n return new Merge(this.source, pathPopFront(this.path), this.children);\r\n }\r\n };\r\n Merge.prototype.toString = function () {\r\n return ('Operation(' +\r\n this.path +\r\n ': ' +\r\n this.source.toString() +\r\n ' merge: ' +\r\n this.children.toString() +\r\n ')');\r\n };\r\n return Merge;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A cache node only stores complete children. Additionally it holds a flag whether the node can be considered fully\r\n * initialized in the sense that we know at one point in time this represented a valid state of the world, e.g.\r\n * initialized with data from the server, or a complete overwrite by the client. The filtered flag also tracks\r\n * whether a node potentially had children removed due to a filter.\r\n */\r\nvar CacheNode = /** @class */ (function () {\r\n function CacheNode(node_, fullyInitialized_, filtered_) {\r\n this.node_ = node_;\r\n this.fullyInitialized_ = fullyInitialized_;\r\n this.filtered_ = filtered_;\r\n }\r\n /**\r\n * Returns whether this node was fully initialized with either server data or a complete overwrite by the client\r\n */\r\n CacheNode.prototype.isFullyInitialized = function () {\r\n return this.fullyInitialized_;\r\n };\r\n /**\r\n * Returns whether this node is potentially missing children due to a filter applied to the node\r\n */\r\n CacheNode.prototype.isFiltered = function () {\r\n return this.filtered_;\r\n };\r\n CacheNode.prototype.isCompleteForPath = function (path) {\r\n if (pathIsEmpty(path)) {\r\n return this.isFullyInitialized() && !this.filtered_;\r\n }\r\n var childKey = pathGetFront(path);\r\n return this.isCompleteForChild(childKey);\r\n };\r\n CacheNode.prototype.isCompleteForChild = function (key) {\r\n return ((this.isFullyInitialized() && !this.filtered_) || this.node_.hasChild(key));\r\n };\r\n CacheNode.prototype.getNode = function () {\r\n return this.node_;\r\n };\r\n return CacheNode;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An EventGenerator is used to convert \"raw\" changes (Change) as computed by the\r\n * CacheDiffer into actual events (Event) that can be raised. See generateEventsForChanges()\r\n * for details.\r\n *\r\n */\r\nvar EventGenerator = /** @class */ (function () {\r\n function EventGenerator(query_) {\r\n this.query_ = query_;\r\n this.index_ = this.query_._queryParams.getIndex();\r\n }\r\n return EventGenerator;\r\n}());\r\n/**\r\n * Given a set of raw changes (no moved events and prevName not specified yet), and a set of\r\n * EventRegistrations that should be notified of these changes, generate the actual events to be raised.\r\n *\r\n * Notes:\r\n * - child_moved events will be synthesized at this time for any child_changed events that affect\r\n * our index.\r\n * - prevName will be calculated based on the index ordering.\r\n */\r\nfunction eventGeneratorGenerateEventsForChanges(eventGenerator, changes, eventCache, eventRegistrations) {\r\n var events = [];\r\n var moves = [];\r\n changes.forEach(function (change) {\r\n if (change.type === \"child_changed\" /* CHILD_CHANGED */ &&\r\n eventGenerator.index_.indexedValueChanged(change.oldSnap, change.snapshotNode)) {\r\n moves.push(changeChildMoved(change.childName, change.snapshotNode));\r\n }\r\n });\r\n eventGeneratorGenerateEventsForType(eventGenerator, events, \"child_removed\" /* CHILD_REMOVED */, changes, eventRegistrations, eventCache);\r\n eventGeneratorGenerateEventsForType(eventGenerator, events, \"child_added\" /* CHILD_ADDED */, changes, eventRegistrations, eventCache);\r\n eventGeneratorGenerateEventsForType(eventGenerator, events, \"child_moved\" /* CHILD_MOVED */, moves, eventRegistrations, eventCache);\r\n eventGeneratorGenerateEventsForType(eventGenerator, events, \"child_changed\" /* CHILD_CHANGED */, changes, eventRegistrations, eventCache);\r\n eventGeneratorGenerateEventsForType(eventGenerator, events, \"value\" /* VALUE */, changes, eventRegistrations, eventCache);\r\n return events;\r\n}\r\n/**\r\n * Given changes of a single change type, generate the corresponding events.\r\n */\r\nfunction eventGeneratorGenerateEventsForType(eventGenerator, events, eventType, changes, registrations, eventCache) {\r\n var filteredChanges = changes.filter(function (change) { return change.type === eventType; });\r\n filteredChanges.sort(function (a, b) {\r\n return eventGeneratorCompareChanges(eventGenerator, a, b);\r\n });\r\n filteredChanges.forEach(function (change) {\r\n var materializedChange = eventGeneratorMaterializeSingleChange(eventGenerator, change, eventCache);\r\n registrations.forEach(function (registration) {\r\n if (registration.respondsTo(change.type)) {\r\n events.push(registration.createEvent(materializedChange, eventGenerator.query_));\r\n }\r\n });\r\n });\r\n}\r\nfunction eventGeneratorMaterializeSingleChange(eventGenerator, change, eventCache) {\r\n if (change.type === 'value' || change.type === 'child_removed') {\r\n return change;\r\n }\r\n else {\r\n change.prevName = eventCache.getPredecessorChildName(change.childName, change.snapshotNode, eventGenerator.index_);\r\n return change;\r\n }\r\n}\r\nfunction eventGeneratorCompareChanges(eventGenerator, a, b) {\r\n if (a.childName == null || b.childName == null) {\r\n throw assertionError('Should only compare child_ events.');\r\n }\r\n var aWrapped = new NamedNode(a.childName, a.snapshotNode);\r\n var bWrapped = new NamedNode(b.childName, b.snapshotNode);\r\n return eventGenerator.index_.compare(aWrapped, bWrapped);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction newViewCache(eventCache, serverCache) {\r\n return { eventCache: eventCache, serverCache: serverCache };\r\n}\r\nfunction viewCacheUpdateEventSnap(viewCache, eventSnap, complete, filtered) {\r\n return newViewCache(new CacheNode(eventSnap, complete, filtered), viewCache.serverCache);\r\n}\r\nfunction viewCacheUpdateServerSnap(viewCache, serverSnap, complete, filtered) {\r\n return newViewCache(viewCache.eventCache, new CacheNode(serverSnap, complete, filtered));\r\n}\r\nfunction viewCacheGetCompleteEventSnap(viewCache) {\r\n return viewCache.eventCache.isFullyInitialized()\r\n ? viewCache.eventCache.getNode()\r\n : null;\r\n}\r\nfunction viewCacheGetCompleteServerSnap(viewCache) {\r\n return viewCache.serverCache.isFullyInitialized()\r\n ? viewCache.serverCache.getNode()\r\n : null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar emptyChildrenSingleton;\r\n/**\r\n * Singleton empty children collection.\r\n *\r\n */\r\nvar EmptyChildren = function () {\r\n if (!emptyChildrenSingleton) {\r\n emptyChildrenSingleton = new SortedMap(stringCompare);\r\n }\r\n return emptyChildrenSingleton;\r\n};\r\n/**\r\n * A tree with immutable elements.\r\n */\r\nvar ImmutableTree = /** @class */ (function () {\r\n function ImmutableTree(value, children) {\r\n if (children === void 0) { children = EmptyChildren(); }\r\n this.value = value;\r\n this.children = children;\r\n }\r\n ImmutableTree.fromObject = function (obj) {\r\n var tree = new ImmutableTree(null);\r\n each(obj, function (childPath, childSnap) {\r\n tree = tree.set(new Path(childPath), childSnap);\r\n });\r\n return tree;\r\n };\r\n /**\r\n * True if the value is empty and there are no children\r\n */\r\n ImmutableTree.prototype.isEmpty = function () {\r\n return this.value === null && this.children.isEmpty();\r\n };\r\n /**\r\n * Given a path and predicate, return the first node and the path to that node\r\n * where the predicate returns true.\r\n *\r\n * TODO Do a perf test -- If we're creating a bunch of `{path: value:}`\r\n * objects on the way back out, it may be better to pass down a pathSoFar obj.\r\n *\r\n * @param relativePath - The remainder of the path\r\n * @param predicate - The predicate to satisfy to return a node\r\n */\r\n ImmutableTree.prototype.findRootMostMatchingPathAndValue = function (relativePath, predicate) {\r\n if (this.value != null && predicate(this.value)) {\r\n return { path: newEmptyPath(), value: this.value };\r\n }\r\n else {\r\n if (pathIsEmpty(relativePath)) {\r\n return null;\r\n }\r\n else {\r\n var front = pathGetFront(relativePath);\r\n var child = this.children.get(front);\r\n if (child !== null) {\r\n var childExistingPathAndValue = child.findRootMostMatchingPathAndValue(pathPopFront(relativePath), predicate);\r\n if (childExistingPathAndValue != null) {\r\n var fullPath = pathChild(new Path(front), childExistingPathAndValue.path);\r\n return { path: fullPath, value: childExistingPathAndValue.value };\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n }\r\n };\r\n /**\r\n * Find, if it exists, the shortest subpath of the given path that points a defined\r\n * value in the tree\r\n */\r\n ImmutableTree.prototype.findRootMostValueAndPath = function (relativePath) {\r\n return this.findRootMostMatchingPathAndValue(relativePath, function () { return true; });\r\n };\r\n /**\r\n * @returns The subtree at the given path\r\n */\r\n ImmutableTree.prototype.subtree = function (relativePath) {\r\n if (pathIsEmpty(relativePath)) {\r\n return this;\r\n }\r\n else {\r\n var front = pathGetFront(relativePath);\r\n var childTree = this.children.get(front);\r\n if (childTree !== null) {\r\n return childTree.subtree(pathPopFront(relativePath));\r\n }\r\n else {\r\n return new ImmutableTree(null);\r\n }\r\n }\r\n };\r\n /**\r\n * Sets a value at the specified path.\r\n *\r\n * @param relativePath - Path to set value at.\r\n * @param toSet - Value to set.\r\n * @returns Resulting tree.\r\n */\r\n ImmutableTree.prototype.set = function (relativePath, toSet) {\r\n if (pathIsEmpty(relativePath)) {\r\n return new ImmutableTree(toSet, this.children);\r\n }\r\n else {\r\n var front = pathGetFront(relativePath);\r\n var child = this.children.get(front) || new ImmutableTree(null);\r\n var newChild = child.set(pathPopFront(relativePath), toSet);\r\n var newChildren = this.children.insert(front, newChild);\r\n return new ImmutableTree(this.value, newChildren);\r\n }\r\n };\r\n /**\r\n * Removes the value at the specified path.\r\n *\r\n * @param relativePath - Path to value to remove.\r\n * @returns Resulting tree.\r\n */\r\n ImmutableTree.prototype.remove = function (relativePath) {\r\n if (pathIsEmpty(relativePath)) {\r\n if (this.children.isEmpty()) {\r\n return new ImmutableTree(null);\r\n }\r\n else {\r\n return new ImmutableTree(null, this.children);\r\n }\r\n }\r\n else {\r\n var front = pathGetFront(relativePath);\r\n var child = this.children.get(front);\r\n if (child) {\r\n var newChild = child.remove(pathPopFront(relativePath));\r\n var newChildren = void 0;\r\n if (newChild.isEmpty()) {\r\n newChildren = this.children.remove(front);\r\n }\r\n else {\r\n newChildren = this.children.insert(front, newChild);\r\n }\r\n if (this.value === null && newChildren.isEmpty()) {\r\n return new ImmutableTree(null);\r\n }\r\n else {\r\n return new ImmutableTree(this.value, newChildren);\r\n }\r\n }\r\n else {\r\n return this;\r\n }\r\n }\r\n };\r\n /**\r\n * Gets a value from the tree.\r\n *\r\n * @param relativePath - Path to get value for.\r\n * @returns Value at path, or null.\r\n */\r\n ImmutableTree.prototype.get = function (relativePath) {\r\n if (pathIsEmpty(relativePath)) {\r\n return this.value;\r\n }\r\n else {\r\n var front = pathGetFront(relativePath);\r\n var child = this.children.get(front);\r\n if (child) {\r\n return child.get(pathPopFront(relativePath));\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n };\r\n /**\r\n * Replace the subtree at the specified path with the given new tree.\r\n *\r\n * @param relativePath - Path to replace subtree for.\r\n * @param newTree - New tree.\r\n * @returns Resulting tree.\r\n */\r\n ImmutableTree.prototype.setTree = function (relativePath, newTree) {\r\n if (pathIsEmpty(relativePath)) {\r\n return newTree;\r\n }\r\n else {\r\n var front = pathGetFront(relativePath);\r\n var child = this.children.get(front) || new ImmutableTree(null);\r\n var newChild = child.setTree(pathPopFront(relativePath), newTree);\r\n var newChildren = void 0;\r\n if (newChild.isEmpty()) {\r\n newChildren = this.children.remove(front);\r\n }\r\n else {\r\n newChildren = this.children.insert(front, newChild);\r\n }\r\n return new ImmutableTree(this.value, newChildren);\r\n }\r\n };\r\n /**\r\n * Performs a depth first fold on this tree. Transforms a tree into a single\r\n * value, given a function that operates on the path to a node, an optional\r\n * current value, and a map of child names to folded subtrees\r\n */\r\n ImmutableTree.prototype.fold = function (fn) {\r\n return this.fold_(newEmptyPath(), fn);\r\n };\r\n /**\r\n * Recursive helper for public-facing fold() method\r\n */\r\n ImmutableTree.prototype.fold_ = function (pathSoFar, fn) {\r\n var accum = {};\r\n this.children.inorderTraversal(function (childKey, childTree) {\r\n accum[childKey] = childTree.fold_(pathChild(pathSoFar, childKey), fn);\r\n });\r\n return fn(pathSoFar, this.value, accum);\r\n };\r\n /**\r\n * Find the first matching value on the given path. Return the result of applying f to it.\r\n */\r\n ImmutableTree.prototype.findOnPath = function (path, f) {\r\n return this.findOnPath_(path, newEmptyPath(), f);\r\n };\r\n ImmutableTree.prototype.findOnPath_ = function (pathToFollow, pathSoFar, f) {\r\n var result = this.value ? f(pathSoFar, this.value) : false;\r\n if (result) {\r\n return result;\r\n }\r\n else {\r\n if (pathIsEmpty(pathToFollow)) {\r\n return null;\r\n }\r\n else {\r\n var front = pathGetFront(pathToFollow);\r\n var nextChild = this.children.get(front);\r\n if (nextChild) {\r\n return nextChild.findOnPath_(pathPopFront(pathToFollow), pathChild(pathSoFar, front), f);\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n }\r\n };\r\n ImmutableTree.prototype.foreachOnPath = function (path, f) {\r\n return this.foreachOnPath_(path, newEmptyPath(), f);\r\n };\r\n ImmutableTree.prototype.foreachOnPath_ = function (pathToFollow, currentRelativePath, f) {\r\n if (pathIsEmpty(pathToFollow)) {\r\n return this;\r\n }\r\n else {\r\n if (this.value) {\r\n f(currentRelativePath, this.value);\r\n }\r\n var front = pathGetFront(pathToFollow);\r\n var nextChild = this.children.get(front);\r\n if (nextChild) {\r\n return nextChild.foreachOnPath_(pathPopFront(pathToFollow), pathChild(currentRelativePath, front), f);\r\n }\r\n else {\r\n return new ImmutableTree(null);\r\n }\r\n }\r\n };\r\n /**\r\n * Calls the given function for each node in the tree that has a value.\r\n *\r\n * @param f - A function to be called with the path from the root of the tree to\r\n * a node, and the value at that node. Called in depth-first order.\r\n */\r\n ImmutableTree.prototype.foreach = function (f) {\r\n this.foreach_(newEmptyPath(), f);\r\n };\r\n ImmutableTree.prototype.foreach_ = function (currentRelativePath, f) {\r\n this.children.inorderTraversal(function (childName, childTree) {\r\n childTree.foreach_(pathChild(currentRelativePath, childName), f);\r\n });\r\n if (this.value) {\r\n f(currentRelativePath, this.value);\r\n }\r\n };\r\n ImmutableTree.prototype.foreachChild = function (f) {\r\n this.children.inorderTraversal(function (childName, childTree) {\r\n if (childTree.value) {\r\n f(childName, childTree.value);\r\n }\r\n });\r\n };\r\n return ImmutableTree;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * This class holds a collection of writes that can be applied to nodes in unison. It abstracts away the logic with\r\n * dealing with priority writes and multiple nested writes. At any given path there is only allowed to be one write\r\n * modifying that path. Any write to an existing path or shadowing an existing path will modify that existing write\r\n * to reflect the write added.\r\n */\r\nvar CompoundWrite = /** @class */ (function () {\r\n function CompoundWrite(writeTree_) {\r\n this.writeTree_ = writeTree_;\r\n }\r\n CompoundWrite.empty = function () {\r\n return new CompoundWrite(new ImmutableTree(null));\r\n };\r\n return CompoundWrite;\r\n}());\r\nfunction compoundWriteAddWrite(compoundWrite, path, node) {\r\n if (pathIsEmpty(path)) {\r\n return new CompoundWrite(new ImmutableTree(node));\r\n }\r\n else {\r\n var rootmost = compoundWrite.writeTree_.findRootMostValueAndPath(path);\r\n if (rootmost != null) {\r\n var rootMostPath = rootmost.path;\r\n var value = rootmost.value;\r\n var relativePath = newRelativePath(rootMostPath, path);\r\n value = value.updateChild(relativePath, node);\r\n return new CompoundWrite(compoundWrite.writeTree_.set(rootMostPath, value));\r\n }\r\n else {\r\n var subtree = new ImmutableTree(node);\r\n var newWriteTree = compoundWrite.writeTree_.setTree(path, subtree);\r\n return new CompoundWrite(newWriteTree);\r\n }\r\n }\r\n}\r\nfunction compoundWriteAddWrites(compoundWrite, path, updates) {\r\n var newWrite = compoundWrite;\r\n each(updates, function (childKey, node) {\r\n newWrite = compoundWriteAddWrite(newWrite, pathChild(path, childKey), node);\r\n });\r\n return newWrite;\r\n}\r\n/**\r\n * Will remove a write at the given path and deeper paths. This will not modify a write at a higher\r\n * location, which must be removed by calling this method with that path.\r\n *\r\n * @param compoundWrite - The CompoundWrite to remove.\r\n * @param path - The path at which a write and all deeper writes should be removed\r\n * @returns The new CompoundWrite with the removed path\r\n */\r\nfunction compoundWriteRemoveWrite(compoundWrite, path) {\r\n if (pathIsEmpty(path)) {\r\n return CompoundWrite.empty();\r\n }\r\n else {\r\n var newWriteTree = compoundWrite.writeTree_.setTree(path, new ImmutableTree(null));\r\n return new CompoundWrite(newWriteTree);\r\n }\r\n}\r\n/**\r\n * Returns whether this CompoundWrite will fully overwrite a node at a given location and can therefore be\r\n * considered \"complete\".\r\n *\r\n * @param compoundWrite - The CompoundWrite to check.\r\n * @param path - The path to check for\r\n * @returns Whether there is a complete write at that path\r\n */\r\nfunction compoundWriteHasCompleteWrite(compoundWrite, path) {\r\n return compoundWriteGetCompleteNode(compoundWrite, path) != null;\r\n}\r\n/**\r\n * Returns a node for a path if and only if the node is a \"complete\" overwrite at that path. This will not aggregate\r\n * writes from deeper paths, but will return child nodes from a more shallow path.\r\n *\r\n * @param compoundWrite - The CompoundWrite to get the node from.\r\n * @param path - The path to get a complete write\r\n * @returns The node if complete at that path, or null otherwise.\r\n */\r\nfunction compoundWriteGetCompleteNode(compoundWrite, path) {\r\n var rootmost = compoundWrite.writeTree_.findRootMostValueAndPath(path);\r\n if (rootmost != null) {\r\n return compoundWrite.writeTree_\r\n .get(rootmost.path)\r\n .getChild(newRelativePath(rootmost.path, path));\r\n }\r\n else {\r\n return null;\r\n }\r\n}\r\n/**\r\n * Returns all children that are guaranteed to be a complete overwrite.\r\n *\r\n * @param compoundWrite - The CompoundWrite to get children from.\r\n * @returns A list of all complete children.\r\n */\r\nfunction compoundWriteGetCompleteChildren(compoundWrite) {\r\n var children = [];\r\n var node = compoundWrite.writeTree_.value;\r\n if (node != null) {\r\n // If it's a leaf node, it has no children; so nothing to do.\r\n if (!node.isLeafNode()) {\r\n node.forEachChild(PRIORITY_INDEX, function (childName, childNode) {\r\n children.push(new NamedNode(childName, childNode));\r\n });\r\n }\r\n }\r\n else {\r\n compoundWrite.writeTree_.children.inorderTraversal(function (childName, childTree) {\r\n if (childTree.value != null) {\r\n children.push(new NamedNode(childName, childTree.value));\r\n }\r\n });\r\n }\r\n return children;\r\n}\r\nfunction compoundWriteChildCompoundWrite(compoundWrite, path) {\r\n if (pathIsEmpty(path)) {\r\n return compoundWrite;\r\n }\r\n else {\r\n var shadowingNode = compoundWriteGetCompleteNode(compoundWrite, path);\r\n if (shadowingNode != null) {\r\n return new CompoundWrite(new ImmutableTree(shadowingNode));\r\n }\r\n else {\r\n return new CompoundWrite(compoundWrite.writeTree_.subtree(path));\r\n }\r\n }\r\n}\r\n/**\r\n * Returns true if this CompoundWrite is empty and therefore does not modify any nodes.\r\n * @returns Whether this CompoundWrite is empty\r\n */\r\nfunction compoundWriteIsEmpty(compoundWrite) {\r\n return compoundWrite.writeTree_.isEmpty();\r\n}\r\n/**\r\n * Applies this CompoundWrite to a node. The node is returned with all writes from this CompoundWrite applied to the\r\n * node\r\n * @param node - The node to apply this CompoundWrite to\r\n * @returns The node with all writes applied\r\n */\r\nfunction compoundWriteApply(compoundWrite, node) {\r\n return applySubtreeWrite(newEmptyPath(), compoundWrite.writeTree_, node);\r\n}\r\nfunction applySubtreeWrite(relativePath, writeTree, node) {\r\n if (writeTree.value != null) {\r\n // Since there a write is always a leaf, we're done here\r\n return node.updateChild(relativePath, writeTree.value);\r\n }\r\n else {\r\n var priorityWrite_1 = null;\r\n writeTree.children.inorderTraversal(function (childKey, childTree) {\r\n if (childKey === '.priority') {\r\n // Apply priorities at the end so we don't update priorities for either empty nodes or forget\r\n // to apply priorities to empty nodes that are later filled\r\n assert(childTree.value !== null, 'Priority writes must always be leaf nodes');\r\n priorityWrite_1 = childTree.value;\r\n }\r\n else {\r\n node = applySubtreeWrite(pathChild(relativePath, childKey), childTree, node);\r\n }\r\n });\r\n // If there was a priority write, we only apply it if the node is not empty\r\n if (!node.getChild(relativePath).isEmpty() && priorityWrite_1 !== null) {\r\n node = node.updateChild(pathChild(relativePath, '.priority'), priorityWrite_1);\r\n }\r\n return node;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Create a new WriteTreeRef for the given path. For use with a new sync point at the given path.\r\n *\r\n */\r\nfunction writeTreeChildWrites(writeTree, path) {\r\n return newWriteTreeRef(path, writeTree);\r\n}\r\n/**\r\n * Record a new overwrite from user code.\r\n *\r\n * @param visible - This is set to false by some transactions. It should be excluded from event caches\r\n */\r\nfunction writeTreeAddOverwrite(writeTree, path, snap, writeId, visible) {\r\n assert(writeId > writeTree.lastWriteId, 'Stacking an older write on top of newer ones');\r\n if (visible === undefined) {\r\n visible = true;\r\n }\r\n writeTree.allWrites.push({\r\n path: path,\r\n snap: snap,\r\n writeId: writeId,\r\n visible: visible\r\n });\r\n if (visible) {\r\n writeTree.visibleWrites = compoundWriteAddWrite(writeTree.visibleWrites, path, snap);\r\n }\r\n writeTree.lastWriteId = writeId;\r\n}\r\n/**\r\n * Record a new merge from user code.\r\n */\r\nfunction writeTreeAddMerge(writeTree, path, changedChildren, writeId) {\r\n assert(writeId > writeTree.lastWriteId, 'Stacking an older merge on top of newer ones');\r\n writeTree.allWrites.push({\r\n path: path,\r\n children: changedChildren,\r\n writeId: writeId,\r\n visible: true\r\n });\r\n writeTree.visibleWrites = compoundWriteAddWrites(writeTree.visibleWrites, path, changedChildren);\r\n writeTree.lastWriteId = writeId;\r\n}\r\nfunction writeTreeGetWrite(writeTree, writeId) {\r\n for (var i = 0; i < writeTree.allWrites.length; i++) {\r\n var record = writeTree.allWrites[i];\r\n if (record.writeId === writeId) {\r\n return record;\r\n }\r\n }\r\n return null;\r\n}\r\n/**\r\n * Remove a write (either an overwrite or merge) that has been successfully acknowledge by the server. Recalculates\r\n * the tree if necessary. We return true if it may have been visible, meaning views need to reevaluate.\r\n *\r\n * @returns true if the write may have been visible (meaning we'll need to reevaluate / raise\r\n * events as a result).\r\n */\r\nfunction writeTreeRemoveWrite(writeTree, writeId) {\r\n // Note: disabling this check. It could be a transaction that preempted another transaction, and thus was applied\r\n // out of order.\r\n //const validClear = revert || this.allWrites_.length === 0 || writeId <= this.allWrites_[0].writeId;\r\n //assert(validClear, \"Either we don't have this write, or it's the first one in the queue\");\r\n var idx = writeTree.allWrites.findIndex(function (s) {\r\n return s.writeId === writeId;\r\n });\r\n assert(idx >= 0, 'removeWrite called with nonexistent writeId.');\r\n var writeToRemove = writeTree.allWrites[idx];\r\n writeTree.allWrites.splice(idx, 1);\r\n var removedWriteWasVisible = writeToRemove.visible;\r\n var removedWriteOverlapsWithOtherWrites = false;\r\n var i = writeTree.allWrites.length - 1;\r\n while (removedWriteWasVisible && i >= 0) {\r\n var currentWrite = writeTree.allWrites[i];\r\n if (currentWrite.visible) {\r\n if (i >= idx &&\r\n writeTreeRecordContainsPath_(currentWrite, writeToRemove.path)) {\r\n // The removed write was completely shadowed by a subsequent write.\r\n removedWriteWasVisible = false;\r\n }\r\n else if (pathContains(writeToRemove.path, currentWrite.path)) {\r\n // Either we're covering some writes or they're covering part of us (depending on which came first).\r\n removedWriteOverlapsWithOtherWrites = true;\r\n }\r\n }\r\n i--;\r\n }\r\n if (!removedWriteWasVisible) {\r\n return false;\r\n }\r\n else if (removedWriteOverlapsWithOtherWrites) {\r\n // There's some shadowing going on. Just rebuild the visible writes from scratch.\r\n writeTreeResetTree_(writeTree);\r\n return true;\r\n }\r\n else {\r\n // There's no shadowing. We can safely just remove the write(s) from visibleWrites.\r\n if (writeToRemove.snap) {\r\n writeTree.visibleWrites = compoundWriteRemoveWrite(writeTree.visibleWrites, writeToRemove.path);\r\n }\r\n else {\r\n var children = writeToRemove.children;\r\n each(children, function (childName) {\r\n writeTree.visibleWrites = compoundWriteRemoveWrite(writeTree.visibleWrites, pathChild(writeToRemove.path, childName));\r\n });\r\n }\r\n return true;\r\n }\r\n}\r\nfunction writeTreeRecordContainsPath_(writeRecord, path) {\r\n if (writeRecord.snap) {\r\n return pathContains(writeRecord.path, path);\r\n }\r\n else {\r\n for (var childName in writeRecord.children) {\r\n if (writeRecord.children.hasOwnProperty(childName) &&\r\n pathContains(pathChild(writeRecord.path, childName), path)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n/**\r\n * Re-layer the writes and merges into a tree so we can efficiently calculate event snapshots\r\n */\r\nfunction writeTreeResetTree_(writeTree) {\r\n writeTree.visibleWrites = writeTreeLayerTree_(writeTree.allWrites, writeTreeDefaultFilter_, newEmptyPath());\r\n if (writeTree.allWrites.length > 0) {\r\n writeTree.lastWriteId =\r\n writeTree.allWrites[writeTree.allWrites.length - 1].writeId;\r\n }\r\n else {\r\n writeTree.lastWriteId = -1;\r\n }\r\n}\r\n/**\r\n * The default filter used when constructing the tree. Keep everything that's visible.\r\n */\r\nfunction writeTreeDefaultFilter_(write) {\r\n return write.visible;\r\n}\r\n/**\r\n * Static method. Given an array of WriteRecords, a filter for which ones to include, and a path, construct the tree of\r\n * event data at that path.\r\n */\r\nfunction writeTreeLayerTree_(writes, filter, treeRoot) {\r\n var compoundWrite = CompoundWrite.empty();\r\n for (var i = 0; i < writes.length; ++i) {\r\n var write = writes[i];\r\n // Theory, a later set will either:\r\n // a) abort a relevant transaction, so no need to worry about excluding it from calculating that transaction\r\n // b) not be relevant to a transaction (separate branch), so again will not affect the data for that transaction\r\n if (filter(write)) {\r\n var writePath = write.path;\r\n var relativePath = void 0;\r\n if (write.snap) {\r\n if (pathContains(treeRoot, writePath)) {\r\n relativePath = newRelativePath(treeRoot, writePath);\r\n compoundWrite = compoundWriteAddWrite(compoundWrite, relativePath, write.snap);\r\n }\r\n else if (pathContains(writePath, treeRoot)) {\r\n relativePath = newRelativePath(writePath, treeRoot);\r\n compoundWrite = compoundWriteAddWrite(compoundWrite, newEmptyPath(), write.snap.getChild(relativePath));\r\n }\r\n else ;\r\n }\r\n else if (write.children) {\r\n if (pathContains(treeRoot, writePath)) {\r\n relativePath = newRelativePath(treeRoot, writePath);\r\n compoundWrite = compoundWriteAddWrites(compoundWrite, relativePath, write.children);\r\n }\r\n else if (pathContains(writePath, treeRoot)) {\r\n relativePath = newRelativePath(writePath, treeRoot);\r\n if (pathIsEmpty(relativePath)) {\r\n compoundWrite = compoundWriteAddWrites(compoundWrite, newEmptyPath(), write.children);\r\n }\r\n else {\r\n var child = safeGet(write.children, pathGetFront(relativePath));\r\n if (child) {\r\n // There exists a child in this node that matches the root path\r\n var deepNode = child.getChild(pathPopFront(relativePath));\r\n compoundWrite = compoundWriteAddWrite(compoundWrite, newEmptyPath(), deepNode);\r\n }\r\n }\r\n }\r\n else ;\r\n }\r\n else {\r\n throw assertionError('WriteRecord should have .snap or .children');\r\n }\r\n }\r\n }\r\n return compoundWrite;\r\n}\r\n/**\r\n * Given optional, underlying server data, and an optional set of constraints (exclude some sets, include hidden\r\n * writes), attempt to calculate a complete snapshot for the given path\r\n *\r\n * @param writeIdsToExclude - An optional set to be excluded\r\n * @param includeHiddenWrites - Defaults to false, whether or not to layer on writes with visible set to false\r\n */\r\nfunction writeTreeCalcCompleteEventCache(writeTree, treePath, completeServerCache, writeIdsToExclude, includeHiddenWrites) {\r\n if (!writeIdsToExclude && !includeHiddenWrites) {\r\n var shadowingNode = compoundWriteGetCompleteNode(writeTree.visibleWrites, treePath);\r\n if (shadowingNode != null) {\r\n return shadowingNode;\r\n }\r\n else {\r\n var subMerge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n if (compoundWriteIsEmpty(subMerge)) {\r\n return completeServerCache;\r\n }\r\n else if (completeServerCache == null &&\r\n !compoundWriteHasCompleteWrite(subMerge, newEmptyPath())) {\r\n // We wouldn't have a complete snapshot, since there's no underlying data and no complete shadow\r\n return null;\r\n }\r\n else {\r\n var layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\r\n return compoundWriteApply(subMerge, layeredCache);\r\n }\r\n }\r\n }\r\n else {\r\n var merge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n if (!includeHiddenWrites && compoundWriteIsEmpty(merge)) {\r\n return completeServerCache;\r\n }\r\n else {\r\n // If the server cache is null, and we don't have a complete cache, we need to return null\r\n if (!includeHiddenWrites &&\r\n completeServerCache == null &&\r\n !compoundWriteHasCompleteWrite(merge, newEmptyPath())) {\r\n return null;\r\n }\r\n else {\r\n var filter = function (write) {\r\n return ((write.visible || includeHiddenWrites) &&\r\n (!writeIdsToExclude ||\r\n !~writeIdsToExclude.indexOf(write.writeId)) &&\r\n (pathContains(write.path, treePath) ||\r\n pathContains(treePath, write.path)));\r\n };\r\n var mergeAtPath = writeTreeLayerTree_(writeTree.allWrites, filter, treePath);\r\n var layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\r\n return compoundWriteApply(mergeAtPath, layeredCache);\r\n }\r\n }\r\n }\r\n}\r\n/**\r\n * With optional, underlying server data, attempt to return a children node of children that we have complete data for.\r\n * Used when creating new views, to pre-fill their complete event children snapshot.\r\n */\r\nfunction writeTreeCalcCompleteEventChildren(writeTree, treePath, completeServerChildren) {\r\n var completeChildren = ChildrenNode.EMPTY_NODE;\r\n var topLevelSet = compoundWriteGetCompleteNode(writeTree.visibleWrites, treePath);\r\n if (topLevelSet) {\r\n if (!topLevelSet.isLeafNode()) {\r\n // we're shadowing everything. Return the children.\r\n topLevelSet.forEachChild(PRIORITY_INDEX, function (childName, childSnap) {\r\n completeChildren = completeChildren.updateImmediateChild(childName, childSnap);\r\n });\r\n }\r\n return completeChildren;\r\n }\r\n else if (completeServerChildren) {\r\n // Layer any children we have on top of this\r\n // We know we don't have a top-level set, so just enumerate existing children\r\n var merge_1 = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n completeServerChildren.forEachChild(PRIORITY_INDEX, function (childName, childNode) {\r\n var node = compoundWriteApply(compoundWriteChildCompoundWrite(merge_1, new Path(childName)), childNode);\r\n completeChildren = completeChildren.updateImmediateChild(childName, node);\r\n });\r\n // Add any complete children we have from the set\r\n compoundWriteGetCompleteChildren(merge_1).forEach(function (namedNode) {\r\n completeChildren = completeChildren.updateImmediateChild(namedNode.name, namedNode.node);\r\n });\r\n return completeChildren;\r\n }\r\n else {\r\n // We don't have anything to layer on top of. Layer on any children we have\r\n // Note that we can return an empty snap if we have a defined delete\r\n var merge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n compoundWriteGetCompleteChildren(merge).forEach(function (namedNode) {\r\n completeChildren = completeChildren.updateImmediateChild(namedNode.name, namedNode.node);\r\n });\r\n return completeChildren;\r\n }\r\n}\r\n/**\r\n * Given that the underlying server data has updated, determine what, if anything, needs to be\r\n * applied to the event cache.\r\n *\r\n * Possibilities:\r\n *\r\n * 1. No writes are shadowing. Events should be raised, the snap to be applied comes from the server data\r\n *\r\n * 2. Some write is completely shadowing. No events to be raised\r\n *\r\n * 3. Is partially shadowed. Events\r\n *\r\n * Either existingEventSnap or existingServerSnap must exist\r\n */\r\nfunction writeTreeCalcEventCacheAfterServerOverwrite(writeTree, treePath, childPath, existingEventSnap, existingServerSnap) {\r\n assert(existingEventSnap || existingServerSnap, 'Either existingEventSnap or existingServerSnap must exist');\r\n var path = pathChild(treePath, childPath);\r\n if (compoundWriteHasCompleteWrite(writeTree.visibleWrites, path)) {\r\n // At this point we can probably guarantee that we're in case 2, meaning no events\r\n // May need to check visibility while doing the findRootMostValueAndPath call\r\n return null;\r\n }\r\n else {\r\n // No complete shadowing. We're either partially shadowing or not shadowing at all.\r\n var childMerge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, path);\r\n if (compoundWriteIsEmpty(childMerge)) {\r\n // We're not shadowing at all. Case 1\r\n return existingServerSnap.getChild(childPath);\r\n }\r\n else {\r\n // This could be more efficient if the serverNode + updates doesn't change the eventSnap\r\n // However this is tricky to find out, since user updates don't necessary change the server\r\n // snap, e.g. priority updates on empty nodes, or deep deletes. Another special case is if the server\r\n // adds nodes, but doesn't change any existing writes. It is therefore not enough to\r\n // only check if the updates change the serverNode.\r\n // Maybe check if the merge tree contains these special cases and only do a full overwrite in that case?\r\n return compoundWriteApply(childMerge, existingServerSnap.getChild(childPath));\r\n }\r\n }\r\n}\r\n/**\r\n * Returns a complete child for a given server snap after applying all user writes or null if there is no\r\n * complete child for this ChildKey.\r\n */\r\nfunction writeTreeCalcCompleteChild(writeTree, treePath, childKey, existingServerSnap) {\r\n var path = pathChild(treePath, childKey);\r\n var shadowingNode = compoundWriteGetCompleteNode(writeTree.visibleWrites, path);\r\n if (shadowingNode != null) {\r\n return shadowingNode;\r\n }\r\n else {\r\n if (existingServerSnap.isCompleteForChild(childKey)) {\r\n var childMerge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, path);\r\n return compoundWriteApply(childMerge, existingServerSnap.getNode().getImmediateChild(childKey));\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n}\r\n/**\r\n * Returns a node if there is a complete overwrite for this path. More specifically, if there is a write at\r\n * a higher path, this will return the child of that write relative to the write and this path.\r\n * Returns null if there is no write at this path.\r\n */\r\nfunction writeTreeShadowingWrite(writeTree, path) {\r\n return compoundWriteGetCompleteNode(writeTree.visibleWrites, path);\r\n}\r\n/**\r\n * This method is used when processing child remove events on a query. If we can, we pull in children that were outside\r\n * the window, but may now be in the window.\r\n */\r\nfunction writeTreeCalcIndexedSlice(writeTree, treePath, completeServerData, startPost, count, reverse, index) {\r\n var toIterate;\r\n var merge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n var shadowingNode = compoundWriteGetCompleteNode(merge, newEmptyPath());\r\n if (shadowingNode != null) {\r\n toIterate = shadowingNode;\r\n }\r\n else if (completeServerData != null) {\r\n toIterate = compoundWriteApply(merge, completeServerData);\r\n }\r\n else {\r\n // no children to iterate on\r\n return [];\r\n }\r\n toIterate = toIterate.withIndex(index);\r\n if (!toIterate.isEmpty() && !toIterate.isLeafNode()) {\r\n var nodes = [];\r\n var cmp = index.getCompare();\r\n var iter = reverse\r\n ? toIterate.getReverseIteratorFrom(startPost, index)\r\n : toIterate.getIteratorFrom(startPost, index);\r\n var next = iter.getNext();\r\n while (next && nodes.length < count) {\r\n if (cmp(next, startPost) !== 0) {\r\n nodes.push(next);\r\n }\r\n next = iter.getNext();\r\n }\r\n return nodes;\r\n }\r\n else {\r\n return [];\r\n }\r\n}\r\nfunction newWriteTree() {\r\n return {\r\n visibleWrites: CompoundWrite.empty(),\r\n allWrites: [],\r\n lastWriteId: -1\r\n };\r\n}\r\n/**\r\n * If possible, returns a complete event cache, using the underlying server data if possible. In addition, can be used\r\n * to get a cache that includes hidden writes, and excludes arbitrary writes. Note that customizing the returned node\r\n * can lead to a more expensive calculation.\r\n *\r\n * @param writeIdsToExclude - Optional writes to exclude.\r\n * @param includeHiddenWrites - Defaults to false, whether or not to layer on writes with visible set to false\r\n */\r\nfunction writeTreeRefCalcCompleteEventCache(writeTreeRef, completeServerCache, writeIdsToExclude, includeHiddenWrites) {\r\n return writeTreeCalcCompleteEventCache(writeTreeRef.writeTree, writeTreeRef.treePath, completeServerCache, writeIdsToExclude, includeHiddenWrites);\r\n}\r\n/**\r\n * If possible, returns a children node containing all of the complete children we have data for. The returned data is a\r\n * mix of the given server data and write data.\r\n *\r\n */\r\nfunction writeTreeRefCalcCompleteEventChildren(writeTreeRef, completeServerChildren) {\r\n return writeTreeCalcCompleteEventChildren(writeTreeRef.writeTree, writeTreeRef.treePath, completeServerChildren);\r\n}\r\n/**\r\n * Given that either the underlying server data has updated or the outstanding writes have updated, determine what,\r\n * if anything, needs to be applied to the event cache.\r\n *\r\n * Possibilities:\r\n *\r\n * 1. No writes are shadowing. Events should be raised, the snap to be applied comes from the server data\r\n *\r\n * 2. Some write is completely shadowing. No events to be raised\r\n *\r\n * 3. Is partially shadowed. Events should be raised\r\n *\r\n * Either existingEventSnap or existingServerSnap must exist, this is validated via an assert\r\n *\r\n *\r\n */\r\nfunction writeTreeRefCalcEventCacheAfterServerOverwrite(writeTreeRef, path, existingEventSnap, existingServerSnap) {\r\n return writeTreeCalcEventCacheAfterServerOverwrite(writeTreeRef.writeTree, writeTreeRef.treePath, path, existingEventSnap, existingServerSnap);\r\n}\r\n/**\r\n * Returns a node if there is a complete overwrite for this path. More specifically, if there is a write at\r\n * a higher path, this will return the child of that write relative to the write and this path.\r\n * Returns null if there is no write at this path.\r\n *\r\n */\r\nfunction writeTreeRefShadowingWrite(writeTreeRef, path) {\r\n return writeTreeShadowingWrite(writeTreeRef.writeTree, pathChild(writeTreeRef.treePath, path));\r\n}\r\n/**\r\n * This method is used when processing child remove events on a query. If we can, we pull in children that were outside\r\n * the window, but may now be in the window\r\n */\r\nfunction writeTreeRefCalcIndexedSlice(writeTreeRef, completeServerData, startPost, count, reverse, index) {\r\n return writeTreeCalcIndexedSlice(writeTreeRef.writeTree, writeTreeRef.treePath, completeServerData, startPost, count, reverse, index);\r\n}\r\n/**\r\n * Returns a complete child for a given server snap after applying all user writes or null if there is no\r\n * complete child for this ChildKey.\r\n */\r\nfunction writeTreeRefCalcCompleteChild(writeTreeRef, childKey, existingServerCache) {\r\n return writeTreeCalcCompleteChild(writeTreeRef.writeTree, writeTreeRef.treePath, childKey, existingServerCache);\r\n}\r\n/**\r\n * Return a WriteTreeRef for a child.\r\n */\r\nfunction writeTreeRefChild(writeTreeRef, childName) {\r\n return newWriteTreeRef(pathChild(writeTreeRef.treePath, childName), writeTreeRef.writeTree);\r\n}\r\nfunction newWriteTreeRef(path, writeTree) {\r\n return {\r\n treePath: path,\r\n writeTree: writeTree\r\n };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar ChildChangeAccumulator = /** @class */ (function () {\r\n function ChildChangeAccumulator() {\r\n this.changeMap = new Map();\r\n }\r\n ChildChangeAccumulator.prototype.trackChildChange = function (change) {\r\n var type = change.type;\r\n var childKey = change.childName;\r\n assert(type === \"child_added\" /* CHILD_ADDED */ ||\r\n type === \"child_changed\" /* CHILD_CHANGED */ ||\r\n type === \"child_removed\" /* CHILD_REMOVED */, 'Only child changes supported for tracking');\r\n assert(childKey !== '.priority', 'Only non-priority child changes can be tracked.');\r\n var oldChange = this.changeMap.get(childKey);\r\n if (oldChange) {\r\n var oldType = oldChange.type;\r\n if (type === \"child_added\" /* CHILD_ADDED */ &&\r\n oldType === \"child_removed\" /* CHILD_REMOVED */) {\r\n this.changeMap.set(childKey, changeChildChanged(childKey, change.snapshotNode, oldChange.snapshotNode));\r\n }\r\n else if (type === \"child_removed\" /* CHILD_REMOVED */ &&\r\n oldType === \"child_added\" /* CHILD_ADDED */) {\r\n this.changeMap.delete(childKey);\r\n }\r\n else if (type === \"child_removed\" /* CHILD_REMOVED */ &&\r\n oldType === \"child_changed\" /* CHILD_CHANGED */) {\r\n this.changeMap.set(childKey, changeChildRemoved(childKey, oldChange.oldSnap));\r\n }\r\n else if (type === \"child_changed\" /* CHILD_CHANGED */ &&\r\n oldType === \"child_added\" /* CHILD_ADDED */) {\r\n this.changeMap.set(childKey, changeChildAdded(childKey, change.snapshotNode));\r\n }\r\n else if (type === \"child_changed\" /* CHILD_CHANGED */ &&\r\n oldType === \"child_changed\" /* CHILD_CHANGED */) {\r\n this.changeMap.set(childKey, changeChildChanged(childKey, change.snapshotNode, oldChange.oldSnap));\r\n }\r\n else {\r\n throw assertionError('Illegal combination of changes: ' +\r\n change +\r\n ' occurred after ' +\r\n oldChange);\r\n }\r\n }\r\n else {\r\n this.changeMap.set(childKey, change);\r\n }\r\n };\r\n ChildChangeAccumulator.prototype.getChanges = function () {\r\n return Array.from(this.changeMap.values());\r\n };\r\n return ChildChangeAccumulator;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An implementation of CompleteChildSource that never returns any additional children\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nvar NoCompleteChildSource_ = /** @class */ (function () {\r\n function NoCompleteChildSource_() {\r\n }\r\n NoCompleteChildSource_.prototype.getCompleteChild = function (childKey) {\r\n return null;\r\n };\r\n NoCompleteChildSource_.prototype.getChildAfterChild = function (index, child, reverse) {\r\n return null;\r\n };\r\n return NoCompleteChildSource_;\r\n}());\r\n/**\r\n * Singleton instance.\r\n */\r\nvar NO_COMPLETE_CHILD_SOURCE = new NoCompleteChildSource_();\r\n/**\r\n * An implementation of CompleteChildSource that uses a WriteTree in addition to any other server data or\r\n * old event caches available to calculate complete children.\r\n */\r\nvar WriteTreeCompleteChildSource = /** @class */ (function () {\r\n function WriteTreeCompleteChildSource(writes_, viewCache_, optCompleteServerCache_) {\r\n if (optCompleteServerCache_ === void 0) { optCompleteServerCache_ = null; }\r\n this.writes_ = writes_;\r\n this.viewCache_ = viewCache_;\r\n this.optCompleteServerCache_ = optCompleteServerCache_;\r\n }\r\n WriteTreeCompleteChildSource.prototype.getCompleteChild = function (childKey) {\r\n var node = this.viewCache_.eventCache;\r\n if (node.isCompleteForChild(childKey)) {\r\n return node.getNode().getImmediateChild(childKey);\r\n }\r\n else {\r\n var serverNode = this.optCompleteServerCache_ != null\r\n ? new CacheNode(this.optCompleteServerCache_, true, false)\r\n : this.viewCache_.serverCache;\r\n return writeTreeRefCalcCompleteChild(this.writes_, childKey, serverNode);\r\n }\r\n };\r\n WriteTreeCompleteChildSource.prototype.getChildAfterChild = function (index, child, reverse) {\r\n var completeServerData = this.optCompleteServerCache_ != null\r\n ? this.optCompleteServerCache_\r\n : viewCacheGetCompleteServerSnap(this.viewCache_);\r\n var nodes = writeTreeRefCalcIndexedSlice(this.writes_, completeServerData, child, 1, reverse, index);\r\n if (nodes.length === 0) {\r\n return null;\r\n }\r\n else {\r\n return nodes[0];\r\n }\r\n };\r\n return WriteTreeCompleteChildSource;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction newViewProcessor(filter) {\r\n return { filter: filter };\r\n}\r\nfunction viewProcessorAssertIndexed(viewProcessor, viewCache) {\r\n assert(viewCache.eventCache.getNode().isIndexed(viewProcessor.filter.getIndex()), 'Event snap not indexed');\r\n assert(viewCache.serverCache.getNode().isIndexed(viewProcessor.filter.getIndex()), 'Server snap not indexed');\r\n}\r\nfunction viewProcessorApplyOperation(viewProcessor, oldViewCache, operation, writesCache, completeCache) {\r\n var accumulator = new ChildChangeAccumulator();\r\n var newViewCache, filterServerNode;\r\n if (operation.type === OperationType.OVERWRITE) {\r\n var overwrite = operation;\r\n if (overwrite.source.fromUser) {\r\n newViewCache = viewProcessorApplyUserOverwrite(viewProcessor, oldViewCache, overwrite.path, overwrite.snap, writesCache, completeCache, accumulator);\r\n }\r\n else {\r\n assert(overwrite.source.fromServer, 'Unknown source.');\r\n // We filter the node if it's a tagged update or the node has been previously filtered and the\r\n // update is not at the root in which case it is ok (and necessary) to mark the node unfiltered\r\n // again\r\n filterServerNode =\r\n overwrite.source.tagged ||\r\n (oldViewCache.serverCache.isFiltered() && !pathIsEmpty(overwrite.path));\r\n newViewCache = viewProcessorApplyServerOverwrite(viewProcessor, oldViewCache, overwrite.path, overwrite.snap, writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n }\r\n else if (operation.type === OperationType.MERGE) {\r\n var merge = operation;\r\n if (merge.source.fromUser) {\r\n newViewCache = viewProcessorApplyUserMerge(viewProcessor, oldViewCache, merge.path, merge.children, writesCache, completeCache, accumulator);\r\n }\r\n else {\r\n assert(merge.source.fromServer, 'Unknown source.');\r\n // We filter the node if it's a tagged update or the node has been previously filtered\r\n filterServerNode =\r\n merge.source.tagged || oldViewCache.serverCache.isFiltered();\r\n newViewCache = viewProcessorApplyServerMerge(viewProcessor, oldViewCache, merge.path, merge.children, writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n }\r\n else if (operation.type === OperationType.ACK_USER_WRITE) {\r\n var ackUserWrite = operation;\r\n if (!ackUserWrite.revert) {\r\n newViewCache = viewProcessorAckUserWrite(viewProcessor, oldViewCache, ackUserWrite.path, ackUserWrite.affectedTree, writesCache, completeCache, accumulator);\r\n }\r\n else {\r\n newViewCache = viewProcessorRevertUserWrite(viewProcessor, oldViewCache, ackUserWrite.path, writesCache, completeCache, accumulator);\r\n }\r\n }\r\n else if (operation.type === OperationType.LISTEN_COMPLETE) {\r\n newViewCache = viewProcessorListenComplete(viewProcessor, oldViewCache, operation.path, writesCache, accumulator);\r\n }\r\n else {\r\n throw assertionError('Unknown operation type: ' + operation.type);\r\n }\r\n var changes = accumulator.getChanges();\r\n viewProcessorMaybeAddValueEvent(oldViewCache, newViewCache, changes);\r\n return { viewCache: newViewCache, changes: changes };\r\n}\r\nfunction viewProcessorMaybeAddValueEvent(oldViewCache, newViewCache, accumulator) {\r\n var eventSnap = newViewCache.eventCache;\r\n if (eventSnap.isFullyInitialized()) {\r\n var isLeafOrEmpty = eventSnap.getNode().isLeafNode() || eventSnap.getNode().isEmpty();\r\n var oldCompleteSnap = viewCacheGetCompleteEventSnap(oldViewCache);\r\n if (accumulator.length > 0 ||\r\n !oldViewCache.eventCache.isFullyInitialized() ||\r\n (isLeafOrEmpty && !eventSnap.getNode().equals(oldCompleteSnap)) ||\r\n !eventSnap.getNode().getPriority().equals(oldCompleteSnap.getPriority())) {\r\n accumulator.push(changeValue(viewCacheGetCompleteEventSnap(newViewCache)));\r\n }\r\n }\r\n}\r\nfunction viewProcessorGenerateEventCacheAfterServerEvent(viewProcessor, viewCache, changePath, writesCache, source, accumulator) {\r\n var oldEventSnap = viewCache.eventCache;\r\n if (writeTreeRefShadowingWrite(writesCache, changePath) != null) {\r\n // we have a shadowing write, ignore changes\r\n return viewCache;\r\n }\r\n else {\r\n var newEventCache = void 0, serverNode = void 0;\r\n if (pathIsEmpty(changePath)) {\r\n // TODO: figure out how this plays with \"sliding ack windows\"\r\n assert(viewCache.serverCache.isFullyInitialized(), 'If change path is empty, we must have complete server data');\r\n if (viewCache.serverCache.isFiltered()) {\r\n // We need to special case this, because we need to only apply writes to complete children, or\r\n // we might end up raising events for incomplete children. If the server data is filtered deep\r\n // writes cannot be guaranteed to be complete\r\n var serverCache = viewCacheGetCompleteServerSnap(viewCache);\r\n var completeChildren = serverCache instanceof ChildrenNode\r\n ? serverCache\r\n : ChildrenNode.EMPTY_NODE;\r\n var completeEventChildren = writeTreeRefCalcCompleteEventChildren(writesCache, completeChildren);\r\n newEventCache = viewProcessor.filter.updateFullNode(viewCache.eventCache.getNode(), completeEventChildren, accumulator);\r\n }\r\n else {\r\n var completeNode = writeTreeRefCalcCompleteEventCache(writesCache, viewCacheGetCompleteServerSnap(viewCache));\r\n newEventCache = viewProcessor.filter.updateFullNode(viewCache.eventCache.getNode(), completeNode, accumulator);\r\n }\r\n }\r\n else {\r\n var childKey = pathGetFront(changePath);\r\n if (childKey === '.priority') {\r\n assert(pathGetLength(changePath) === 1, \"Can't have a priority with additional path components\");\r\n var oldEventNode = oldEventSnap.getNode();\r\n serverNode = viewCache.serverCache.getNode();\r\n // we might have overwrites for this priority\r\n var updatedPriority = writeTreeRefCalcEventCacheAfterServerOverwrite(writesCache, changePath, oldEventNode, serverNode);\r\n if (updatedPriority != null) {\r\n newEventCache = viewProcessor.filter.updatePriority(oldEventNode, updatedPriority);\r\n }\r\n else {\r\n // priority didn't change, keep old node\r\n newEventCache = oldEventSnap.getNode();\r\n }\r\n }\r\n else {\r\n var childChangePath = pathPopFront(changePath);\r\n // update child\r\n var newEventChild = void 0;\r\n if (oldEventSnap.isCompleteForChild(childKey)) {\r\n serverNode = viewCache.serverCache.getNode();\r\n var eventChildUpdate = writeTreeRefCalcEventCacheAfterServerOverwrite(writesCache, changePath, oldEventSnap.getNode(), serverNode);\r\n if (eventChildUpdate != null) {\r\n newEventChild = oldEventSnap\r\n .getNode()\r\n .getImmediateChild(childKey)\r\n .updateChild(childChangePath, eventChildUpdate);\r\n }\r\n else {\r\n // Nothing changed, just keep the old child\r\n newEventChild = oldEventSnap.getNode().getImmediateChild(childKey);\r\n }\r\n }\r\n else {\r\n newEventChild = writeTreeRefCalcCompleteChild(writesCache, childKey, viewCache.serverCache);\r\n }\r\n if (newEventChild != null) {\r\n newEventCache = viewProcessor.filter.updateChild(oldEventSnap.getNode(), childKey, newEventChild, childChangePath, source, accumulator);\r\n }\r\n else {\r\n // no complete child available or no change\r\n newEventCache = oldEventSnap.getNode();\r\n }\r\n }\r\n }\r\n return viewCacheUpdateEventSnap(viewCache, newEventCache, oldEventSnap.isFullyInitialized() || pathIsEmpty(changePath), viewProcessor.filter.filtersNodes());\r\n }\r\n}\r\nfunction viewProcessorApplyServerOverwrite(viewProcessor, oldViewCache, changePath, changedSnap, writesCache, completeCache, filterServerNode, accumulator) {\r\n var oldServerSnap = oldViewCache.serverCache;\r\n var newServerCache;\r\n var serverFilter = filterServerNode\r\n ? viewProcessor.filter\r\n : viewProcessor.filter.getIndexedFilter();\r\n if (pathIsEmpty(changePath)) {\r\n newServerCache = serverFilter.updateFullNode(oldServerSnap.getNode(), changedSnap, null);\r\n }\r\n else if (serverFilter.filtersNodes() && !oldServerSnap.isFiltered()) {\r\n // we want to filter the server node, but we didn't filter the server node yet, so simulate a full update\r\n var newServerNode = oldServerSnap\r\n .getNode()\r\n .updateChild(changePath, changedSnap);\r\n newServerCache = serverFilter.updateFullNode(oldServerSnap.getNode(), newServerNode, null);\r\n }\r\n else {\r\n var childKey = pathGetFront(changePath);\r\n if (!oldServerSnap.isCompleteForPath(changePath) &&\r\n pathGetLength(changePath) > 1) {\r\n // We don't update incomplete nodes with updates intended for other listeners\r\n return oldViewCache;\r\n }\r\n var childChangePath = pathPopFront(changePath);\r\n var childNode = oldServerSnap.getNode().getImmediateChild(childKey);\r\n var newChildNode = childNode.updateChild(childChangePath, changedSnap);\r\n if (childKey === '.priority') {\r\n newServerCache = serverFilter.updatePriority(oldServerSnap.getNode(), newChildNode);\r\n }\r\n else {\r\n newServerCache = serverFilter.updateChild(oldServerSnap.getNode(), childKey, newChildNode, childChangePath, NO_COMPLETE_CHILD_SOURCE, null);\r\n }\r\n }\r\n var newViewCache = viewCacheUpdateServerSnap(oldViewCache, newServerCache, oldServerSnap.isFullyInitialized() || pathIsEmpty(changePath), serverFilter.filtersNodes());\r\n var source = new WriteTreeCompleteChildSource(writesCache, newViewCache, completeCache);\r\n return viewProcessorGenerateEventCacheAfterServerEvent(viewProcessor, newViewCache, changePath, writesCache, source, accumulator);\r\n}\r\nfunction viewProcessorApplyUserOverwrite(viewProcessor, oldViewCache, changePath, changedSnap, writesCache, completeCache, accumulator) {\r\n var oldEventSnap = oldViewCache.eventCache;\r\n var newViewCache, newEventCache;\r\n var source = new WriteTreeCompleteChildSource(writesCache, oldViewCache, completeCache);\r\n if (pathIsEmpty(changePath)) {\r\n newEventCache = viewProcessor.filter.updateFullNode(oldViewCache.eventCache.getNode(), changedSnap, accumulator);\r\n newViewCache = viewCacheUpdateEventSnap(oldViewCache, newEventCache, true, viewProcessor.filter.filtersNodes());\r\n }\r\n else {\r\n var childKey = pathGetFront(changePath);\r\n if (childKey === '.priority') {\r\n newEventCache = viewProcessor.filter.updatePriority(oldViewCache.eventCache.getNode(), changedSnap);\r\n newViewCache = viewCacheUpdateEventSnap(oldViewCache, newEventCache, oldEventSnap.isFullyInitialized(), oldEventSnap.isFiltered());\r\n }\r\n else {\r\n var childChangePath = pathPopFront(changePath);\r\n var oldChild = oldEventSnap.getNode().getImmediateChild(childKey);\r\n var newChild = void 0;\r\n if (pathIsEmpty(childChangePath)) {\r\n // Child overwrite, we can replace the child\r\n newChild = changedSnap;\r\n }\r\n else {\r\n var childNode = source.getCompleteChild(childKey);\r\n if (childNode != null) {\r\n if (pathGetBack(childChangePath) === '.priority' &&\r\n childNode.getChild(pathParent(childChangePath)).isEmpty()) {\r\n // This is a priority update on an empty node. If this node exists on the server, the\r\n // server will send down the priority in the update, so ignore for now\r\n newChild = childNode;\r\n }\r\n else {\r\n newChild = childNode.updateChild(childChangePath, changedSnap);\r\n }\r\n }\r\n else {\r\n // There is no complete child node available\r\n newChild = ChildrenNode.EMPTY_NODE;\r\n }\r\n }\r\n if (!oldChild.equals(newChild)) {\r\n var newEventSnap = viewProcessor.filter.updateChild(oldEventSnap.getNode(), childKey, newChild, childChangePath, source, accumulator);\r\n newViewCache = viewCacheUpdateEventSnap(oldViewCache, newEventSnap, oldEventSnap.isFullyInitialized(), viewProcessor.filter.filtersNodes());\r\n }\r\n else {\r\n newViewCache = oldViewCache;\r\n }\r\n }\r\n }\r\n return newViewCache;\r\n}\r\nfunction viewProcessorCacheHasChild(viewCache, childKey) {\r\n return viewCache.eventCache.isCompleteForChild(childKey);\r\n}\r\nfunction viewProcessorApplyUserMerge(viewProcessor, viewCache, path, changedChildren, writesCache, serverCache, accumulator) {\r\n // HACK: In the case of a limit query, there may be some changes that bump things out of the\r\n // window leaving room for new items. It's important we process these changes first, so we\r\n // iterate the changes twice, first processing any that affect items currently in view.\r\n // TODO: I consider an item \"in view\" if cacheHasChild is true, which checks both the server\r\n // and event snap. I'm not sure if this will result in edge cases when a child is in one but\r\n // not the other.\r\n var curViewCache = viewCache;\r\n changedChildren.foreach(function (relativePath, childNode) {\r\n var writePath = pathChild(path, relativePath);\r\n if (viewProcessorCacheHasChild(viewCache, pathGetFront(writePath))) {\r\n curViewCache = viewProcessorApplyUserOverwrite(viewProcessor, curViewCache, writePath, childNode, writesCache, serverCache, accumulator);\r\n }\r\n });\r\n changedChildren.foreach(function (relativePath, childNode) {\r\n var writePath = pathChild(path, relativePath);\r\n if (!viewProcessorCacheHasChild(viewCache, pathGetFront(writePath))) {\r\n curViewCache = viewProcessorApplyUserOverwrite(viewProcessor, curViewCache, writePath, childNode, writesCache, serverCache, accumulator);\r\n }\r\n });\r\n return curViewCache;\r\n}\r\nfunction viewProcessorApplyMerge(viewProcessor, node, merge) {\r\n merge.foreach(function (relativePath, childNode) {\r\n node = node.updateChild(relativePath, childNode);\r\n });\r\n return node;\r\n}\r\nfunction viewProcessorApplyServerMerge(viewProcessor, viewCache, path, changedChildren, writesCache, serverCache, filterServerNode, accumulator) {\r\n // If we don't have a cache yet, this merge was intended for a previously listen in the same location. Ignore it and\r\n // wait for the complete data update coming soon.\r\n if (viewCache.serverCache.getNode().isEmpty() &&\r\n !viewCache.serverCache.isFullyInitialized()) {\r\n return viewCache;\r\n }\r\n // HACK: In the case of a limit query, there may be some changes that bump things out of the\r\n // window leaving room for new items. It's important we process these changes first, so we\r\n // iterate the changes twice, first processing any that affect items currently in view.\r\n // TODO: I consider an item \"in view\" if cacheHasChild is true, which checks both the server\r\n // and event snap. I'm not sure if this will result in edge cases when a child is in one but\r\n // not the other.\r\n var curViewCache = viewCache;\r\n var viewMergeTree;\r\n if (pathIsEmpty(path)) {\r\n viewMergeTree = changedChildren;\r\n }\r\n else {\r\n viewMergeTree = new ImmutableTree(null).setTree(path, changedChildren);\r\n }\r\n var serverNode = viewCache.serverCache.getNode();\r\n viewMergeTree.children.inorderTraversal(function (childKey, childTree) {\r\n if (serverNode.hasChild(childKey)) {\r\n var serverChild = viewCache.serverCache\r\n .getNode()\r\n .getImmediateChild(childKey);\r\n var newChild = viewProcessorApplyMerge(viewProcessor, serverChild, childTree);\r\n curViewCache = viewProcessorApplyServerOverwrite(viewProcessor, curViewCache, new Path(childKey), newChild, writesCache, serverCache, filterServerNode, accumulator);\r\n }\r\n });\r\n viewMergeTree.children.inorderTraversal(function (childKey, childMergeTree) {\r\n var isUnknownDeepMerge = !viewCache.serverCache.isCompleteForChild(childKey) &&\r\n childMergeTree.value === undefined;\r\n if (!serverNode.hasChild(childKey) && !isUnknownDeepMerge) {\r\n var serverChild = viewCache.serverCache\r\n .getNode()\r\n .getImmediateChild(childKey);\r\n var newChild = viewProcessorApplyMerge(viewProcessor, serverChild, childMergeTree);\r\n curViewCache = viewProcessorApplyServerOverwrite(viewProcessor, curViewCache, new Path(childKey), newChild, writesCache, serverCache, filterServerNode, accumulator);\r\n }\r\n });\r\n return curViewCache;\r\n}\r\nfunction viewProcessorAckUserWrite(viewProcessor, viewCache, ackPath, affectedTree, writesCache, completeCache, accumulator) {\r\n if (writeTreeRefShadowingWrite(writesCache, ackPath) != null) {\r\n return viewCache;\r\n }\r\n // Only filter server node if it is currently filtered\r\n var filterServerNode = viewCache.serverCache.isFiltered();\r\n // Essentially we'll just get our existing server cache for the affected paths and re-apply it as a server update\r\n // now that it won't be shadowed.\r\n var serverCache = viewCache.serverCache;\r\n if (affectedTree.value != null) {\r\n // This is an overwrite.\r\n if ((pathIsEmpty(ackPath) && serverCache.isFullyInitialized()) ||\r\n serverCache.isCompleteForPath(ackPath)) {\r\n return viewProcessorApplyServerOverwrite(viewProcessor, viewCache, ackPath, serverCache.getNode().getChild(ackPath), writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n else if (pathIsEmpty(ackPath)) {\r\n // This is a goofy edge case where we are acking data at this location but don't have full data. We\r\n // should just re-apply whatever we have in our cache as a merge.\r\n var changedChildren_1 = new ImmutableTree(null);\r\n serverCache.getNode().forEachChild(KEY_INDEX, function (name, node) {\r\n changedChildren_1 = changedChildren_1.set(new Path(name), node);\r\n });\r\n return viewProcessorApplyServerMerge(viewProcessor, viewCache, ackPath, changedChildren_1, writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n else {\r\n return viewCache;\r\n }\r\n }\r\n else {\r\n // This is a merge.\r\n var changedChildren_2 = new ImmutableTree(null);\r\n affectedTree.foreach(function (mergePath, value) {\r\n var serverCachePath = pathChild(ackPath, mergePath);\r\n if (serverCache.isCompleteForPath(serverCachePath)) {\r\n changedChildren_2 = changedChildren_2.set(mergePath, serverCache.getNode().getChild(serverCachePath));\r\n }\r\n });\r\n return viewProcessorApplyServerMerge(viewProcessor, viewCache, ackPath, changedChildren_2, writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n}\r\nfunction viewProcessorListenComplete(viewProcessor, viewCache, path, writesCache, accumulator) {\r\n var oldServerNode = viewCache.serverCache;\r\n var newViewCache = viewCacheUpdateServerSnap(viewCache, oldServerNode.getNode(), oldServerNode.isFullyInitialized() || pathIsEmpty(path), oldServerNode.isFiltered());\r\n return viewProcessorGenerateEventCacheAfterServerEvent(viewProcessor, newViewCache, path, writesCache, NO_COMPLETE_CHILD_SOURCE, accumulator);\r\n}\r\nfunction viewProcessorRevertUserWrite(viewProcessor, viewCache, path, writesCache, completeServerCache, accumulator) {\r\n var complete;\r\n if (writeTreeRefShadowingWrite(writesCache, path) != null) {\r\n return viewCache;\r\n }\r\n else {\r\n var source = new WriteTreeCompleteChildSource(writesCache, viewCache, completeServerCache);\r\n var oldEventCache = viewCache.eventCache.getNode();\r\n var newEventCache = void 0;\r\n if (pathIsEmpty(path) || pathGetFront(path) === '.priority') {\r\n var newNode = void 0;\r\n if (viewCache.serverCache.isFullyInitialized()) {\r\n newNode = writeTreeRefCalcCompleteEventCache(writesCache, viewCacheGetCompleteServerSnap(viewCache));\r\n }\r\n else {\r\n var serverChildren = viewCache.serverCache.getNode();\r\n assert(serverChildren instanceof ChildrenNode, 'serverChildren would be complete if leaf node');\r\n newNode = writeTreeRefCalcCompleteEventChildren(writesCache, serverChildren);\r\n }\r\n newNode = newNode;\r\n newEventCache = viewProcessor.filter.updateFullNode(oldEventCache, newNode, accumulator);\r\n }\r\n else {\r\n var childKey = pathGetFront(path);\r\n var newChild = writeTreeRefCalcCompleteChild(writesCache, childKey, viewCache.serverCache);\r\n if (newChild == null &&\r\n viewCache.serverCache.isCompleteForChild(childKey)) {\r\n newChild = oldEventCache.getImmediateChild(childKey);\r\n }\r\n if (newChild != null) {\r\n newEventCache = viewProcessor.filter.updateChild(oldEventCache, childKey, newChild, pathPopFront(path), source, accumulator);\r\n }\r\n else if (viewCache.eventCache.getNode().hasChild(childKey)) {\r\n // No complete child available, delete the existing one, if any\r\n newEventCache = viewProcessor.filter.updateChild(oldEventCache, childKey, ChildrenNode.EMPTY_NODE, pathPopFront(path), source, accumulator);\r\n }\r\n else {\r\n newEventCache = oldEventCache;\r\n }\r\n if (newEventCache.isEmpty() &&\r\n viewCache.serverCache.isFullyInitialized()) {\r\n // We might have reverted all child writes. Maybe the old event was a leaf node\r\n complete = writeTreeRefCalcCompleteEventCache(writesCache, viewCacheGetCompleteServerSnap(viewCache));\r\n if (complete.isLeafNode()) {\r\n newEventCache = viewProcessor.filter.updateFullNode(newEventCache, complete, accumulator);\r\n }\r\n }\r\n }\r\n complete =\r\n viewCache.serverCache.isFullyInitialized() ||\r\n writeTreeRefShadowingWrite(writesCache, newEmptyPath()) != null;\r\n return viewCacheUpdateEventSnap(viewCache, newEventCache, complete, viewProcessor.filter.filtersNodes());\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A view represents a specific location and query that has 1 or more event registrations.\r\n *\r\n * It does several things:\r\n * - Maintains the list of event registrations for this location/query.\r\n * - Maintains a cache of the data visible for this location/query.\r\n * - Applies new operations (via applyOperation), updates the cache, and based on the event\r\n * registrations returns the set of events to be raised.\r\n */\r\nvar View = /** @class */ (function () {\r\n function View(query_, initialViewCache) {\r\n this.query_ = query_;\r\n this.eventRegistrations_ = [];\r\n var params = this.query_._queryParams;\r\n var indexFilter = new IndexedFilter(params.getIndex());\r\n var filter = queryParamsGetNodeFilter(params);\r\n this.processor_ = newViewProcessor(filter);\r\n var initialServerCache = initialViewCache.serverCache;\r\n var initialEventCache = initialViewCache.eventCache;\r\n // Don't filter server node with other filter than index, wait for tagged listen\r\n var serverSnap = indexFilter.updateFullNode(ChildrenNode.EMPTY_NODE, initialServerCache.getNode(), null);\r\n var eventSnap = filter.updateFullNode(ChildrenNode.EMPTY_NODE, initialEventCache.getNode(), null);\r\n var newServerCache = new CacheNode(serverSnap, initialServerCache.isFullyInitialized(), indexFilter.filtersNodes());\r\n var newEventCache = new CacheNode(eventSnap, initialEventCache.isFullyInitialized(), filter.filtersNodes());\r\n this.viewCache_ = newViewCache(newEventCache, newServerCache);\r\n this.eventGenerator_ = new EventGenerator(this.query_);\r\n }\r\n Object.defineProperty(View.prototype, \"query\", {\r\n get: function () {\r\n return this.query_;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n return View;\r\n}());\r\nfunction viewGetServerCache(view) {\r\n return view.viewCache_.serverCache.getNode();\r\n}\r\nfunction viewGetCompleteNode(view) {\r\n return viewCacheGetCompleteEventSnap(view.viewCache_);\r\n}\r\nfunction viewGetCompleteServerCache(view, path) {\r\n var cache = viewCacheGetCompleteServerSnap(view.viewCache_);\r\n if (cache) {\r\n // If this isn't a \"loadsAllData\" view, then cache isn't actually a complete cache and\r\n // we need to see if it contains the child we're interested in.\r\n if (view.query._queryParams.loadsAllData() ||\r\n (!pathIsEmpty(path) &&\r\n !cache.getImmediateChild(pathGetFront(path)).isEmpty())) {\r\n return cache.getChild(path);\r\n }\r\n }\r\n return null;\r\n}\r\nfunction viewIsEmpty(view) {\r\n return view.eventRegistrations_.length === 0;\r\n}\r\nfunction viewAddEventRegistration(view, eventRegistration) {\r\n view.eventRegistrations_.push(eventRegistration);\r\n}\r\n/**\r\n * @param eventRegistration - If null, remove all callbacks.\r\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\r\n * @returns Cancel events, if cancelError was provided.\r\n */\r\nfunction viewRemoveEventRegistration(view, eventRegistration, cancelError) {\r\n var cancelEvents = [];\r\n if (cancelError) {\r\n assert(eventRegistration == null, 'A cancel should cancel all event registrations.');\r\n var path_1 = view.query._path;\r\n view.eventRegistrations_.forEach(function (registration) {\r\n var maybeEvent = registration.createCancelEvent(cancelError, path_1);\r\n if (maybeEvent) {\r\n cancelEvents.push(maybeEvent);\r\n }\r\n });\r\n }\r\n if (eventRegistration) {\r\n var remaining = [];\r\n for (var i = 0; i < view.eventRegistrations_.length; ++i) {\r\n var existing = view.eventRegistrations_[i];\r\n if (!existing.matches(eventRegistration)) {\r\n remaining.push(existing);\r\n }\r\n else if (eventRegistration.hasAnyCallback()) {\r\n // We're removing just this one\r\n remaining = remaining.concat(view.eventRegistrations_.slice(i + 1));\r\n break;\r\n }\r\n }\r\n view.eventRegistrations_ = remaining;\r\n }\r\n else {\r\n view.eventRegistrations_ = [];\r\n }\r\n return cancelEvents;\r\n}\r\n/**\r\n * Applies the given Operation, updates our cache, and returns the appropriate events.\r\n */\r\nfunction viewApplyOperation(view, operation, writesCache, completeServerCache) {\r\n if (operation.type === OperationType.MERGE &&\r\n operation.source.queryId !== null) {\r\n assert(viewCacheGetCompleteServerSnap(view.viewCache_), 'We should always have a full cache before handling merges');\r\n assert(viewCacheGetCompleteEventSnap(view.viewCache_), 'Missing event cache, even though we have a server cache');\r\n }\r\n var oldViewCache = view.viewCache_;\r\n var result = viewProcessorApplyOperation(view.processor_, oldViewCache, operation, writesCache, completeServerCache);\r\n viewProcessorAssertIndexed(view.processor_, result.viewCache);\r\n assert(result.viewCache.serverCache.isFullyInitialized() ||\r\n !oldViewCache.serverCache.isFullyInitialized(), 'Once a server snap is complete, it should never go back');\r\n view.viewCache_ = result.viewCache;\r\n return viewGenerateEventsForChanges_(view, result.changes, result.viewCache.eventCache.getNode(), null);\r\n}\r\nfunction viewGetInitialEvents(view, registration) {\r\n var eventSnap = view.viewCache_.eventCache;\r\n var initialChanges = [];\r\n if (!eventSnap.getNode().isLeafNode()) {\r\n var eventNode = eventSnap.getNode();\r\n eventNode.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n initialChanges.push(changeChildAdded(key, childNode));\r\n });\r\n }\r\n if (eventSnap.isFullyInitialized()) {\r\n initialChanges.push(changeValue(eventSnap.getNode()));\r\n }\r\n return viewGenerateEventsForChanges_(view, initialChanges, eventSnap.getNode(), registration);\r\n}\r\nfunction viewGenerateEventsForChanges_(view, changes, eventCache, eventRegistration) {\r\n var registrations = eventRegistration\r\n ? [eventRegistration]\r\n : view.eventRegistrations_;\r\n return eventGeneratorGenerateEventsForChanges(view.eventGenerator_, changes, eventCache, registrations);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar referenceConstructor$1;\r\n/**\r\n * SyncPoint represents a single location in a SyncTree with 1 or more event registrations, meaning we need to\r\n * maintain 1 or more Views at this location to cache server data and raise appropriate events for server changes\r\n * and user writes (set, transaction, update).\r\n *\r\n * It's responsible for:\r\n * - Maintaining the set of 1 or more views necessary at this location (a SyncPoint with 0 views should be removed).\r\n * - Proxying user / server operations to the views as appropriate (i.e. applyServerOverwrite,\r\n * applyUserOverwrite, etc.)\r\n */\r\nvar SyncPoint = /** @class */ (function () {\r\n function SyncPoint() {\r\n /**\r\n * The Views being tracked at this location in the tree, stored as a map where the key is a\r\n * queryId and the value is the View for that query.\r\n *\r\n * NOTE: This list will be quite small (usually 1, but perhaps 2 or 3; any more is an odd use case).\r\n */\r\n this.views = new Map();\r\n }\r\n return SyncPoint;\r\n}());\r\nfunction syncPointSetReferenceConstructor(val) {\r\n assert(!referenceConstructor$1, '__referenceConstructor has already been defined');\r\n referenceConstructor$1 = val;\r\n}\r\nfunction syncPointGetReferenceConstructor() {\r\n assert(referenceConstructor$1, 'Reference.ts has not been loaded');\r\n return referenceConstructor$1;\r\n}\r\nfunction syncPointIsEmpty(syncPoint) {\r\n return syncPoint.views.size === 0;\r\n}\r\nfunction syncPointApplyOperation(syncPoint, operation, writesCache, optCompleteServerCache) {\r\n var e_1, _a;\r\n var queryId = operation.source.queryId;\r\n if (queryId !== null) {\r\n var view = syncPoint.views.get(queryId);\r\n assert(view != null, 'SyncTree gave us an op for an invalid query.');\r\n return viewApplyOperation(view, operation, writesCache, optCompleteServerCache);\r\n }\r\n else {\r\n var events = [];\r\n try {\r\n for (var _b = __values(syncPoint.views.values()), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var view = _c.value;\r\n events = events.concat(viewApplyOperation(view, operation, writesCache, optCompleteServerCache));\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n return events;\r\n }\r\n}\r\n/**\r\n * Get a view for the specified query.\r\n *\r\n * @param query - The query to return a view for\r\n * @param writesCache\r\n * @param serverCache\r\n * @param serverCacheComplete\r\n * @returns Events to raise.\r\n */\r\nfunction syncPointGetView(syncPoint, query, writesCache, serverCache, serverCacheComplete) {\r\n var queryId = query._queryIdentifier;\r\n var view = syncPoint.views.get(queryId);\r\n if (!view) {\r\n // TODO: make writesCache take flag for complete server node\r\n var eventCache = writeTreeRefCalcCompleteEventCache(writesCache, serverCacheComplete ? serverCache : null);\r\n var eventCacheComplete = false;\r\n if (eventCache) {\r\n eventCacheComplete = true;\r\n }\r\n else if (serverCache instanceof ChildrenNode) {\r\n eventCache = writeTreeRefCalcCompleteEventChildren(writesCache, serverCache);\r\n eventCacheComplete = false;\r\n }\r\n else {\r\n eventCache = ChildrenNode.EMPTY_NODE;\r\n eventCacheComplete = false;\r\n }\r\n var viewCache = newViewCache(new CacheNode(eventCache, eventCacheComplete, false), new CacheNode(serverCache, serverCacheComplete, false));\r\n return new View(query, viewCache);\r\n }\r\n return view;\r\n}\r\n/**\r\n * Add an event callback for the specified query.\r\n *\r\n * @param query\r\n * @param eventRegistration\r\n * @param writesCache\r\n * @param serverCache - Complete server cache, if we have it.\r\n * @param serverCacheComplete\r\n * @returns Events to raise.\r\n */\r\nfunction syncPointAddEventRegistration(syncPoint, query, eventRegistration, writesCache, serverCache, serverCacheComplete) {\r\n var view = syncPointGetView(syncPoint, query, writesCache, serverCache, serverCacheComplete);\r\n if (!syncPoint.views.has(query._queryIdentifier)) {\r\n syncPoint.views.set(query._queryIdentifier, view);\r\n }\r\n // This is guaranteed to exist now, we just created anything that was missing\r\n viewAddEventRegistration(view, eventRegistration);\r\n return viewGetInitialEvents(view, eventRegistration);\r\n}\r\n/**\r\n * Remove event callback(s). Return cancelEvents if a cancelError is specified.\r\n *\r\n * If query is the default query, we'll check all views for the specified eventRegistration.\r\n * If eventRegistration is null, we'll remove all callbacks for the specified view(s).\r\n *\r\n * @param eventRegistration - If null, remove all callbacks.\r\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\r\n * @returns removed queries and any cancel events\r\n */\r\nfunction syncPointRemoveEventRegistration(syncPoint, query, eventRegistration, cancelError) {\r\n var e_2, _a;\r\n var queryId = query._queryIdentifier;\r\n var removed = [];\r\n var cancelEvents = [];\r\n var hadCompleteView = syncPointHasCompleteView(syncPoint);\r\n if (queryId === 'default') {\r\n try {\r\n // When you do ref.off(...), we search all views for the registration to remove.\r\n for (var _b = __values(syncPoint.views.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var _d = __read(_c.value, 2), viewQueryId = _d[0], view = _d[1];\r\n cancelEvents = cancelEvents.concat(viewRemoveEventRegistration(view, eventRegistration, cancelError));\r\n if (viewIsEmpty(view)) {\r\n syncPoint.views.delete(viewQueryId);\r\n // We'll deal with complete views later.\r\n if (!view.query._queryParams.loadsAllData()) {\r\n removed.push(view.query);\r\n }\r\n }\r\n }\r\n }\r\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_2) throw e_2.error; }\r\n }\r\n }\r\n else {\r\n // remove the callback from the specific view.\r\n var view = syncPoint.views.get(queryId);\r\n if (view) {\r\n cancelEvents = cancelEvents.concat(viewRemoveEventRegistration(view, eventRegistration, cancelError));\r\n if (viewIsEmpty(view)) {\r\n syncPoint.views.delete(queryId);\r\n // We'll deal with complete views later.\r\n if (!view.query._queryParams.loadsAllData()) {\r\n removed.push(view.query);\r\n }\r\n }\r\n }\r\n }\r\n if (hadCompleteView && !syncPointHasCompleteView(syncPoint)) {\r\n // We removed our last complete view.\r\n removed.push(new (syncPointGetReferenceConstructor())(query._repo, query._path));\r\n }\r\n return { removed: removed, events: cancelEvents };\r\n}\r\nfunction syncPointGetQueryViews(syncPoint) {\r\n var e_3, _a;\r\n var result = [];\r\n try {\r\n for (var _b = __values(syncPoint.views.values()), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var view = _c.value;\r\n if (!view.query._queryParams.loadsAllData()) {\r\n result.push(view);\r\n }\r\n }\r\n }\r\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_3) throw e_3.error; }\r\n }\r\n return result;\r\n}\r\n/**\r\n * @param path - The path to the desired complete snapshot\r\n * @returns A complete cache, if it exists\r\n */\r\nfunction syncPointGetCompleteServerCache(syncPoint, path) {\r\n var e_4, _a;\r\n var serverCache = null;\r\n try {\r\n for (var _b = __values(syncPoint.views.values()), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var view = _c.value;\r\n serverCache = serverCache || viewGetCompleteServerCache(view, path);\r\n }\r\n }\r\n catch (e_4_1) { e_4 = { error: e_4_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_4) throw e_4.error; }\r\n }\r\n return serverCache;\r\n}\r\nfunction syncPointViewForQuery(syncPoint, query) {\r\n var params = query._queryParams;\r\n if (params.loadsAllData()) {\r\n return syncPointGetCompleteView(syncPoint);\r\n }\r\n else {\r\n var queryId = query._queryIdentifier;\r\n return syncPoint.views.get(queryId);\r\n }\r\n}\r\nfunction syncPointViewExistsForQuery(syncPoint, query) {\r\n return syncPointViewForQuery(syncPoint, query) != null;\r\n}\r\nfunction syncPointHasCompleteView(syncPoint) {\r\n return syncPointGetCompleteView(syncPoint) != null;\r\n}\r\nfunction syncPointGetCompleteView(syncPoint) {\r\n var e_5, _a;\r\n try {\r\n for (var _b = __values(syncPoint.views.values()), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var view = _c.value;\r\n if (view.query._queryParams.loadsAllData()) {\r\n return view;\r\n }\r\n }\r\n }\r\n catch (e_5_1) { e_5 = { error: e_5_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_5) throw e_5.error; }\r\n }\r\n return null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar referenceConstructor;\r\nfunction syncTreeSetReferenceConstructor(val) {\r\n assert(!referenceConstructor, '__referenceConstructor has already been defined');\r\n referenceConstructor = val;\r\n}\r\nfunction syncTreeGetReferenceConstructor() {\r\n assert(referenceConstructor, 'Reference.ts has not been loaded');\r\n return referenceConstructor;\r\n}\r\n/**\r\n * Static tracker for next query tag.\r\n */\r\nvar syncTreeNextQueryTag_ = 1;\r\n/**\r\n * SyncTree is the central class for managing event callback registration, data caching, views\r\n * (query processing), and event generation. There are typically two SyncTree instances for\r\n * each Repo, one for the normal Firebase data, and one for the .info data.\r\n *\r\n * It has a number of responsibilities, including:\r\n * - Tracking all user event callbacks (registered via addEventRegistration() and removeEventRegistration()).\r\n * - Applying and caching data changes for user set(), transaction(), and update() calls\r\n * (applyUserOverwrite(), applyUserMerge()).\r\n * - Applying and caching data changes for server data changes (applyServerOverwrite(),\r\n * applyServerMerge()).\r\n * - Generating user-facing events for server and user changes (all of the apply* methods\r\n * return the set of events that need to be raised as a result).\r\n * - Maintaining the appropriate set of server listens to ensure we are always subscribed\r\n * to the correct set of paths and queries to satisfy the current set of user event\r\n * callbacks (listens are started/stopped using the provided listenProvider).\r\n *\r\n * NOTE: Although SyncTree tracks event callbacks and calculates events to raise, the actual\r\n * events are returned to the caller rather than raised synchronously.\r\n *\r\n */\r\nvar SyncTree = /** @class */ (function () {\r\n /**\r\n * @param listenProvider_ - Used by SyncTree to start / stop listening\r\n * to server data.\r\n */\r\n function SyncTree(listenProvider_) {\r\n this.listenProvider_ = listenProvider_;\r\n /**\r\n * Tree of SyncPoints. There's a SyncPoint at any location that has 1 or more views.\r\n */\r\n this.syncPointTree_ = new ImmutableTree(null);\r\n /**\r\n * A tree of all pending user writes (user-initiated set()'s, transaction()'s, update()'s, etc.).\r\n */\r\n this.pendingWriteTree_ = newWriteTree();\r\n this.tagToQueryMap = new Map();\r\n this.queryToTagMap = new Map();\r\n }\r\n return SyncTree;\r\n}());\r\n/**\r\n * Apply the data changes for a user-generated set() or transaction() call.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyUserOverwrite(syncTree, path, newData, writeId, visible) {\r\n // Record pending write.\r\n writeTreeAddOverwrite(syncTree.pendingWriteTree_, path, newData, writeId, visible);\r\n if (!visible) {\r\n return [];\r\n }\r\n else {\r\n return syncTreeApplyOperationToSyncPoints_(syncTree, new Overwrite(newOperationSourceUser(), path, newData));\r\n }\r\n}\r\n/**\r\n * Apply the data from a user-generated update() call\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyUserMerge(syncTree, path, changedChildren, writeId) {\r\n // Record pending merge.\r\n writeTreeAddMerge(syncTree.pendingWriteTree_, path, changedChildren, writeId);\r\n var changeTree = ImmutableTree.fromObject(changedChildren);\r\n return syncTreeApplyOperationToSyncPoints_(syncTree, new Merge(newOperationSourceUser(), path, changeTree));\r\n}\r\n/**\r\n * Acknowledge a pending user write that was previously registered with applyUserOverwrite() or applyUserMerge().\r\n *\r\n * @param revert - True if the given write failed and needs to be reverted\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeAckUserWrite(syncTree, writeId, revert) {\r\n if (revert === void 0) { revert = false; }\r\n var write = writeTreeGetWrite(syncTree.pendingWriteTree_, writeId);\r\n var needToReevaluate = writeTreeRemoveWrite(syncTree.pendingWriteTree_, writeId);\r\n if (!needToReevaluate) {\r\n return [];\r\n }\r\n else {\r\n var affectedTree_1 = new ImmutableTree(null);\r\n if (write.snap != null) {\r\n // overwrite\r\n affectedTree_1 = affectedTree_1.set(newEmptyPath(), true);\r\n }\r\n else {\r\n each(write.children, function (pathString) {\r\n affectedTree_1 = affectedTree_1.set(new Path(pathString), true);\r\n });\r\n }\r\n return syncTreeApplyOperationToSyncPoints_(syncTree, new AckUserWrite(write.path, affectedTree_1, revert));\r\n }\r\n}\r\n/**\r\n * Apply new server data for the specified path..\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyServerOverwrite(syncTree, path, newData) {\r\n return syncTreeApplyOperationToSyncPoints_(syncTree, new Overwrite(newOperationSourceServer(), path, newData));\r\n}\r\n/**\r\n * Apply new server data to be merged in at the specified path.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyServerMerge(syncTree, path, changedChildren) {\r\n var changeTree = ImmutableTree.fromObject(changedChildren);\r\n return syncTreeApplyOperationToSyncPoints_(syncTree, new Merge(newOperationSourceServer(), path, changeTree));\r\n}\r\n/**\r\n * Apply a listen complete for a query\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyListenComplete(syncTree, path) {\r\n return syncTreeApplyOperationToSyncPoints_(syncTree, new ListenComplete(newOperationSourceServer(), path));\r\n}\r\n/**\r\n * Apply a listen complete for a tagged query\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyTaggedListenComplete(syncTree, path, tag) {\r\n var queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\r\n if (queryKey) {\r\n var r = syncTreeParseQueryKey_(queryKey);\r\n var queryPath = r.path, queryId = r.queryId;\r\n var relativePath = newRelativePath(queryPath, path);\r\n var op = new ListenComplete(newOperationSourceServerTaggedQuery(queryId), relativePath);\r\n return syncTreeApplyTaggedOperation_(syncTree, queryPath, op);\r\n }\r\n else {\r\n // We've already removed the query. No big deal, ignore the update\r\n return [];\r\n }\r\n}\r\n/**\r\n * Remove event callback(s).\r\n *\r\n * If query is the default query, we'll check all queries for the specified eventRegistration.\r\n * If eventRegistration is null, we'll remove all callbacks for the specified query/queries.\r\n *\r\n * @param eventRegistration - If null, all callbacks are removed.\r\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\r\n * @returns Cancel events, if cancelError was provided.\r\n */\r\nfunction syncTreeRemoveEventRegistration(syncTree, query, eventRegistration, cancelError) {\r\n // Find the syncPoint first. Then deal with whether or not it has matching listeners\r\n var path = query._path;\r\n var maybeSyncPoint = syncTree.syncPointTree_.get(path);\r\n var cancelEvents = [];\r\n // A removal on a default query affects all queries at that location. A removal on an indexed query, even one without\r\n // other query constraints, does *not* affect all queries at that location. So this check must be for 'default', and\r\n // not loadsAllData().\r\n if (maybeSyncPoint &&\r\n (query._queryIdentifier === 'default' ||\r\n syncPointViewExistsForQuery(maybeSyncPoint, query))) {\r\n var removedAndEvents = syncPointRemoveEventRegistration(maybeSyncPoint, query, eventRegistration, cancelError);\r\n if (syncPointIsEmpty(maybeSyncPoint)) {\r\n syncTree.syncPointTree_ = syncTree.syncPointTree_.remove(path);\r\n }\r\n var removed = removedAndEvents.removed;\r\n cancelEvents = removedAndEvents.events;\r\n // We may have just removed one of many listeners and can short-circuit this whole process\r\n // We may also not have removed a default listener, in which case all of the descendant listeners should already be\r\n // properly set up.\r\n //\r\n // Since indexed queries can shadow if they don't have other query constraints, check for loadsAllData(), instead of\r\n // queryId === 'default'\r\n var removingDefault = -1 !==\r\n removed.findIndex(function (query) {\r\n return query._queryParams.loadsAllData();\r\n });\r\n var covered = syncTree.syncPointTree_.findOnPath(path, function (relativePath, parentSyncPoint) {\r\n return syncPointHasCompleteView(parentSyncPoint);\r\n });\r\n if (removingDefault && !covered) {\r\n var subtree = syncTree.syncPointTree_.subtree(path);\r\n // There are potentially child listeners. Determine what if any listens we need to send before executing the\r\n // removal\r\n if (!subtree.isEmpty()) {\r\n // We need to fold over our subtree and collect the listeners to send\r\n var newViews = syncTreeCollectDistinctViewsForSubTree_(subtree);\r\n // Ok, we've collected all the listens we need. Set them up.\r\n for (var i = 0; i < newViews.length; ++i) {\r\n var view = newViews[i], newQuery = view.query;\r\n var listener = syncTreeCreateListenerForView_(syncTree, view);\r\n syncTree.listenProvider_.startListening(syncTreeQueryForListening_(newQuery), syncTreeTagForQuery_(syncTree, newQuery), listener.hashFn, listener.onComplete);\r\n }\r\n }\r\n }\r\n // If we removed anything and we're not covered by a higher up listen, we need to stop listening on this query\r\n // The above block has us covered in terms of making sure we're set up on listens lower in the tree.\r\n // Also, note that if we have a cancelError, it's already been removed at the provider level.\r\n if (!covered && removed.length > 0 && !cancelError) {\r\n // If we removed a default, then we weren't listening on any of the other queries here. Just cancel the one\r\n // default. Otherwise, we need to iterate through and cancel each individual query\r\n if (removingDefault) {\r\n // We don't tag default listeners\r\n var defaultTag = null;\r\n syncTree.listenProvider_.stopListening(syncTreeQueryForListening_(query), defaultTag);\r\n }\r\n else {\r\n removed.forEach(function (queryToRemove) {\r\n var tagToRemove = syncTree.queryToTagMap.get(syncTreeMakeQueryKey_(queryToRemove));\r\n syncTree.listenProvider_.stopListening(syncTreeQueryForListening_(queryToRemove), tagToRemove);\r\n });\r\n }\r\n }\r\n // Now, clear all of the tags we're tracking for the removed listens\r\n syncTreeRemoveTags_(syncTree, removed);\r\n }\r\n return cancelEvents;\r\n}\r\n/**\r\n * Apply new server data for the specified tagged query.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyTaggedQueryOverwrite(syncTree, path, snap, tag) {\r\n var queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\r\n if (queryKey != null) {\r\n var r = syncTreeParseQueryKey_(queryKey);\r\n var queryPath = r.path, queryId = r.queryId;\r\n var relativePath = newRelativePath(queryPath, path);\r\n var op = new Overwrite(newOperationSourceServerTaggedQuery(queryId), relativePath, snap);\r\n return syncTreeApplyTaggedOperation_(syncTree, queryPath, op);\r\n }\r\n else {\r\n // Query must have been removed already\r\n return [];\r\n }\r\n}\r\n/**\r\n * Apply server data to be merged in for the specified tagged query.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyTaggedQueryMerge(syncTree, path, changedChildren, tag) {\r\n var queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\r\n if (queryKey) {\r\n var r = syncTreeParseQueryKey_(queryKey);\r\n var queryPath = r.path, queryId = r.queryId;\r\n var relativePath = newRelativePath(queryPath, path);\r\n var changeTree = ImmutableTree.fromObject(changedChildren);\r\n var op = new Merge(newOperationSourceServerTaggedQuery(queryId), relativePath, changeTree);\r\n return syncTreeApplyTaggedOperation_(syncTree, queryPath, op);\r\n }\r\n else {\r\n // We've already removed the query. No big deal, ignore the update\r\n return [];\r\n }\r\n}\r\n/**\r\n * Add an event callback for the specified query.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeAddEventRegistration(syncTree, query, eventRegistration) {\r\n var path = query._path;\r\n var serverCache = null;\r\n var foundAncestorDefaultView = false;\r\n // Any covering writes will necessarily be at the root, so really all we need to find is the server cache.\r\n // Consider optimizing this once there's a better understanding of what actual behavior will be.\r\n syncTree.syncPointTree_.foreachOnPath(path, function (pathToSyncPoint, sp) {\r\n var relativePath = newRelativePath(pathToSyncPoint, path);\r\n serverCache =\r\n serverCache || syncPointGetCompleteServerCache(sp, relativePath);\r\n foundAncestorDefaultView =\r\n foundAncestorDefaultView || syncPointHasCompleteView(sp);\r\n });\r\n var syncPoint = syncTree.syncPointTree_.get(path);\r\n if (!syncPoint) {\r\n syncPoint = new SyncPoint();\r\n syncTree.syncPointTree_ = syncTree.syncPointTree_.set(path, syncPoint);\r\n }\r\n else {\r\n foundAncestorDefaultView =\r\n foundAncestorDefaultView || syncPointHasCompleteView(syncPoint);\r\n serverCache =\r\n serverCache || syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\r\n }\r\n var serverCacheComplete;\r\n if (serverCache != null) {\r\n serverCacheComplete = true;\r\n }\r\n else {\r\n serverCacheComplete = false;\r\n serverCache = ChildrenNode.EMPTY_NODE;\r\n var subtree = syncTree.syncPointTree_.subtree(path);\r\n subtree.foreachChild(function (childName, childSyncPoint) {\r\n var completeCache = syncPointGetCompleteServerCache(childSyncPoint, newEmptyPath());\r\n if (completeCache) {\r\n serverCache = serverCache.updateImmediateChild(childName, completeCache);\r\n }\r\n });\r\n }\r\n var viewAlreadyExists = syncPointViewExistsForQuery(syncPoint, query);\r\n if (!viewAlreadyExists && !query._queryParams.loadsAllData()) {\r\n // We need to track a tag for this query\r\n var queryKey = syncTreeMakeQueryKey_(query);\r\n assert(!syncTree.queryToTagMap.has(queryKey), 'View does not exist, but we have a tag');\r\n var tag = syncTreeGetNextQueryTag_();\r\n syncTree.queryToTagMap.set(queryKey, tag);\r\n syncTree.tagToQueryMap.set(tag, queryKey);\r\n }\r\n var writesCache = writeTreeChildWrites(syncTree.pendingWriteTree_, path);\r\n var events = syncPointAddEventRegistration(syncPoint, query, eventRegistration, writesCache, serverCache, serverCacheComplete);\r\n if (!viewAlreadyExists && !foundAncestorDefaultView) {\r\n var view = syncPointViewForQuery(syncPoint, query);\r\n events = events.concat(syncTreeSetupListener_(syncTree, query, view));\r\n }\r\n return events;\r\n}\r\n/**\r\n * Returns a complete cache, if we have one, of the data at a particular path. If the location does not have a\r\n * listener above it, we will get a false \"null\". This shouldn't be a problem because transactions will always\r\n * have a listener above, and atomic operations would correctly show a jitter of ->\r\n * as the write is applied locally and then acknowledged at the server.\r\n *\r\n * Note: this method will *include* hidden writes from transaction with applyLocally set to false.\r\n *\r\n * @param path - The path to the data we want\r\n * @param writeIdsToExclude - A specific set to be excluded\r\n */\r\nfunction syncTreeCalcCompleteEventCache(syncTree, path, writeIdsToExclude) {\r\n var includeHiddenSets = true;\r\n var writeTree = syncTree.pendingWriteTree_;\r\n var serverCache = syncTree.syncPointTree_.findOnPath(path, function (pathSoFar, syncPoint) {\r\n var relativePath = newRelativePath(pathSoFar, path);\r\n var serverCache = syncPointGetCompleteServerCache(syncPoint, relativePath);\r\n if (serverCache) {\r\n return serverCache;\r\n }\r\n });\r\n return writeTreeCalcCompleteEventCache(writeTree, path, serverCache, writeIdsToExclude, includeHiddenSets);\r\n}\r\nfunction syncTreeGetServerValue(syncTree, query) {\r\n var path = query._path;\r\n var serverCache = null;\r\n // Any covering writes will necessarily be at the root, so really all we need to find is the server cache.\r\n // Consider optimizing this once there's a better understanding of what actual behavior will be.\r\n syncTree.syncPointTree_.foreachOnPath(path, function (pathToSyncPoint, sp) {\r\n var relativePath = newRelativePath(pathToSyncPoint, path);\r\n serverCache =\r\n serverCache || syncPointGetCompleteServerCache(sp, relativePath);\r\n });\r\n var syncPoint = syncTree.syncPointTree_.get(path);\r\n if (!syncPoint) {\r\n syncPoint = new SyncPoint();\r\n syncTree.syncPointTree_ = syncTree.syncPointTree_.set(path, syncPoint);\r\n }\r\n else {\r\n serverCache =\r\n serverCache || syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\r\n }\r\n var serverCacheComplete = serverCache != null;\r\n var serverCacheNode = serverCacheComplete\r\n ? new CacheNode(serverCache, true, false)\r\n : null;\r\n var writesCache = writeTreeChildWrites(syncTree.pendingWriteTree_, query._path);\r\n var view = syncPointGetView(syncPoint, query, writesCache, serverCacheComplete ? serverCacheNode.getNode() : ChildrenNode.EMPTY_NODE, serverCacheComplete);\r\n return viewGetCompleteNode(view);\r\n}\r\n/**\r\n * A helper method that visits all descendant and ancestor SyncPoints, applying the operation.\r\n *\r\n * NOTES:\r\n * - Descendant SyncPoints will be visited first (since we raise events depth-first).\r\n *\r\n * - We call applyOperation() on each SyncPoint passing three things:\r\n * 1. A version of the Operation that has been made relative to the SyncPoint location.\r\n * 2. A WriteTreeRef of any writes we have cached at the SyncPoint location.\r\n * 3. A snapshot Node with cached server data, if we have it.\r\n *\r\n * - We concatenate all of the events returned by each SyncPoint and return the result.\r\n */\r\nfunction syncTreeApplyOperationToSyncPoints_(syncTree, operation) {\r\n return syncTreeApplyOperationHelper_(operation, syncTree.syncPointTree_, \r\n /*serverCache=*/ null, writeTreeChildWrites(syncTree.pendingWriteTree_, newEmptyPath()));\r\n}\r\n/**\r\n * Recursive helper for applyOperationToSyncPoints_\r\n */\r\nfunction syncTreeApplyOperationHelper_(operation, syncPointTree, serverCache, writesCache) {\r\n if (pathIsEmpty(operation.path)) {\r\n return syncTreeApplyOperationDescendantsHelper_(operation, syncPointTree, serverCache, writesCache);\r\n }\r\n else {\r\n var syncPoint = syncPointTree.get(newEmptyPath());\r\n // If we don't have cached server data, see if we can get it from this SyncPoint.\r\n if (serverCache == null && syncPoint != null) {\r\n serverCache = syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\r\n }\r\n var events = [];\r\n var childName = pathGetFront(operation.path);\r\n var childOperation = operation.operationForChild(childName);\r\n var childTree = syncPointTree.children.get(childName);\r\n if (childTree && childOperation) {\r\n var childServerCache = serverCache\r\n ? serverCache.getImmediateChild(childName)\r\n : null;\r\n var childWritesCache = writeTreeRefChild(writesCache, childName);\r\n events = events.concat(syncTreeApplyOperationHelper_(childOperation, childTree, childServerCache, childWritesCache));\r\n }\r\n if (syncPoint) {\r\n events = events.concat(syncPointApplyOperation(syncPoint, operation, writesCache, serverCache));\r\n }\r\n return events;\r\n }\r\n}\r\n/**\r\n * Recursive helper for applyOperationToSyncPoints_\r\n */\r\nfunction syncTreeApplyOperationDescendantsHelper_(operation, syncPointTree, serverCache, writesCache) {\r\n var syncPoint = syncPointTree.get(newEmptyPath());\r\n // If we don't have cached server data, see if we can get it from this SyncPoint.\r\n if (serverCache == null && syncPoint != null) {\r\n serverCache = syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\r\n }\r\n var events = [];\r\n syncPointTree.children.inorderTraversal(function (childName, childTree) {\r\n var childServerCache = serverCache\r\n ? serverCache.getImmediateChild(childName)\r\n : null;\r\n var childWritesCache = writeTreeRefChild(writesCache, childName);\r\n var childOperation = operation.operationForChild(childName);\r\n if (childOperation) {\r\n events = events.concat(syncTreeApplyOperationDescendantsHelper_(childOperation, childTree, childServerCache, childWritesCache));\r\n }\r\n });\r\n if (syncPoint) {\r\n events = events.concat(syncPointApplyOperation(syncPoint, operation, writesCache, serverCache));\r\n }\r\n return events;\r\n}\r\nfunction syncTreeCreateListenerForView_(syncTree, view) {\r\n var query = view.query;\r\n var tag = syncTreeTagForQuery_(syncTree, query);\r\n return {\r\n hashFn: function () {\r\n var cache = viewGetServerCache(view) || ChildrenNode.EMPTY_NODE;\r\n return cache.hash();\r\n },\r\n onComplete: function (status) {\r\n if (status === 'ok') {\r\n if (tag) {\r\n return syncTreeApplyTaggedListenComplete(syncTree, query._path, tag);\r\n }\r\n else {\r\n return syncTreeApplyListenComplete(syncTree, query._path);\r\n }\r\n }\r\n else {\r\n // If a listen failed, kill all of the listeners here, not just the one that triggered the error.\r\n // Note that this may need to be scoped to just this listener if we change permissions on filtered children\r\n var error = errorForServerCode(status, query);\r\n return syncTreeRemoveEventRegistration(syncTree, query, \r\n /*eventRegistration*/ null, error);\r\n }\r\n }\r\n };\r\n}\r\n/**\r\n * Return the tag associated with the given query.\r\n */\r\nfunction syncTreeTagForQuery_(syncTree, query) {\r\n var queryKey = syncTreeMakeQueryKey_(query);\r\n return syncTree.queryToTagMap.get(queryKey);\r\n}\r\n/**\r\n * Given a query, computes a \"queryKey\" suitable for use in our queryToTagMap_.\r\n */\r\nfunction syncTreeMakeQueryKey_(query) {\r\n return query._path.toString() + '$' + query._queryIdentifier;\r\n}\r\n/**\r\n * Return the query associated with the given tag, if we have one\r\n */\r\nfunction syncTreeQueryKeyForTag_(syncTree, tag) {\r\n return syncTree.tagToQueryMap.get(tag);\r\n}\r\n/**\r\n * Given a queryKey (created by makeQueryKey), parse it back into a path and queryId.\r\n */\r\nfunction syncTreeParseQueryKey_(queryKey) {\r\n var splitIndex = queryKey.indexOf('$');\r\n assert(splitIndex !== -1 && splitIndex < queryKey.length - 1, 'Bad queryKey.');\r\n return {\r\n queryId: queryKey.substr(splitIndex + 1),\r\n path: new Path(queryKey.substr(0, splitIndex))\r\n };\r\n}\r\n/**\r\n * A helper method to apply tagged operations\r\n */\r\nfunction syncTreeApplyTaggedOperation_(syncTree, queryPath, operation) {\r\n var syncPoint = syncTree.syncPointTree_.get(queryPath);\r\n assert(syncPoint, \"Missing sync point for query tag that we're tracking\");\r\n var writesCache = writeTreeChildWrites(syncTree.pendingWriteTree_, queryPath);\r\n return syncPointApplyOperation(syncPoint, operation, writesCache, null);\r\n}\r\n/**\r\n * This collapses multiple unfiltered views into a single view, since we only need a single\r\n * listener for them.\r\n */\r\nfunction syncTreeCollectDistinctViewsForSubTree_(subtree) {\r\n return subtree.fold(function (relativePath, maybeChildSyncPoint, childMap) {\r\n if (maybeChildSyncPoint && syncPointHasCompleteView(maybeChildSyncPoint)) {\r\n var completeView = syncPointGetCompleteView(maybeChildSyncPoint);\r\n return [completeView];\r\n }\r\n else {\r\n // No complete view here, flatten any deeper listens into an array\r\n var views_1 = [];\r\n if (maybeChildSyncPoint) {\r\n views_1 = syncPointGetQueryViews(maybeChildSyncPoint);\r\n }\r\n each(childMap, function (_key, childViews) {\r\n views_1 = views_1.concat(childViews);\r\n });\r\n return views_1;\r\n }\r\n });\r\n}\r\n/**\r\n * Normalizes a query to a query we send the server for listening\r\n *\r\n * @returns The normalized query\r\n */\r\nfunction syncTreeQueryForListening_(query) {\r\n if (query._queryParams.loadsAllData() && !query._queryParams.isDefault()) {\r\n // We treat queries that load all data as default queries\r\n // Cast is necessary because ref() technically returns Firebase which is actually fb.api.Firebase which inherits\r\n // from Query\r\n return new (syncTreeGetReferenceConstructor())(query._repo, query._path);\r\n }\r\n else {\r\n return query;\r\n }\r\n}\r\nfunction syncTreeRemoveTags_(syncTree, queries) {\r\n for (var j = 0; j < queries.length; ++j) {\r\n var removedQuery = queries[j];\r\n if (!removedQuery._queryParams.loadsAllData()) {\r\n // We should have a tag for this\r\n var removedQueryKey = syncTreeMakeQueryKey_(removedQuery);\r\n var removedQueryTag = syncTree.queryToTagMap.get(removedQueryKey);\r\n syncTree.queryToTagMap.delete(removedQueryKey);\r\n syncTree.tagToQueryMap.delete(removedQueryTag);\r\n }\r\n }\r\n}\r\n/**\r\n * Static accessor for query tags.\r\n */\r\nfunction syncTreeGetNextQueryTag_() {\r\n return syncTreeNextQueryTag_++;\r\n}\r\n/**\r\n * For a given new listen, manage the de-duplication of outstanding subscriptions.\r\n *\r\n * @returns This method can return events to support synchronous data sources\r\n */\r\nfunction syncTreeSetupListener_(syncTree, query, view) {\r\n var path = query._path;\r\n var tag = syncTreeTagForQuery_(syncTree, query);\r\n var listener = syncTreeCreateListenerForView_(syncTree, view);\r\n var events = syncTree.listenProvider_.startListening(syncTreeQueryForListening_(query), tag, listener.hashFn, listener.onComplete);\r\n var subtree = syncTree.syncPointTree_.subtree(path);\r\n // The root of this subtree has our query. We're here because we definitely need to send a listen for that, but we\r\n // may need to shadow other listens as well.\r\n if (tag) {\r\n assert(!syncPointHasCompleteView(subtree.value), \"If we're adding a query, it shouldn't be shadowed\");\r\n }\r\n else {\r\n // Shadow everything at or below this location, this is a default listener.\r\n var queriesToStop = subtree.fold(function (relativePath, maybeChildSyncPoint, childMap) {\r\n if (!pathIsEmpty(relativePath) &&\r\n maybeChildSyncPoint &&\r\n syncPointHasCompleteView(maybeChildSyncPoint)) {\r\n return [syncPointGetCompleteView(maybeChildSyncPoint).query];\r\n }\r\n else {\r\n // No default listener here, flatten any deeper queries into an array\r\n var queries_1 = [];\r\n if (maybeChildSyncPoint) {\r\n queries_1 = queries_1.concat(syncPointGetQueryViews(maybeChildSyncPoint).map(function (view) { return view.query; }));\r\n }\r\n each(childMap, function (_key, childQueries) {\r\n queries_1 = queries_1.concat(childQueries);\r\n });\r\n return queries_1;\r\n }\r\n });\r\n for (var i = 0; i < queriesToStop.length; ++i) {\r\n var queryToStop = queriesToStop[i];\r\n syncTree.listenProvider_.stopListening(syncTreeQueryForListening_(queryToStop), syncTreeTagForQuery_(syncTree, queryToStop));\r\n }\r\n }\r\n return events;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar ExistingValueProvider = /** @class */ (function () {\r\n function ExistingValueProvider(node_) {\r\n this.node_ = node_;\r\n }\r\n ExistingValueProvider.prototype.getImmediateChild = function (childName) {\r\n var child = this.node_.getImmediateChild(childName);\r\n return new ExistingValueProvider(child);\r\n };\r\n ExistingValueProvider.prototype.node = function () {\r\n return this.node_;\r\n };\r\n return ExistingValueProvider;\r\n}());\r\nvar DeferredValueProvider = /** @class */ (function () {\r\n function DeferredValueProvider(syncTree, path) {\r\n this.syncTree_ = syncTree;\r\n this.path_ = path;\r\n }\r\n DeferredValueProvider.prototype.getImmediateChild = function (childName) {\r\n var childPath = pathChild(this.path_, childName);\r\n return new DeferredValueProvider(this.syncTree_, childPath);\r\n };\r\n DeferredValueProvider.prototype.node = function () {\r\n return syncTreeCalcCompleteEventCache(this.syncTree_, this.path_);\r\n };\r\n return DeferredValueProvider;\r\n}());\r\n/**\r\n * Generate placeholders for deferred values.\r\n */\r\nvar generateWithValues = function (values) {\r\n values = values || {};\r\n values['timestamp'] = values['timestamp'] || new Date().getTime();\r\n return values;\r\n};\r\n/**\r\n * Value to use when firing local events. When writing server values, fire\r\n * local events with an approximate value, otherwise return value as-is.\r\n */\r\nvar resolveDeferredLeafValue = function (value, existingVal, serverValues) {\r\n if (!value || typeof value !== 'object') {\r\n return value;\r\n }\r\n assert('.sv' in value, 'Unexpected leaf node or priority contents');\r\n if (typeof value['.sv'] === 'string') {\r\n return resolveScalarDeferredValue(value['.sv'], existingVal, serverValues);\r\n }\r\n else if (typeof value['.sv'] === 'object') {\r\n return resolveComplexDeferredValue(value['.sv'], existingVal);\r\n }\r\n else {\r\n assert(false, 'Unexpected server value: ' + JSON.stringify(value, null, 2));\r\n }\r\n};\r\nvar resolveScalarDeferredValue = function (op, existing, serverValues) {\r\n switch (op) {\r\n case 'timestamp':\r\n return serverValues['timestamp'];\r\n default:\r\n assert(false, 'Unexpected server value: ' + op);\r\n }\r\n};\r\nvar resolveComplexDeferredValue = function (op, existing, unused) {\r\n if (!op.hasOwnProperty('increment')) {\r\n assert(false, 'Unexpected server value: ' + JSON.stringify(op, null, 2));\r\n }\r\n var delta = op['increment'];\r\n if (typeof delta !== 'number') {\r\n assert(false, 'Unexpected increment value: ' + delta);\r\n }\r\n var existingNode = existing.node();\r\n assert(existingNode !== null && typeof existingNode !== 'undefined', 'Expected ChildrenNode.EMPTY_NODE for nulls');\r\n // Incrementing a non-number sets the value to the incremented amount\r\n if (!existingNode.isLeafNode()) {\r\n return delta;\r\n }\r\n var leaf = existingNode;\r\n var existingVal = leaf.getValue();\r\n if (typeof existingVal !== 'number') {\r\n return delta;\r\n }\r\n // No need to do over/underflow arithmetic here because JS only handles floats under the covers\r\n return existingVal + delta;\r\n};\r\n/**\r\n * Recursively replace all deferred values and priorities in the tree with the\r\n * specified generated replacement values.\r\n * @param path - path to which write is relative\r\n * @param node - new data written at path\r\n * @param syncTree - current data\r\n */\r\nvar resolveDeferredValueTree = function (path, node, syncTree, serverValues) {\r\n return resolveDeferredValue(node, new DeferredValueProvider(syncTree, path), serverValues);\r\n};\r\n/**\r\n * Recursively replace all deferred values and priorities in the node with the\r\n * specified generated replacement values. If there are no server values in the node,\r\n * it'll be returned as-is.\r\n */\r\nvar resolveDeferredValueSnapshot = function (node, existing, serverValues) {\r\n return resolveDeferredValue(node, new ExistingValueProvider(existing), serverValues);\r\n};\r\nfunction resolveDeferredValue(node, existingVal, serverValues) {\r\n var rawPri = node.getPriority().val();\r\n var priority = resolveDeferredLeafValue(rawPri, existingVal.getImmediateChild('.priority'), serverValues);\r\n var newNode;\r\n if (node.isLeafNode()) {\r\n var leafNode = node;\r\n var value = resolveDeferredLeafValue(leafNode.getValue(), existingVal, serverValues);\r\n if (value !== leafNode.getValue() ||\r\n priority !== leafNode.getPriority().val()) {\r\n return new LeafNode(value, nodeFromJSON(priority));\r\n }\r\n else {\r\n return node;\r\n }\r\n }\r\n else {\r\n var childrenNode = node;\r\n newNode = childrenNode;\r\n if (priority !== childrenNode.getPriority().val()) {\r\n newNode = newNode.updatePriority(new LeafNode(priority));\r\n }\r\n childrenNode.forEachChild(PRIORITY_INDEX, function (childName, childNode) {\r\n var newChildNode = resolveDeferredValue(childNode, existingVal.getImmediateChild(childName), serverValues);\r\n if (newChildNode !== childNode) {\r\n newNode = newNode.updateImmediateChild(childName, newChildNode);\r\n }\r\n });\r\n return newNode;\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A light-weight tree, traversable by path. Nodes can have both values and children.\r\n * Nodes are not enumerated (by forEachChild) unless they have a value or non-empty\r\n * children.\r\n */\r\nvar Tree = /** @class */ (function () {\r\n /**\r\n * @param name - Optional name of the node.\r\n * @param parent - Optional parent node.\r\n * @param node - Optional node to wrap.\r\n */\r\n function Tree(name, parent, node) {\r\n if (name === void 0) { name = ''; }\r\n if (parent === void 0) { parent = null; }\r\n if (node === void 0) { node = { children: {}, childCount: 0 }; }\r\n this.name = name;\r\n this.parent = parent;\r\n this.node = node;\r\n }\r\n return Tree;\r\n}());\r\n/**\r\n * Returns a sub-Tree for the given path.\r\n *\r\n * @param pathObj - Path to look up.\r\n * @returns Tree for path.\r\n */\r\nfunction treeSubTree(tree, pathObj) {\r\n // TODO: Require pathObj to be Path?\r\n var path = pathObj instanceof Path ? pathObj : new Path(pathObj);\r\n var child = tree, next = pathGetFront(path);\r\n while (next !== null) {\r\n var childNode = safeGet(child.node.children, next) || {\r\n children: {},\r\n childCount: 0\r\n };\r\n child = new Tree(next, child, childNode);\r\n path = pathPopFront(path);\r\n next = pathGetFront(path);\r\n }\r\n return child;\r\n}\r\n/**\r\n * Returns the data associated with this tree node.\r\n *\r\n * @returns The data or null if no data exists.\r\n */\r\nfunction treeGetValue(tree) {\r\n return tree.node.value;\r\n}\r\n/**\r\n * Sets data to this tree node.\r\n *\r\n * @param value - Value to set.\r\n */\r\nfunction treeSetValue(tree, value) {\r\n tree.node.value = value;\r\n treeUpdateParents(tree);\r\n}\r\n/**\r\n * @returns Whether the tree has any children.\r\n */\r\nfunction treeHasChildren(tree) {\r\n return tree.node.childCount > 0;\r\n}\r\n/**\r\n * @returns Whethe rthe tree is empty (no value or children).\r\n */\r\nfunction treeIsEmpty(tree) {\r\n return treeGetValue(tree) === undefined && !treeHasChildren(tree);\r\n}\r\n/**\r\n * Calls action for each child of this tree node.\r\n *\r\n * @param action - Action to be called for each child.\r\n */\r\nfunction treeForEachChild(tree, action) {\r\n each(tree.node.children, function (child, childTree) {\r\n action(new Tree(child, tree, childTree));\r\n });\r\n}\r\n/**\r\n * Does a depth-first traversal of this node's descendants, calling action for each one.\r\n *\r\n * @param action - Action to be called for each child.\r\n * @param includeSelf - Whether to call action on this node as well. Defaults to\r\n * false.\r\n * @param childrenFirst - Whether to call action on children before calling it on\r\n * parent.\r\n */\r\nfunction treeForEachDescendant(tree, action, includeSelf, childrenFirst) {\r\n if (includeSelf && !childrenFirst) {\r\n action(tree);\r\n }\r\n treeForEachChild(tree, function (child) {\r\n treeForEachDescendant(child, action, true, childrenFirst);\r\n });\r\n if (includeSelf && childrenFirst) {\r\n action(tree);\r\n }\r\n}\r\n/**\r\n * Calls action on each ancestor node.\r\n *\r\n * @param action - Action to be called on each parent; return\r\n * true to abort.\r\n * @param includeSelf - Whether to call action on this node as well.\r\n * @returns true if the action callback returned true.\r\n */\r\nfunction treeForEachAncestor(tree, action, includeSelf) {\r\n var node = includeSelf ? tree : tree.parent;\r\n while (node !== null) {\r\n if (action(node)) {\r\n return true;\r\n }\r\n node = node.parent;\r\n }\r\n return false;\r\n}\r\n/**\r\n * @returns The path of this tree node, as a Path.\r\n */\r\nfunction treeGetPath(tree) {\r\n return new Path(tree.parent === null\r\n ? tree.name\r\n : treeGetPath(tree.parent) + '/' + tree.name);\r\n}\r\n/**\r\n * Adds or removes this child from its parent based on whether it's empty or not.\r\n */\r\nfunction treeUpdateParents(tree) {\r\n if (tree.parent !== null) {\r\n treeUpdateChild(tree.parent, tree.name, tree);\r\n }\r\n}\r\n/**\r\n * Adds or removes the passed child to this tree node, depending on whether it's empty.\r\n *\r\n * @param childName - The name of the child to update.\r\n * @param child - The child to update.\r\n */\r\nfunction treeUpdateChild(tree, childName, child) {\r\n var childEmpty = treeIsEmpty(child);\r\n var childExists = contains(tree.node.children, childName);\r\n if (childEmpty && childExists) {\r\n delete tree.node.children[childName];\r\n tree.node.childCount--;\r\n treeUpdateParents(tree);\r\n }\r\n else if (!childEmpty && !childExists) {\r\n tree.node.children[childName] = child.node;\r\n tree.node.childCount++;\r\n treeUpdateParents(tree);\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * True for invalid Firebase keys\r\n */\r\nvar INVALID_KEY_REGEX_ = /[\\[\\].#$\\/\\u0000-\\u001F\\u007F]/;\r\n/**\r\n * True for invalid Firebase paths.\r\n * Allows '/' in paths.\r\n */\r\nvar INVALID_PATH_REGEX_ = /[\\[\\].#$\\u0000-\\u001F\\u007F]/;\r\n/**\r\n * Maximum number of characters to allow in leaf value\r\n */\r\nvar MAX_LEAF_SIZE_ = 10 * 1024 * 1024;\r\nvar isValidKey = function (key) {\r\n return (typeof key === 'string' && key.length !== 0 && !INVALID_KEY_REGEX_.test(key));\r\n};\r\nvar isValidPathString = function (pathString) {\r\n return (typeof pathString === 'string' &&\r\n pathString.length !== 0 &&\r\n !INVALID_PATH_REGEX_.test(pathString));\r\n};\r\nvar isValidRootPathString = function (pathString) {\r\n if (pathString) {\r\n // Allow '/.info/' at the beginning.\r\n pathString = pathString.replace(/^\\/*\\.info(\\/|$)/, '/');\r\n }\r\n return isValidPathString(pathString);\r\n};\r\nvar isValidPriority = function (priority) {\r\n return (priority === null ||\r\n typeof priority === 'string' ||\r\n (typeof priority === 'number' && !isInvalidJSONNumber(priority)) ||\r\n (priority &&\r\n typeof priority === 'object' &&\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n contains(priority, '.sv')));\r\n};\r\n/**\r\n * Pre-validate a datum passed as an argument to Firebase function.\r\n */\r\nvar validateFirebaseDataArg = function (fnName, value, path, optional) {\r\n if (optional && value === undefined) {\r\n return;\r\n }\r\n validateFirebaseData(errorPrefix(fnName, 'value'), value, path);\r\n};\r\n/**\r\n * Validate a data object client-side before sending to server.\r\n */\r\nvar validateFirebaseData = function (errorPrefix, data, path_) {\r\n var path = path_ instanceof Path ? new ValidationPath(path_, errorPrefix) : path_;\r\n if (data === undefined) {\r\n throw new Error(errorPrefix + 'contains undefined ' + validationPathToErrorString(path));\r\n }\r\n if (typeof data === 'function') {\r\n throw new Error(errorPrefix +\r\n 'contains a function ' +\r\n validationPathToErrorString(path) +\r\n ' with contents = ' +\r\n data.toString());\r\n }\r\n if (isInvalidJSONNumber(data)) {\r\n throw new Error(errorPrefix +\r\n 'contains ' +\r\n data.toString() +\r\n ' ' +\r\n validationPathToErrorString(path));\r\n }\r\n // Check max leaf size, but try to avoid the utf8 conversion if we can.\r\n if (typeof data === 'string' &&\r\n data.length > MAX_LEAF_SIZE_ / 3 &&\r\n stringLength(data) > MAX_LEAF_SIZE_) {\r\n throw new Error(errorPrefix +\r\n 'contains a string greater than ' +\r\n MAX_LEAF_SIZE_ +\r\n ' utf8 bytes ' +\r\n validationPathToErrorString(path) +\r\n \" ('\" +\r\n data.substring(0, 50) +\r\n \"...')\");\r\n }\r\n // TODO = Perf = Consider combining the recursive validation of keys into NodeFromJSON\r\n // to save extra walking of large objects.\r\n if (data && typeof data === 'object') {\r\n var hasDotValue_1 = false;\r\n var hasActualChild_1 = false;\r\n each(data, function (key, value) {\r\n if (key === '.value') {\r\n hasDotValue_1 = true;\r\n }\r\n else if (key !== '.priority' && key !== '.sv') {\r\n hasActualChild_1 = true;\r\n if (!isValidKey(key)) {\r\n throw new Error(errorPrefix +\r\n ' contains an invalid key (' +\r\n key +\r\n ') ' +\r\n validationPathToErrorString(path) +\r\n '. Keys must be non-empty strings ' +\r\n 'and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"');\r\n }\r\n }\r\n validationPathPush(path, key);\r\n validateFirebaseData(errorPrefix, value, path);\r\n validationPathPop(path);\r\n });\r\n if (hasDotValue_1 && hasActualChild_1) {\r\n throw new Error(errorPrefix +\r\n ' contains \".value\" child ' +\r\n validationPathToErrorString(path) +\r\n ' in addition to actual children.');\r\n }\r\n }\r\n};\r\n/**\r\n * Pre-validate paths passed in the firebase function.\r\n */\r\nvar validateFirebaseMergePaths = function (errorPrefix, mergePaths) {\r\n var i, curPath;\r\n for (i = 0; i < mergePaths.length; i++) {\r\n curPath = mergePaths[i];\r\n var keys = pathSlice(curPath);\r\n for (var j = 0; j < keys.length; j++) {\r\n if (keys[j] === '.priority' && j === keys.length - 1) ;\r\n else if (!isValidKey(keys[j])) {\r\n throw new Error(errorPrefix +\r\n 'contains an invalid key (' +\r\n keys[j] +\r\n ') in path ' +\r\n curPath.toString() +\r\n '. Keys must be non-empty strings ' +\r\n 'and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"');\r\n }\r\n }\r\n }\r\n // Check that update keys are not descendants of each other.\r\n // We rely on the property that sorting guarantees that ancestors come\r\n // right before descendants.\r\n mergePaths.sort(pathCompare);\r\n var prevPath = null;\r\n for (i = 0; i < mergePaths.length; i++) {\r\n curPath = mergePaths[i];\r\n if (prevPath !== null && pathContains(prevPath, curPath)) {\r\n throw new Error(errorPrefix +\r\n 'contains a path ' +\r\n prevPath.toString() +\r\n ' that is ancestor of another path ' +\r\n curPath.toString());\r\n }\r\n prevPath = curPath;\r\n }\r\n};\r\n/**\r\n * pre-validate an object passed as an argument to firebase function (\r\n * must be an object - e.g. for firebase.update()).\r\n */\r\nvar validateFirebaseMergeDataArg = function (fnName, data, path, optional) {\r\n if (optional && data === undefined) {\r\n return;\r\n }\r\n var errorPrefix$1 = errorPrefix(fnName, 'values');\r\n if (!(data && typeof data === 'object') || Array.isArray(data)) {\r\n throw new Error(errorPrefix$1 + ' must be an object containing the children to replace.');\r\n }\r\n var mergePaths = [];\r\n each(data, function (key, value) {\r\n var curPath = new Path(key);\r\n validateFirebaseData(errorPrefix$1, value, pathChild(path, curPath));\r\n if (pathGetBack(curPath) === '.priority') {\r\n if (!isValidPriority(value)) {\r\n throw new Error(errorPrefix$1 +\r\n \"contains an invalid value for '\" +\r\n curPath.toString() +\r\n \"', which must be a valid \" +\r\n 'Firebase priority (a string, finite number, server value, or null).');\r\n }\r\n }\r\n mergePaths.push(curPath);\r\n });\r\n validateFirebaseMergePaths(errorPrefix$1, mergePaths);\r\n};\r\nvar validatePriority = function (fnName, priority, optional) {\r\n if (optional && priority === undefined) {\r\n return;\r\n }\r\n if (isInvalidJSONNumber(priority)) {\r\n throw new Error(errorPrefix(fnName, 'priority') +\r\n 'is ' +\r\n priority.toString() +\r\n ', but must be a valid Firebase priority (a string, finite number, ' +\r\n 'server value, or null).');\r\n }\r\n // Special case to allow importing data with a .sv.\r\n if (!isValidPriority(priority)) {\r\n throw new Error(errorPrefix(fnName, 'priority') +\r\n 'must be a valid Firebase priority ' +\r\n '(a string, finite number, server value, or null).');\r\n }\r\n};\r\nvar validateEventType = function (fnName, eventType, optional) {\r\n if (optional && eventType === undefined) {\r\n return;\r\n }\r\n switch (eventType) {\r\n case 'value':\r\n case 'child_added':\r\n case 'child_removed':\r\n case 'child_changed':\r\n case 'child_moved':\r\n break;\r\n default:\r\n throw new Error(errorPrefix(fnName, 'eventType') +\r\n 'must be a valid event type = \"value\", \"child_added\", \"child_removed\", ' +\r\n '\"child_changed\", or \"child_moved\".');\r\n }\r\n};\r\nvar validateKey = function (fnName, argumentName, key, optional) {\r\n if (optional && key === undefined) {\r\n return;\r\n }\r\n if (!isValidKey(key)) {\r\n throw new Error(errorPrefix(fnName, argumentName) +\r\n 'was an invalid key = \"' +\r\n key +\r\n '\". Firebase keys must be non-empty strings and ' +\r\n 'can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\").');\r\n }\r\n};\r\nvar validatePathString = function (fnName, argumentName, pathString, optional) {\r\n if (optional && pathString === undefined) {\r\n return;\r\n }\r\n if (!isValidPathString(pathString)) {\r\n throw new Error(errorPrefix(fnName, argumentName) +\r\n 'was an invalid path = \"' +\r\n pathString +\r\n '\". Paths must be non-empty strings and ' +\r\n 'can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\"');\r\n }\r\n};\r\nvar validateRootPathString = function (fnName, argumentName, pathString, optional) {\r\n if (pathString) {\r\n // Allow '/.info/' at the beginning.\r\n pathString = pathString.replace(/^\\/*\\.info(\\/|$)/, '/');\r\n }\r\n validatePathString(fnName, argumentName, pathString, optional);\r\n};\r\nvar validateWritablePath = function (fnName, path) {\r\n if (pathGetFront(path) === '.info') {\r\n throw new Error(fnName + \" failed = Can't modify data under /.info/\");\r\n }\r\n};\r\nvar validateUrl = function (fnName, parsedUrl) {\r\n // TODO = Validate server better.\r\n var pathString = parsedUrl.path.toString();\r\n if (!(typeof parsedUrl.repoInfo.host === 'string') ||\r\n parsedUrl.repoInfo.host.length === 0 ||\r\n (!isValidKey(parsedUrl.repoInfo.namespace) &&\r\n parsedUrl.repoInfo.host.split(':')[0] !== 'localhost') ||\r\n (pathString.length !== 0 && !isValidRootPathString(pathString))) {\r\n throw new Error(errorPrefix(fnName, 'url') +\r\n 'must be a valid firebase URL and ' +\r\n 'the path can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\".');\r\n }\r\n};\r\nvar validateBoolean = function (fnName, argumentName, bool, optional) {\r\n if (optional && bool === undefined) {\r\n return;\r\n }\r\n if (typeof bool !== 'boolean') {\r\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a boolean.');\r\n }\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The event queue serves a few purposes:\r\n * 1. It ensures we maintain event order in the face of event callbacks doing operations that result in more\r\n * events being queued.\r\n * 2. raiseQueuedEvents() handles being called reentrantly nicely. That is, if in the course of raising events,\r\n * raiseQueuedEvents() is called again, the \"inner\" call will pick up raising events where the \"outer\" call\r\n * left off, ensuring that the events are still raised synchronously and in order.\r\n * 3. You can use raiseEventsAtPath and raiseEventsForChangedPath to ensure only relevant previously-queued\r\n * events are raised synchronously.\r\n *\r\n * NOTE: This can all go away if/when we move to async events.\r\n *\r\n */\r\nvar EventQueue = /** @class */ (function () {\r\n function EventQueue() {\r\n this.eventLists_ = [];\r\n /**\r\n * Tracks recursion depth of raiseQueuedEvents_, for debugging purposes.\r\n */\r\n this.recursionDepth_ = 0;\r\n }\r\n return EventQueue;\r\n}());\r\n/**\r\n * @param eventDataList - The new events to queue.\r\n */\r\nfunction eventQueueQueueEvents(eventQueue, eventDataList) {\r\n // We group events by path, storing them in a single EventList, to make it easier to skip over them quickly.\r\n var currList = null;\r\n for (var i = 0; i < eventDataList.length; i++) {\r\n var data = eventDataList[i];\r\n var path = data.getPath();\r\n if (currList !== null && !pathEquals(path, currList.path)) {\r\n eventQueue.eventLists_.push(currList);\r\n currList = null;\r\n }\r\n if (currList === null) {\r\n currList = { events: [], path: path };\r\n }\r\n currList.events.push(data);\r\n }\r\n if (currList) {\r\n eventQueue.eventLists_.push(currList);\r\n }\r\n}\r\n/**\r\n * Queues the specified events and synchronously raises all events (including previously queued ones)\r\n * for the specified path.\r\n *\r\n * It is assumed that the new events are all for the specified path.\r\n *\r\n * @param path - The path to raise events for.\r\n * @param eventDataList - The new events to raise.\r\n */\r\nfunction eventQueueRaiseEventsAtPath(eventQueue, path, eventDataList) {\r\n eventQueueQueueEvents(eventQueue, eventDataList);\r\n eventQueueRaiseQueuedEventsMatchingPredicate(eventQueue, function (eventPath) {\r\n return pathEquals(eventPath, path);\r\n });\r\n}\r\n/**\r\n * Queues the specified events and synchronously raises all events (including previously queued ones) for\r\n * locations related to the specified change path (i.e. all ancestors and descendants).\r\n *\r\n * It is assumed that the new events are all related (ancestor or descendant) to the specified path.\r\n *\r\n * @param changedPath - The path to raise events for.\r\n * @param eventDataList - The events to raise\r\n */\r\nfunction eventQueueRaiseEventsForChangedPath(eventQueue, changedPath, eventDataList) {\r\n eventQueueQueueEvents(eventQueue, eventDataList);\r\n eventQueueRaiseQueuedEventsMatchingPredicate(eventQueue, function (eventPath) {\r\n return pathContains(eventPath, changedPath) ||\r\n pathContains(changedPath, eventPath);\r\n });\r\n}\r\nfunction eventQueueRaiseQueuedEventsMatchingPredicate(eventQueue, predicate) {\r\n eventQueue.recursionDepth_++;\r\n var sentAll = true;\r\n for (var i = 0; i < eventQueue.eventLists_.length; i++) {\r\n var eventList = eventQueue.eventLists_[i];\r\n if (eventList) {\r\n var eventPath = eventList.path;\r\n if (predicate(eventPath)) {\r\n eventListRaise(eventQueue.eventLists_[i]);\r\n eventQueue.eventLists_[i] = null;\r\n }\r\n else {\r\n sentAll = false;\r\n }\r\n }\r\n }\r\n if (sentAll) {\r\n eventQueue.eventLists_ = [];\r\n }\r\n eventQueue.recursionDepth_--;\r\n}\r\n/**\r\n * Iterates through the list and raises each event\r\n */\r\nfunction eventListRaise(eventList) {\r\n for (var i = 0; i < eventList.events.length; i++) {\r\n var eventData = eventList.events[i];\r\n if (eventData !== null) {\r\n eventList.events[i] = null;\r\n var eventFn = eventData.getEventRunner();\r\n if (logger) {\r\n log('event: ' + eventData.toString());\r\n }\r\n exceptionGuard(eventFn);\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar INTERRUPT_REASON = 'repo_interrupt';\r\n/**\r\n * If a transaction does not succeed after 25 retries, we abort it. Among other\r\n * things this ensure that if there's ever a bug causing a mismatch between\r\n * client / server hashes for some data, we won't retry indefinitely.\r\n */\r\nvar MAX_TRANSACTION_RETRIES = 25;\r\n/**\r\n * A connection to a single data repository.\r\n */\r\nvar Repo = /** @class */ (function () {\r\n function Repo(repoInfo_, forceRestClient_, authTokenProvider_, appCheckProvider_) {\r\n this.repoInfo_ = repoInfo_;\r\n this.forceRestClient_ = forceRestClient_;\r\n this.authTokenProvider_ = authTokenProvider_;\r\n this.appCheckProvider_ = appCheckProvider_;\r\n this.dataUpdateCount = 0;\r\n this.statsListener_ = null;\r\n this.eventQueue_ = new EventQueue();\r\n this.nextWriteId_ = 1;\r\n this.interceptServerDataCallback_ = null;\r\n /** A list of data pieces and paths to be set when this client disconnects. */\r\n this.onDisconnect_ = newSparseSnapshotTree();\r\n /** Stores queues of outstanding transactions for Firebase locations. */\r\n this.transactionQueueTree_ = new Tree();\r\n // TODO: This should be @private but it's used by test_access.js and internal.js\r\n this.persistentConnection_ = null;\r\n // This key is intentionally not updated if RepoInfo is later changed or replaced\r\n this.key = this.repoInfo_.toURLString();\r\n }\r\n /**\r\n * @returns The URL corresponding to the root of this Firebase.\r\n */\r\n Repo.prototype.toString = function () {\r\n return ((this.repoInfo_.secure ? 'https://' : 'http://') + this.repoInfo_.host);\r\n };\r\n return Repo;\r\n}());\r\nfunction repoStart(repo, appId, authOverride) {\r\n repo.stats_ = statsManagerGetCollection(repo.repoInfo_);\r\n if (repo.forceRestClient_ || beingCrawled()) {\r\n repo.server_ = new ReadonlyRestClient(repo.repoInfo_, function (pathString, data, isMerge, tag) {\r\n repoOnDataUpdate(repo, pathString, data, isMerge, tag);\r\n }, repo.authTokenProvider_, repo.appCheckProvider_);\r\n // Minor hack: Fire onConnect immediately, since there's no actual connection.\r\n setTimeout(function () { return repoOnConnectStatus(repo, /* connectStatus= */ true); }, 0);\r\n }\r\n else {\r\n // Validate authOverride\r\n if (typeof authOverride !== 'undefined' && authOverride !== null) {\r\n if (typeof authOverride !== 'object') {\r\n throw new Error('Only objects are supported for option databaseAuthVariableOverride');\r\n }\r\n try {\r\n stringify(authOverride);\r\n }\r\n catch (e) {\r\n throw new Error('Invalid authOverride provided: ' + e);\r\n }\r\n }\r\n repo.persistentConnection_ = new PersistentConnection(repo.repoInfo_, appId, function (pathString, data, isMerge, tag) {\r\n repoOnDataUpdate(repo, pathString, data, isMerge, tag);\r\n }, function (connectStatus) {\r\n repoOnConnectStatus(repo, connectStatus);\r\n }, function (updates) {\r\n repoOnServerInfoUpdate(repo, updates);\r\n }, repo.authTokenProvider_, repo.appCheckProvider_, authOverride);\r\n repo.server_ = repo.persistentConnection_;\r\n }\r\n repo.authTokenProvider_.addTokenChangeListener(function (token) {\r\n repo.server_.refreshAuthToken(token);\r\n });\r\n repo.appCheckProvider_.addTokenChangeListener(function (result) {\r\n repo.server_.refreshAppCheckToken(result.token);\r\n });\r\n // In the case of multiple Repos for the same repoInfo (i.e. there are multiple Firebase.Contexts being used),\r\n // we only want to create one StatsReporter. As such, we'll report stats over the first Repo created.\r\n repo.statsReporter_ = statsManagerGetOrCreateReporter(repo.repoInfo_, function () { return new StatsReporter(repo.stats_, repo.server_); });\r\n // Used for .info.\r\n repo.infoData_ = new SnapshotHolder();\r\n repo.infoSyncTree_ = new SyncTree({\r\n startListening: function (query, tag, currentHashFn, onComplete) {\r\n var infoEvents = [];\r\n var node = repo.infoData_.getNode(query._path);\r\n // This is possibly a hack, but we have different semantics for .info endpoints. We don't raise null events\r\n // on initial data...\r\n if (!node.isEmpty()) {\r\n infoEvents = syncTreeApplyServerOverwrite(repo.infoSyncTree_, query._path, node);\r\n setTimeout(function () {\r\n onComplete('ok');\r\n }, 0);\r\n }\r\n return infoEvents;\r\n },\r\n stopListening: function () { }\r\n });\r\n repoUpdateInfo(repo, 'connected', false);\r\n repo.serverSyncTree_ = new SyncTree({\r\n startListening: function (query, tag, currentHashFn, onComplete) {\r\n repo.server_.listen(query, currentHashFn, tag, function (status, data) {\r\n var events = onComplete(status, data);\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, query._path, events);\r\n });\r\n // No synchronous events for network-backed sync trees\r\n return [];\r\n },\r\n stopListening: function (query, tag) {\r\n repo.server_.unlisten(query, tag);\r\n }\r\n });\r\n}\r\n/**\r\n * @returns The time in milliseconds, taking the server offset into account if we have one.\r\n */\r\nfunction repoServerTime(repo) {\r\n var offsetNode = repo.infoData_.getNode(new Path('.info/serverTimeOffset'));\r\n var offset = offsetNode.val() || 0;\r\n return new Date().getTime() + offset;\r\n}\r\n/**\r\n * Generate ServerValues using some variables from the repo object.\r\n */\r\nfunction repoGenerateServerValues(repo) {\r\n return generateWithValues({\r\n timestamp: repoServerTime(repo)\r\n });\r\n}\r\n/**\r\n * Called by realtime when we get new messages from the server.\r\n */\r\nfunction repoOnDataUpdate(repo, pathString, data, isMerge, tag) {\r\n // For testing.\r\n repo.dataUpdateCount++;\r\n var path = new Path(pathString);\r\n data = repo.interceptServerDataCallback_\r\n ? repo.interceptServerDataCallback_(pathString, data)\r\n : data;\r\n var events = [];\r\n if (tag) {\r\n if (isMerge) {\r\n var taggedChildren = map(data, function (raw) { return nodeFromJSON(raw); });\r\n events = syncTreeApplyTaggedQueryMerge(repo.serverSyncTree_, path, taggedChildren, tag);\r\n }\r\n else {\r\n var taggedSnap = nodeFromJSON(data);\r\n events = syncTreeApplyTaggedQueryOverwrite(repo.serverSyncTree_, path, taggedSnap, tag);\r\n }\r\n }\r\n else if (isMerge) {\r\n var changedChildren = map(data, function (raw) { return nodeFromJSON(raw); });\r\n events = syncTreeApplyServerMerge(repo.serverSyncTree_, path, changedChildren);\r\n }\r\n else {\r\n var snap = nodeFromJSON(data);\r\n events = syncTreeApplyServerOverwrite(repo.serverSyncTree_, path, snap);\r\n }\r\n var affectedPath = path;\r\n if (events.length > 0) {\r\n // Since we have a listener outstanding for each transaction, receiving any events\r\n // is a proxy for some change having occurred.\r\n affectedPath = repoRerunTransactions(repo, path);\r\n }\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, events);\r\n}\r\n// TODO: This should be @private but it's used by test_access.js and internal.js\r\nfunction repoInterceptServerData(repo, callback) {\r\n repo.interceptServerDataCallback_ = callback;\r\n}\r\nfunction repoOnConnectStatus(repo, connectStatus) {\r\n repoUpdateInfo(repo, 'connected', connectStatus);\r\n if (connectStatus === false) {\r\n repoRunOnDisconnectEvents(repo);\r\n }\r\n}\r\nfunction repoOnServerInfoUpdate(repo, updates) {\r\n each(updates, function (key, value) {\r\n repoUpdateInfo(repo, key, value);\r\n });\r\n}\r\nfunction repoUpdateInfo(repo, pathString, value) {\r\n var path = new Path('/.info/' + pathString);\r\n var newNode = nodeFromJSON(value);\r\n repo.infoData_.updateSnapshot(path, newNode);\r\n var events = syncTreeApplyServerOverwrite(repo.infoSyncTree_, path, newNode);\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\r\n}\r\nfunction repoGetNextWriteId(repo) {\r\n return repo.nextWriteId_++;\r\n}\r\n/**\r\n * The purpose of `getValue` is to return the latest known value\r\n * satisfying `query`.\r\n *\r\n * This method will first check for in-memory cached values\r\n * belonging to active listeners. If they are found, such values\r\n * are considered to be the most up-to-date.\r\n *\r\n * If the client is not connected, this method will try to\r\n * establish a connection and request the value for `query`. If\r\n * the client is not able to retrieve the query result, it reports\r\n * an error.\r\n *\r\n * @param query - The query to surface a value for.\r\n */\r\nfunction repoGetValue(repo, query) {\r\n // Only active queries are cached. There is no persisted cache.\r\n var cached = syncTreeGetServerValue(repo.serverSyncTree_, query);\r\n if (cached != null) {\r\n return Promise.resolve(cached);\r\n }\r\n return repo.server_.get(query).then(function (payload) {\r\n var node = nodeFromJSON(payload).withIndex(query._queryParams.getIndex());\r\n var events = syncTreeApplyServerOverwrite(repo.serverSyncTree_, query._path, node);\r\n eventQueueRaiseEventsAtPath(repo.eventQueue_, query._path, events);\r\n return Promise.resolve(node);\r\n }, function (err) {\r\n repoLog(repo, 'get for query ' + stringify(query) + ' failed: ' + err);\r\n return Promise.reject(new Error(err));\r\n });\r\n}\r\nfunction repoSetWithPriority(repo, path, newVal, newPriority, onComplete) {\r\n repoLog(repo, 'set', {\r\n path: path.toString(),\r\n value: newVal,\r\n priority: newPriority\r\n });\r\n // TODO: Optimize this behavior to either (a) store flag to skip resolving where possible and / or\r\n // (b) store unresolved paths on JSON parse\r\n var serverValues = repoGenerateServerValues(repo);\r\n var newNodeUnresolved = nodeFromJSON(newVal, newPriority);\r\n var existing = syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path);\r\n var newNode = resolveDeferredValueSnapshot(newNodeUnresolved, existing, serverValues);\r\n var writeId = repoGetNextWriteId(repo);\r\n var events = syncTreeApplyUserOverwrite(repo.serverSyncTree_, path, newNode, writeId, true);\r\n eventQueueQueueEvents(repo.eventQueue_, events);\r\n repo.server_.put(path.toString(), newNodeUnresolved.val(/*export=*/ true), function (status, errorReason) {\r\n var success = status === 'ok';\r\n if (!success) {\r\n warn('set at ' + path + ' failed: ' + status);\r\n }\r\n var clearEvents = syncTreeAckUserWrite(repo.serverSyncTree_, writeId, !success);\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, clearEvents);\r\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n });\r\n var affectedPath = repoAbortTransactions(repo, path);\r\n repoRerunTransactions(repo, affectedPath);\r\n // We queued the events above, so just flush the queue here\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, []);\r\n}\r\nfunction repoUpdate(repo, path, childrenToMerge, onComplete) {\r\n repoLog(repo, 'update', { path: path.toString(), value: childrenToMerge });\r\n // Start with our existing data and merge each child into it.\r\n var empty = true;\r\n var serverValues = repoGenerateServerValues(repo);\r\n var changedChildren = {};\r\n each(childrenToMerge, function (changedKey, changedValue) {\r\n empty = false;\r\n changedChildren[changedKey] = resolveDeferredValueTree(pathChild(path, changedKey), nodeFromJSON(changedValue), repo.serverSyncTree_, serverValues);\r\n });\r\n if (!empty) {\r\n var writeId_1 = repoGetNextWriteId(repo);\r\n var events = syncTreeApplyUserMerge(repo.serverSyncTree_, path, changedChildren, writeId_1);\r\n eventQueueQueueEvents(repo.eventQueue_, events);\r\n repo.server_.merge(path.toString(), childrenToMerge, function (status, errorReason) {\r\n var success = status === 'ok';\r\n if (!success) {\r\n warn('update at ' + path + ' failed: ' + status);\r\n }\r\n var clearEvents = syncTreeAckUserWrite(repo.serverSyncTree_, writeId_1, !success);\r\n var affectedPath = clearEvents.length > 0 ? repoRerunTransactions(repo, path) : path;\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, clearEvents);\r\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n });\r\n each(childrenToMerge, function (changedPath) {\r\n var affectedPath = repoAbortTransactions(repo, pathChild(path, changedPath));\r\n repoRerunTransactions(repo, affectedPath);\r\n });\r\n // We queued the events above, so just flush the queue here\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, []);\r\n }\r\n else {\r\n log(\"update() called with empty data. Don't do anything.\");\r\n repoCallOnCompleteCallback(repo, onComplete, 'ok', undefined);\r\n }\r\n}\r\n/**\r\n * Applies all of the changes stored up in the onDisconnect_ tree.\r\n */\r\nfunction repoRunOnDisconnectEvents(repo) {\r\n repoLog(repo, 'onDisconnectEvents');\r\n var serverValues = repoGenerateServerValues(repo);\r\n var resolvedOnDisconnectTree = newSparseSnapshotTree();\r\n sparseSnapshotTreeForEachTree(repo.onDisconnect_, newEmptyPath(), function (path, node) {\r\n var resolved = resolveDeferredValueTree(path, node, repo.serverSyncTree_, serverValues);\r\n sparseSnapshotTreeRemember(resolvedOnDisconnectTree, path, resolved);\r\n });\r\n var events = [];\r\n sparseSnapshotTreeForEachTree(resolvedOnDisconnectTree, newEmptyPath(), function (path, snap) {\r\n events = events.concat(syncTreeApplyServerOverwrite(repo.serverSyncTree_, path, snap));\r\n var affectedPath = repoAbortTransactions(repo, path);\r\n repoRerunTransactions(repo, affectedPath);\r\n });\r\n repo.onDisconnect_ = newSparseSnapshotTree();\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, newEmptyPath(), events);\r\n}\r\nfunction repoOnDisconnectCancel(repo, path, onComplete) {\r\n repo.server_.onDisconnectCancel(path.toString(), function (status, errorReason) {\r\n if (status === 'ok') {\r\n sparseSnapshotTreeForget(repo.onDisconnect_, path);\r\n }\r\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n });\r\n}\r\nfunction repoOnDisconnectSet(repo, path, value, onComplete) {\r\n var newNode = nodeFromJSON(value);\r\n repo.server_.onDisconnectPut(path.toString(), newNode.val(/*export=*/ true), function (status, errorReason) {\r\n if (status === 'ok') {\r\n sparseSnapshotTreeRemember(repo.onDisconnect_, path, newNode);\r\n }\r\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n });\r\n}\r\nfunction repoOnDisconnectSetWithPriority(repo, path, value, priority, onComplete) {\r\n var newNode = nodeFromJSON(value, priority);\r\n repo.server_.onDisconnectPut(path.toString(), newNode.val(/*export=*/ true), function (status, errorReason) {\r\n if (status === 'ok') {\r\n sparseSnapshotTreeRemember(repo.onDisconnect_, path, newNode);\r\n }\r\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n });\r\n}\r\nfunction repoOnDisconnectUpdate(repo, path, childrenToMerge, onComplete) {\r\n if (isEmpty(childrenToMerge)) {\r\n log(\"onDisconnect().update() called with empty data. Don't do anything.\");\r\n repoCallOnCompleteCallback(repo, onComplete, 'ok', undefined);\r\n return;\r\n }\r\n repo.server_.onDisconnectMerge(path.toString(), childrenToMerge, function (status, errorReason) {\r\n if (status === 'ok') {\r\n each(childrenToMerge, function (childName, childNode) {\r\n var newChildNode = nodeFromJSON(childNode);\r\n sparseSnapshotTreeRemember(repo.onDisconnect_, pathChild(path, childName), newChildNode);\r\n });\r\n }\r\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n });\r\n}\r\nfunction repoAddEventCallbackForQuery(repo, query, eventRegistration) {\r\n var events;\r\n if (pathGetFront(query._path) === '.info') {\r\n events = syncTreeAddEventRegistration(repo.infoSyncTree_, query, eventRegistration);\r\n }\r\n else {\r\n events = syncTreeAddEventRegistration(repo.serverSyncTree_, query, eventRegistration);\r\n }\r\n eventQueueRaiseEventsAtPath(repo.eventQueue_, query._path, events);\r\n}\r\nfunction repoRemoveEventCallbackForQuery(repo, query, eventRegistration) {\r\n // These are guaranteed not to raise events, since we're not passing in a cancelError. However, we can future-proof\r\n // a little bit by handling the return values anyways.\r\n var events;\r\n if (pathGetFront(query._path) === '.info') {\r\n events = syncTreeRemoveEventRegistration(repo.infoSyncTree_, query, eventRegistration);\r\n }\r\n else {\r\n events = syncTreeRemoveEventRegistration(repo.serverSyncTree_, query, eventRegistration);\r\n }\r\n eventQueueRaiseEventsAtPath(repo.eventQueue_, query._path, events);\r\n}\r\nfunction repoInterrupt(repo) {\r\n if (repo.persistentConnection_) {\r\n repo.persistentConnection_.interrupt(INTERRUPT_REASON);\r\n }\r\n}\r\nfunction repoResume(repo) {\r\n if (repo.persistentConnection_) {\r\n repo.persistentConnection_.resume(INTERRUPT_REASON);\r\n }\r\n}\r\nfunction repoStats(repo, showDelta) {\r\n if (showDelta === void 0) { showDelta = false; }\r\n if (typeof console === 'undefined') {\r\n return;\r\n }\r\n var stats;\r\n if (showDelta) {\r\n if (!repo.statsListener_) {\r\n repo.statsListener_ = new StatsListener(repo.stats_);\r\n }\r\n stats = repo.statsListener_.get();\r\n }\r\n else {\r\n stats = repo.stats_.get();\r\n }\r\n var longestName = Object.keys(stats).reduce(function (previousValue, currentValue) {\r\n return Math.max(currentValue.length, previousValue);\r\n }, 0);\r\n each(stats, function (stat, value) {\r\n var paddedStat = stat;\r\n // pad stat names to be the same length (plus 2 extra spaces).\r\n for (var i = stat.length; i < longestName + 2; i++) {\r\n paddedStat += ' ';\r\n }\r\n console.log(paddedStat + value);\r\n });\r\n}\r\nfunction repoStatsIncrementCounter(repo, metric) {\r\n repo.stats_.incrementCounter(metric);\r\n statsReporterIncludeStat(repo.statsReporter_, metric);\r\n}\r\nfunction repoLog(repo) {\r\n var varArgs = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n varArgs[_i - 1] = arguments[_i];\r\n }\r\n var prefix = '';\r\n if (repo.persistentConnection_) {\r\n prefix = repo.persistentConnection_.id + ':';\r\n }\r\n log.apply(void 0, __spreadArray([prefix], __read(varArgs)));\r\n}\r\nfunction repoCallOnCompleteCallback(repo, callback, status, errorReason) {\r\n if (callback) {\r\n exceptionGuard(function () {\r\n if (status === 'ok') {\r\n callback(null);\r\n }\r\n else {\r\n var code = (status || 'error').toUpperCase();\r\n var message = code;\r\n if (errorReason) {\r\n message += ': ' + errorReason;\r\n }\r\n var error = new Error(message);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error.code = code;\r\n callback(error);\r\n }\r\n });\r\n }\r\n}\r\n/**\r\n * Creates a new transaction, adds it to the transactions we're tracking, and\r\n * sends it to the server if possible.\r\n *\r\n * @param path - Path at which to do transaction.\r\n * @param transactionUpdate - Update callback.\r\n * @param onComplete - Completion callback.\r\n * @param unwatcher - Function that will be called when the transaction no longer\r\n * need data updates for `path`.\r\n * @param applyLocally - Whether or not to make intermediate results visible\r\n */\r\nfunction repoStartTransaction(repo, path, transactionUpdate, onComplete, unwatcher, applyLocally) {\r\n repoLog(repo, 'transaction on ' + path);\r\n // Initialize transaction.\r\n var transaction = {\r\n path: path,\r\n update: transactionUpdate,\r\n onComplete: onComplete,\r\n // One of TransactionStatus enums.\r\n status: null,\r\n // Used when combining transactions at different locations to figure out\r\n // which one goes first.\r\n order: LUIDGenerator(),\r\n // Whether to raise local events for this transaction.\r\n applyLocally: applyLocally,\r\n // Count of how many times we've retried the transaction.\r\n retryCount: 0,\r\n // Function to call to clean up our .on() listener.\r\n unwatcher: unwatcher,\r\n // Stores why a transaction was aborted.\r\n abortReason: null,\r\n currentWriteId: null,\r\n currentInputSnapshot: null,\r\n currentOutputSnapshotRaw: null,\r\n currentOutputSnapshotResolved: null\r\n };\r\n // Run transaction initially.\r\n var currentState = repoGetLatestState(repo, path, undefined);\r\n transaction.currentInputSnapshot = currentState;\r\n var newVal = transaction.update(currentState.val());\r\n if (newVal === undefined) {\r\n // Abort transaction.\r\n transaction.unwatcher();\r\n transaction.currentOutputSnapshotRaw = null;\r\n transaction.currentOutputSnapshotResolved = null;\r\n if (transaction.onComplete) {\r\n transaction.onComplete(null, false, transaction.currentInputSnapshot);\r\n }\r\n }\r\n else {\r\n validateFirebaseData('transaction failed: Data returned ', newVal, transaction.path);\r\n // Mark as run and add to our queue.\r\n transaction.status = 0 /* RUN */;\r\n var queueNode = treeSubTree(repo.transactionQueueTree_, path);\r\n var nodeQueue = treeGetValue(queueNode) || [];\r\n nodeQueue.push(transaction);\r\n treeSetValue(queueNode, nodeQueue);\r\n // Update visibleData and raise events\r\n // Note: We intentionally raise events after updating all of our\r\n // transaction state, since the user could start new transactions from the\r\n // event callbacks.\r\n var priorityForNode = void 0;\r\n if (typeof newVal === 'object' &&\r\n newVal !== null &&\r\n contains(newVal, '.priority')) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n priorityForNode = safeGet(newVal, '.priority');\r\n assert(isValidPriority(priorityForNode), 'Invalid priority returned by transaction. ' +\r\n 'Priority must be a valid string, finite number, server value, or null.');\r\n }\r\n else {\r\n var currentNode = syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path) ||\r\n ChildrenNode.EMPTY_NODE;\r\n priorityForNode = currentNode.getPriority().val();\r\n }\r\n var serverValues = repoGenerateServerValues(repo);\r\n var newNodeUnresolved = nodeFromJSON(newVal, priorityForNode);\r\n var newNode = resolveDeferredValueSnapshot(newNodeUnresolved, currentState, serverValues);\r\n transaction.currentOutputSnapshotRaw = newNodeUnresolved;\r\n transaction.currentOutputSnapshotResolved = newNode;\r\n transaction.currentWriteId = repoGetNextWriteId(repo);\r\n var events = syncTreeApplyUserOverwrite(repo.serverSyncTree_, path, newNode, transaction.currentWriteId, transaction.applyLocally);\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\r\n repoSendReadyTransactions(repo, repo.transactionQueueTree_);\r\n }\r\n}\r\n/**\r\n * @param excludeSets - A specific set to exclude\r\n */\r\nfunction repoGetLatestState(repo, path, excludeSets) {\r\n return (syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path, excludeSets) ||\r\n ChildrenNode.EMPTY_NODE);\r\n}\r\n/**\r\n * Sends any already-run transactions that aren't waiting for outstanding\r\n * transactions to complete.\r\n *\r\n * Externally it's called with no arguments, but it calls itself recursively\r\n * with a particular transactionQueueTree node to recurse through the tree.\r\n *\r\n * @param node - transactionQueueTree node to start at.\r\n */\r\nfunction repoSendReadyTransactions(repo, node) {\r\n if (node === void 0) { node = repo.transactionQueueTree_; }\r\n // Before recursing, make sure any completed transactions are removed.\r\n if (!node) {\r\n repoPruneCompletedTransactionsBelowNode(repo, node);\r\n }\r\n if (treeGetValue(node)) {\r\n var queue = repoBuildTransactionQueue(repo, node);\r\n assert(queue.length > 0, 'Sending zero length transaction queue');\r\n var allRun = queue.every(function (transaction) { return transaction.status === 0 /* RUN */; });\r\n // If they're all run (and not sent), we can send them. Else, we must wait.\r\n if (allRun) {\r\n repoSendTransactionQueue(repo, treeGetPath(node), queue);\r\n }\r\n }\r\n else if (treeHasChildren(node)) {\r\n treeForEachChild(node, function (childNode) {\r\n repoSendReadyTransactions(repo, childNode);\r\n });\r\n }\r\n}\r\n/**\r\n * Given a list of run transactions, send them to the server and then handle\r\n * the result (success or failure).\r\n *\r\n * @param path - The location of the queue.\r\n * @param queue - Queue of transactions under the specified location.\r\n */\r\nfunction repoSendTransactionQueue(repo, path, queue) {\r\n // Mark transactions as sent and increment retry count!\r\n var setsToIgnore = queue.map(function (txn) {\r\n return txn.currentWriteId;\r\n });\r\n var latestState = repoGetLatestState(repo, path, setsToIgnore);\r\n var snapToSend = latestState;\r\n var latestHash = latestState.hash();\r\n for (var i = 0; i < queue.length; i++) {\r\n var txn = queue[i];\r\n assert(txn.status === 0 /* RUN */, 'tryToSendTransactionQueue_: items in queue should all be run.');\r\n txn.status = 1 /* SENT */;\r\n txn.retryCount++;\r\n var relativePath = newRelativePath(path, txn.path);\r\n // If we've gotten to this point, the output snapshot must be defined.\r\n snapToSend = snapToSend.updateChild(relativePath /** @type {!Node} */, txn.currentOutputSnapshotRaw);\r\n }\r\n var dataToSend = snapToSend.val(true);\r\n var pathToSend = path;\r\n // Send the put.\r\n repo.server_.put(pathToSend.toString(), dataToSend, function (status) {\r\n repoLog(repo, 'transaction put response', {\r\n path: pathToSend.toString(),\r\n status: status\r\n });\r\n var events = [];\r\n if (status === 'ok') {\r\n // Queue up the callbacks and fire them after cleaning up all of our\r\n // transaction state, since the callback could trigger more\r\n // transactions or sets.\r\n var callbacks = [];\r\n var _loop_1 = function (i) {\r\n queue[i].status = 2 /* COMPLETED */;\r\n events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, queue[i].currentWriteId));\r\n if (queue[i].onComplete) {\r\n // We never unset the output snapshot, and given that this\r\n // transaction is complete, it should be set\r\n callbacks.push(function () {\r\n return queue[i].onComplete(null, true, queue[i].currentOutputSnapshotResolved);\r\n });\r\n }\r\n queue[i].unwatcher();\r\n };\r\n for (var i = 0; i < queue.length; i++) {\r\n _loop_1(i);\r\n }\r\n // Now remove the completed transactions.\r\n repoPruneCompletedTransactionsBelowNode(repo, treeSubTree(repo.transactionQueueTree_, path));\r\n // There may be pending transactions that we can now send.\r\n repoSendReadyTransactions(repo, repo.transactionQueueTree_);\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\r\n // Finally, trigger onComplete callbacks.\r\n for (var i = 0; i < callbacks.length; i++) {\r\n exceptionGuard(callbacks[i]);\r\n }\r\n }\r\n else {\r\n // transactions are no longer sent. Update their status appropriately.\r\n if (status === 'datastale') {\r\n for (var i = 0; i < queue.length; i++) {\r\n if (queue[i].status === 3 /* SENT_NEEDS_ABORT */) {\r\n queue[i].status = 4 /* NEEDS_ABORT */;\r\n }\r\n else {\r\n queue[i].status = 0 /* RUN */;\r\n }\r\n }\r\n }\r\n else {\r\n warn('transaction at ' + pathToSend.toString() + ' failed: ' + status);\r\n for (var i = 0; i < queue.length; i++) {\r\n queue[i].status = 4 /* NEEDS_ABORT */;\r\n queue[i].abortReason = status;\r\n }\r\n }\r\n repoRerunTransactions(repo, path);\r\n }\r\n }, latestHash);\r\n}\r\n/**\r\n * Finds all transactions dependent on the data at changedPath and reruns them.\r\n *\r\n * Should be called any time cached data changes.\r\n *\r\n * Return the highest path that was affected by rerunning transactions. This\r\n * is the path at which events need to be raised for.\r\n *\r\n * @param changedPath - The path in mergedData that changed.\r\n * @returns The rootmost path that was affected by rerunning transactions.\r\n */\r\nfunction repoRerunTransactions(repo, changedPath) {\r\n var rootMostTransactionNode = repoGetAncestorTransactionNode(repo, changedPath);\r\n var path = treeGetPath(rootMostTransactionNode);\r\n var queue = repoBuildTransactionQueue(repo, rootMostTransactionNode);\r\n repoRerunTransactionQueue(repo, queue, path);\r\n return path;\r\n}\r\n/**\r\n * Does all the work of rerunning transactions (as well as cleans up aborted\r\n * transactions and whatnot).\r\n *\r\n * @param queue - The queue of transactions to run.\r\n * @param path - The path the queue is for.\r\n */\r\nfunction repoRerunTransactionQueue(repo, queue, path) {\r\n if (queue.length === 0) {\r\n return; // Nothing to do!\r\n }\r\n // Queue up the callbacks and fire them after cleaning up all of our\r\n // transaction state, since the callback could trigger more transactions or\r\n // sets.\r\n var callbacks = [];\r\n var events = [];\r\n // Ignore all of the sets we're going to re-run.\r\n var txnsToRerun = queue.filter(function (q) {\r\n return q.status === 0 /* RUN */;\r\n });\r\n var setsToIgnore = txnsToRerun.map(function (q) {\r\n return q.currentWriteId;\r\n });\r\n var _loop_2 = function (i) {\r\n var transaction = queue[i];\r\n var relativePath = newRelativePath(path, transaction.path);\r\n var abortTransaction = false, abortReason;\r\n assert(relativePath !== null, 'rerunTransactionsUnderNode_: relativePath should not be null.');\r\n if (transaction.status === 4 /* NEEDS_ABORT */) {\r\n abortTransaction = true;\r\n abortReason = transaction.abortReason;\r\n events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, transaction.currentWriteId, true));\r\n }\r\n else if (transaction.status === 0 /* RUN */) {\r\n if (transaction.retryCount >= MAX_TRANSACTION_RETRIES) {\r\n abortTransaction = true;\r\n abortReason = 'maxretry';\r\n events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, transaction.currentWriteId, true));\r\n }\r\n else {\r\n // This code reruns a transaction\r\n var currentNode = repoGetLatestState(repo, transaction.path, setsToIgnore);\r\n transaction.currentInputSnapshot = currentNode;\r\n var newData = queue[i].update(currentNode.val());\r\n if (newData !== undefined) {\r\n validateFirebaseData('transaction failed: Data returned ', newData, transaction.path);\r\n var newDataNode = nodeFromJSON(newData);\r\n var hasExplicitPriority = typeof newData === 'object' &&\r\n newData != null &&\r\n contains(newData, '.priority');\r\n if (!hasExplicitPriority) {\r\n // Keep the old priority if there wasn't a priority explicitly specified.\r\n newDataNode = newDataNode.updatePriority(currentNode.getPriority());\r\n }\r\n var oldWriteId = transaction.currentWriteId;\r\n var serverValues = repoGenerateServerValues(repo);\r\n var newNodeResolved = resolveDeferredValueSnapshot(newDataNode, currentNode, serverValues);\r\n transaction.currentOutputSnapshotRaw = newDataNode;\r\n transaction.currentOutputSnapshotResolved = newNodeResolved;\r\n transaction.currentWriteId = repoGetNextWriteId(repo);\r\n // Mutates setsToIgnore in place\r\n setsToIgnore.splice(setsToIgnore.indexOf(oldWriteId), 1);\r\n events = events.concat(syncTreeApplyUserOverwrite(repo.serverSyncTree_, transaction.path, newNodeResolved, transaction.currentWriteId, transaction.applyLocally));\r\n events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, oldWriteId, true));\r\n }\r\n else {\r\n abortTransaction = true;\r\n abortReason = 'nodata';\r\n events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, transaction.currentWriteId, true));\r\n }\r\n }\r\n }\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\r\n events = [];\r\n if (abortTransaction) {\r\n // Abort.\r\n queue[i].status = 2 /* COMPLETED */;\r\n // Removing a listener can trigger pruning which can muck with\r\n // mergedData/visibleData (as it prunes data). So defer the unwatcher\r\n // until we're done.\r\n (function (unwatcher) {\r\n setTimeout(unwatcher, Math.floor(0));\r\n })(queue[i].unwatcher);\r\n if (queue[i].onComplete) {\r\n if (abortReason === 'nodata') {\r\n callbacks.push(function () {\r\n return queue[i].onComplete(null, false, queue[i].currentInputSnapshot);\r\n });\r\n }\r\n else {\r\n callbacks.push(function () {\r\n return queue[i].onComplete(new Error(abortReason), false, null);\r\n });\r\n }\r\n }\r\n }\r\n };\r\n for (var i = 0; i < queue.length; i++) {\r\n _loop_2(i);\r\n }\r\n // Clean up completed transactions.\r\n repoPruneCompletedTransactionsBelowNode(repo, repo.transactionQueueTree_);\r\n // Now fire callbacks, now that we're in a good, known state.\r\n for (var i = 0; i < callbacks.length; i++) {\r\n exceptionGuard(callbacks[i]);\r\n }\r\n // Try to send the transaction result to the server.\r\n repoSendReadyTransactions(repo, repo.transactionQueueTree_);\r\n}\r\n/**\r\n * Returns the rootmost ancestor node of the specified path that has a pending\r\n * transaction on it, or just returns the node for the given path if there are\r\n * no pending transactions on any ancestor.\r\n *\r\n * @param path - The location to start at.\r\n * @returns The rootmost node with a transaction.\r\n */\r\nfunction repoGetAncestorTransactionNode(repo, path) {\r\n var front;\r\n // Start at the root and walk deeper into the tree towards path until we\r\n // find a node with pending transactions.\r\n var transactionNode = repo.transactionQueueTree_;\r\n front = pathGetFront(path);\r\n while (front !== null && treeGetValue(transactionNode) === undefined) {\r\n transactionNode = treeSubTree(transactionNode, front);\r\n path = pathPopFront(path);\r\n front = pathGetFront(path);\r\n }\r\n return transactionNode;\r\n}\r\n/**\r\n * Builds the queue of all transactions at or below the specified\r\n * transactionNode.\r\n *\r\n * @param transactionNode\r\n * @returns The generated queue.\r\n */\r\nfunction repoBuildTransactionQueue(repo, transactionNode) {\r\n // Walk any child transaction queues and aggregate them into a single queue.\r\n var transactionQueue = [];\r\n repoAggregateTransactionQueuesForNode(repo, transactionNode, transactionQueue);\r\n // Sort them by the order the transactions were created.\r\n transactionQueue.sort(function (a, b) { return a.order - b.order; });\r\n return transactionQueue;\r\n}\r\nfunction repoAggregateTransactionQueuesForNode(repo, node, queue) {\r\n var nodeQueue = treeGetValue(node);\r\n if (nodeQueue) {\r\n for (var i = 0; i < nodeQueue.length; i++) {\r\n queue.push(nodeQueue[i]);\r\n }\r\n }\r\n treeForEachChild(node, function (child) {\r\n repoAggregateTransactionQueuesForNode(repo, child, queue);\r\n });\r\n}\r\n/**\r\n * Remove COMPLETED transactions at or below this node in the transactionQueueTree_.\r\n */\r\nfunction repoPruneCompletedTransactionsBelowNode(repo, node) {\r\n var queue = treeGetValue(node);\r\n if (queue) {\r\n var to = 0;\r\n for (var from = 0; from < queue.length; from++) {\r\n if (queue[from].status !== 2 /* COMPLETED */) {\r\n queue[to] = queue[from];\r\n to++;\r\n }\r\n }\r\n queue.length = to;\r\n treeSetValue(node, queue.length > 0 ? queue : undefined);\r\n }\r\n treeForEachChild(node, function (childNode) {\r\n repoPruneCompletedTransactionsBelowNode(repo, childNode);\r\n });\r\n}\r\n/**\r\n * Aborts all transactions on ancestors or descendants of the specified path.\r\n * Called when doing a set() or update() since we consider them incompatible\r\n * with transactions.\r\n *\r\n * @param path - Path for which we want to abort related transactions.\r\n */\r\nfunction repoAbortTransactions(repo, path) {\r\n var affectedPath = treeGetPath(repoGetAncestorTransactionNode(repo, path));\r\n var transactionNode = treeSubTree(repo.transactionQueueTree_, path);\r\n treeForEachAncestor(transactionNode, function (node) {\r\n repoAbortTransactionsOnNode(repo, node);\r\n });\r\n repoAbortTransactionsOnNode(repo, transactionNode);\r\n treeForEachDescendant(transactionNode, function (node) {\r\n repoAbortTransactionsOnNode(repo, node);\r\n });\r\n return affectedPath;\r\n}\r\n/**\r\n * Abort transactions stored in this transaction queue node.\r\n *\r\n * @param node - Node to abort transactions for.\r\n */\r\nfunction repoAbortTransactionsOnNode(repo, node) {\r\n var queue = treeGetValue(node);\r\n if (queue) {\r\n // Queue up the callbacks and fire them after cleaning up all of our\r\n // transaction state, since the callback could trigger more transactions\r\n // or sets.\r\n var callbacks = [];\r\n // Go through queue. Any already-sent transactions must be marked for\r\n // abort, while the unsent ones can be immediately aborted and removed.\r\n var events = [];\r\n var lastSent = -1;\r\n for (var i = 0; i < queue.length; i++) {\r\n if (queue[i].status === 3 /* SENT_NEEDS_ABORT */) ;\r\n else if (queue[i].status === 1 /* SENT */) {\r\n assert(lastSent === i - 1, 'All SENT items should be at beginning of queue.');\r\n lastSent = i;\r\n // Mark transaction for abort when it comes back.\r\n queue[i].status = 3 /* SENT_NEEDS_ABORT */;\r\n queue[i].abortReason = 'set';\r\n }\r\n else {\r\n assert(queue[i].status === 0 /* RUN */, 'Unexpected transaction status in abort');\r\n // We can abort it immediately.\r\n queue[i].unwatcher();\r\n events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, queue[i].currentWriteId, true));\r\n if (queue[i].onComplete) {\r\n callbacks.push(queue[i].onComplete.bind(null, new Error('set'), false, null));\r\n }\r\n }\r\n }\r\n if (lastSent === -1) {\r\n // We're not waiting for any sent transactions. We can clear the queue.\r\n treeSetValue(node, undefined);\r\n }\r\n else {\r\n // Remove the transactions we aborted.\r\n queue.length = lastSent + 1;\r\n }\r\n // Now fire the callbacks.\r\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, treeGetPath(node), events);\r\n for (var i = 0; i < callbacks.length; i++) {\r\n exceptionGuard(callbacks[i]);\r\n }\r\n }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction decodePath(pathString) {\r\n var pathStringDecoded = '';\r\n var pieces = pathString.split('/');\r\n for (var i = 0; i < pieces.length; i++) {\r\n if (pieces[i].length > 0) {\r\n var piece = pieces[i];\r\n try {\r\n piece = decodeURIComponent(piece.replace(/\\+/g, ' '));\r\n }\r\n catch (e) { }\r\n pathStringDecoded += '/' + piece;\r\n }\r\n }\r\n return pathStringDecoded;\r\n}\r\n/**\r\n * @returns key value hash\r\n */\r\nfunction decodeQuery(queryString) {\r\n var e_1, _a;\r\n var results = {};\r\n if (queryString.charAt(0) === '?') {\r\n queryString = queryString.substring(1);\r\n }\r\n try {\r\n for (var _b = __values(queryString.split('&')), _c = _b.next(); !_c.done; _c = _b.next()) {\r\n var segment = _c.value;\r\n if (segment.length === 0) {\r\n continue;\r\n }\r\n var kv = segment.split('=');\r\n if (kv.length === 2) {\r\n results[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1]);\r\n }\r\n else {\r\n warn(\"Invalid query segment '\" + segment + \"' in query '\" + queryString + \"'\");\r\n }\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n return results;\r\n}\r\nvar parseRepoInfo = function (dataURL, nodeAdmin) {\r\n var parsedUrl = parseDatabaseURL(dataURL), namespace = parsedUrl.namespace;\r\n if (parsedUrl.domain === 'firebase.com') {\r\n fatal(parsedUrl.host +\r\n ' is no longer supported. ' +\r\n 'Please use .firebaseio.com instead');\r\n }\r\n // Catch common error of uninitialized namespace value.\r\n if ((!namespace || namespace === 'undefined') &&\r\n parsedUrl.domain !== 'localhost') {\r\n fatal('Cannot parse Firebase url. Please use https://.firebaseio.com');\r\n }\r\n if (!parsedUrl.secure) {\r\n warnIfPageIsSecure();\r\n }\r\n var webSocketOnly = parsedUrl.scheme === 'ws' || parsedUrl.scheme === 'wss';\r\n return {\r\n repoInfo: new RepoInfo(parsedUrl.host, parsedUrl.secure, namespace, nodeAdmin, webSocketOnly, \r\n /*persistenceKey=*/ '', \r\n /*includeNamespaceInQueryParams=*/ namespace !== parsedUrl.subdomain),\r\n path: new Path(parsedUrl.pathString)\r\n };\r\n};\r\nvar parseDatabaseURL = function (dataURL) {\r\n // Default to empty strings in the event of a malformed string.\r\n var host = '', domain = '', subdomain = '', pathString = '', namespace = '';\r\n // Always default to SSL, unless otherwise specified.\r\n var secure = true, scheme = 'https', port = 443;\r\n // Don't do any validation here. The caller is responsible for validating the result of parsing.\r\n if (typeof dataURL === 'string') {\r\n // Parse scheme.\r\n var colonInd = dataURL.indexOf('//');\r\n if (colonInd >= 0) {\r\n scheme = dataURL.substring(0, colonInd - 1);\r\n dataURL = dataURL.substring(colonInd + 2);\r\n }\r\n // Parse host, path, and query string.\r\n var slashInd = dataURL.indexOf('/');\r\n if (slashInd === -1) {\r\n slashInd = dataURL.length;\r\n }\r\n var questionMarkInd = dataURL.indexOf('?');\r\n if (questionMarkInd === -1) {\r\n questionMarkInd = dataURL.length;\r\n }\r\n host = dataURL.substring(0, Math.min(slashInd, questionMarkInd));\r\n if (slashInd < questionMarkInd) {\r\n // For pathString, questionMarkInd will always come after slashInd\r\n pathString = decodePath(dataURL.substring(slashInd, questionMarkInd));\r\n }\r\n var queryParams = decodeQuery(dataURL.substring(Math.min(dataURL.length, questionMarkInd)));\r\n // If we have a port, use scheme for determining if it's secure.\r\n colonInd = host.indexOf(':');\r\n if (colonInd >= 0) {\r\n secure = scheme === 'https' || scheme === 'wss';\r\n port = parseInt(host.substring(colonInd + 1), 10);\r\n }\r\n else {\r\n colonInd = host.length;\r\n }\r\n var hostWithoutPort = host.slice(0, colonInd);\r\n if (hostWithoutPort.toLowerCase() === 'localhost') {\r\n domain = 'localhost';\r\n }\r\n else if (hostWithoutPort.split('.').length <= 2) {\r\n domain = hostWithoutPort;\r\n }\r\n else {\r\n // Interpret the subdomain of a 3 or more component URL as the namespace name.\r\n var dotInd = host.indexOf('.');\r\n subdomain = host.substring(0, dotInd).toLowerCase();\r\n domain = host.substring(dotInd + 1);\r\n // Normalize namespaces to lowercase to share storage / connection.\r\n namespace = subdomain;\r\n }\r\n // Always treat the value of the `ns` as the namespace name if it is present.\r\n if ('ns' in queryParams) {\r\n namespace = queryParams['ns'];\r\n }\r\n }\r\n return {\r\n host: host,\r\n port: port,\r\n domain: domain,\r\n subdomain: subdomain,\r\n secure: secure,\r\n scheme: scheme,\r\n pathString: pathString,\r\n namespace: namespace\r\n };\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Encapsulates the data needed to raise an event\r\n */\r\nvar DataEvent = /** @class */ (function () {\r\n /**\r\n * @param eventType - One of: value, child_added, child_changed, child_moved, child_removed\r\n * @param eventRegistration - The function to call to with the event data. User provided\r\n * @param snapshot - The data backing the event\r\n * @param prevName - Optional, the name of the previous child for child_* events.\r\n */\r\n function DataEvent(eventType, eventRegistration, snapshot, prevName) {\r\n this.eventType = eventType;\r\n this.eventRegistration = eventRegistration;\r\n this.snapshot = snapshot;\r\n this.prevName = prevName;\r\n }\r\n DataEvent.prototype.getPath = function () {\r\n var ref = this.snapshot.ref;\r\n if (this.eventType === 'value') {\r\n return ref._path;\r\n }\r\n else {\r\n return ref.parent._path;\r\n }\r\n };\r\n DataEvent.prototype.getEventType = function () {\r\n return this.eventType;\r\n };\r\n DataEvent.prototype.getEventRunner = function () {\r\n return this.eventRegistration.getEventRunner(this);\r\n };\r\n DataEvent.prototype.toString = function () {\r\n return (this.getPath().toString() +\r\n ':' +\r\n this.eventType +\r\n ':' +\r\n stringify(this.snapshot.exportVal()));\r\n };\r\n return DataEvent;\r\n}());\r\nvar CancelEvent = /** @class */ (function () {\r\n function CancelEvent(eventRegistration, error, path) {\r\n this.eventRegistration = eventRegistration;\r\n this.error = error;\r\n this.path = path;\r\n }\r\n CancelEvent.prototype.getPath = function () {\r\n return this.path;\r\n };\r\n CancelEvent.prototype.getEventType = function () {\r\n return 'cancel';\r\n };\r\n CancelEvent.prototype.getEventRunner = function () {\r\n return this.eventRegistration.getEventRunner(this);\r\n };\r\n CancelEvent.prototype.toString = function () {\r\n return this.path.toString() + ':cancel';\r\n };\r\n return CancelEvent;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A wrapper class that converts events from the database@exp SDK to the legacy\r\n * Database SDK. Events are not converted directly as event registration relies\r\n * on reference comparison of the original user callback (see `matches()`) and\r\n * relies on equality of the legacy SDK's `context` object.\r\n */\r\nvar CallbackContext = /** @class */ (function () {\r\n function CallbackContext(snapshotCallback, cancelCallback) {\r\n this.snapshotCallback = snapshotCallback;\r\n this.cancelCallback = cancelCallback;\r\n }\r\n CallbackContext.prototype.onValue = function (expDataSnapshot, previousChildName) {\r\n this.snapshotCallback.call(null, expDataSnapshot, previousChildName);\r\n };\r\n CallbackContext.prototype.onCancel = function (error) {\r\n assert(this.hasCancelCallback, 'Raising a cancel event on a listener with no cancel callback');\r\n return this.cancelCallback.call(null, error);\r\n };\r\n Object.defineProperty(CallbackContext.prototype, \"hasCancelCallback\", {\r\n get: function () {\r\n return !!this.cancelCallback;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n CallbackContext.prototype.matches = function (other) {\r\n return (this.snapshotCallback === other.snapshotCallback ||\r\n (this.snapshotCallback.userCallback !== undefined &&\r\n this.snapshotCallback.userCallback ===\r\n other.snapshotCallback.userCallback &&\r\n this.snapshotCallback.context === other.snapshotCallback.context));\r\n };\r\n return CallbackContext;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The `onDisconnect` class allows you to write or clear data when your client\r\n * disconnects from the Database server. These updates occur whether your\r\n * client disconnects cleanly or not, so you can rely on them to clean up data\r\n * even if a connection is dropped or a client crashes.\r\n *\r\n * The `onDisconnect` class is most commonly used to manage presence in\r\n * applications where it is useful to detect how many clients are connected and\r\n * when other clients disconnect. See\r\n * {@link https://firebase.google.com/docs/database/web/offline-capabilities | Enabling Offline Capabilities in JavaScript}\r\n * for more information.\r\n *\r\n * To avoid problems when a connection is dropped before the requests can be\r\n * transferred to the Database server, these functions should be called before\r\n * writing any data.\r\n *\r\n * Note that `onDisconnect` operations are only triggered once. If you want an\r\n * operation to occur each time a disconnect occurs, you'll need to re-establish\r\n * the `onDisconnect` operations each time you reconnect.\r\n */\r\nvar OnDisconnect$1 = /** @class */ (function () {\r\n /** @hideconstructor */\r\n function OnDisconnect(_repo, _path) {\r\n this._repo = _repo;\r\n this._path = _path;\r\n }\r\n /**\r\n * Cancels all previously queued `onDisconnect()` set or update events for this\r\n * location and all children.\r\n *\r\n * If a write has been queued for this location via a `set()` or `update()` at a\r\n * parent location, the write at this location will be canceled, though writes\r\n * to sibling locations will still occur.\r\n *\r\n * @returns Resolves when synchronization to the server is complete.\r\n */\r\n OnDisconnect.prototype.cancel = function () {\r\n var deferred = new Deferred();\r\n repoOnDisconnectCancel(this._repo, this._path, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n };\r\n /**\r\n * Ensures the data at this location is deleted when the client is disconnected\r\n * (due to closing the browser, navigating to a new page, or network issues).\r\n *\r\n * @returns Resolves when synchronization to the server is complete.\r\n */\r\n OnDisconnect.prototype.remove = function () {\r\n validateWritablePath('OnDisconnect.remove', this._path);\r\n var deferred = new Deferred();\r\n repoOnDisconnectSet(this._repo, this._path, null, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n };\r\n /**\r\n * Ensures the data at this location is set to the specified value when the\r\n * client is disconnected (due to closing the browser, navigating to a new page,\r\n * or network issues).\r\n *\r\n * `set()` is especially useful for implementing \"presence\" systems, where a\r\n * value should be changed or cleared when a user disconnects so that they\r\n * appear \"offline\" to other users. See\r\n * {@link https://firebase.google.com/docs/database/web/offline-capabilities | Enabling Offline Capabilities in JavaScript}\r\n * for more information.\r\n *\r\n * Note that `onDisconnect` operations are only triggered once. If you want an\r\n * operation to occur each time a disconnect occurs, you'll need to re-establish\r\n * the `onDisconnect` operations each time.\r\n *\r\n * @param value - The value to be written to this location on disconnect (can\r\n * be an object, array, string, number, boolean, or null).\r\n * @returns Resolves when synchronization to the Database is complete.\r\n */\r\n OnDisconnect.prototype.set = function (value) {\r\n validateWritablePath('OnDisconnect.set', this._path);\r\n validateFirebaseDataArg('OnDisconnect.set', value, this._path, false);\r\n var deferred = new Deferred();\r\n repoOnDisconnectSet(this._repo, this._path, value, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n };\r\n /**\r\n * Ensures the data at this location is set to the specified value and priority\r\n * when the client is disconnected (due to closing the browser, navigating to a\r\n * new page, or network issues).\r\n *\r\n * @param value - The value to be written to this location on disconnect (can\r\n * be an object, array, string, number, boolean, or null).\r\n * @param priority - The priority to be written (string, number, or null).\r\n * @returns Resolves when synchronization to the Database is complete.\r\n */\r\n OnDisconnect.prototype.setWithPriority = function (value, priority) {\r\n validateWritablePath('OnDisconnect.setWithPriority', this._path);\r\n validateFirebaseDataArg('OnDisconnect.setWithPriority', value, this._path, false);\r\n validatePriority('OnDisconnect.setWithPriority', priority, false);\r\n var deferred = new Deferred();\r\n repoOnDisconnectSetWithPriority(this._repo, this._path, value, priority, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n };\r\n /**\r\n * Writes multiple values at this location when the client is disconnected (due\r\n * to closing the browser, navigating to a new page, or network issues).\r\n *\r\n * The `values` argument contains multiple property-value pairs that will be\r\n * written to the Database together. Each child property can either be a simple\r\n * property (for example, \"name\") or a relative path (for example, \"name/first\")\r\n * from the current location to the data to update.\r\n *\r\n * As opposed to the `set()` method, `update()` can be use to selectively update\r\n * only the referenced properties at the current location (instead of replacing\r\n * all the child properties at the current location).\r\n *\r\n * @param values - Object containing multiple values.\r\n * @returns Resolves when synchronization to the Database is complete.\r\n */\r\n OnDisconnect.prototype.update = function (values) {\r\n validateWritablePath('OnDisconnect.update', this._path);\r\n validateFirebaseMergeDataArg('OnDisconnect.update', values, this._path, false);\r\n var deferred = new Deferred();\r\n repoOnDisconnectUpdate(this._repo, this._path, values, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n };\r\n return OnDisconnect;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @internal\r\n */\r\nvar QueryImpl = /** @class */ (function () {\r\n /**\r\n * @hideconstructor\r\n */\r\n function QueryImpl(_repo, _path, _queryParams, _orderByCalled) {\r\n this._repo = _repo;\r\n this._path = _path;\r\n this._queryParams = _queryParams;\r\n this._orderByCalled = _orderByCalled;\r\n }\r\n Object.defineProperty(QueryImpl.prototype, \"key\", {\r\n get: function () {\r\n if (pathIsEmpty(this._path)) {\r\n return null;\r\n }\r\n else {\r\n return pathGetBack(this._path);\r\n }\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(QueryImpl.prototype, \"ref\", {\r\n get: function () {\r\n return new ReferenceImpl(this._repo, this._path);\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(QueryImpl.prototype, \"_queryIdentifier\", {\r\n get: function () {\r\n var obj = queryParamsGetQueryObject(this._queryParams);\r\n var id = ObjectToUniqueKey(obj);\r\n return id === '{}' ? 'default' : id;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(QueryImpl.prototype, \"_queryObject\", {\r\n /**\r\n * An object representation of the query parameters used by this Query.\r\n */\r\n get: function () {\r\n return queryParamsGetQueryObject(this._queryParams);\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n QueryImpl.prototype.isEqual = function (other) {\r\n other = getModularInstance(other);\r\n if (!(other instanceof QueryImpl)) {\r\n return false;\r\n }\r\n var sameRepo = this._repo === other._repo;\r\n var samePath = pathEquals(this._path, other._path);\r\n var sameQueryIdentifier = this._queryIdentifier === other._queryIdentifier;\r\n return sameRepo && samePath && sameQueryIdentifier;\r\n };\r\n QueryImpl.prototype.toJSON = function () {\r\n return this.toString();\r\n };\r\n QueryImpl.prototype.toString = function () {\r\n return this._repo.toString() + pathToUrlEncodedString(this._path);\r\n };\r\n return QueryImpl;\r\n}());\r\n/**\r\n * Validates that no other order by call has been made\r\n */\r\nfunction validateNoPreviousOrderByCall(query, fnName) {\r\n if (query._orderByCalled === true) {\r\n throw new Error(fnName + \": You can't combine multiple orderBy calls.\");\r\n }\r\n}\r\n/**\r\n * Validates start/end values for queries.\r\n */\r\nfunction validateQueryEndpoints(params) {\r\n var startNode = null;\r\n var endNode = null;\r\n if (params.hasStart()) {\r\n startNode = params.getIndexStartValue();\r\n }\r\n if (params.hasEnd()) {\r\n endNode = params.getIndexEndValue();\r\n }\r\n if (params.getIndex() === KEY_INDEX) {\r\n var tooManyArgsError = 'Query: When ordering by key, you may only pass one argument to ' +\r\n 'startAt(), endAt(), or equalTo().';\r\n var wrongArgTypeError = 'Query: When ordering by key, the argument passed to startAt(), startAfter(), ' +\r\n 'endAt(), endBefore(), or equalTo() must be a string.';\r\n if (params.hasStart()) {\r\n var startName = params.getIndexStartName();\r\n if (startName !== MIN_NAME) {\r\n throw new Error(tooManyArgsError);\r\n }\r\n else if (typeof startNode !== 'string') {\r\n throw new Error(wrongArgTypeError);\r\n }\r\n }\r\n if (params.hasEnd()) {\r\n var endName = params.getIndexEndName();\r\n if (endName !== MAX_NAME) {\r\n throw new Error(tooManyArgsError);\r\n }\r\n else if (typeof endNode !== 'string') {\r\n throw new Error(wrongArgTypeError);\r\n }\r\n }\r\n }\r\n else if (params.getIndex() === PRIORITY_INDEX) {\r\n if ((startNode != null && !isValidPriority(startNode)) ||\r\n (endNode != null && !isValidPriority(endNode))) {\r\n throw new Error('Query: When ordering by priority, the first argument passed to startAt(), ' +\r\n 'startAfter() endAt(), endBefore(), or equalTo() must be a valid priority value ' +\r\n '(null, a number, or a string).');\r\n }\r\n }\r\n else {\r\n assert(params.getIndex() instanceof PathIndex ||\r\n params.getIndex() === VALUE_INDEX, 'unknown index type.');\r\n if ((startNode != null && typeof startNode === 'object') ||\r\n (endNode != null && typeof endNode === 'object')) {\r\n throw new Error('Query: First argument passed to startAt(), startAfter(), endAt(), endBefore(), or ' +\r\n 'equalTo() cannot be an object.');\r\n }\r\n }\r\n}\r\n/**\r\n * Validates that limit* has been called with the correct combination of parameters\r\n */\r\nfunction validateLimit(params) {\r\n if (params.hasStart() &&\r\n params.hasEnd() &&\r\n params.hasLimit() &&\r\n !params.hasAnchoredLimit()) {\r\n throw new Error(\"Query: Can't combine startAt(), startAfter(), endAt(), endBefore(), and limit(). Use \" +\r\n 'limitToFirst() or limitToLast() instead.');\r\n }\r\n}\r\n/**\r\n * @internal\r\n */\r\nvar ReferenceImpl = /** @class */ (function (_super) {\r\n __extends(ReferenceImpl, _super);\r\n /** @hideconstructor */\r\n function ReferenceImpl(repo, path) {\r\n return _super.call(this, repo, path, new QueryParams(), false) || this;\r\n }\r\n Object.defineProperty(ReferenceImpl.prototype, \"parent\", {\r\n get: function () {\r\n var parentPath = pathParent(this._path);\r\n return parentPath === null\r\n ? null\r\n : new ReferenceImpl(this._repo, parentPath);\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(ReferenceImpl.prototype, \"root\", {\r\n get: function () {\r\n var ref = this;\r\n while (ref.parent !== null) {\r\n ref = ref.parent;\r\n }\r\n return ref;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n return ReferenceImpl;\r\n}(QueryImpl));\r\n/**\r\n * A `DataSnapshot` contains data from a Database location.\r\n *\r\n * Any time you read data from the Database, you receive the data as a\r\n * `DataSnapshot`. A `DataSnapshot` is passed to the event callbacks you attach\r\n * with `on()` or `once()`. You can extract the contents of the snapshot as a\r\n * JavaScript object by calling the `val()` method. Alternatively, you can\r\n * traverse into the snapshot by calling `child()` to return child snapshots\r\n * (which you could then call `val()` on).\r\n *\r\n * A `DataSnapshot` is an efficiently generated, immutable copy of the data at\r\n * a Database location. It cannot be modified and will never change (to modify\r\n * data, you always call the `set()` method on a `Reference` directly).\r\n */\r\nvar DataSnapshot$1 = /** @class */ (function () {\r\n /**\r\n * @param _node - A SnapshotNode to wrap.\r\n * @param ref - The location this snapshot came from.\r\n * @param _index - The iteration order for this snapshot\r\n * @hideconstructor\r\n */\r\n function DataSnapshot(_node, \r\n /**\r\n * The location of this DataSnapshot.\r\n */\r\n ref, _index) {\r\n this._node = _node;\r\n this.ref = ref;\r\n this._index = _index;\r\n }\r\n Object.defineProperty(DataSnapshot.prototype, \"priority\", {\r\n /**\r\n * Gets the priority value of the data in this `DataSnapshot`.\r\n *\r\n * Applications need not use priority but can order collections by\r\n * ordinary properties (see\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data |Sorting and filtering data}\r\n * ).\r\n */\r\n get: function () {\r\n // typecast here because we never return deferred values or internal priorities (MAX_PRIORITY)\r\n return this._node.getPriority().val();\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(DataSnapshot.prototype, \"key\", {\r\n /**\r\n * The key (last part of the path) of the location of this `DataSnapshot`.\r\n *\r\n * The last token in a Database location is considered its key. For example,\r\n * \"ada\" is the key for the /users/ada/ node. Accessing the key on any\r\n * `DataSnapshot` will return the key for the location that generated it.\r\n * However, accessing the key on the root URL of a Database will return\r\n * `null`.\r\n */\r\n get: function () {\r\n return this.ref.key;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(DataSnapshot.prototype, \"size\", {\r\n /** Returns the number of child properties of this `DataSnapshot`. */\r\n get: function () {\r\n return this._node.numChildren();\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n /**\r\n * Gets another `DataSnapshot` for the location at the specified relative path.\r\n *\r\n * Passing a relative path to the `child()` method of a DataSnapshot returns\r\n * another `DataSnapshot` for the location at the specified relative path. The\r\n * relative path can either be a simple child name (for example, \"ada\") or a\r\n * deeper, slash-separated path (for example, \"ada/name/first\"). If the child\r\n * location has no data, an empty `DataSnapshot` (that is, a `DataSnapshot`\r\n * whose value is `null`) is returned.\r\n *\r\n * @param path - A relative path to the location of child data.\r\n */\r\n DataSnapshot.prototype.child = function (path) {\r\n var childPath = new Path(path);\r\n var childRef = child(this.ref, path);\r\n return new DataSnapshot(this._node.getChild(childPath), childRef, PRIORITY_INDEX);\r\n };\r\n /**\r\n * Returns true if this `DataSnapshot` contains any data. It is slightly more\r\n * efficient than using `snapshot.val() !== null`.\r\n */\r\n DataSnapshot.prototype.exists = function () {\r\n return !this._node.isEmpty();\r\n };\r\n /**\r\n * Exports the entire contents of the DataSnapshot as a JavaScript object.\r\n *\r\n * The `exportVal()` method is similar to `val()`, except priority information\r\n * is included (if available), making it suitable for backing up your data.\r\n *\r\n * @returns The DataSnapshot's contents as a JavaScript value (Object,\r\n * Array, string, number, boolean, or `null`).\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n DataSnapshot.prototype.exportVal = function () {\r\n return this._node.val(true);\r\n };\r\n /**\r\n * Enumerates the top-level children in the `DataSnapshot`.\r\n *\r\n * Because of the way JavaScript objects work, the ordering of data in the\r\n * JavaScript object returned by `val()` is not guaranteed to match the\r\n * ordering on the server nor the ordering of `onChildAdded()` events. That is\r\n * where `forEach()` comes in handy. It guarantees the children of a\r\n * `DataSnapshot` will be iterated in their query order.\r\n *\r\n * If no explicit `orderBy*()` method is used, results are returned\r\n * ordered by key (unless priorities are used, in which case, results are\r\n * returned by priority).\r\n *\r\n * @param action - A function that will be called for each child DataSnapshot.\r\n * The callback can return true to cancel further enumeration.\r\n * @returns true if enumeration was canceled due to your callback returning\r\n * true.\r\n */\r\n DataSnapshot.prototype.forEach = function (action) {\r\n var _this = this;\r\n if (this._node.isLeafNode()) {\r\n return false;\r\n }\r\n var childrenNode = this._node;\r\n // Sanitize the return value to a boolean. ChildrenNode.forEachChild has a weird return type...\r\n return !!childrenNode.forEachChild(this._index, function (key, node) {\r\n return action(new DataSnapshot(node, child(_this.ref, key), PRIORITY_INDEX));\r\n });\r\n };\r\n /**\r\n * Returns true if the specified child path has (non-null) data.\r\n *\r\n * @param path - A relative path to the location of a potential child.\r\n * @returns `true` if data exists at the specified child path; else\r\n * `false`.\r\n */\r\n DataSnapshot.prototype.hasChild = function (path) {\r\n var childPath = new Path(path);\r\n return !this._node.getChild(childPath).isEmpty();\r\n };\r\n /**\r\n * Returns whether or not the `DataSnapshot` has any non-`null` child\r\n * properties.\r\n *\r\n * You can use `hasChildren()` to determine if a `DataSnapshot` has any\r\n * children. If it does, you can enumerate them using `forEach()`. If it\r\n * doesn't, then either this snapshot contains a primitive value (which can be\r\n * retrieved with `val()`) or it is empty (in which case, `val()` will return\r\n * `null`).\r\n *\r\n * @returns true if this snapshot has any children; else false.\r\n */\r\n DataSnapshot.prototype.hasChildren = function () {\r\n if (this._node.isLeafNode()) {\r\n return false;\r\n }\r\n else {\r\n return !this._node.isEmpty();\r\n }\r\n };\r\n /**\r\n * Returns a JSON-serializable representation of this object.\r\n */\r\n DataSnapshot.prototype.toJSON = function () {\r\n return this.exportVal();\r\n };\r\n /**\r\n * Extracts a JavaScript value from a `DataSnapshot`.\r\n *\r\n * Depending on the data in a `DataSnapshot`, the `val()` method may return a\r\n * scalar type (string, number, or boolean), an array, or an object. It may\r\n * also return null, indicating that the `DataSnapshot` is empty (contains no\r\n * data).\r\n *\r\n * @returns The DataSnapshot's contents as a JavaScript value (Object,\r\n * Array, string, number, boolean, or `null`).\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n DataSnapshot.prototype.val = function () {\r\n return this._node.val();\r\n };\r\n return DataSnapshot;\r\n}());\r\n/**\r\n *\r\n * Returns a `Reference` representing the location in the Database\r\n * corresponding to the provided path. If no path is provided, the `Reference`\r\n * will point to the root of the Database.\r\n *\r\n * @param db - The database instance to obtain a reference for.\r\n * @param path - Optional path representing the location the returned\r\n * `Reference` will point. If not provided, the returned `Reference` will\r\n * point to the root of the Database.\r\n * @returns If a path is provided, a `Reference`\r\n * pointing to the provided path. Otherwise, a `Reference` pointing to the\r\n * root of the Database.\r\n */\r\nfunction ref(db, path) {\r\n db = getModularInstance(db);\r\n db._checkNotDeleted('ref');\r\n return path !== undefined ? child(db._root, path) : db._root;\r\n}\r\n/**\r\n * Returns a `Reference` representing the location in the Database\r\n * corresponding to the provided Firebase URL.\r\n *\r\n * An exception is thrown if the URL is not a valid Firebase Database URL or it\r\n * has a different domain than the current `Database` instance.\r\n *\r\n * Note that all query parameters (`orderBy`, `limitToLast`, etc.) are ignored\r\n * and are not applied to the returned `Reference`.\r\n *\r\n * @param db - The database instance to obtain a reference for.\r\n * @param url - The Firebase URL at which the returned `Reference` will\r\n * point.\r\n * @returns A `Reference` pointing to the provided\r\n * Firebase URL.\r\n */\r\nfunction refFromURL(db, url) {\r\n db = getModularInstance(db);\r\n db._checkNotDeleted('refFromURL');\r\n var parsedURL = parseRepoInfo(url, db._repo.repoInfo_.nodeAdmin);\r\n validateUrl('refFromURL', parsedURL);\r\n var repoInfo = parsedURL.repoInfo;\r\n if (!db._repo.repoInfo_.isCustomHost() &&\r\n repoInfo.host !== db._repo.repoInfo_.host) {\r\n fatal('refFromURL' +\r\n ': Host name does not match the current database: ' +\r\n '(found ' +\r\n repoInfo.host +\r\n ' but expected ' +\r\n db._repo.repoInfo_.host +\r\n ')');\r\n }\r\n return ref(db, parsedURL.path.toString());\r\n}\r\n/**\r\n * Gets a `Reference` for the location at the specified relative path.\r\n *\r\n * The relative path can either be a simple child name (for example, \"ada\") or\r\n * a deeper slash-separated path (for example, \"ada/name/first\").\r\n *\r\n * @param parent - The parent location.\r\n * @param path - A relative path from this location to the desired child\r\n * location.\r\n * @returns The specified child location.\r\n */\r\nfunction child(parent, path) {\r\n parent = getModularInstance(parent);\r\n if (pathGetFront(parent._path) === null) {\r\n validateRootPathString('child', 'path', path, false);\r\n }\r\n else {\r\n validatePathString('child', 'path', path, false);\r\n }\r\n return new ReferenceImpl(parent._repo, pathChild(parent._path, path));\r\n}\r\n/**\r\n * Generates a new child location using a unique key and returns its\r\n * `Reference`.\r\n *\r\n * This is the most common pattern for adding data to a collection of items.\r\n *\r\n * If you provide a value to `push()`, the value is written to the\r\n * generated location. If you don't pass a value, nothing is written to the\r\n * database and the child remains empty (but you can use the `Reference`\r\n * elsewhere).\r\n *\r\n * The unique keys generated by `push()` are ordered by the current time, so the\r\n * resulting list of items is chronologically sorted. The keys are also\r\n * designed to be unguessable (they contain 72 random bits of entropy).\r\n *\r\n * See {@link https://firebase.google.com/docs/database/web/lists-of-data#append_to_a_list_of_data | Append to a list of data}\r\n *
See {@link ttps://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html | The 2^120 Ways to Ensure Unique Identifiers}\r\n *\r\n * @param parent - The parent location.\r\n * @param value - Optional value to be written at the generated location.\r\n * @returns Combined `Promise` and `Reference`; resolves when write is complete,\r\n * but can be used immediately as the `Reference` to the child location.\r\n */\r\nfunction push(parent, value) {\r\n parent = getModularInstance(parent);\r\n validateWritablePath('push', parent._path);\r\n validateFirebaseDataArg('push', value, parent._path, true);\r\n var now = repoServerTime(parent._repo);\r\n var name = nextPushId(now);\r\n // push() returns a ThennableReference whose promise is fulfilled with a\r\n // regular Reference. We use child() to create handles to two different\r\n // references. The first is turned into a ThennableReference below by adding\r\n // then() and catch() methods and is used as the return value of push(). The\r\n // second remains a regular Reference and is used as the fulfilled value of\r\n // the first ThennableReference.\r\n var thennablePushRef = child(parent, name);\r\n var pushRef = child(parent, name);\r\n var promise;\r\n if (value != null) {\r\n promise = set(pushRef, value).then(function () { return pushRef; });\r\n }\r\n else {\r\n promise = Promise.resolve(pushRef);\r\n }\r\n thennablePushRef.then = promise.then.bind(promise);\r\n thennablePushRef.catch = promise.then.bind(promise, undefined);\r\n return thennablePushRef;\r\n}\r\n/**\r\n * Removes the data at this Database location.\r\n *\r\n * Any data at child locations will also be deleted.\r\n *\r\n * The effect of the remove will be visible immediately and the corresponding\r\n * event 'value' will be triggered. Synchronization of the remove to the\r\n * Firebase servers will also be started, and the returned Promise will resolve\r\n * when complete. If provided, the onComplete callback will be called\r\n * asynchronously after synchronization has finished.\r\n *\r\n * @param ref - The location to remove.\r\n * @returns Resolves when remove on server is complete.\r\n */\r\nfunction remove(ref) {\r\n validateWritablePath('remove', ref._path);\r\n return set(ref, null);\r\n}\r\n/**\r\n * Writes data to this Database location.\r\n *\r\n * This will overwrite any data at this location and all child locations.\r\n *\r\n * The effect of the write will be visible immediately, and the corresponding\r\n * events (\"value\", \"child_added\", etc.) will be triggered. Synchronization of\r\n * the data to the Firebase servers will also be started, and the returned\r\n * Promise will resolve when complete. If provided, the `onComplete` callback\r\n * will be called asynchronously after synchronization has finished.\r\n *\r\n * Passing `null` for the new value is equivalent to calling `remove()`; namely,\r\n * all data at this location and all child locations will be deleted.\r\n *\r\n * `set()` will remove any priority stored at this location, so if priority is\r\n * meant to be preserved, you need to use `setWithPriority()` instead.\r\n *\r\n * Note that modifying data with `set()` will cancel any pending transactions\r\n * at that location, so extreme care should be taken if mixing `set()` and\r\n * `transaction()` to modify the same data.\r\n *\r\n * A single `set()` will generate a single \"value\" event at the location where\r\n * the `set()` was performed.\r\n *\r\n * @param ref - The location to write to.\r\n * @param value - The value to be written (string, number, boolean, object,\r\n * array, or null).\r\n * @returns Resolves when write to server is complete.\r\n */\r\nfunction set(ref, value) {\r\n ref = getModularInstance(ref);\r\n validateWritablePath('set', ref._path);\r\n validateFirebaseDataArg('set', value, ref._path, false);\r\n var deferred = new Deferred();\r\n repoSetWithPriority(ref._repo, ref._path, value, \r\n /*priority=*/ null, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n}\r\n/**\r\n * Sets a priority for the data at this Database location.\r\n *\r\n * Applications need not use priority but can order collections by\r\n * ordinary properties (see\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data | Sorting and filtering data}\r\n * ).\r\n *\r\n * @param ref - The location to write to.\r\n * @param priority - The priority to be written (string, number, or null).\r\n * @returns Resolves when write to server is complete.\r\n */\r\nfunction setPriority(ref, priority) {\r\n ref = getModularInstance(ref);\r\n validateWritablePath('setPriority', ref._path);\r\n validatePriority('setPriority', priority, false);\r\n var deferred = new Deferred();\r\n repoSetWithPriority(ref._repo, pathChild(ref._path, '.priority'), priority, null, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n}\r\n/**\r\n * Writes data the Database location. Like `set()` but also specifies the\r\n * priority for that data.\r\n *\r\n * Applications need not use priority but can order collections by\r\n * ordinary properties (see\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data | Sorting and filtering data}\r\n * ).\r\n *\r\n * @param ref - The location to write to.\r\n * @param value - The value to be written (string, number, boolean, object,\r\n * array, or null).\r\n * @param priority - The priority to be written (string, number, or null).\r\n * @returns Resolves when write to server is complete.\r\n */\r\nfunction setWithPriority(ref, value, priority) {\r\n validateWritablePath('setWithPriority', ref._path);\r\n validateFirebaseDataArg('setWithPriority', value, ref._path, false);\r\n validatePriority('setWithPriority', priority, false);\r\n if (ref.key === '.length' || ref.key === '.keys') {\r\n throw 'setWithPriority failed: ' + ref.key + ' is a read-only object.';\r\n }\r\n var deferred = new Deferred();\r\n repoSetWithPriority(ref._repo, ref._path, value, priority, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n}\r\n/**\r\n * Writes multiple values to the Database at once.\r\n *\r\n * The `values` argument contains multiple property-value pairs that will be\r\n * written to the Database together. Each child property can either be a simple\r\n * property (for example, \"name\") or a relative path (for example,\r\n * \"name/first\") from the current location to the data to update.\r\n *\r\n * As opposed to the `set()` method, `update()` can be use to selectively update\r\n * only the referenced properties at the current location (instead of replacing\r\n * all the child properties at the current location).\r\n *\r\n * The effect of the write will be visible immediately, and the corresponding\r\n * events ('value', 'child_added', etc.) will be triggered. Synchronization of\r\n * the data to the Firebase servers will also be started, and the returned\r\n * Promise will resolve when complete. If provided, the `onComplete` callback\r\n * will be called asynchronously after synchronization has finished.\r\n *\r\n * A single `update()` will generate a single \"value\" event at the location\r\n * where the `update()` was performed, regardless of how many children were\r\n * modified.\r\n *\r\n * Note that modifying data with `update()` will cancel any pending\r\n * transactions at that location, so extreme care should be taken if mixing\r\n * `update()` and `transaction()` to modify the same data.\r\n *\r\n * Passing `null` to `update()` will remove the data at this location.\r\n *\r\n * See\r\n * {@link https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html | Introducing multi-location updates and more}.\r\n *\r\n * @param ref - The location to write to.\r\n * @param values - Object containing multiple values.\r\n * @returns Resolves when update on server is complete.\r\n */\r\nfunction update(ref, values) {\r\n validateFirebaseMergeDataArg('update', values, ref._path, false);\r\n var deferred = new Deferred();\r\n repoUpdate(ref._repo, ref._path, values, deferred.wrapCallback(function () { }));\r\n return deferred.promise;\r\n}\r\n/**\r\n * Gets the most up-to-date result for this query.\r\n *\r\n * @param query - The query to run.\r\n * @returns A promise which resolves to the resulting DataSnapshot if a value is\r\n * available, or rejects if the client is unable to return a value (e.g., if the\r\n * server is unreachable and there is nothing cached).\r\n */\r\nfunction get(query) {\r\n query = getModularInstance(query);\r\n return repoGetValue(query._repo, query).then(function (node) {\r\n return new DataSnapshot$1(node, new ReferenceImpl(query._repo, query._path), query._queryParams.getIndex());\r\n });\r\n}\r\n/**\r\n * Represents registration for 'value' events.\r\n */\r\nvar ValueEventRegistration = /** @class */ (function () {\r\n function ValueEventRegistration(callbackContext) {\r\n this.callbackContext = callbackContext;\r\n }\r\n ValueEventRegistration.prototype.respondsTo = function (eventType) {\r\n return eventType === 'value';\r\n };\r\n ValueEventRegistration.prototype.createEvent = function (change, query) {\r\n var index = query._queryParams.getIndex();\r\n return new DataEvent('value', this, new DataSnapshot$1(change.snapshotNode, new ReferenceImpl(query._repo, query._path), index));\r\n };\r\n ValueEventRegistration.prototype.getEventRunner = function (eventData) {\r\n var _this = this;\r\n if (eventData.getEventType() === 'cancel') {\r\n return function () {\r\n return _this.callbackContext.onCancel(eventData.error);\r\n };\r\n }\r\n else {\r\n return function () {\r\n return _this.callbackContext.onValue(eventData.snapshot, null);\r\n };\r\n }\r\n };\r\n ValueEventRegistration.prototype.createCancelEvent = function (error, path) {\r\n if (this.callbackContext.hasCancelCallback) {\r\n return new CancelEvent(this, error, path);\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n ValueEventRegistration.prototype.matches = function (other) {\r\n if (!(other instanceof ValueEventRegistration)) {\r\n return false;\r\n }\r\n else if (!other.callbackContext || !this.callbackContext) {\r\n // If no callback specified, we consider it to match any callback.\r\n return true;\r\n }\r\n else {\r\n return other.callbackContext.matches(this.callbackContext);\r\n }\r\n };\r\n ValueEventRegistration.prototype.hasAnyCallback = function () {\r\n return this.callbackContext !== null;\r\n };\r\n return ValueEventRegistration;\r\n}());\r\n/**\r\n * Represents the registration of a child_x event.\r\n */\r\nvar ChildEventRegistration = /** @class */ (function () {\r\n function ChildEventRegistration(eventType, callbackContext) {\r\n this.eventType = eventType;\r\n this.callbackContext = callbackContext;\r\n }\r\n ChildEventRegistration.prototype.respondsTo = function (eventType) {\r\n var eventToCheck = eventType === 'children_added' ? 'child_added' : eventType;\r\n eventToCheck =\r\n eventToCheck === 'children_removed' ? 'child_removed' : eventToCheck;\r\n return this.eventType === eventToCheck;\r\n };\r\n ChildEventRegistration.prototype.createCancelEvent = function (error, path) {\r\n if (this.callbackContext.hasCancelCallback) {\r\n return new CancelEvent(this, error, path);\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n ChildEventRegistration.prototype.createEvent = function (change, query) {\r\n assert(change.childName != null, 'Child events should have a childName.');\r\n var childRef = child(new ReferenceImpl(query._repo, query._path), change.childName);\r\n var index = query._queryParams.getIndex();\r\n return new DataEvent(change.type, this, new DataSnapshot$1(change.snapshotNode, childRef, index), change.prevName);\r\n };\r\n ChildEventRegistration.prototype.getEventRunner = function (eventData) {\r\n var _this = this;\r\n if (eventData.getEventType() === 'cancel') {\r\n return function () {\r\n return _this.callbackContext.onCancel(eventData.error);\r\n };\r\n }\r\n else {\r\n return function () {\r\n return _this.callbackContext.onValue(eventData.snapshot, eventData.prevName);\r\n };\r\n }\r\n };\r\n ChildEventRegistration.prototype.matches = function (other) {\r\n if (other instanceof ChildEventRegistration) {\r\n return (this.eventType === other.eventType &&\r\n (!this.callbackContext ||\r\n !other.callbackContext ||\r\n this.callbackContext.matches(other.callbackContext)));\r\n }\r\n return false;\r\n };\r\n ChildEventRegistration.prototype.hasAnyCallback = function () {\r\n return !!this.callbackContext;\r\n };\r\n return ChildEventRegistration;\r\n}());\r\nfunction addEventListener(query, eventType, callback, cancelCallbackOrListenOptions, options) {\r\n var cancelCallback;\r\n if (typeof cancelCallbackOrListenOptions === 'object') {\r\n cancelCallback = undefined;\r\n options = cancelCallbackOrListenOptions;\r\n }\r\n if (typeof cancelCallbackOrListenOptions === 'function') {\r\n cancelCallback = cancelCallbackOrListenOptions;\r\n }\r\n if (options && options.onlyOnce) {\r\n var userCallback_1 = callback;\r\n var onceCallback = function (dataSnapshot, previousChildName) {\r\n repoRemoveEventCallbackForQuery(query._repo, query, container);\r\n userCallback_1(dataSnapshot, previousChildName);\r\n };\r\n onceCallback.userCallback = callback.userCallback;\r\n onceCallback.context = callback.context;\r\n callback = onceCallback;\r\n }\r\n var callbackContext = new CallbackContext(callback, cancelCallback || undefined);\r\n var container = eventType === 'value'\r\n ? new ValueEventRegistration(callbackContext)\r\n : new ChildEventRegistration(eventType, callbackContext);\r\n repoAddEventCallbackForQuery(query._repo, query, container);\r\n return function () { return repoRemoveEventCallbackForQuery(query._repo, query, container); };\r\n}\r\nfunction onValue(query, callback, cancelCallbackOrListenOptions, options) {\r\n return addEventListener(query, 'value', callback, cancelCallbackOrListenOptions, options);\r\n}\r\nfunction onChildAdded(query, callback, cancelCallbackOrListenOptions, options) {\r\n return addEventListener(query, 'child_added', callback, cancelCallbackOrListenOptions, options);\r\n}\r\nfunction onChildChanged(query, callback, cancelCallbackOrListenOptions, options) {\r\n return addEventListener(query, 'child_changed', callback, cancelCallbackOrListenOptions, options);\r\n}\r\nfunction onChildMoved(query, callback, cancelCallbackOrListenOptions, options) {\r\n return addEventListener(query, 'child_moved', callback, cancelCallbackOrListenOptions, options);\r\n}\r\nfunction onChildRemoved(query, callback, cancelCallbackOrListenOptions, options) {\r\n return addEventListener(query, 'child_removed', callback, cancelCallbackOrListenOptions, options);\r\n}\r\n/**\r\n * Detaches a callback previously attached with `on()`.\r\n *\r\n * Detach a callback previously attached with `on()`. Note that if `on()` was\r\n * called multiple times with the same eventType and callback, the callback\r\n * will be called multiple times for each event, and `off()` must be called\r\n * multiple times to remove the callback. Calling `off()` on a parent listener\r\n * will not automatically remove listeners registered on child nodes, `off()`\r\n * must also be called on any child listeners to remove the callback.\r\n *\r\n * If a callback is not specified, all callbacks for the specified eventType\r\n * will be removed. Similarly, if no eventType is specified, all callbacks\r\n * for the `Reference` will be removed.\r\n *\r\n * Individual listeners can also be removed by invoking their unsubscribe\r\n * callbacks.\r\n *\r\n * @param query - The query that the listener was registered with.\r\n * @param eventType - One of the following strings: \"value\", \"child_added\",\r\n * \"child_changed\", \"child_removed\", or \"child_moved.\" If omitted, all callbacks\r\n * for the `Reference` will be removed.\r\n * @param callback - The callback function that was passed to `on()` or\r\n * `undefined` to remove all callbacks.\r\n */\r\nfunction off(query, eventType, callback) {\r\n var container = null;\r\n var expCallback = callback ? new CallbackContext(callback) : null;\r\n if (eventType === 'value') {\r\n container = new ValueEventRegistration(expCallback);\r\n }\r\n else if (eventType) {\r\n container = new ChildEventRegistration(eventType, expCallback);\r\n }\r\n repoRemoveEventCallbackForQuery(query._repo, query, container);\r\n}\r\n/**\r\n * A `QueryConstraint` is used to narrow the set of documents returned by a\r\n * Database query. `QueryConstraint`s are created by invoking {@link endAt},\r\n * {@link endBefore}, {@link startAt}, {@link startAfter}, {@link\r\n * limitToFirst}, {@link limitToLast}, {@link orderByChild},\r\n * {@link orderByChild}, {@link orderByKey} , {@link orderByPriority} ,\r\n * {@link orderByValue} or {@link equalTo} and\r\n * can then be passed to {@link query} to create a new query instance that\r\n * also contains this `QueryConstraint`.\r\n */\r\nvar QueryConstraint = /** @class */ (function () {\r\n function QueryConstraint() {\r\n }\r\n return QueryConstraint;\r\n}());\r\nvar QueryEndAtConstraint = /** @class */ (function (_super) {\r\n __extends(QueryEndAtConstraint, _super);\r\n function QueryEndAtConstraint(_value, _key) {\r\n var _this = _super.call(this) || this;\r\n _this._value = _value;\r\n _this._key = _key;\r\n return _this;\r\n }\r\n QueryEndAtConstraint.prototype._apply = function (query) {\r\n validateFirebaseDataArg('endAt', this._value, query._path, true);\r\n var newParams = queryParamsEndAt(query._queryParams, this._value, this._key);\r\n validateLimit(newParams);\r\n validateQueryEndpoints(newParams);\r\n if (query._queryParams.hasEnd()) {\r\n throw new Error('endAt: Starting point was already set (by another call to endAt, ' +\r\n 'endBefore or equalTo).');\r\n }\r\n return new QueryImpl(query._repo, query._path, newParams, query._orderByCalled);\r\n };\r\n return QueryEndAtConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a `QueryConstraint` with the specified ending point.\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The ending point is inclusive, so children with exactly the specified value\r\n * will be included in the query. The optional key argument can be used to\r\n * further limit the range of the query. If it is specified, then children that\r\n * have exactly the specified value must also have a key name less than or equal\r\n * to the specified key.\r\n *\r\n * You can read more about `endAt()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param value - The value to end at. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to end at, among the children with the previously\r\n * specified priority. This argument is only allowed if ordering by child,\r\n * value, or priority.\r\n */\r\nfunction endAt(value, key) {\r\n validateKey('endAt', 'key', key, true);\r\n return new QueryEndAtConstraint(value, key);\r\n}\r\nvar QueryEndBeforeConstraint = /** @class */ (function (_super) {\r\n __extends(QueryEndBeforeConstraint, _super);\r\n function QueryEndBeforeConstraint(_value, _key) {\r\n var _this = _super.call(this) || this;\r\n _this._value = _value;\r\n _this._key = _key;\r\n return _this;\r\n }\r\n QueryEndBeforeConstraint.prototype._apply = function (query) {\r\n validateFirebaseDataArg('endBefore', this._value, query._path, false);\r\n var newParams = queryParamsEndBefore(query._queryParams, this._value, this._key);\r\n validateLimit(newParams);\r\n validateQueryEndpoints(newParams);\r\n if (query._queryParams.hasEnd()) {\r\n throw new Error('endBefore: Starting point was already set (by another call to endAt, ' +\r\n 'endBefore or equalTo).');\r\n }\r\n return new QueryImpl(query._repo, query._path, newParams, query._orderByCalled);\r\n };\r\n return QueryEndBeforeConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a `QueryConstraint` with the specified ending point (exclusive).\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The ending point is exclusive. If only a value is provided, children\r\n * with a value less than the specified value will be included in the query.\r\n * If a key is specified, then children must have a value lesss than or equal\r\n * to the specified value and a a key name less than the specified key.\r\n *\r\n * @param value - The value to end before. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to end before, among the children with the\r\n * previously specified priority. This argument is only allowed if ordering by\r\n * child, value, or priority.\r\n */\r\nfunction endBefore(value, key) {\r\n validateKey('endBefore', 'key', key, true);\r\n return new QueryEndBeforeConstraint(value, key);\r\n}\r\nvar QueryStartAtConstraint = /** @class */ (function (_super) {\r\n __extends(QueryStartAtConstraint, _super);\r\n function QueryStartAtConstraint(_value, _key) {\r\n var _this = _super.call(this) || this;\r\n _this._value = _value;\r\n _this._key = _key;\r\n return _this;\r\n }\r\n QueryStartAtConstraint.prototype._apply = function (query) {\r\n validateFirebaseDataArg('startAt', this._value, query._path, true);\r\n var newParams = queryParamsStartAt(query._queryParams, this._value, this._key);\r\n validateLimit(newParams);\r\n validateQueryEndpoints(newParams);\r\n if (query._queryParams.hasStart()) {\r\n throw new Error('startAt: Starting point was already set (by another call to startAt, ' +\r\n 'startBefore or equalTo).');\r\n }\r\n return new QueryImpl(query._repo, query._path, newParams, query._orderByCalled);\r\n };\r\n return QueryStartAtConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a `QueryConstraint` with the specified starting point.\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The starting point is inclusive, so children with exactly the specified value\r\n * will be included in the query. The optional key argument can be used to\r\n * further limit the range of the query. If it is specified, then children that\r\n * have exactly the specified value must also have a key name greater than or\r\n * equal to the specified key.\r\n *\r\n * You can read more about `startAt()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param value - The value to start at. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to start at. This argument is only allowed if\r\n * ordering by child, value, or priority.\r\n */\r\nfunction startAt(value, key) {\r\n if (value === void 0) { value = null; }\r\n validateKey('startAt', 'key', key, true);\r\n return new QueryStartAtConstraint(value, key);\r\n}\r\nvar QueryStartAfterConstraint = /** @class */ (function (_super) {\r\n __extends(QueryStartAfterConstraint, _super);\r\n function QueryStartAfterConstraint(_value, _key) {\r\n var _this = _super.call(this) || this;\r\n _this._value = _value;\r\n _this._key = _key;\r\n return _this;\r\n }\r\n QueryStartAfterConstraint.prototype._apply = function (query) {\r\n validateFirebaseDataArg('startAfter', this._value, query._path, false);\r\n var newParams = queryParamsStartAfter(query._queryParams, this._value, this._key);\r\n validateLimit(newParams);\r\n validateQueryEndpoints(newParams);\r\n if (query._queryParams.hasStart()) {\r\n throw new Error('startAfter: Starting point was already set (by another call to startAt, ' +\r\n 'startAfter, or equalTo).');\r\n }\r\n return new QueryImpl(query._repo, query._path, newParams, query._orderByCalled);\r\n };\r\n return QueryStartAfterConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a `QueryConstraint` with the specified starting point (exclusive).\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The starting point is exclusive. If only a value is provided, children\r\n * with a value greater than the specified value will be included in the query.\r\n * If a key is specified, then children must have a value greater than or equal\r\n * to the specified value and a a key name greater than the specified key.\r\n *\r\n * @param value - The value to start after. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to start after. This argument is only allowed if\r\n * ordering by child, value, or priority.\r\n */\r\nfunction startAfter(value, key) {\r\n validateKey('startAfter', 'key', key, true);\r\n return new QueryStartAfterConstraint(value, key);\r\n}\r\nvar QueryLimitToFirstConstraint = /** @class */ (function (_super) {\r\n __extends(QueryLimitToFirstConstraint, _super);\r\n function QueryLimitToFirstConstraint(_limit) {\r\n var _this = _super.call(this) || this;\r\n _this._limit = _limit;\r\n return _this;\r\n }\r\n QueryLimitToFirstConstraint.prototype._apply = function (query) {\r\n if (query._queryParams.hasLimit()) {\r\n throw new Error('limitToFirst: Limit was already set (by another call to limitToFirst ' +\r\n 'or limitToLast).');\r\n }\r\n return new QueryImpl(query._repo, query._path, queryParamsLimitToFirst(query._queryParams, this._limit), query._orderByCalled);\r\n };\r\n return QueryLimitToFirstConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a new `QueryConstraint` that if limited to the first specific number\r\n * of children.\r\n *\r\n * The `limitToFirst()` method is used to set a maximum number of children to be\r\n * synced for a given callback. If we set a limit of 100, we will initially only\r\n * receive up to 100 `child_added` events. If we have fewer than 100 messages\r\n * stored in our Database, a `child_added` event will fire for each message.\r\n * However, if we have over 100 messages, we will only receive a `child_added`\r\n * event for the first 100 ordered messages. As items change, we will receive\r\n * `child_removed` events for each item that drops out of the active list so\r\n * that the total number stays at 100.\r\n *\r\n * You can read more about `limitToFirst()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param limit - The maximum number of nodes to include in this query.\r\n */\r\nfunction limitToFirst(limit) {\r\n if (typeof limit !== 'number' || Math.floor(limit) !== limit || limit <= 0) {\r\n throw new Error('limitToFirst: First argument must be a positive integer.');\r\n }\r\n return new QueryLimitToFirstConstraint(limit);\r\n}\r\nvar QueryLimitToLastConstraint = /** @class */ (function (_super) {\r\n __extends(QueryLimitToLastConstraint, _super);\r\n function QueryLimitToLastConstraint(_limit) {\r\n var _this = _super.call(this) || this;\r\n _this._limit = _limit;\r\n return _this;\r\n }\r\n QueryLimitToLastConstraint.prototype._apply = function (query) {\r\n if (query._queryParams.hasLimit()) {\r\n throw new Error('limitToLast: Limit was already set (by another call to limitToFirst ' +\r\n 'or limitToLast).');\r\n }\r\n return new QueryImpl(query._repo, query._path, queryParamsLimitToLast(query._queryParams, this._limit), query._orderByCalled);\r\n };\r\n return QueryLimitToLastConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a new `QueryConstraint` that is limited to return only the last\r\n * specified number of children.\r\n *\r\n * The `limitToLast()` method is used to set a maximum number of children to be\r\n * synced for a given callback. If we set a limit of 100, we will initially only\r\n * receive up to 100 `child_added` events. If we have fewer than 100 messages\r\n * stored in our Database, a `child_added` event will fire for each message.\r\n * However, if we have over 100 messages, we will only receive a `child_added`\r\n * event for the last 100 ordered messages. As items change, we will receive\r\n * `child_removed` events for each item that drops out of the active list so\r\n * that the total number stays at 100.\r\n *\r\n * You can read more about `limitToLast()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param limit - The maximum number of nodes to include in this query.\r\n */\r\nfunction limitToLast(limit) {\r\n if (typeof limit !== 'number' || Math.floor(limit) !== limit || limit <= 0) {\r\n throw new Error('limitToLast: First argument must be a positive integer.');\r\n }\r\n return new QueryLimitToLastConstraint(limit);\r\n}\r\nvar QueryOrderByChildConstraint = /** @class */ (function (_super) {\r\n __extends(QueryOrderByChildConstraint, _super);\r\n function QueryOrderByChildConstraint(_path) {\r\n var _this = _super.call(this) || this;\r\n _this._path = _path;\r\n return _this;\r\n }\r\n QueryOrderByChildConstraint.prototype._apply = function (query) {\r\n validateNoPreviousOrderByCall(query, 'orderByChild');\r\n var parsedPath = new Path(this._path);\r\n if (pathIsEmpty(parsedPath)) {\r\n throw new Error('orderByChild: cannot pass in empty path. Use orderByValue() instead.');\r\n }\r\n var index = new PathIndex(parsedPath);\r\n var newParams = queryParamsOrderBy(query._queryParams, index);\r\n validateQueryEndpoints(newParams);\r\n return new QueryImpl(query._repo, query._path, newParams, \r\n /*orderByCalled=*/ true);\r\n };\r\n return QueryOrderByChildConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a new `QueryConstraint` that orders by the specified child key.\r\n *\r\n * Queries can only order by one key at a time. Calling `orderByChild()`\r\n * multiple times on the same query is an error.\r\n *\r\n * Firebase queries allow you to order your data by any child key on the fly.\r\n * However, if you know in advance what your indexes will be, you can define\r\n * them via the .indexOn rule in your Security Rules for better performance. See\r\n * the{@link https://firebase.google.com/docs/database/security/indexing-data}\r\n * rule for more information.\r\n *\r\n * You can read more about `orderByChild()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\r\n *\r\n * @param path - The path to order by.\r\n */\r\nfunction orderByChild(path) {\r\n if (path === '$key') {\r\n throw new Error('orderByChild: \"$key\" is invalid. Use orderByKey() instead.');\r\n }\r\n else if (path === '$priority') {\r\n throw new Error('orderByChild: \"$priority\" is invalid. Use orderByPriority() instead.');\r\n }\r\n else if (path === '$value') {\r\n throw new Error('orderByChild: \"$value\" is invalid. Use orderByValue() instead.');\r\n }\r\n validatePathString('orderByChild', 'path', path, false);\r\n return new QueryOrderByChildConstraint(path);\r\n}\r\nvar QueryOrderByKeyConstraint = /** @class */ (function (_super) {\r\n __extends(QueryOrderByKeyConstraint, _super);\r\n function QueryOrderByKeyConstraint() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n QueryOrderByKeyConstraint.prototype._apply = function (query) {\r\n validateNoPreviousOrderByCall(query, 'orderByKey');\r\n var newParams = queryParamsOrderBy(query._queryParams, KEY_INDEX);\r\n validateQueryEndpoints(newParams);\r\n return new QueryImpl(query._repo, query._path, newParams, \r\n /*orderByCalled=*/ true);\r\n };\r\n return QueryOrderByKeyConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a new `QueryConstraint` that orders by the key.\r\n *\r\n * Sorts the results of a query by their (ascending) key values.\r\n *\r\n * You can read more about `orderByKey()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\r\n */\r\nfunction orderByKey() {\r\n return new QueryOrderByKeyConstraint();\r\n}\r\nvar QueryOrderByPriorityConstraint = /** @class */ (function (_super) {\r\n __extends(QueryOrderByPriorityConstraint, _super);\r\n function QueryOrderByPriorityConstraint() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n QueryOrderByPriorityConstraint.prototype._apply = function (query) {\r\n validateNoPreviousOrderByCall(query, 'orderByPriority');\r\n var newParams = queryParamsOrderBy(query._queryParams, PRIORITY_INDEX);\r\n validateQueryEndpoints(newParams);\r\n return new QueryImpl(query._repo, query._path, newParams, \r\n /*orderByCalled=*/ true);\r\n };\r\n return QueryOrderByPriorityConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a new `QueryConstraint` that orders by priority.\r\n *\r\n * Applications need not use priority but can order collections by\r\n * ordinary properties (see\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}\r\n * for alternatives to priority.\r\n */\r\nfunction orderByPriority() {\r\n return new QueryOrderByPriorityConstraint();\r\n}\r\nvar QueryOrderByValueConstraint = /** @class */ (function (_super) {\r\n __extends(QueryOrderByValueConstraint, _super);\r\n function QueryOrderByValueConstraint() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n QueryOrderByValueConstraint.prototype._apply = function (query) {\r\n validateNoPreviousOrderByCall(query, 'orderByValue');\r\n var newParams = queryParamsOrderBy(query._queryParams, VALUE_INDEX);\r\n validateQueryEndpoints(newParams);\r\n return new QueryImpl(query._repo, query._path, newParams, \r\n /*orderByCalled=*/ true);\r\n };\r\n return QueryOrderByValueConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a new `QueryConstraint` that orders by value.\r\n *\r\n * If the children of a query are all scalar values (string, number, or\r\n * boolean), you can order the results by their (ascending) values.\r\n *\r\n * You can read more about `orderByValue()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\r\n */\r\nfunction orderByValue() {\r\n return new QueryOrderByValueConstraint();\r\n}\r\nvar QueryEqualToValueConstraint = /** @class */ (function (_super) {\r\n __extends(QueryEqualToValueConstraint, _super);\r\n function QueryEqualToValueConstraint(_value, _key) {\r\n var _this = _super.call(this) || this;\r\n _this._value = _value;\r\n _this._key = _key;\r\n return _this;\r\n }\r\n QueryEqualToValueConstraint.prototype._apply = function (query) {\r\n validateFirebaseDataArg('equalTo', this._value, query._path, false);\r\n if (query._queryParams.hasStart()) {\r\n throw new Error('equalTo: Starting point was already set (by another call to startAt/startAfter or ' +\r\n 'equalTo).');\r\n }\r\n if (query._queryParams.hasEnd()) {\r\n throw new Error('equalTo: Ending point was already set (by another call to endAt/endBefore or ' +\r\n 'equalTo).');\r\n }\r\n return new QueryEndAtConstraint(this._value, this._key)._apply(new QueryStartAtConstraint(this._value, this._key)._apply(query));\r\n };\r\n return QueryEqualToValueConstraint;\r\n}(QueryConstraint));\r\n/**\r\n * Creates a `QueryConstraint` that includes children that match the specified\r\n * value.\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The optional key argument can be used to further limit the range of the\r\n * query. If it is specified, then children that have exactly the specified\r\n * value must also have exactly the specified key as their key name. This can be\r\n * used to filter result sets with many matches for the same value.\r\n *\r\n * You can read more about `equalTo()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param value - The value to match for. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to start at, among the children with the\r\n * previously specified priority. This argument is only allowed if ordering by\r\n * child, value, or priority.\r\n */\r\nfunction equalTo(value, key) {\r\n validateKey('equalTo', 'key', key, true);\r\n return new QueryEqualToValueConstraint(value, key);\r\n}\r\n/**\r\n * Creates a new immutable instance of `Query` that is extended to also include\r\n * additional query constraints.\r\n *\r\n * @param query - The Query instance to use as a base for the new constraints.\r\n * @param queryConstraints - The list of `QueryConstraint`s to apply.\r\n * @throws if any of the provided query constraints cannot be combined with the\r\n * existing or new constraints.\r\n */\r\nfunction query(query) {\r\n var e_1, _a;\r\n var queryConstraints = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n queryConstraints[_i - 1] = arguments[_i];\r\n }\r\n var queryImpl = getModularInstance(query);\r\n try {\r\n for (var queryConstraints_1 = __values(queryConstraints), queryConstraints_1_1 = queryConstraints_1.next(); !queryConstraints_1_1.done; queryConstraints_1_1 = queryConstraints_1.next()) {\r\n var constraint = queryConstraints_1_1.value;\r\n queryImpl = constraint._apply(queryImpl);\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (queryConstraints_1_1 && !queryConstraints_1_1.done && (_a = queryConstraints_1.return)) _a.call(queryConstraints_1);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n return queryImpl;\r\n}\r\n/**\r\n * Define reference constructor in various modules\r\n *\r\n * We are doing this here to avoid several circular\r\n * dependency issues\r\n */\r\nsyncPointSetReferenceConstructor(ReferenceImpl);\r\nsyncTreeSetReferenceConstructor(ReferenceImpl);\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * This variable is also defined in the firebase node.js admin SDK. Before\r\n * modifying this definition, consult the definition in:\r\n *\r\n * https://github.com/firebase/firebase-admin-node\r\n *\r\n * and make sure the two are consistent.\r\n */\r\nvar FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST';\r\n/**\r\n * Creates and caches Repo instances.\r\n */\r\nvar repos = {};\r\n/**\r\n * If true, new Repos will be created to use ReadonlyRestClient (for testing purposes).\r\n */\r\nvar useRestClient = false;\r\n/**\r\n * Update an existing repo in place to point to a new host/port.\r\n */\r\nfunction repoManagerApplyEmulatorSettings(repo, host, port, tokenProvider) {\r\n repo.repoInfo_ = new RepoInfo(host + \":\" + port, \r\n /* secure= */ false, repo.repoInfo_.namespace, repo.repoInfo_.webSocketOnly, repo.repoInfo_.nodeAdmin, repo.repoInfo_.persistenceKey, repo.repoInfo_.includeNamespaceInQueryParams);\r\n if (tokenProvider) {\r\n repo.authTokenProvider_ = tokenProvider;\r\n }\r\n}\r\n/**\r\n * This function should only ever be called to CREATE a new database instance.\r\n * @internal\r\n */\r\nfunction repoManagerDatabaseFromApp(app, authProvider, appCheckProvider, url, nodeAdmin) {\r\n var dbUrl = url || app.options.databaseURL;\r\n if (dbUrl === undefined) {\r\n if (!app.options.projectId) {\r\n fatal(\"Can't determine Firebase Database URL. Be sure to include \" +\r\n ' a Project ID when calling firebase.initializeApp().');\r\n }\r\n log('Using default host for project ', app.options.projectId);\r\n dbUrl = app.options.projectId + \"-default-rtdb.firebaseio.com\";\r\n }\r\n var parsedUrl = parseRepoInfo(dbUrl, nodeAdmin);\r\n var repoInfo = parsedUrl.repoInfo;\r\n var isEmulator;\r\n var dbEmulatorHost = undefined;\r\n if (typeof process !== 'undefined') {\r\n dbEmulatorHost = process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR];\r\n }\r\n if (dbEmulatorHost) {\r\n isEmulator = true;\r\n dbUrl = \"http://\" + dbEmulatorHost + \"?ns=\" + repoInfo.namespace;\r\n parsedUrl = parseRepoInfo(dbUrl, nodeAdmin);\r\n repoInfo = parsedUrl.repoInfo;\r\n }\r\n else {\r\n isEmulator = !parsedUrl.repoInfo.secure;\r\n }\r\n var authTokenProvider = nodeAdmin && isEmulator\r\n ? new EmulatorTokenProvider(EmulatorTokenProvider.OWNER)\r\n : new FirebaseAuthTokenProvider(app.name, app.options, authProvider);\r\n validateUrl('Invalid Firebase Database URL', parsedUrl);\r\n if (!pathIsEmpty(parsedUrl.path)) {\r\n fatal('Database URL must point to the root of a Firebase Database ' +\r\n '(not including a child path).');\r\n }\r\n var repo = repoManagerCreateRepo(repoInfo, app, authTokenProvider, new AppCheckTokenProvider(app.name, appCheckProvider));\r\n return new Database$1(repo, app);\r\n}\r\n/**\r\n * Remove the repo and make sure it is disconnected.\r\n *\r\n */\r\nfunction repoManagerDeleteRepo(repo, appName) {\r\n var appRepos = repos[appName];\r\n // This should never happen...\r\n if (!appRepos || appRepos[repo.key] !== repo) {\r\n fatal(\"Database \" + appName + \"(\" + repo.repoInfo_ + \") has already been deleted.\");\r\n }\r\n repoInterrupt(repo);\r\n delete appRepos[repo.key];\r\n}\r\n/**\r\n * Ensures a repo doesn't already exist and then creates one using the\r\n * provided app.\r\n *\r\n * @param repoInfo - The metadata about the Repo\r\n * @returns The Repo object for the specified server / repoName.\r\n */\r\nfunction repoManagerCreateRepo(repoInfo, app, authTokenProvider, appCheckProvider) {\r\n var appRepos = repos[app.name];\r\n if (!appRepos) {\r\n appRepos = {};\r\n repos[app.name] = appRepos;\r\n }\r\n var repo = appRepos[repoInfo.toURLString()];\r\n if (repo) {\r\n fatal('Database initialized multiple times. Please make sure the format of the database URL matches with each database() call.');\r\n }\r\n repo = new Repo(repoInfo, useRestClient, authTokenProvider, appCheckProvider);\r\n appRepos[repoInfo.toURLString()] = repo;\r\n return repo;\r\n}\r\n/**\r\n * Forces us to use ReadonlyRestClient instead of PersistentConnection for new Repos.\r\n */\r\nfunction repoManagerForceRestClient(forceRestClient) {\r\n useRestClient = forceRestClient;\r\n}\r\n/**\r\n * Class representing a Firebase Realtime Database.\r\n */\r\nvar Database$1 = /** @class */ (function () {\r\n /** @hideconstructor */\r\n function Database(_repoInternal, \r\n /** The FirebaseApp associated with this Realtime Database instance. */\r\n app) {\r\n this._repoInternal = _repoInternal;\r\n this.app = app;\r\n /** Represents a database instance. */\r\n this['type'] = 'database';\r\n /** Track if the instance has been used (root or repo accessed) */\r\n this._instanceStarted = false;\r\n }\r\n Object.defineProperty(Database.prototype, \"_repo\", {\r\n get: function () {\r\n if (!this._instanceStarted) {\r\n repoStart(this._repoInternal, this.app.options.appId, this.app.options['databaseAuthVariableOverride']);\r\n this._instanceStarted = true;\r\n }\r\n return this._repoInternal;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(Database.prototype, \"_root\", {\r\n get: function () {\r\n if (!this._rootInternal) {\r\n this._rootInternal = new ReferenceImpl(this._repo, newEmptyPath());\r\n }\r\n return this._rootInternal;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Database.prototype._delete = function () {\r\n if (this._rootInternal !== null) {\r\n repoManagerDeleteRepo(this._repo, this.app.name);\r\n this._repoInternal = null;\r\n this._rootInternal = null;\r\n }\r\n return Promise.resolve();\r\n };\r\n Database.prototype._checkNotDeleted = function (apiName) {\r\n if (this._rootInternal === null) {\r\n fatal('Cannot call ' + apiName + ' on a deleted database.');\r\n }\r\n };\r\n return Database;\r\n}());\r\n/**\r\n * Modify the provided instance to communicate with the Realtime Database\r\n * emulator.\r\n *\r\n *

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

Note: This method must be called before performing any other operation.\r\n *\r\n * @param host - the emulator host (ex: localhost)\r\n * @param port - the emulator port (ex: 8080)\r\n * @param options.mockUserToken - the mock auth token to use for unit testing Security Rules\r\n */\r\n Database.prototype.useEmulator = function (host, port, options) {\r\n if (options === void 0) { options = {}; }\r\n connectDatabaseEmulator(this._delegate, host, port, options);\r\n };\r\n Database.prototype.ref = function (path) {\r\n validateArgCount('database.ref', 0, 1, arguments.length);\r\n if (path instanceof Reference) {\r\n var childRef = refFromURL(this._delegate, path.toString());\r\n return new Reference(this, childRef);\r\n }\r\n else {\r\n var childRef = ref(this._delegate, path);\r\n return new Reference(this, childRef);\r\n }\r\n };\r\n /**\r\n * Returns a reference to the root or the path specified in url.\r\n * We throw a exception if the url is not in the same domain as the\r\n * current repo.\r\n * @returns Firebase reference.\r\n */\r\n Database.prototype.refFromURL = function (url) {\r\n var apiName = 'database.refFromURL';\r\n validateArgCount(apiName, 1, 1, arguments.length);\r\n var childRef = refFromURL(this._delegate, url);\r\n return new Reference(this, childRef);\r\n };\r\n // Make individual repo go offline.\r\n Database.prototype.goOffline = function () {\r\n validateArgCount('database.goOffline', 0, 0, arguments.length);\r\n return goOffline(this._delegate);\r\n };\r\n Database.prototype.goOnline = function () {\r\n validateArgCount('database.goOnline', 0, 0, arguments.length);\r\n return goOnline(this._delegate);\r\n };\r\n Database.ServerValue = {\r\n TIMESTAMP: serverTimestamp(),\r\n increment: function (delta) { return increment(delta); }\r\n };\r\n return Database;\r\n}());\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * INTERNAL methods for internal-use only (tests, etc.).\r\n *\r\n * Customers shouldn't use these or else should be aware that they could break at any time.\r\n */\r\nvar forceLongPolling = function () {\r\n WebSocketConnection.forceDisallow();\r\n BrowserPollConnection.forceAllow();\r\n};\r\nvar forceWebSockets = function () {\r\n BrowserPollConnection.forceDisallow();\r\n};\r\n/* Used by App Manager */\r\nvar isWebSocketsAvailable = function () {\r\n return WebSocketConnection['isAvailable']();\r\n};\r\nvar setSecurityDebugCallback = function (ref, callback) {\r\n var connection = ref._delegate._repo.persistentConnection_;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n connection.securityDebugCallback_ = callback;\r\n};\r\nvar stats = function (ref, showDelta) {\r\n repoStats(ref._delegate._repo, showDelta);\r\n};\r\nvar statsIncrementCounter = function (ref, metric) {\r\n repoStatsIncrementCounter(ref._delegate._repo, metric);\r\n};\r\nvar dataUpdateCount = function (ref) {\r\n return ref._delegate._repo.dataUpdateCount;\r\n};\r\nvar interceptServerData = function (ref, callback) {\r\n return repoInterceptServerData(ref._delegate._repo, callback);\r\n};\r\n/**\r\n * Used by console to create a database based on the app,\r\n * passed database URL and a custom auth implementation.\r\n *\r\n * @param app - A valid FirebaseApp-like object\r\n * @param url - A valid Firebase databaseURL\r\n * @param version - custom version e.g. firebase-admin version\r\n * @param customAuthImpl - custom auth implementation\r\n */\r\nfunction initStandalone(_a) {\r\n var app = _a.app, url = _a.url, version = _a.version, customAuthImpl = _a.customAuthImpl, namespace = _a.namespace, _b = _a.nodeAdmin, nodeAdmin = _b === void 0 ? false : _b;\r\n setSDKVersion(version);\r\n /**\r\n * ComponentContainer('database-standalone') is just a placeholder that doesn't perform\r\n * any actual function.\r\n */\r\n var authProvider = new Provider('auth-internal', new ComponentContainer('database-standalone'));\r\n authProvider.setComponent(new Component('auth-internal', function () { return customAuthImpl; }, \"PRIVATE\" /* PRIVATE */));\r\n return {\r\n instance: new Database(repoManagerDatabaseFromApp(app, authProvider, \r\n /* appCheckProvider= */ undefined, url, nodeAdmin), app),\r\n namespace: namespace\r\n };\r\n}\n\nvar INTERNAL = /*#__PURE__*/Object.freeze({\n __proto__: null,\n forceLongPolling: forceLongPolling,\n forceWebSockets: forceWebSockets,\n isWebSocketsAvailable: isWebSocketsAvailable,\n setSecurityDebugCallback: setSecurityDebugCallback,\n stats: stats,\n statsIncrementCounter: statsIncrementCounter,\n dataUpdateCount: dataUpdateCount,\n interceptServerData: interceptServerData,\n initStandalone: initStandalone\n});\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar DataConnection = PersistentConnection;\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nPersistentConnection.prototype.simpleListen = function (pathString, onComplete) {\r\n this.sendRequest('q', { p: pathString }, onComplete);\r\n};\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nPersistentConnection.prototype.echo = function (data, onEcho) {\r\n this.sendRequest('echo', { d: data }, onEcho);\r\n};\r\n// RealTimeConnection properties that we use in tests.\r\nvar RealTimeConnection = Connection;\r\nvar hijackHash = function (newHash) {\r\n var oldPut = PersistentConnection.prototype.put;\r\n PersistentConnection.prototype.put = function (pathString, data, onComplete, hash) {\r\n if (hash !== undefined) {\r\n hash = newHash();\r\n }\r\n oldPut.call(this, pathString, data, onComplete, hash);\r\n };\r\n return function () {\r\n PersistentConnection.prototype.put = oldPut;\r\n };\r\n};\r\nvar ConnectionTarget = RepoInfo;\r\nvar queryIdentifier = function (query) {\r\n return query._delegate._queryIdentifier;\r\n};\r\n/**\r\n * Forces the RepoManager to create Repos that use ReadonlyRestClient instead of PersistentConnection.\r\n */\r\nvar forceRestClient = function (forceRestClient) {\r\n repoManagerForceRestClient(forceRestClient);\r\n};\n\nvar TEST_ACCESS = /*#__PURE__*/Object.freeze({\n __proto__: null,\n DataConnection: DataConnection,\n RealTimeConnection: RealTimeConnection,\n hijackHash: hijackHash,\n ConnectionTarget: ConnectionTarget,\n queryIdentifier: queryIdentifier,\n forceRestClient: forceRestClient\n});\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar ServerValue = Database.ServerValue;\r\nfunction registerDatabase(instance) {\r\n // set SDK_VERSION\r\n setSDKVersion(instance.SDK_VERSION);\r\n // Register the Database Service with the 'firebase' namespace.\r\n var namespace = instance.INTERNAL.registerComponent(new Component('database', function (container, _a) {\r\n var url = _a.instanceIdentifier;\r\n /* Dependencies */\r\n // getImmediate for FirebaseApp will always succeed\r\n var app = container.getProvider('app').getImmediate();\r\n var authProvider = container.getProvider('auth-internal');\r\n var appCheckProvider = container.getProvider('app-check-internal');\r\n return new Database(repoManagerDatabaseFromApp(app, authProvider, appCheckProvider, url), app);\r\n }, \"PUBLIC\" /* PUBLIC */)\r\n .setServiceProps(\r\n // firebase.database namespace properties\r\n {\r\n Reference: Reference,\r\n Query: Query,\r\n Database: Database,\r\n DataSnapshot: DataSnapshot,\r\n enableLogging: enableLogging,\r\n INTERNAL: INTERNAL,\r\n ServerValue: ServerValue,\r\n TEST_ACCESS: TEST_ACCESS\r\n })\r\n .setMultipleInstances(true));\r\n instance.registerVersion(name, version);\r\n if (isNodeSdk()) {\r\n module.exports = namespace;\r\n }\r\n}\r\nregisterDatabase(firebase);\n\nexport { DataSnapshot, Database, OnDisconnect, Query, Reference, ServerValue, enableLogging, registerDatabase };\n//# sourceMappingURL=index.esm.js.map\n"],"sourceRoot":""}