UNPKG

@firebase/firestore

Version:

This is the [Cloud Firestore](https://firebase.google.com/docs/firestore/) component of the [Firebase JS SDK](https://www.npmjs.com/package/firebase).

209 lines (208 loc) • 8.81 kB
/** * @license * Copyright 2017 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { SnapshotVersion } from '../core/snapshot_version'; import { ProtoByteString, TargetId } from '../core/types'; import { TargetData } from '../local/target_data'; import { DocumentKeySet } from '../model/collections'; import { MaybeDocument } from '../model/document'; import { DocumentKey } from '../model/document_key'; import { FirestoreError } from '../util/error'; import { ExistenceFilter } from './existence_filter'; import { RemoteEvent } from './remote_event'; /** * Internal representation of the watcher API protocol buffers. */ export declare type WatchChange = DocumentWatchChange | WatchTargetChange | ExistenceFilterChange; /** * Represents a changed document and a list of target ids to which this change * applies. * * If document has been deleted NoDocument will be provided. */ export declare class DocumentWatchChange { /** The new document applies to all of these targets. */ updatedTargetIds: TargetId[]; /** The new document is removed from all of these targets. */ removedTargetIds: TargetId[]; /** The key of the document for this change. */ key: DocumentKey; /** * The new document or NoDocument if it was deleted. Is null if the * document went out of view without the server sending a new document. */ newDoc: MaybeDocument | null; constructor( /** The new document applies to all of these targets. */ updatedTargetIds: TargetId[], /** The new document is removed from all of these targets. */ removedTargetIds: TargetId[], /** The key of the document for this change. */ key: DocumentKey, /** * The new document or NoDocument if it was deleted. Is null if the * document went out of view without the server sending a new document. */ newDoc: MaybeDocument | null); } export declare class ExistenceFilterChange { targetId: TargetId; existenceFilter: ExistenceFilter; constructor(targetId: TargetId, existenceFilter: ExistenceFilter); } export declare enum WatchTargetChangeState { NoChange = 0, Added = 1, Removed = 2, Current = 3, Reset = 4 } export declare class WatchTargetChange { /** What kind of change occurred to the watch target. */ state: WatchTargetChangeState; /** The target IDs that were added/removed/set. */ targetIds: TargetId[]; /** * An opaque, server-assigned token that allows watching a target to be * resumed after disconnecting without retransmitting all the data that * matches the target. The resume token essentially identifies a point in * time from which the server should resume sending results. */ resumeToken: ProtoByteString; /** An RPC error indicating why the watch failed. */ cause: FirestoreError | null; constructor( /** What kind of change occurred to the watch target. */ state: WatchTargetChangeState, /** The target IDs that were added/removed/set. */ targetIds: TargetId[], /** * An opaque, server-assigned token that allows watching a target to be * resumed after disconnecting without retransmitting all the data that * matches the target. The resume token essentially identifies a point in * time from which the server should resume sending results. */ resumeToken?: ProtoByteString, /** An RPC error indicating why the watch failed. */ cause?: FirestoreError | null); } /** * Interface implemented by RemoteStore to expose target metadata to the * WatchChangeAggregator. */ export interface TargetMetadataProvider { /** * Returns the set of remote document keys for the given target ID as of the * last raised snapshot. */ getRemoteKeysForTarget(targetId: TargetId): DocumentKeySet; /** * Returns the TargetData for an active target ID or 'null' if this target * has become inactive */ getTargetDataForTarget(targetId: TargetId): TargetData | null; } /** * A helper class to accumulate watch changes into a RemoteEvent. */ export declare class WatchChangeAggregator { private metadataProvider; constructor(metadataProvider: TargetMetadataProvider); /** The internal state of all tracked targets. */ private targetStates; /** Keeps track of the documents to update since the last raised snapshot. */ private pendingDocumentUpdates; /** A mapping of document keys to their set of target IDs. */ private pendingDocumentTargetMapping; /** * A list of targets with existence filter mismatches. These targets are * known to be inconsistent and their listens needs to be re-established by * RemoteStore. */ private pendingTargetResets; /** * Processes and adds the DocumentWatchChange to the current set of changes. */ handleDocumentChange(docChange: DocumentWatchChange): void; /** Processes and adds the WatchTargetChange to the current set of changes. */ handleTargetChange(targetChange: WatchTargetChange): void; /** * Iterates over all targetIds that the watch change applies to: either the * targetIds explicitly listed in the change or the targetIds of all currently * active targets. */ forEachTarget(targetChange: WatchTargetChange, fn: (targetId: TargetId) => void): void; /** * Handles existence filters and synthesizes deletes for filter mismatches. * Targets that are invalidated by filter mismatches are added to * `pendingTargetResets`. */ handleExistenceFilter(watchChange: ExistenceFilterChange): void; /** * Converts the currently accumulated state into a remote event at the * provided snapshot version. Resets the accumulated changes before returning. */ createRemoteEvent(snapshotVersion: SnapshotVersion): RemoteEvent; /** * Adds the provided document to the internal list of document updates and * its document key to the given target's mapping. */ addDocumentToTarget(targetId: TargetId, document: MaybeDocument): void; /** * Removes the provided document from the target mapping. If the * document no longer matches the target, but the document's state is still * known (e.g. we know that the document was deleted or we received the change * that caused the filter mismatch), the new document can be provided * to update the remote document cache. */ removeDocumentFromTarget(targetId: TargetId, key: DocumentKey, updatedDocument: MaybeDocument | null): void; removeTarget(targetId: TargetId): void; /** * Returns the current count of documents in the target. This includes both * the number of documents that the LocalStore considers to be part of the * target as well as any accumulated changes. */ private getCurrentDocumentCountForTarget; /** * Increment the number of acks needed from watch before we can consider the * server to be 'in-sync' with the client's active targets. */ recordPendingTargetRequest(targetId: TargetId): void; private ensureTargetState; private ensureDocumentTargetMapping; /** * Verifies that the user is still interested in this target (by calling * `getTargetDataForTarget()`) and that we are not waiting for pending ADDs * from watch. */ protected isActiveTarget(targetId: TargetId): boolean; /** * Returns the TargetData for an active target (i.e. a target that the user * is still interested in that has no outstanding target change requests). */ protected targetDataForActiveTarget(targetId: TargetId): TargetData | null; /** * Resets the state of a Watch target to its initial state (e.g. sets * 'current' to false, clears the resume token and removes its target mapping * from all documents). */ private resetTarget; /** * Returns whether the LocalStore considers the document to be part of the * specified target. */ private targetContainsDocument; }