diff --git a/packages/firestore/src/local/indexeddb_query_cache.ts b/packages/firestore/src/local/indexeddb_query_cache.ts index f626131754f..79e107ad067 100644 --- a/packages/firestore/src/local/indexeddb_query_cache.ts +++ b/packages/firestore/src/local/indexeddb_query_cache.ts @@ -87,12 +87,16 @@ export class IndexedDbQueryCache implements QueryCache { }); } - setLastRemoteSnapshotVersion( + setTargetsMetadata( transaction: PersistenceTransaction, - snapshotVersion: SnapshotVersion + highestListenSequenceNumber: number, + lastRemoteSnapshotVersion?: SnapshotVersion ): PersistencePromise { return this.retrieveMetadata(transaction).next(metadata => { - metadata.lastRemoteSnapshotVersion = snapshotVersion.toTimestamp(); + metadata.highestListenSequenceNumber = highestListenSequenceNumber; + if (lastRemoteSnapshotVersion) { + metadata.lastRemoteSnapshotVersion = lastRemoteSnapshotVersion.toTimestamp(); + } return this.saveMetadata(transaction, metadata); }); } @@ -114,15 +118,7 @@ export class IndexedDbQueryCache implements QueryCache { transaction: PersistenceTransaction, queryData: QueryData ): PersistencePromise { - return this.saveQueryData(transaction, queryData).next(() => { - return this.retrieveMetadata(transaction).next(metadata => { - if (this.updateMetadataFromQueryData(queryData, metadata)) { - return this.saveMetadata(transaction, metadata); - } else { - return PersistencePromise.resolve(); - } - }); - }); + return this.saveQueryData(transaction, queryData); } removeQueryData( diff --git a/packages/firestore/src/local/local_store.ts b/packages/firestore/src/local/local_store.ts index 86ef188ae21..340c6bfb804 100644 --- a/packages/firestore/src/local/local_store.ts +++ b/packages/firestore/src/local/local_store.ts @@ -605,8 +605,9 @@ export class LocalStore { ' < ' + lastRemoteVersion ); - return this.queryCache.setLastRemoteSnapshotVersion( + return this.queryCache.setTargetsMetadata( txn, + /*highestSequenceNumber=*/ 0, remoteVersion ); }); diff --git a/packages/firestore/src/local/memory_query_cache.ts b/packages/firestore/src/local/memory_query_cache.ts index 64ddfa4caf1..1e4a47b24c3 100644 --- a/packages/firestore/src/local/memory_query_cache.ts +++ b/packages/firestore/src/local/memory_query_cache.ts @@ -69,11 +69,14 @@ export class MemoryQueryCache implements QueryCache { return PersistencePromise.resolve(nextTargetId); } - setLastRemoteSnapshotVersion( + setTargetsMetadata( transaction: PersistenceTransaction, - snapshotVersion: SnapshotVersion + highestListenSequenceNumber: number, + lastRemoteSnapshotVersion?: SnapshotVersion ): PersistencePromise { - this.lastRemoteSnapshotVersion = snapshotVersion; + if (lastRemoteSnapshotVersion) { + this.lastRemoteSnapshotVersion = lastRemoteSnapshotVersion; + } return PersistencePromise.resolve(); } diff --git a/packages/firestore/src/local/query_cache.ts b/packages/firestore/src/local/query_cache.ts index 151312b87d8..af3cfd17c26 100644 --- a/packages/firestore/src/local/query_cache.ts +++ b/packages/firestore/src/local/query_cache.ts @@ -51,14 +51,17 @@ export interface QueryCache extends GarbageSource { ): PersistencePromise; /** - * Set the snapshot version representing the last consistent snapshot received - * from the backend. (see getLastRemoteSnapshotVersion() for more details). + * Set the highest listen sequence number and optionally updates the + * snapshot version of the last consistent snapshot received from the backend + * (see getLastRemoteSnapshotVersion() for more details). * - * @param snapshotVersion The new snapshot version. + * @param highestListenSequenceNumber The new maximum listen sequence number. + * @param lastRemoteSnapshotVersion The new snapshot version. Optional. */ - setLastRemoteSnapshotVersion( + setTargetsMetadata( transaction: PersistenceTransaction, - snapshotVersion: SnapshotVersion + highestListenSequenceNumber: number, + lastRemoteSnapshotVersion?: SnapshotVersion ): PersistencePromise; /** diff --git a/packages/firestore/test/unit/local/query_cache.test.ts b/packages/firestore/test/unit/local/query_cache.test.ts index 400e73980c5..2a3ede52eba 100644 --- a/packages/firestore/test/unit/local/query_cache.test.ts +++ b/packages/firestore/test/unit/local/query_cache.test.ts @@ -325,14 +325,14 @@ function genericQueryCacheTests(): void { expect(await otherCache.allocateTargetId()).to.deep.equal(50); }); - it('can get / set lastRemoteSnapshotVersion', async () => { + it('can get / set targets metadata', async () => { expect(await cache.getLastRemoteSnapshotVersion()).to.deep.equal( SnapshotVersion.MIN ); // Can set the snapshot version. return cache - .setLastRemoteSnapshotVersion(version(42)) + .setTargetsMetadata(/* highestListenSequenceNumber= */ 0, version(42)) .then(async () => { expect(await cache.getLastRemoteSnapshotVersion()).to.deep.equal( version(42) diff --git a/packages/firestore/test/unit/local/test_query_cache.ts b/packages/firestore/test/unit/local/test_query_cache.ts index 7e4f2d47a52..9e915231d48 100644 --- a/packages/firestore/test/unit/local/test_query_cache.ts +++ b/packages/firestore/test/unit/local/test_query_cache.ts @@ -132,11 +132,16 @@ export class TestQueryCache { }); } - setLastRemoteSnapshotVersion(version: SnapshotVersion): Promise { - return this.persistence.runTransaction( - 'setLastRemoteSnapshotVersion', - true, - txn => this.cache.setLastRemoteSnapshotVersion(txn, version) + setTargetsMetadata( + highestListenSequenceNumber: number, + lastRemoteSnapshotVersion?: SnapshotVersion + ): Promise { + return this.persistence.runTransaction('setTargetsMetadata', true, txn => + this.cache.setTargetsMetadata( + txn, + highestListenSequenceNumber, + lastRemoteSnapshotVersion + ) ); } }