From 2c93300dc3fb4b3abd1efa7cecf4506a3f5b1225 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 23 Jul 2018 10:55:54 -0700 Subject: [PATCH 01/25] Cherry pick sequence number starting point --- .../firestore/src/core/listen_sequence.ts | 31 +++++++++++++++++ packages/firestore/src/core/sync_engine.ts | 16 +++++++-- .../src/local/indexeddb_mutation_queue.ts | 7 ++-- .../src/local/indexeddb_persistence.ts | 34 +++++++++++++++---- .../src/local/indexeddb_query_cache.ts | 17 ++++++---- .../local/indexeddb_remote_document_cache.ts | 3 +- .../firestore/src/local/local_serializer.ts | 1 + packages/firestore/src/local/local_store.ts | 13 ++++--- .../firestore/src/local/memory_persistence.ts | 8 ++++- .../firestore/src/local/memory_query_cache.ts | 5 --- packages/firestore/src/local/persistence.ts | 5 ++- packages/firestore/src/local/query_cache.ts | 2 +- packages/firestore/src/local/simple_db.ts | 7 ++-- packages/firestore/src/remote/remote_store.ts | 7 ++-- 14 files changed, 121 insertions(+), 35 deletions(-) create mode 100644 packages/firestore/src/core/listen_sequence.ts diff --git a/packages/firestore/src/core/listen_sequence.ts b/packages/firestore/src/core/listen_sequence.ts new file mode 100644 index 00000000000..8da44cec5cb --- /dev/null +++ b/packages/firestore/src/core/listen_sequence.ts @@ -0,0 +1,31 @@ +import { ListenSequenceNumber } from './types'; + +/** + * Copyright 2018 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. + */ + +export class ListenSequence { + static readonly IRRELEVANT = -1; + + private previousSequenceNumber: ListenSequenceNumber; + + constructor(startAfter: ListenSequenceNumber) { + this.previousSequenceNumber = startAfter; + } + + next(): ListenSequenceNumber { + return ++this.previousSequenceNumber; + } +} \ No newline at end of file diff --git a/packages/firestore/src/core/sync_engine.ts b/packages/firestore/src/core/sync_engine.ts index 29a515478cb..841bbce976c 100644 --- a/packages/firestore/src/core/sync_engine.ts +++ b/packages/firestore/src/core/sync_engine.ts @@ -46,7 +46,13 @@ import { Query } from './query'; import { SnapshotVersion } from './snapshot_version'; import { TargetIdGenerator } from './target_id_generator'; import { Transaction } from './transaction'; -import { BatchId, OnlineState, ProtoByteString, TargetId } from './types'; +import { + BatchId, + OnlineState, + ProtoByteString, + TargetId, + ListenSequenceNumber +} from './types'; import { AddedLimboDocument, LimboDocumentChange, @@ -56,6 +62,7 @@ import { } from './view'; import { ViewSnapshot } from './view_snapshot'; import { SortedSet } from '../util/sorted_set'; +import { ListenSequence } from './listen_sequence'; const LOG_TAG = 'SyncEngine'; @@ -527,7 +534,12 @@ export class SyncEngine implements RemoteSyncer { const query = Query.atPath(key.path); this.limboResolutionsByTarget[limboTargetId] = new LimboResolution(key); this.remoteStore.listen( - new QueryData(query, limboTargetId, QueryPurpose.LimboResolution) + new QueryData( + query, + limboTargetId, + ListenSequence.IRRELEVANT, + QueryPurpose.LimboResolution + ) ); this.limboTargetsByKey = this.limboTargetsByKey.insert( key, diff --git a/packages/firestore/src/local/indexeddb_mutation_queue.ts b/packages/firestore/src/local/indexeddb_mutation_queue.ts index fa0a9b5066f..d57e1cdc866 100644 --- a/packages/firestore/src/local/indexeddb_mutation_queue.ts +++ b/packages/firestore/src/local/indexeddb_mutation_queue.ts @@ -41,6 +41,7 @@ import { MutationQueue } from './mutation_queue'; import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { SimpleDb, SimpleDbStore } from './simple_db'; +import { IndexedDbTransaction } from './indexeddb_persistence'; /** A mutation queue for a specific user, backed by IndexedDB. */ export class IndexedDbMutationQueue implements MutationQueue { @@ -564,7 +565,7 @@ function mutationsStore( txn: PersistenceTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn, + (txn as IndexedDbTransaction).simpleDbTransaction, DbMutationBatch.store ); } @@ -576,7 +577,7 @@ function documentMutationsStore( txn: PersistenceTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn, + (txn as IndexedDbTransaction).simpleDbTransaction, DbDocumentMutation.store ); } @@ -588,7 +589,7 @@ function mutationQueuesStore( txn: PersistenceTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn, + (txn as IndexedDbTransaction).simpleDbTransaction, DbMutationQueue.store ); } diff --git a/packages/firestore/src/local/indexeddb_persistence.ts b/packages/firestore/src/local/indexeddb_persistence.ts index 6d04e23ac2b..323630933e9 100644 --- a/packages/firestore/src/local/indexeddb_persistence.ts +++ b/packages/firestore/src/local/indexeddb_persistence.ts @@ -34,11 +34,13 @@ import { } from './indexeddb_schema'; import { LocalSerializer } from './local_serializer'; import { MutationQueue } from './mutation_queue'; -import { Persistence } from './persistence'; +import { Persistence, PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { RemoteDocumentCache } from './remote_document_cache'; import { SimpleDb, SimpleDbTransaction } from './simple_db'; +import { ListenSequence } from '../core/listen_sequence'; +import { ListenSequenceNumber } from '../core/types'; const LOG_TAG = 'IndexedDbPersistence'; @@ -59,6 +61,13 @@ const UNSUPPORTED_PLATFORM_ERROR_MSG = ' IndexedDB or is known to have an incomplete implementation. Offline' + ' persistence has been disabled.'; +export class IndexedDbTransaction { + constructor( + readonly simpleDbTransaction: SimpleDbTransaction, + readonly currentSequenceNumber: ListenSequenceNumber + ) {} +} + /** * An IndexedDB-backed instance of Persistence. Data is stored persistently * across sessions. @@ -114,10 +123,15 @@ export class IndexedDbPersistence implements Persistence { private serializer: LocalSerializer; + private queryCache: IndexedDbQueryCache; + + private listenSequence: ListenSequence; + constructor(prefix: string, serializer: JsonProtoSerializer) { this.dbName = prefix + IndexedDbPersistence.MAIN_DATABASE; this.serializer = new LocalSerializer(serializer); this.localStoragePrefix = prefix; + this.queryCache = new IndexedDbQueryCache(this.serializer); } start(): Promise { @@ -140,6 +154,12 @@ export class IndexedDbPersistence implements Persistence { .then(() => { this.scheduleOwnerLeaseRefreshes(); this.attachWindowUnloadHook(); + }).then(() => this.simpleDb.runTransaction( + 'readonly', + ALL_STORES, + (txn) => this.queryCache.start(txn) + )).then(() => { + //this.listenSequence = new ListenSequence(this.queryCache.getHighestSequenceNumber); }); } @@ -161,7 +181,7 @@ export class IndexedDbPersistence implements Persistence { } getQueryCache(): QueryCache { - return new IndexedDbQueryCache(this.serializer); + return this.queryCache; } getRemoteDocumentCache(): RemoteDocumentCache { @@ -170,7 +190,7 @@ export class IndexedDbPersistence implements Persistence { runTransaction( action: string, - operation: (transaction: SimpleDbTransaction) => PersistencePromise + operation: (transaction: PersistenceTransaction) => PersistencePromise ): Promise { if (this.persistenceError) { return Promise.reject(this.persistenceError); @@ -180,9 +200,11 @@ export class IndexedDbPersistence implements Persistence { // Do all transactions as readwrite against all object stores, since we // are the only reader/writer. - return this.simpleDb.runTransaction('readwrite', ALL_STORES, txn => { + return this.simpleDb.runTransaction('readwrite', ALL_STORES, simpleDbTxn => { // Verify that we still have the owner lease as part of every transaction. - return this.ensureOwnerLease(txn).next(() => operation(txn)); + const sequenceNumber = this.listenSequence.next(); + const txn = new IndexedDbTransaction(simpleDbTxn, sequenceNumber); + return this.ensureOwnerLease(txn.simpleDbTransaction).next(() => operation(txn)); }); } @@ -320,7 +342,7 @@ export class IndexedDbPersistence implements Persistence { // would increase the chances of us not refreshing on time if the queue is // backed up for some reason. this.ownerLeaseRefreshHandle = setInterval(() => { - const txResult = this.runTransaction('Refresh owner timestamp', txn => { + const txResult = this.simpleDb.runTransaction('readwrite', ALL_STORES, txn => { // NOTE: We don't need to validate the current owner contents, since // runTransaction does that automatically. const store = txn.store(DbOwner.store); diff --git a/packages/firestore/src/local/indexeddb_query_cache.ts b/packages/firestore/src/local/indexeddb_query_cache.ts index 253b07fd524..8e1810e4e79 100644 --- a/packages/firestore/src/local/indexeddb_query_cache.ts +++ b/packages/firestore/src/local/indexeddb_query_cache.ts @@ -38,7 +38,8 @@ import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { QueryData } from './query_data'; -import { SimpleDb, SimpleDbStore } from './simple_db'; +import { SimpleDb, SimpleDbStore, SimpleDbTransaction } from './simple_db'; +import { IndexedDbTransaction } from './indexeddb_persistence'; export class IndexedDbQueryCache implements QueryCache { constructor(private serializer: LocalSerializer) {} @@ -57,7 +58,7 @@ export class IndexedDbQueryCache implements QueryCache { /** The garbage collector to notify about potential garbage keys. */ private garbageCollector: GarbageCollector | null = null; - start(transaction: PersistenceTransaction): PersistencePromise { + start(transaction: SimpleDbTransaction): PersistencePromise { return globalTargetStore(transaction) .get(DbTargetGlobal.key) .next(metadata => { @@ -335,17 +336,21 @@ export class IndexedDbQueryCache implements QueryCache { function targetsStore( txn: PersistenceTransaction ): SimpleDbStore { - return SimpleDb.getStore(txn, DbTarget.store); + return SimpleDb.getStore( + (txn as IndexedDbTransaction).simpleDbTransaction, + DbTarget.store + ); } /** * Helper to get a typed SimpleDbStore for the target globals object store. */ function globalTargetStore( - txn: PersistenceTransaction + txn: PersistenceTransaction | SimpleDbTransaction ): SimpleDbStore { + const simpleDbTransaction = txn instanceof SimpleDbTransaction ? txn : (txn as IndexedDbTransaction).simpleDbTransaction; return SimpleDb.getStore( - txn, + simpleDbTransaction, DbTargetGlobal.store ); } @@ -357,7 +362,7 @@ function documentTargetStore( txn: PersistenceTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn, + (txn as IndexedDbTransaction).simpleDbTransaction, DbTargetDocument.store ); } diff --git a/packages/firestore/src/local/indexeddb_remote_document_cache.ts b/packages/firestore/src/local/indexeddb_remote_document_cache.ts index 08db1b8edf3..a0b2d63a015 100644 --- a/packages/firestore/src/local/indexeddb_remote_document_cache.ts +++ b/packages/firestore/src/local/indexeddb_remote_document_cache.ts @@ -20,6 +20,7 @@ import { Document, MaybeDocument } from '../model/document'; import { DocumentKey } from '../model/document_key'; import { DbRemoteDocument, DbRemoteDocumentKey } from './indexeddb_schema'; +import { IndexedDbTransaction } from './indexeddb_persistence'; import { LocalSerializer } from './local_serializer'; import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; @@ -89,7 +90,7 @@ function remoteDocumentsStore( txn: PersistenceTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn, + (txn as IndexedDbTransaction).simpleDbTransaction, DbRemoteDocument.store ); } diff --git a/packages/firestore/src/local/local_serializer.ts b/packages/firestore/src/local/local_serializer.ts index 5fa4d85045f..2f63d687546 100644 --- a/packages/firestore/src/local/local_serializer.ts +++ b/packages/firestore/src/local/local_serializer.ts @@ -106,6 +106,7 @@ export class LocalSerializer { return new QueryData( query, dbTarget.targetId, + dbTarget.lastListenSequenceNumber, QueryPurpose.Listen, version, dbTarget.resumeToken diff --git a/packages/firestore/src/local/local_store.ts b/packages/firestore/src/local/local_store.ts index fee30adbc58..52fee7842fd 100644 --- a/packages/firestore/src/local/local_store.ts +++ b/packages/firestore/src/local/local_store.ts @@ -166,6 +166,8 @@ export class LocalStore { this.mutationQueue = persistence.getMutationQueue(initialUser); this.remoteDocuments = persistence.getRemoteDocumentCache(); this.queryCache = persistence.getQueryCache(); + const targetId = this.queryCache.getHighestTargetId(); + this.targetIdGenerator = TargetIdGenerator.forLocalStore(targetId); this.localDocuments = new LocalDocumentsView( this.remoteDocuments, this.mutationQueue @@ -178,7 +180,7 @@ export class LocalStore { /** Performs any initial startup actions required by the local store. */ start(): Promise { return this.persistence.runTransaction('Start LocalStore', txn => { - return this.startMutationQueue(txn).next(() => this.startQueryCache(txn)); + return this.startMutationQueue(txn); }); } @@ -230,14 +232,14 @@ export class LocalStore { }); } - private startQueryCache( + /*private startQueryCache( txn: PersistenceTransaction ): PersistencePromise { return this.queryCache.start(txn).next(() => { const targetId = this.queryCache.getHighestTargetId(); this.targetIdGenerator = TargetIdGenerator.forLocalStore(targetId); }); - } + }*/ private startMutationQueue( txn: PersistenceTransaction @@ -467,7 +469,8 @@ export class LocalStore { if (resumeToken.length > 0) { queryData = queryData.copy({ resumeToken, - snapshotVersion: remoteEvent.snapshotVersion + snapshotVersion: remoteEvent.snapshotVersion, + sequenceNumber: txn.currentSequenceNumber }); this.targetIds[targetId] = queryData; promises.push(this.queryCache.updateQueryData(txn, queryData)); @@ -621,7 +624,7 @@ export class LocalStore { return PersistencePromise.resolve(); } else { const targetId = this.targetIdGenerator.next(); - queryData = new QueryData(query, targetId, QueryPurpose.Listen); + queryData = new QueryData(query, targetId, txn.currentSequenceNumber, QueryPurpose.Listen); return this.queryCache.addQueryData(txn, queryData); } }) diff --git a/packages/firestore/src/local/memory_persistence.ts b/packages/firestore/src/local/memory_persistence.ts index 2b21d5a491a..15b76f36d77 100644 --- a/packages/firestore/src/local/memory_persistence.ts +++ b/packages/firestore/src/local/memory_persistence.ts @@ -26,6 +26,8 @@ import { Persistence, PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { RemoteDocumentCache } from './remote_document_cache'; +import { ListenSequenceNumber } from '../core/types'; +import { ListenSequence } from '../core/listen_sequence'; const LOG_TAG = 'MemoryPersistence'; @@ -86,4 +88,8 @@ export class MemoryPersistence implements Persistence { } /** Dummy class since memory persistence doesn't actually use transactions. */ -class MemoryPersistenceTransaction implements PersistenceTransaction {} +class MemoryPersistenceTransaction implements PersistenceTransaction { + get currentSequenceNumber(): ListenSequenceNumber { + return ListenSequence.IRRELEVANT; + } +} diff --git a/packages/firestore/src/local/memory_query_cache.ts b/packages/firestore/src/local/memory_query_cache.ts index 6b0166b1d52..8dea3aefb39 100644 --- a/packages/firestore/src/local/memory_query_cache.ts +++ b/packages/firestore/src/local/memory_query_cache.ts @@ -47,11 +47,6 @@ export class MemoryQueryCache implements QueryCache { private targetCount = 0; - start(transaction: PersistenceTransaction): PersistencePromise { - // Nothing to do. - return PersistencePromise.resolve(); - } - getLastRemoteSnapshotVersion(): SnapshotVersion { return this.lastRemoteSnapshotVersion; } diff --git a/packages/firestore/src/local/persistence.ts b/packages/firestore/src/local/persistence.ts index 915ae39658b..dca0002d278 100644 --- a/packages/firestore/src/local/persistence.ts +++ b/packages/firestore/src/local/persistence.ts @@ -21,6 +21,7 @@ import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { RemoteDocumentCache } from './remote_document_cache'; +import { ListenSequenceNumber } from '../core/types'; /** * Opaque interface representing a persistence transaction. @@ -29,7 +30,9 @@ import { RemoteDocumentCache } from './remote_document_cache'; * pass it to your callback. You then pass it to any method that operates * on persistence. */ -export interface PersistenceTransaction {} +export interface PersistenceTransaction { + currentSequenceNumber: ListenSequenceNumber; +} /** * Persistence is the lowest-level shared interface to persistent storage in diff --git a/packages/firestore/src/local/query_cache.ts b/packages/firestore/src/local/query_cache.ts index 47b3c410242..d30534c572f 100644 --- a/packages/firestore/src/local/query_cache.ts +++ b/packages/firestore/src/local/query_cache.ts @@ -33,7 +33,7 @@ export interface QueryCache extends GarbageSource { /** * Starts up the query cache. */ - start(transaction: PersistenceTransaction): PersistencePromise; + //start(transaction: PersistenceTransaction): PersistencePromise; /** * Returns the highest target ID of any query in the cache. Typically called diff --git a/packages/firestore/src/local/simple_db.ts b/packages/firestore/src/local/simple_db.ts index b79aee50c54..9f3d8ee8ae4 100644 --- a/packages/firestore/src/local/simple_db.ts +++ b/packages/firestore/src/local/simple_db.ts @@ -23,6 +23,7 @@ import { SCHEMA_VERSION } from './indexeddb_schema'; import { Deferred } from '../util/promise'; import { PersistenceTransaction } from './persistence'; import { Code, FirestoreError } from '../util/error'; +import { ListenSequenceNumber } from '../core/types'; const LOG_TAG = 'SimpleDb'; @@ -150,7 +151,7 @@ export class SimpleDb { /** Helper to get a typed SimpleDbStore from a transaction. */ static getStore( - txn: PersistenceTransaction, + txn: SimpleDbTransaction, store: string ): SimpleDbStore { if (txn instanceof SimpleDbTransaction) { @@ -277,7 +278,9 @@ export class SimpleDbTransaction { mode: IDBTransactionMode, objectStoreNames: string[] ): SimpleDbTransaction { - return new SimpleDbTransaction(db.transaction(objectStoreNames, mode)); + return new SimpleDbTransaction( + db.transaction(objectStoreNames, mode) + ); } constructor(private readonly transaction: IDBTransaction) { diff --git a/packages/firestore/src/remote/remote_store.ts b/packages/firestore/src/remote/remote_store.ts index ea24b364eeb..6144d8d5843 100644 --- a/packages/firestore/src/remote/remote_store.ts +++ b/packages/firestore/src/remote/remote_store.ts @@ -407,7 +407,8 @@ export class RemoteStore implements TargetMetadataProvider { if (queryData) { this.listenTargets[targetId] = queryData.copy({ resumeToken: change.resumeToken, - snapshotVersion + snapshotVersion, + sequenceNumber: queryData.sequenceNumber }); } } @@ -425,7 +426,8 @@ export class RemoteStore implements TargetMetadataProvider { // Clear the resume token for the query, since we're in a known mismatch // state. this.listenTargets[targetId] = queryData.copy({ - resumeToken: emptyByteString() + resumeToken: emptyByteString(), + sequenceNumber: queryData.sequenceNumber }); // Cause a hard reset by unwatching and rewatching immediately, but @@ -439,6 +441,7 @@ export class RemoteStore implements TargetMetadataProvider { const requestQueryData = new QueryData( queryData.query, targetId, + queryData.sequenceNumber, QueryPurpose.ExistenceFilterMismatch ); this.sendWatchRequest(requestQueryData); From 96d732c63dc127c5910d55fdff80ba41e2472851 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 23 Jul 2018 13:51:36 -0700 Subject: [PATCH 02/25] Working on typed transactions --- .../firestore/src/core/firestore_client.ts | 7 +-- .../firestore/src/core/listen_sequence.ts | 4 +- packages/firestore/src/core/sync_engine.ts | 3 +- packages/firestore/src/core/types.ts | 6 +++ .../src/local/indexeddb_mutation_queue.ts | 44 ++++++++--------- .../src/local/indexeddb_persistence.ts | 10 ++-- .../src/local/indexeddb_query_cache.ts | 47 ++++++++++--------- .../local/indexeddb_remote_document_cache.ts | 14 +++--- .../src/local/local_documents_view.ts | 20 ++++---- packages/firestore/src/local/local_store.ts | 30 ++++++------ .../src/local/memory_mutation_queue.ts | 38 +++++++-------- .../firestore/src/local/memory_persistence.ts | 14 +++--- .../firestore/src/local/memory_query_cache.ts | 23 ++++----- .../src/local/memory_remote_document_cache.ts | 11 +++-- .../firestore/src/local/mutation_queue.ts | 34 +++++++------- packages/firestore/src/local/persistence.ts | 10 ++-- packages/firestore/src/local/query_cache.ts | 6 +-- packages/firestore/src/local/query_data.ts | 14 +++--- .../src/local/remote_document_cache.ts | 10 ++-- .../local/remote_document_change_buffer.ts | 9 ++-- packages/firestore/src/remote/remote_store.ts | 3 +- packages/firestore/test/util/helpers.ts | 9 ++-- 22 files changed, 190 insertions(+), 176 deletions(-) diff --git a/packages/firestore/src/core/firestore_client.ts b/packages/firestore/src/core/firestore_client.ts index c45f4591e2d..f2b51e6fcbc 100644 --- a/packages/firestore/src/core/firestore_client.ts +++ b/packages/firestore/src/core/firestore_client.ts @@ -30,7 +30,7 @@ import { IndexedDbPersistence } from '../local/indexeddb_persistence'; import { LocalStore } from '../local/local_store'; import { MemoryPersistence } from '../local/memory_persistence'; import { NoOpGarbageCollector } from '../local/no_op_garbage_collector'; -import { Persistence } from '../local/persistence'; +import { Persistence, PersistenceTransaction } from '../local/persistence'; import { DocumentKeySet, documentKeySet, @@ -76,8 +76,9 @@ export class FirestoreClient { // undefined checks. private eventMgr: EventManager; private garbageCollector: GarbageCollector; - private persistence: Persistence; - private localStore: LocalStore; + // TODO(gsoltis): wrap these two together to enforce the same parametrized type + private persistence: Persistence; + private localStore: LocalStore; private remoteStore: RemoteStore; private syncEngine: SyncEngine; diff --git a/packages/firestore/src/core/listen_sequence.ts b/packages/firestore/src/core/listen_sequence.ts index 8da44cec5cb..2adfd9d92ff 100644 --- a/packages/firestore/src/core/listen_sequence.ts +++ b/packages/firestore/src/core/listen_sequence.ts @@ -1,5 +1,3 @@ -import { ListenSequenceNumber } from './types'; - /** * Copyright 2018 Google Inc. * @@ -16,6 +14,8 @@ import { ListenSequenceNumber } from './types'; * limitations under the License. */ + import { ListenSequenceNumber } from './types'; + export class ListenSequence { static readonly IRRELEVANT = -1; diff --git a/packages/firestore/src/core/sync_engine.ts b/packages/firestore/src/core/sync_engine.ts index 841bbce976c..55ca37f7f30 100644 --- a/packages/firestore/src/core/sync_engine.ts +++ b/packages/firestore/src/core/sync_engine.ts @@ -63,6 +63,7 @@ import { import { ViewSnapshot } from './view_snapshot'; import { SortedSet } from '../util/sorted_set'; import { ListenSequence } from './listen_sequence'; +import { PersistenceTransaction } from '../local/persistence'; const LOG_TAG = 'SyncEngine'; @@ -150,7 +151,7 @@ export class SyncEngine implements RemoteSyncer { private targetIdGenerator = TargetIdGenerator.forSyncEngine(); constructor( - private localStore: LocalStore, + private localStore: LocalStore, private remoteStore: RemoteStore, private currentUser: User ) { diff --git a/packages/firestore/src/core/types.ts b/packages/firestore/src/core/types.ts index c5ef83a76bc..1af76795b91 100644 --- a/packages/firestore/src/core/types.ts +++ b/packages/firestore/src/core/types.ts @@ -26,6 +26,12 @@ export type BatchId = number; */ export type TargetId = number; +/** + * ListenSequenceNumbers provide an ordering for activity on targets, as + * well as on document usage. + */ +export type ListenSequenceNumber = number; + // TODO(b/35918695): In GRPC / node, tokens are Uint8Array. In WebChannel, // they're strings. We should probably (de-)serialize to a common internal type. export type ProtoByteString = Uint8Array | string; diff --git a/packages/firestore/src/local/indexeddb_mutation_queue.ts b/packages/firestore/src/local/indexeddb_mutation_queue.ts index d57e1cdc866..817eb0f2c6f 100644 --- a/packages/firestore/src/local/indexeddb_mutation_queue.ts +++ b/packages/firestore/src/local/indexeddb_mutation_queue.ts @@ -44,7 +44,7 @@ import { SimpleDb, SimpleDbStore } from './simple_db'; import { IndexedDbTransaction } from './indexeddb_persistence'; /** A mutation queue for a specific user, backed by IndexedDB. */ -export class IndexedDbMutationQueue implements MutationQueue { +export class IndexedDbMutationQueue implements MutationQueue { /** * Next value to use when assigning sequential IDs to each mutation batch. * @@ -88,7 +88,7 @@ export class IndexedDbMutationQueue implements MutationQueue { return new IndexedDbMutationQueue(userId, serializer); } - start(transaction: PersistenceTransaction): PersistencePromise { + start(transaction: IndexedDbTransaction): PersistencePromise { return IndexedDbMutationQueue.loadNextBatchIdFromDb(transaction) .next(nextBatchId => { this.nextBatchId = nextBatchId; @@ -130,7 +130,7 @@ export class IndexedDbMutationQueue implements MutationQueue { * are no mutations returns 0. Note that batch IDs are global. */ static loadNextBatchIdFromDb( - txn: PersistenceTransaction + txn: IndexedDbTransaction ): PersistencePromise { let maxBatchId = BATCHID_UNKNOWN; return mutationsStore(txn) @@ -153,7 +153,7 @@ export class IndexedDbMutationQueue implements MutationQueue { .next(() => maxBatchId + 1); } - checkEmpty(transaction: PersistenceTransaction): PersistencePromise { + checkEmpty(transaction: IndexedDbTransaction): PersistencePromise { let empty = true; const range = IDBKeyRange.bound( this.keyForBatchId(Number.NEGATIVE_INFINITY), @@ -168,19 +168,19 @@ export class IndexedDbMutationQueue implements MutationQueue { } getNextBatchId( - transaction: PersistenceTransaction + transaction: IndexedDbTransaction ): PersistencePromise { return PersistencePromise.resolve(this.nextBatchId); } getHighestAcknowledgedBatchId( - transaction: PersistenceTransaction + transaction: IndexedDbTransaction ): PersistencePromise { return PersistencePromise.resolve(this.metadata.lastAcknowledgedBatchId); } acknowledgeBatch( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, batch: MutationBatch, streamToken: ProtoByteString ): PersistencePromise { @@ -197,13 +197,13 @@ export class IndexedDbMutationQueue implements MutationQueue { } getLastStreamToken( - transaction: PersistenceTransaction + transaction: IndexedDbTransaction ): PersistencePromise { return PersistencePromise.resolve(this.metadata.lastStreamToken); } setLastStreamToken( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, streamToken: ProtoByteString ): PersistencePromise { this.metadata.lastStreamToken = convertStreamToken(streamToken); @@ -211,7 +211,7 @@ export class IndexedDbMutationQueue implements MutationQueue { } addMutationBatch( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, localWriteTime: Timestamp, mutations: Mutation[] ): PersistencePromise { @@ -246,7 +246,7 @@ export class IndexedDbMutationQueue implements MutationQueue { } lookupMutationBatch( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, batchId: BatchId ): PersistencePromise { return mutationsStore(transaction) @@ -258,7 +258,7 @@ export class IndexedDbMutationQueue implements MutationQueue { } getNextMutationBatchAfterBatchId( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, batchId: BatchId ): PersistencePromise { // All batches with batchId <= this.metadata.lastAcknowledgedBatchId have @@ -284,7 +284,7 @@ export class IndexedDbMutationQueue implements MutationQueue { } getAllMutationBatches( - transaction: PersistenceTransaction + transaction: IndexedDbTransaction ): PersistencePromise { const range = IDBKeyRange.bound( this.keyForBatchId(BATCHID_UNKNOWN), @@ -298,7 +298,7 @@ export class IndexedDbMutationQueue implements MutationQueue { } getAllMutationBatchesThroughBatchId( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, batchId: BatchId ): PersistencePromise { const range = IDBKeyRange.bound( @@ -313,7 +313,7 @@ export class IndexedDbMutationQueue implements MutationQueue { } getAllMutationBatchesAffectingDocumentKey( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, documentKey: DocumentKey ): PersistencePromise { // Scan the document-mutation index starting with a prefix starting with @@ -364,7 +364,7 @@ export class IndexedDbMutationQueue implements MutationQueue { } getAllMutationBatchesAffectingQuery( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, query: Query ): PersistencePromise { assert( @@ -440,7 +440,7 @@ export class IndexedDbMutationQueue implements MutationQueue { } removeMutationBatches( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, batches: MutationBatch[] ): PersistencePromise { const txn = mutationsStore(transaction); @@ -479,7 +479,7 @@ export class IndexedDbMutationQueue implements MutationQueue { } performConsistencyCheck( - txn: PersistenceTransaction + txn: IndexedDbTransaction ): PersistencePromise { return this.checkEmpty(txn).next(empty => { if (!empty) { @@ -518,7 +518,7 @@ export class IndexedDbMutationQueue implements MutationQueue { } containsKey( - txn: PersistenceTransaction, + txn: IndexedDbTransaction, key: DocumentKey ): PersistencePromise { const indexKey = DbDocumentMutation.prefixForPath(this.userId, key.path); @@ -562,7 +562,7 @@ function convertStreamToken(token: ProtoByteString): string { * Helper to get a typed SimpleDbStore for the mutations object store. */ function mutationsStore( - txn: PersistenceTransaction + txn: IndexedDbTransaction ): SimpleDbStore { return SimpleDb.getStore( (txn as IndexedDbTransaction).simpleDbTransaction, @@ -574,7 +574,7 @@ function mutationsStore( * Helper to get a typed SimpleDbStore for the mutationQueues object store. */ function documentMutationsStore( - txn: PersistenceTransaction + txn: IndexedDbTransaction ): SimpleDbStore { return SimpleDb.getStore( (txn as IndexedDbTransaction).simpleDbTransaction, @@ -586,7 +586,7 @@ function documentMutationsStore( * Helper to get a typed SimpleDbStore for the mutationQueues object store. */ function mutationQueuesStore( - txn: PersistenceTransaction + txn: IndexedDbTransaction ): SimpleDbStore { return SimpleDb.getStore( (txn as IndexedDbTransaction).simpleDbTransaction, diff --git a/packages/firestore/src/local/indexeddb_persistence.ts b/packages/firestore/src/local/indexeddb_persistence.ts index 323630933e9..d7bd021213b 100644 --- a/packages/firestore/src/local/indexeddb_persistence.ts +++ b/packages/firestore/src/local/indexeddb_persistence.ts @@ -97,7 +97,7 @@ export class IndexedDbTransaction { * which acts as an indicator that another tab should go ahead and take the * owner lease immediately regardless of the current lease timestamp. */ -export class IndexedDbPersistence implements Persistence { +export class IndexedDbPersistence implements Persistence { /** * The name of the main (and currently only) IndexedDB database. this name is * appended to the prefix provided to the IndexedDbPersistence constructor. @@ -176,21 +176,21 @@ export class IndexedDbPersistence implements Persistence { }); } - getMutationQueue(user: User): MutationQueue { + getMutationQueue(user: User): MutationQueue { return IndexedDbMutationQueue.forUser(user, this.serializer); } - getQueryCache(): QueryCache { + getQueryCache(): QueryCache { return this.queryCache; } - getRemoteDocumentCache(): RemoteDocumentCache { + getRemoteDocumentCache(): RemoteDocumentCache { return new IndexedDbRemoteDocumentCache(this.serializer); } runTransaction( action: string, - operation: (transaction: PersistenceTransaction) => PersistencePromise + operation: (transaction: IndexedDbTransaction) => PersistencePromise ): Promise { if (this.persistenceError) { return Promise.reject(this.persistenceError); diff --git a/packages/firestore/src/local/indexeddb_query_cache.ts b/packages/firestore/src/local/indexeddb_query_cache.ts index 8e1810e4e79..bee11442e30 100644 --- a/packages/firestore/src/local/indexeddb_query_cache.ts +++ b/packages/firestore/src/local/indexeddb_query_cache.ts @@ -41,7 +41,7 @@ import { QueryData } from './query_data'; import { SimpleDb, SimpleDbStore, SimpleDbTransaction } from './simple_db'; import { IndexedDbTransaction } from './indexeddb_persistence'; -export class IndexedDbQueryCache implements QueryCache { +export class IndexedDbQueryCache implements QueryCache { constructor(private serializer: LocalSerializer) {} /** @@ -84,19 +84,19 @@ export class IndexedDbQueryCache implements QueryCache { } setLastRemoteSnapshotVersion( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, snapshotVersion: SnapshotVersion ): PersistencePromise { this.lastRemoteSnapshotVersion = snapshotVersion; this.metadata.lastRemoteSnapshotVersion = snapshotVersion.toTimestamp(); - return globalTargetStore(transaction).put( + return globalTargetStore(transaction.simpleDbTransaction).put( DbTargetGlobal.key, this.metadata ); } addQueryData( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, queryData: QueryData ): PersistencePromise { return this.saveQueryData(transaction, queryData).next(() => { @@ -107,7 +107,7 @@ export class IndexedDbQueryCache implements QueryCache { } updateQueryData( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, queryData: QueryData ): PersistencePromise { return this.saveQueryData(transaction, queryData).next(() => { @@ -120,7 +120,7 @@ export class IndexedDbQueryCache implements QueryCache { } removeQueryData( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, queryData: QueryData ): PersistencePromise { assert(this.metadata.targetCount > 0, 'Removing from an empty query cache'); @@ -133,16 +133,16 @@ export class IndexedDbQueryCache implements QueryCache { } private saveMetadata( - transaction: PersistenceTransaction + transaction: IndexedDbTransaction ): PersistencePromise { - return globalTargetStore(transaction).put( + return globalTargetStore(transaction.simpleDbTransaction).put( DbTargetGlobal.key, this.metadata ); } private saveQueryData( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, queryData: QueryData ): PersistencePromise { return targetsStore(transaction).put(this.serializer.toDbTarget(queryData)); @@ -169,7 +169,7 @@ export class IndexedDbQueryCache implements QueryCache { } getQueryData( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, query: Query ): PersistencePromise { // Iterating by the canonicalId may yield more than one result because @@ -198,7 +198,7 @@ export class IndexedDbQueryCache implements QueryCache { } addMatchingKeys( - txn: PersistenceTransaction, + txn: IndexedDbTransaction, keys: DocumentKeySet, targetId: TargetId ): PersistencePromise { @@ -214,7 +214,7 @@ export class IndexedDbQueryCache implements QueryCache { } removeMatchingKeys( - txn: PersistenceTransaction, + txn: IndexedDbTransaction, keys: DocumentKeySet, targetId: TargetId ): PersistencePromise { @@ -233,7 +233,7 @@ export class IndexedDbQueryCache implements QueryCache { } removeMatchingKeysForTargetId( - txn: PersistenceTransaction, + txn: IndexedDbTransaction, targetId: TargetId ): PersistencePromise { const store = documentTargetStore(txn); @@ -249,7 +249,7 @@ export class IndexedDbQueryCache implements QueryCache { } private notifyGCForRemovedKeys( - txn: PersistenceTransaction, + txn: IndexedDbTransaction, range: IDBKeyRange ): PersistencePromise { const store = documentTargetStore(txn); @@ -273,7 +273,7 @@ export class IndexedDbQueryCache implements QueryCache { } getMatchingKeysForTargetId( - txn: PersistenceTransaction, + txn: IndexedDbTransaction, targetId: TargetId ): PersistencePromise { const range = IDBKeyRange.bound( @@ -298,8 +298,10 @@ export class IndexedDbQueryCache implements QueryCache { this.garbageCollector = gc; } + // TODO(gsoltis): we can let the compiler assert that txn !== null if we + // drop null from the type bounds on txn. containsKey( - txn: PersistenceTransaction | null, + txn: IndexedDbTransaction | null, key: DocumentKey ): PersistencePromise { assert( @@ -334,10 +336,10 @@ export class IndexedDbQueryCache implements QueryCache { * Helper to get a typed SimpleDbStore for the queries object store. */ function targetsStore( - txn: PersistenceTransaction + txn: IndexedDbTransaction ): SimpleDbStore { return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + txn.simpleDbTransaction, DbTarget.store ); } @@ -346,11 +348,10 @@ function targetsStore( * Helper to get a typed SimpleDbStore for the target globals object store. */ function globalTargetStore( - txn: PersistenceTransaction | SimpleDbTransaction + txn: SimpleDbTransaction ): SimpleDbStore { - const simpleDbTransaction = txn instanceof SimpleDbTransaction ? txn : (txn as IndexedDbTransaction).simpleDbTransaction; return SimpleDb.getStore( - simpleDbTransaction, + txn, DbTargetGlobal.store ); } @@ -359,10 +360,10 @@ function globalTargetStore( * Helper to get a typed SimpleDbStore for the document target object store. */ function documentTargetStore( - txn: PersistenceTransaction + txn: IndexedDbTransaction ): SimpleDbStore { return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + txn.simpleDbTransaction, DbTargetDocument.store ); } diff --git a/packages/firestore/src/local/indexeddb_remote_document_cache.ts b/packages/firestore/src/local/indexeddb_remote_document_cache.ts index a0b2d63a015..e4dd9d590d4 100644 --- a/packages/firestore/src/local/indexeddb_remote_document_cache.ts +++ b/packages/firestore/src/local/indexeddb_remote_document_cache.ts @@ -27,11 +27,11 @@ import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; import { SimpleDb, SimpleDbStore } from './simple_db'; -export class IndexedDbRemoteDocumentCache implements RemoteDocumentCache { +export class IndexedDbRemoteDocumentCache implements RemoteDocumentCache { constructor(private serializer: LocalSerializer) {} addEntry( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, maybeDocument: MaybeDocument ): PersistencePromise { return remoteDocumentsStore(transaction).put( @@ -41,14 +41,14 @@ export class IndexedDbRemoteDocumentCache implements RemoteDocumentCache { } removeEntry( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, documentKey: DocumentKey ): PersistencePromise { return remoteDocumentsStore(transaction).delete(dbKey(documentKey)); } getEntry( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, documentKey: DocumentKey ): PersistencePromise { return remoteDocumentsStore(transaction) @@ -61,7 +61,7 @@ export class IndexedDbRemoteDocumentCache implements RemoteDocumentCache { } getDocumentsMatchingQuery( - transaction: PersistenceTransaction, + transaction: IndexedDbTransaction, query: Query ): PersistencePromise { let results = documentMap(); @@ -87,10 +87,10 @@ export class IndexedDbRemoteDocumentCache implements RemoteDocumentCache { * Helper to get a typed SimpleDbStore for the remoteDocuments object store. */ function remoteDocumentsStore( - txn: PersistenceTransaction + txn: IndexedDbTransaction ): SimpleDbStore { return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + txn.simpleDbTransaction, DbRemoteDocument.store ); } diff --git a/packages/firestore/src/local/local_documents_view.ts b/packages/firestore/src/local/local_documents_view.ts index 7a37b330774..a802ebd9b52 100644 --- a/packages/firestore/src/local/local_documents_view.ts +++ b/packages/firestore/src/local/local_documents_view.ts @@ -40,10 +40,10 @@ import { RemoteDocumentCache } from './remote_document_cache'; * document). The view is computed by applying the mutations in the * MutationQueue to the RemoteDocumentCache. */ -export class LocalDocumentsView { +export class LocalDocumentsView { constructor( - private remoteDocumentCache: RemoteDocumentCache, - private mutationQueue: MutationQueue + private remoteDocumentCache: RemoteDocumentCache, + private mutationQueue: MutationQueue ) {} /** @@ -53,7 +53,7 @@ export class LocalDocumentsView { * state for it. */ getDocument( - transaction: PersistenceTransaction, + transaction: TransactionType, key: DocumentKey ): PersistencePromise { return this.remoteDocumentCache @@ -70,7 +70,7 @@ export class LocalDocumentsView { * be stored for that key in the resulting set. */ getDocuments( - transaction: PersistenceTransaction, + transaction: TransactionType, keys: DocumentKeySet ): PersistencePromise { const promises = [] as Array>; @@ -91,7 +91,7 @@ export class LocalDocumentsView { /** Performs a query against the local view of all documents. */ getDocumentsMatchingQuery( - transaction: PersistenceTransaction, + transaction: TransactionType, query: Query ): PersistencePromise { if (DocumentKey.isDocumentKey(query.path)) { @@ -102,7 +102,7 @@ export class LocalDocumentsView { } private getDocumentsMatchingDocumentQuery( - transaction: PersistenceTransaction, + transaction: TransactionType, docPath: ResourcePath ): PersistencePromise { // Just do a simple document lookup. @@ -118,7 +118,7 @@ export class LocalDocumentsView { } private getDocumentsMatchingCollectionQuery( - transaction: PersistenceTransaction, + transaction: TransactionType, query: Query ): PersistencePromise { // Query the remote documents and overlay mutations. @@ -188,7 +188,7 @@ export class LocalDocumentsView { * @param document The base remote document to apply mutations to or null. */ private computeLocalDocument( - transaction: PersistenceTransaction, + transaction: TransactionType, documentKey: DocumentKey, document: MaybeDocument | null ): PersistencePromise { @@ -211,7 +211,7 @@ export class LocalDocumentsView { * @return The local view of the documents. */ private computeLocalDocuments( - transaction: PersistenceTransaction, + transaction: TransactionType, documents: DocumentMap ): PersistencePromise { const promises = [] as Array>; diff --git a/packages/firestore/src/local/local_store.ts b/packages/firestore/src/local/local_store.ts index 52fee7842fd..528e033c622 100644 --- a/packages/firestore/src/local/local_store.ts +++ b/packages/firestore/src/local/local_store.ts @@ -110,21 +110,21 @@ export interface LocalWriteResult { * (unexpected) failure (e.g. failed assert) and always represent an * unrecoverable error (should be caught / reported by the async_queue). */ -export class LocalStore { +export class LocalStore { /** * The set of all mutations that have been sent but not yet been applied to * the backend. */ - private mutationQueue: MutationQueue; + private mutationQueue: MutationQueue; /** The set of all cached remote documents. */ - private remoteDocuments: RemoteDocumentCache; + private remoteDocuments: RemoteDocumentCache; /** * The "local" view of all documents (layering mutationQueue on top of * remoteDocumentCache). */ - private localDocuments: LocalDocumentsView; + private localDocuments: LocalDocumentsView; /** * The set of document references maintained by any local views. @@ -132,7 +132,7 @@ export class LocalStore { private localViewReferences = new ReferenceSet(); /** Maps a query to the data about that query. */ - private queryCache: QueryCache; + private queryCache: QueryCache; /** Maps a targetID to data about its query. */ private targetIds = {} as { [targetId: number]: QueryData }; @@ -154,7 +154,7 @@ export class LocalStore { constructor( /** Manages our in-memory or durable persistence. */ - private persistence: Persistence, + private persistence: Persistence, initialUser: User, /** * The garbage collector collects documents that should no longer be @@ -242,7 +242,7 @@ export class LocalStore { }*/ private startMutationQueue( - txn: PersistenceTransaction + txn: TransactionType ): PersistencePromise { return this.mutationQueue .start(txn) @@ -717,8 +717,8 @@ export class LocalStore { } private releaseHeldBatchResults( - txn: PersistenceTransaction, - documentBuffer: RemoteDocumentChangeBuffer + txn: TransactionType, + documentBuffer: RemoteDocumentChangeBuffer ): PersistencePromise { const toRelease: MutationBatchResult[] = []; for (const batchResult of this.heldBatchResults) { @@ -754,9 +754,9 @@ export class LocalStore { } private releaseBatchResults( - txn: PersistenceTransaction, + txn: TransactionType, batchResults: MutationBatchResult[], - documentBuffer: RemoteDocumentChangeBuffer + documentBuffer: RemoteDocumentChangeBuffer ): PersistencePromise { let promiseChain = PersistencePromise.resolve(); for (const batchResult of batchResults) { @@ -773,7 +773,7 @@ export class LocalStore { } private removeMutationBatch( - txn: PersistenceTransaction, + txn: TransactionType, batch: MutationBatch ): PersistencePromise { return this.removeMutationBatches(txn, [batch]); @@ -781,7 +781,7 @@ export class LocalStore { /** Removes all the mutation batches named in the given array. */ private removeMutationBatches( - txn: PersistenceTransaction, + txn: TransactionType, batches: MutationBatch[] ): PersistencePromise { let affectedDocs = documentKeySet(); @@ -798,9 +798,9 @@ export class LocalStore { } private applyWriteToRemoteDocuments( - txn: PersistenceTransaction, + txn: TransactionType, batchResult: MutationBatchResult, - documentBuffer: RemoteDocumentChangeBuffer + documentBuffer: RemoteDocumentChangeBuffer ): PersistencePromise { const batch = batchResult.batch; const docKeys = batch.keys(); diff --git a/packages/firestore/src/local/memory_mutation_queue.ts b/packages/firestore/src/local/memory_mutation_queue.ts index add67d47220..f477ce43279 100644 --- a/packages/firestore/src/local/memory_mutation_queue.ts +++ b/packages/firestore/src/local/memory_mutation_queue.ts @@ -27,11 +27,11 @@ import { SortedSet } from '../util/sorted_set'; import { GarbageCollector } from './garbage_collector'; import { MutationQueue } from './mutation_queue'; -import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { DocReference } from './reference_set'; +import { MemoryPersistenceTransaction } from './memory_persistence'; -export class MemoryMutationQueue implements MutationQueue { +export class MemoryMutationQueue implements MutationQueue { /** * The set of all mutations that have been sent but not yet been applied to * the backend. @@ -56,7 +56,7 @@ export class MemoryMutationQueue implements MutationQueue { /** An ordered mapping between documents and the mutations batch IDs. */ private batchesByDocumentKey = new SortedSet(DocReference.compareByKey); - start(transaction: PersistenceTransaction): PersistencePromise { + start(transaction: MemoryPersistenceTransaction): PersistencePromise { // NOTE: The queue may be shutdown / started multiple times, since we // maintain the queue for the duration of the app session in case a user // logs out / back in. To behave like the LevelDB-backed MutationQueue (and @@ -73,24 +73,24 @@ export class MemoryMutationQueue implements MutationQueue { return PersistencePromise.resolve(); } - checkEmpty(transaction: PersistenceTransaction): PersistencePromise { + checkEmpty(transaction: MemoryPersistenceTransaction): PersistencePromise { return PersistencePromise.resolve(this.mutationQueue.length === 0); } getNextBatchId( - transaction: PersistenceTransaction + transaction: MemoryPersistenceTransaction ): PersistencePromise { return PersistencePromise.resolve(this.nextBatchId); } getHighestAcknowledgedBatchId( - transaction: PersistenceTransaction + transaction: MemoryPersistenceTransaction ): PersistencePromise { return PersistencePromise.resolve(this.highestAcknowledgedBatchId); } acknowledgeBatch( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, batch: MutationBatch, streamToken: ProtoByteString ): PersistencePromise { @@ -122,13 +122,13 @@ export class MemoryMutationQueue implements MutationQueue { } getLastStreamToken( - transaction: PersistenceTransaction + transaction: MemoryPersistenceTransaction ): PersistencePromise { return PersistencePromise.resolve(this.lastStreamToken); } setLastStreamToken( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, streamToken: ProtoByteString ): PersistencePromise { this.lastStreamToken = streamToken; @@ -136,7 +136,7 @@ export class MemoryMutationQueue implements MutationQueue { } addMutationBatch( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, localWriteTime: Timestamp, mutations: Mutation[] ): PersistencePromise { @@ -167,14 +167,14 @@ export class MemoryMutationQueue implements MutationQueue { } lookupMutationBatch( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, batchId: BatchId ): PersistencePromise { return PersistencePromise.resolve(this.findMutationBatch(batchId)); } getNextMutationBatchAfterBatchId( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, batchId: BatchId ): PersistencePromise { const size = this.mutationQueue.length; @@ -200,7 +200,7 @@ export class MemoryMutationQueue implements MutationQueue { } getAllMutationBatches( - transaction: PersistenceTransaction + transaction: MemoryPersistenceTransaction ): PersistencePromise { return PersistencePromise.resolve( this.getAllLiveMutationBatchesBeforeIndex(this.mutationQueue.length) @@ -208,7 +208,7 @@ export class MemoryMutationQueue implements MutationQueue { } getAllMutationBatchesThroughBatchId( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, batchId: BatchId ): PersistencePromise { const count = this.mutationQueue.length; @@ -230,7 +230,7 @@ export class MemoryMutationQueue implements MutationQueue { } getAllMutationBatchesAffectingDocumentKey( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, documentKey: DocumentKey ): PersistencePromise { const start = new DocReference(documentKey, 0); @@ -253,7 +253,7 @@ export class MemoryMutationQueue implements MutationQueue { } getAllMutationBatchesAffectingQuery( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, query: Query ): PersistencePromise { // Use the query path as a prefix for testing if a document matches the @@ -306,7 +306,7 @@ export class MemoryMutationQueue implements MutationQueue { } removeMutationBatches( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, batches: MutationBatch[] ): PersistencePromise { const batchCount = batches.length; @@ -382,7 +382,7 @@ export class MemoryMutationQueue implements MutationQueue { } containsKey( - txn: PersistenceTransaction, + txn: MemoryPersistenceTransaction, key: DocumentKey ): PersistencePromise { const ref = new DocReference(key, 0); @@ -391,7 +391,7 @@ export class MemoryMutationQueue implements MutationQueue { } performConsistencyCheck( - txn: PersistenceTransaction + txn: MemoryPersistenceTransaction ): PersistencePromise { if (this.mutationQueue.length === 0) { assert( diff --git a/packages/firestore/src/local/memory_persistence.ts b/packages/firestore/src/local/memory_persistence.ts index 15b76f36d77..f2bbcddd095 100644 --- a/packages/firestore/src/local/memory_persistence.ts +++ b/packages/firestore/src/local/memory_persistence.ts @@ -35,7 +35,7 @@ const LOG_TAG = 'MemoryPersistence'; * A memory-backed instance of Persistence. Data is stored only in RAM and * not persisted across sessions. */ -export class MemoryPersistence implements Persistence { +export class MemoryPersistence implements Persistence { /** * Note that these are retained here to make it easier to write tests * affecting both the in-memory and IndexedDB-backed persistence layers. Tests @@ -43,7 +43,7 @@ export class MemoryPersistence implements Persistence { * will make the in-memory persistence layer behave as if it were actually * persisting values. */ - private mutationQueues: { [user: string]: MutationQueue } = {}; + private mutationQueues: { [user: string]: MutationQueue } = {}; private remoteDocumentCache = new MemoryRemoteDocumentCache(); private queryCache = new MemoryQueryCache(); @@ -61,7 +61,7 @@ export class MemoryPersistence implements Persistence { this.started = false; } - getMutationQueue(user: User): MutationQueue { + getMutationQueue(user: User): MutationQueue { let queue = this.mutationQueues[user.toKey()]; if (!queue) { queue = new MemoryMutationQueue(); @@ -70,17 +70,17 @@ export class MemoryPersistence implements Persistence { return queue; } - getQueryCache(): QueryCache { + getQueryCache(): QueryCache { return this.queryCache; } - getRemoteDocumentCache(): RemoteDocumentCache { + getRemoteDocumentCache(): RemoteDocumentCache { return this.remoteDocumentCache; } runTransaction( action: string, - operation: (transaction: PersistenceTransaction) => PersistencePromise + operation: (transaction: MemoryPersistenceTransaction) => PersistencePromise ): Promise { debug(LOG_TAG, 'Starting transaction:', action); return operation(new MemoryPersistenceTransaction()).toPromise(); @@ -88,7 +88,7 @@ export class MemoryPersistence implements Persistence { } /** Dummy class since memory persistence doesn't actually use transactions. */ -class MemoryPersistenceTransaction implements PersistenceTransaction { +export class MemoryPersistenceTransaction implements PersistenceTransaction { get currentSequenceNumber(): ListenSequenceNumber { return ListenSequence.IRRELEVANT; } diff --git a/packages/firestore/src/local/memory_query_cache.ts b/packages/firestore/src/local/memory_query_cache.ts index 8dea3aefb39..2d44bdd9aad 100644 --- a/packages/firestore/src/local/memory_query_cache.ts +++ b/packages/firestore/src/local/memory_query_cache.ts @@ -28,8 +28,9 @@ import { QueryCache } from './query_cache'; import { QueryData } from './query_data'; import { ReferenceSet } from './reference_set'; import { assert } from '../util/assert'; +import { MemoryPersistenceTransaction } from './memory_persistence'; -export class MemoryQueryCache implements QueryCache { +export class MemoryQueryCache implements QueryCache { /** * Maps a query to the data about that query */ @@ -56,7 +57,7 @@ export class MemoryQueryCache implements QueryCache { } setLastRemoteSnapshotVersion( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, snapshotVersion: SnapshotVersion ): PersistencePromise { this.lastRemoteSnapshotVersion = snapshotVersion; @@ -73,7 +74,7 @@ export class MemoryQueryCache implements QueryCache { } addQueryData( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, queryData: QueryData ): PersistencePromise { assert( @@ -86,7 +87,7 @@ export class MemoryQueryCache implements QueryCache { } updateQueryData( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, queryData: QueryData ): PersistencePromise { assert(this.queries.has(queryData.query), 'Updating a non-existent query'); @@ -95,7 +96,7 @@ export class MemoryQueryCache implements QueryCache { } removeQueryData( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, queryData: QueryData ): PersistencePromise { assert(this.targetCount > 0, 'Removing a target from an empty cache'); @@ -114,7 +115,7 @@ export class MemoryQueryCache implements QueryCache { } getQueryData( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, query: Query ): PersistencePromise { const queryData = this.queries.get(query) || null; @@ -122,7 +123,7 @@ export class MemoryQueryCache implements QueryCache { } addMatchingKeys( - txn: PersistenceTransaction, + txn: MemoryPersistenceTransaction, keys: DocumentKeySet, targetId: TargetId ): PersistencePromise { @@ -131,7 +132,7 @@ export class MemoryQueryCache implements QueryCache { } removeMatchingKeys( - txn: PersistenceTransaction, + txn: MemoryPersistenceTransaction, keys: DocumentKeySet, targetId: TargetId ): PersistencePromise { @@ -140,7 +141,7 @@ export class MemoryQueryCache implements QueryCache { } removeMatchingKeysForTargetId( - txn: PersistenceTransaction, + txn: MemoryPersistenceTransaction, targetId: TargetId ): PersistencePromise { this.references.removeReferencesForId(targetId); @@ -148,7 +149,7 @@ export class MemoryQueryCache implements QueryCache { } getMatchingKeysForTargetId( - txn: PersistenceTransaction, + txn: MemoryPersistenceTransaction, targetId: TargetId ): PersistencePromise { const matchingKeys = this.references.referencesForId(targetId); @@ -160,7 +161,7 @@ export class MemoryQueryCache implements QueryCache { } containsKey( - txn: PersistenceTransaction | null, + txn: MemoryPersistenceTransaction | null, key: DocumentKey ): PersistencePromise { return this.references.containsKey(txn, key); diff --git a/packages/firestore/src/local/memory_remote_document_cache.ts b/packages/firestore/src/local/memory_remote_document_cache.ts index 881ab8c186d..51d2abc4aef 100644 --- a/packages/firestore/src/local/memory_remote_document_cache.ts +++ b/packages/firestore/src/local/memory_remote_document_cache.ts @@ -26,12 +26,13 @@ import { DocumentKey } from '../model/document_key'; import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; +import { MemoryPersistenceTransaction } from './memory_persistence'; -export class MemoryRemoteDocumentCache implements RemoteDocumentCache { +export class MemoryRemoteDocumentCache implements RemoteDocumentCache { private docs = maybeDocumentMap(); addEntry( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, maybeDocument: MaybeDocument ): PersistencePromise { this.docs = this.docs.insert(maybeDocument.key, maybeDocument); @@ -39,7 +40,7 @@ export class MemoryRemoteDocumentCache implements RemoteDocumentCache { } removeEntry( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, documentKey: DocumentKey ): PersistencePromise { this.docs = this.docs.remove(documentKey); @@ -47,14 +48,14 @@ export class MemoryRemoteDocumentCache implements RemoteDocumentCache { } getEntry( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, documentKey: DocumentKey ): PersistencePromise { return PersistencePromise.resolve(this.docs.get(documentKey)); } getDocumentsMatchingQuery( - transaction: PersistenceTransaction, + transaction: MemoryPersistenceTransaction, query: Query ): PersistencePromise { let results = documentMap(); diff --git a/packages/firestore/src/local/mutation_queue.ts b/packages/firestore/src/local/mutation_queue.ts index 8ad262a9e67..fbab7270e03 100644 --- a/packages/firestore/src/local/mutation_queue.ts +++ b/packages/firestore/src/local/mutation_queue.ts @@ -26,7 +26,7 @@ import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; /** A queue of mutations to apply to the remote store. */ -export interface MutationQueue extends GarbageSource { +export interface MutationQueue extends GarbageSource { /** * Starts the mutation queue, performing any initial reads that might be * required to establish invariants, etc. @@ -36,10 +36,10 @@ export interface MutationQueue extends GarbageSource { * local store from creating new batches that the mutation queue would * consider erroneously acknowledged. */ - start(transaction: PersistenceTransaction): PersistencePromise; + start(transaction: TransactionType): PersistencePromise; /** Returns true if this queue contains no mutation batches. */ - checkEmpty(transaction: PersistenceTransaction): PersistencePromise; + checkEmpty(transaction: TransactionType): PersistencePromise; /** * Returns the next BatchId that will be assigned to a new mutation batch. @@ -49,7 +49,7 @@ export interface MutationQueue extends GarbageSource { * highestAcknowledgedBatchId is less than nextBatchId. */ getNextBatchId( - transaction: PersistenceTransaction + transaction: TransactionType ): PersistencePromise; /** @@ -58,39 +58,39 @@ export interface MutationQueue extends GarbageSource { * BATCHID_UNKNOWN. */ getHighestAcknowledgedBatchId( - transaction: PersistenceTransaction + transaction: TransactionType ): PersistencePromise; /** * Acknowledges the given batch. */ acknowledgeBatch( - transaction: PersistenceTransaction, + transaction: TransactionType, batch: MutationBatch, streamToken: ProtoByteString ): PersistencePromise; /** Returns the current stream token for this mutation queue. */ getLastStreamToken( - transaction: PersistenceTransaction + transaction: TransactionType ): PersistencePromise; /** Sets the stream token for this mutation queue. */ setLastStreamToken( - transaction: PersistenceTransaction, + transaction: TransactionType, streamToken: ProtoByteString ): PersistencePromise; /** Creates a new mutation batch and adds it to this mutation queue. */ addMutationBatch( - transaction: PersistenceTransaction, + transaction: TransactionType, localWriteTime: Timestamp, mutations: Mutation[] ): PersistencePromise; /** Loads the mutation batch with the given batchId. */ lookupMutationBatch( - transaction: PersistenceTransaction, + transaction: TransactionType, batchId: BatchId ): PersistencePromise; @@ -104,7 +104,7 @@ export interface MutationQueue extends GarbageSource { * @return the next mutation or null if there wasn't one. */ getNextMutationBatchAfterBatchId( - transaction: PersistenceTransaction, + transaction: TransactionType, batchId: BatchId ): PersistencePromise; @@ -112,7 +112,7 @@ export interface MutationQueue extends GarbageSource { // TODO(mikelehen): PERF: Current consumer only needs mutated keys; if we can // provide that cheaply, we should replace this. getAllMutationBatches( - transaction: PersistenceTransaction + transaction: TransactionType ): PersistencePromise; /** @@ -129,7 +129,7 @@ export interface MutationQueue extends GarbageSource { // TODO(mcg): This should really return an enumerator and the caller should be // adjusted to only loop through these once. getAllMutationBatchesThroughBatchId( - transaction: PersistenceTransaction, + transaction: TransactionType, batchId: BatchId ): PersistencePromise; @@ -146,7 +146,7 @@ export interface MutationQueue extends GarbageSource { // TODO(mcg): This should really return an enumerator // also for b/32992024, all backing stores should really index by document key getAllMutationBatchesAffectingDocumentKey( - transaction: PersistenceTransaction, + transaction: TransactionType, documentKey: DocumentKey ): PersistencePromise; @@ -166,7 +166,7 @@ export interface MutationQueue extends GarbageSource { // TODO(mikelehen): This should perhaps return an enumerator, though I'm not // sure we can avoid loading them all in memory. getAllMutationBatchesAffectingQuery( - transaction: PersistenceTransaction, + transaction: TransactionType, query: Query ): PersistencePromise; @@ -182,7 +182,7 @@ export interface MutationQueue extends GarbageSource { * getAllMutationBatchesThroughBatchId() */ removeMutationBatches( - transaction: PersistenceTransaction, + transaction: TransactionType, batches: MutationBatch[] ): PersistencePromise; @@ -191,6 +191,6 @@ export interface MutationQueue extends GarbageSource { * leaks, if possible. */ performConsistencyCheck( - transaction: PersistenceTransaction + transaction: TransactionType ): PersistencePromise; } diff --git a/packages/firestore/src/local/persistence.ts b/packages/firestore/src/local/persistence.ts index dca0002d278..acca57141ee 100644 --- a/packages/firestore/src/local/persistence.ts +++ b/packages/firestore/src/local/persistence.ts @@ -70,7 +70,7 @@ export interface PersistenceTransaction { * writes in order to avoid relying on being able to read back uncommitted * writes. */ -export interface Persistence { +export interface Persistence { /** * Starts persistent storage, opening the database or similar. * @@ -96,7 +96,7 @@ export interface Persistence { * extent possible (e.g. in the case of uid switching from * sally=>jack=>sally, sally's mutation queue will be preserved). */ - getMutationQueue(user: User): MutationQueue; + getMutationQueue(user: User): MutationQueue; /** * Returns a QueryCache representing the persisted cache of queries. @@ -105,7 +105,7 @@ export interface Persistence { * this is called. In particular, the memory-backed implementation does this * to emulate the persisted implementation to the extent possible. */ - getQueryCache(): QueryCache; + getQueryCache(): QueryCache; /** * Returns a RemoteDocumentCache representing the persisted cache of remote @@ -115,7 +115,7 @@ export interface Persistence { * this is called. In particular, the memory-backed implementation does this * to emulate the persisted implementation to the extent possible. */ - getRemoteDocumentCache(): RemoteDocumentCache; + getRemoteDocumentCache(): RemoteDocumentCache; /** * Performs an operation inside a persistence transaction. Any reads or writes @@ -135,7 +135,7 @@ export interface Persistence { runTransaction( action: string, transactionOperation: ( - transaction: PersistenceTransaction + transaction: TransactionType ) => PersistencePromise ): Promise; } diff --git a/packages/firestore/src/local/query_cache.ts b/packages/firestore/src/local/query_cache.ts index d30534c572f..a3c1f428198 100644 --- a/packages/firestore/src/local/query_cache.ts +++ b/packages/firestore/src/local/query_cache.ts @@ -29,7 +29,7 @@ import { QueryData } from './query_data'; * * The cache is keyed by Query and entries in the cache are QueryData instances. */ -export interface QueryCache extends GarbageSource { +export interface QueryCache extends GarbageSource { /** * Starts up the query cache. */ @@ -62,7 +62,7 @@ export interface QueryCache extends GarbageSource { * @param snapshotVersion The new snapshot version. */ setLastRemoteSnapshotVersion( - transaction: PersistenceTransaction, + transaction: TransactionType, snapshotVersion: SnapshotVersion ): PersistencePromise; @@ -75,7 +75,7 @@ export interface QueryCache extends GarbageSource { * @param queryData A QueryData instance to put in the cache. */ addQueryData( - transaction: PersistenceTransaction, + transaction: TransactionType, queryData: QueryData ): PersistencePromise; diff --git a/packages/firestore/src/local/query_data.ts b/packages/firestore/src/local/query_data.ts index e5f7f3fdbd0..2b9a304ebe8 100644 --- a/packages/firestore/src/local/query_data.ts +++ b/packages/firestore/src/local/query_data.ts @@ -16,7 +16,7 @@ import { Query } from '../core/query'; import { SnapshotVersion } from '../core/snapshot_version'; -import { ProtoByteString, TargetId } from '../core/types'; +import { ProtoByteString, TargetId, ListenSequenceNumber } from '../core/types'; import { emptyByteString } from '../platform/platform'; /** An enumeration of the different purposes we have for queries. */ @@ -45,6 +45,7 @@ export class QueryData { * LocalStore for user listens and by the SyncEngine for limbo watches. */ readonly targetId: TargetId, + readonly sequenceNumber: ListenSequenceNumber, /** The purpose of the query. */ readonly purpose: QueryPurpose, /** The latest snapshot version seen for this target. */ @@ -65,23 +66,22 @@ export class QueryData { copy(overwrite: { resumeToken?: ProtoByteString; snapshotVersion?: SnapshotVersion; + sequenceNumber: ListenSequenceNumber; }): QueryData { return new QueryData( this.query, this.targetId, + overwrite.sequenceNumber, this.purpose, - overwrite.snapshotVersion === undefined - ? this.snapshotVersion - : overwrite.snapshotVersion, - overwrite.resumeToken === undefined - ? this.resumeToken - : overwrite.resumeToken + overwrite.snapshotVersion || this.snapshotVersion, + overwrite.resumeToken || this.resumeToken ); } isEqual(other: QueryData): boolean { return ( this.targetId === other.targetId && + this.sequenceNumber === other.sequenceNumber && this.purpose === other.purpose && this.snapshotVersion.isEqual(other.snapshotVersion) && this.resumeToken === other.resumeToken && diff --git a/packages/firestore/src/local/remote_document_cache.ts b/packages/firestore/src/local/remote_document_cache.ts index ceb58d3bf91..608de651002 100644 --- a/packages/firestore/src/local/remote_document_cache.ts +++ b/packages/firestore/src/local/remote_document_cache.ts @@ -30,7 +30,7 @@ import { PersistencePromise } from './persistence_promise'; * with data) as well as NoDocument instances (indicating that the document is * known to not exist). */ -export interface RemoteDocumentCache { +export interface RemoteDocumentCache { /** * Adds or replaces an entry in the cache. * @@ -40,13 +40,13 @@ export interface RemoteDocumentCache { * @param maybeDocument A Document or NoDocument to put in the cache. */ addEntry( - transaction: PersistenceTransaction, + transaction: TransactionType, maybeDocument: MaybeDocument ): PersistencePromise; /** Removes the cached entry for the given key (no-op if no entry exists). */ removeEntry( - transaction: PersistenceTransaction, + transaction: TransactionType, documentKey: DocumentKey ): PersistencePromise; @@ -58,7 +58,7 @@ export interface RemoteDocumentCache { * cached. */ getEntry( - transaction: PersistenceTransaction, + transaction: TransactionType, documentKey: DocumentKey ): PersistencePromise; @@ -74,7 +74,7 @@ export interface RemoteDocumentCache { * @return The set of matching documents. */ getDocumentsMatchingQuery( - transaction: PersistenceTransaction, + transaction: TransactionType, query: Query ): PersistencePromise; } diff --git a/packages/firestore/src/local/remote_document_change_buffer.ts b/packages/firestore/src/local/remote_document_change_buffer.ts index 184e5301f5f..a2ac4141500 100644 --- a/packages/firestore/src/local/remote_document_change_buffer.ts +++ b/packages/firestore/src/local/remote_document_change_buffer.ts @@ -23,6 +23,7 @@ import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; +// TODO(gsoltis): delete this class. /** * An in-memory buffer of entries to be written to a RemoteDocumentCache. * It can be used to batch up a set of changes to be written to the cache, but @@ -35,10 +36,10 @@ import { RemoteDocumentCache } from './remote_document_cache'; * read-your-own-writes capability, this class is not technically needed, but * has been preserved as a convenience and to aid portability. */ -export class RemoteDocumentChangeBuffer { +export class RemoteDocumentChangeBuffer { private changes: MaybeDocumentMap | null = maybeDocumentMap(); - constructor(private remoteDocumentCache: RemoteDocumentCache) {} + constructor(private remoteDocumentCache: RemoteDocumentCache) {} /** Buffers a `RemoteDocumentCache.addEntry()` call. */ addEntry(maybeDocument: MaybeDocument): void { @@ -60,7 +61,7 @@ export class RemoteDocumentChangeBuffer { * cached. */ getEntry( - transaction: PersistenceTransaction, + transaction: TransactionType, documentKey: DocumentKey ): PersistencePromise { const changes = this.assertChanges(); @@ -77,7 +78,7 @@ export class RemoteDocumentChangeBuffer { * Applies buffered changes to the underlying RemoteDocumentCache, using * the provided transaction. */ - apply(transaction: PersistenceTransaction): PersistencePromise { + apply(transaction: TransactionType): PersistencePromise { const changes = this.assertChanges(); const promises: Array> = []; diff --git a/packages/firestore/src/remote/remote_store.ts b/packages/firestore/src/remote/remote_store.ts index 6144d8d5843..ec73c6bcc2c 100644 --- a/packages/firestore/src/remote/remote_store.ts +++ b/packages/firestore/src/remote/remote_store.ts @@ -51,6 +51,7 @@ import { import { OnlineStateTracker } from './online_state_tracker'; import { AsyncQueue } from '../util/async_queue'; import { DocumentKeySet } from '../model/collections'; +import { PersistenceTransaction } from '../local/persistence'; const LOG_TAG = 'RemoteStore'; @@ -117,7 +118,7 @@ export class RemoteStore implements TargetMetadataProvider { /** * The local store, used to fill the write pipeline with outbound mutations. */ - private localStore: LocalStore, + private localStore: LocalStore, /** The client-side proxy for interacting with the backend. */ private datastore: Datastore, asyncQueue: AsyncQueue, diff --git a/packages/firestore/test/util/helpers.ts b/packages/firestore/test/util/helpers.ts index 5a1ce01b879..e1df1f04684 100644 --- a/packages/firestore/test/util/helpers.ts +++ b/packages/firestore/test/util/helpers.ts @@ -34,7 +34,7 @@ import { RelationOp } from '../../src/core/query'; import { SnapshotVersion } from '../../src/core/snapshot_version'; -import { ProtoByteString, TargetId } from '../../src/core/types'; +import { ProtoByteString, TargetId, ListenSequenceNumber } from '../../src/core/types'; import { AddedLimboDocument, LimboDocumentChange, @@ -240,10 +240,11 @@ export function bound( export function queryData( targetId: TargetId, + sequenceNumber: ListenSequenceNumber, queryPurpose: QueryPurpose, path: string ): QueryData { - return new QueryData(query(path)._query, targetId, queryPurpose); + return new QueryData(query(path)._query, targetId, sequenceNumber, queryPurpose); } export function docAddedRemoteEvent( @@ -264,7 +265,7 @@ export function docAddedRemoteEvent( const aggregator = new WatchChangeAggregator({ getRemoteKeysForTarget: () => documentKeySet(), getQueryDataForTarget: targetId => - queryData(targetId, QueryPurpose.Listen, doc.key.toString()) + queryData(targetId, 0, QueryPurpose.Listen, doc.key.toString()) }); aggregator.handleDocumentChange(docChange); return aggregator.createRemoteEvent(doc.version); @@ -288,7 +289,7 @@ export function docUpdateRemoteEvent( const aggregator = new WatchChangeAggregator({ getRemoteKeysForTarget: () => keys(doc), getQueryDataForTarget: targetId => - queryData(targetId, QueryPurpose.Listen, doc.key.toString()) + queryData(targetId, 0, QueryPurpose.Listen, doc.key.toString()) }); aggregator.handleDocumentChange(docChange); return aggregator.createRemoteEvent(doc.version); From 59121ba75c3dfbd5945e0ae6ff3c272b4a6a64cd Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Tue, 24 Jul 2018 11:59:41 -0700 Subject: [PATCH 03/25] Start plumbing in sequence number --- packages/firestore/src/core/sync_engine.ts | 6 +- .../src/local/indexeddb_mutation_queue.ts | 1 - .../src/local/indexeddb_persistence.ts | 4 +- .../src/local/indexeddb_query_cache.ts | 9 +- .../local/indexeddb_remote_document_cache.ts | 1 - .../firestore/src/local/memory_query_cache.ts | 8 +- .../src/local/memory_remote_document_cache.ts | 2 - packages/firestore/src/local/query_cache.ts | 4 +- packages/firestore/src/local/simple_db.ts | 3 - .../local/eager_garbage_collector.test.ts | 4 +- .../test/unit/local/local_store.test.ts | 12 +- .../test/unit/local/mutation_queue.test.ts | 140 +++++++++--------- .../test/unit/local/query_cache.test.ts | 41 +++-- .../unit/local/remote_document_cache.test.ts | 33 ++--- .../remote_document_change_buffer.test.ts | 9 +- .../test/unit/local/test_garbage_collector.ts | 6 +- .../test/unit/local/test_mutation_queue.ts | 6 +- .../test/unit/local/test_query_cache.ts | 10 +- .../unit/local/test_remote_document_cache.ts | 8 +- .../test_remote_document_change_buffer.ts | 8 +- .../test/unit/remote/node/serializer.test.ts | 10 +- .../test/unit/remote/remote_event.test.ts | 8 +- .../test/unit/specs/spec_test_runner.ts | 25 ++-- 23 files changed, 175 insertions(+), 183 deletions(-) diff --git a/packages/firestore/src/core/sync_engine.ts b/packages/firestore/src/core/sync_engine.ts index 55ca37f7f30..459ff8be5e3 100644 --- a/packages/firestore/src/core/sync_engine.ts +++ b/packages/firestore/src/core/sync_engine.ts @@ -41,7 +41,7 @@ import { ObjectMap } from '../util/obj_map'; import { Deferred } from '../util/promise'; import { SortedMap } from '../util/sorted_map'; import { isNullOrUndefined } from '../util/types'; - +import { PersistenceTransaction } from '../local/persistence'; import { Query } from './query'; import { SnapshotVersion } from './snapshot_version'; import { TargetIdGenerator } from './target_id_generator'; @@ -50,8 +50,7 @@ import { BatchId, OnlineState, ProtoByteString, - TargetId, - ListenSequenceNumber + TargetId } from './types'; import { AddedLimboDocument, @@ -63,7 +62,6 @@ import { import { ViewSnapshot } from './view_snapshot'; import { SortedSet } from '../util/sorted_set'; import { ListenSequence } from './listen_sequence'; -import { PersistenceTransaction } from '../local/persistence'; const LOG_TAG = 'SyncEngine'; diff --git a/packages/firestore/src/local/indexeddb_mutation_queue.ts b/packages/firestore/src/local/indexeddb_mutation_queue.ts index 817eb0f2c6f..cb958f41d15 100644 --- a/packages/firestore/src/local/indexeddb_mutation_queue.ts +++ b/packages/firestore/src/local/indexeddb_mutation_queue.ts @@ -38,7 +38,6 @@ import { } from './indexeddb_schema'; import { LocalSerializer } from './local_serializer'; import { MutationQueue } from './mutation_queue'; -import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { SimpleDb, SimpleDbStore } from './simple_db'; import { IndexedDbTransaction } from './indexeddb_persistence'; diff --git a/packages/firestore/src/local/indexeddb_persistence.ts b/packages/firestore/src/local/indexeddb_persistence.ts index d7bd021213b..eb74888a412 100644 --- a/packages/firestore/src/local/indexeddb_persistence.ts +++ b/packages/firestore/src/local/indexeddb_persistence.ts @@ -34,7 +34,7 @@ import { } from './indexeddb_schema'; import { LocalSerializer } from './local_serializer'; import { MutationQueue } from './mutation_queue'; -import { Persistence, PersistenceTransaction } from './persistence'; +import { Persistence } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { RemoteDocumentCache } from './remote_document_cache'; @@ -159,7 +159,7 @@ export class IndexedDbPersistence implements Persistence { ALL_STORES, (txn) => this.queryCache.start(txn) )).then(() => { - //this.listenSequence = new ListenSequence(this.queryCache.getHighestSequenceNumber); + this.listenSequence = new ListenSequence(this.queryCache.getHighestListenSequenceNumber()); }); } diff --git a/packages/firestore/src/local/indexeddb_query_cache.ts b/packages/firestore/src/local/indexeddb_query_cache.ts index bee11442e30..9ae3efaac34 100644 --- a/packages/firestore/src/local/indexeddb_query_cache.ts +++ b/packages/firestore/src/local/indexeddb_query_cache.ts @@ -17,7 +17,7 @@ import { Timestamp } from '../api/timestamp'; import { Query } from '../core/query'; import { SnapshotVersion } from '../core/snapshot_version'; -import { TargetId } from '../core/types'; +import { TargetId, ListenSequenceNumber } from '../core/types'; import { DocumentKeySet, documentKeySet } from '../model/collections'; import { DocumentKey } from '../model/document_key'; import { assert } from '../util/assert'; @@ -34,7 +34,6 @@ import { DbTargetKey } from './indexeddb_schema'; import { LocalSerializer } from './local_serializer'; -import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { QueryData } from './query_data'; @@ -53,7 +52,7 @@ export class IndexedDbQueryCache implements QueryCache { /** * A cached copy of the metadata for the query cache. */ - private metadata = null; + private metadata: DbTargetGlobal = null; /** The garbage collector to notify about potential garbage keys. */ private garbageCollector: GarbageCollector | null = null; @@ -79,6 +78,10 @@ export class IndexedDbQueryCache implements QueryCache { return this.metadata.highestTargetId; } + getHighestListenSequenceNumber(): ListenSequenceNumber { + return this.metadata.highestListenSequenceNumber; + } + getLastRemoteSnapshotVersion(): SnapshotVersion { return this.lastRemoteSnapshotVersion; } diff --git a/packages/firestore/src/local/indexeddb_remote_document_cache.ts b/packages/firestore/src/local/indexeddb_remote_document_cache.ts index e4dd9d590d4..64f1c5e2c5b 100644 --- a/packages/firestore/src/local/indexeddb_remote_document_cache.ts +++ b/packages/firestore/src/local/indexeddb_remote_document_cache.ts @@ -22,7 +22,6 @@ import { DocumentKey } from '../model/document_key'; import { DbRemoteDocument, DbRemoteDocumentKey } from './indexeddb_schema'; import { IndexedDbTransaction } from './indexeddb_persistence'; import { LocalSerializer } from './local_serializer'; -import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; import { SimpleDb, SimpleDbStore } from './simple_db'; diff --git a/packages/firestore/src/local/memory_query_cache.ts b/packages/firestore/src/local/memory_query_cache.ts index 2d44bdd9aad..b183236774e 100644 --- a/packages/firestore/src/local/memory_query_cache.ts +++ b/packages/firestore/src/local/memory_query_cache.ts @@ -16,19 +16,19 @@ import { Query } from '../core/query'; import { SnapshotVersion } from '../core/snapshot_version'; -import { TargetId } from '../core/types'; +import { TargetId, ListenSequenceNumber } from '../core/types'; import { DocumentKeySet } from '../model/collections'; import { DocumentKey } from '../model/document_key'; import { ObjectMap } from '../util/obj_map'; import { GarbageCollector } from './garbage_collector'; -import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { QueryData } from './query_data'; import { ReferenceSet } from './reference_set'; import { assert } from '../util/assert'; import { MemoryPersistenceTransaction } from './memory_persistence'; +import { ListenSequence } from '../core/listen_sequence'; export class MemoryQueryCache implements QueryCache { /** @@ -56,6 +56,10 @@ export class MemoryQueryCache implements QueryCache exte */ getHighestTargetId(): TargetId; + getHighestListenSequenceNumber(): ListenSequenceNumber; + /** * A global snapshot version representing the last consistent snapshot we * received from the backend. This is monotonically increasing and any diff --git a/packages/firestore/src/local/simple_db.ts b/packages/firestore/src/local/simple_db.ts index 9f3d8ee8ae4..ea4700854f3 100644 --- a/packages/firestore/src/local/simple_db.ts +++ b/packages/firestore/src/local/simple_db.ts @@ -17,13 +17,10 @@ import { assert, fail } from '../util/assert'; import { debug } from '../util/log'; import { AnyDuringMigration } from '../util/misc'; - import { PersistencePromise } from './persistence_promise'; import { SCHEMA_VERSION } from './indexeddb_schema'; import { Deferred } from '../util/promise'; -import { PersistenceTransaction } from './persistence'; import { Code, FirestoreError } from '../util/error'; -import { ListenSequenceNumber } from '../core/types'; const LOG_TAG = 'SimpleDb'; diff --git a/packages/firestore/test/unit/local/eager_garbage_collector.test.ts b/packages/firestore/test/unit/local/eager_garbage_collector.test.ts index f12a579b217..6d8922bb89b 100644 --- a/packages/firestore/test/unit/local/eager_garbage_collector.test.ts +++ b/packages/firestore/test/unit/local/eager_garbage_collector.test.ts @@ -65,7 +65,9 @@ describe('EagerGarbageCollector', () => { expect(referenceSet.isEmpty()).to.equal(false); referenceSet.removeReferencesForId(2); - return gc.collectGarbage(true).toPromise(); + return gc.collectGarbage(null).toPromise(); + // TODO(gsoltis): true does not conform to PersistenceTransaction + //return gc.collectGarbage(true).toPromise(); }) .then(garbage => { expectSetToEqual(garbage, [key3]); diff --git a/packages/firestore/test/unit/local/local_store.test.ts b/packages/firestore/test/unit/local/local_store.test.ts index 3a687040c7c..f7089d9ea66 100644 --- a/packages/firestore/test/unit/local/local_store.test.ts +++ b/packages/firestore/test/unit/local/local_store.test.ts @@ -24,7 +24,7 @@ import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; import { LocalStore, LocalWriteResult } from '../../../src/local/local_store'; import { LocalViewChanges } from '../../../src/local/local_view_changes'; import { NoOpGarbageCollector } from '../../../src/local/no_op_garbage_collector'; -import { Persistence } from '../../../src/local/persistence'; +import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; import { documentKeySet, DocumentMap, @@ -73,7 +73,7 @@ class LocalStoreTester { private lastChanges: MaybeDocumentMap | null = null; private lastTargetId: TargetId | null = null; private batches: MutationBatch[] = []; - constructor(public localStore: LocalStore) {} + constructor(public localStore: LocalStore) {} after( op: Mutation | Mutation[] | RemoteEvent | LocalViewChanges @@ -270,11 +270,11 @@ describe('LocalStore w/ IndexedDB Persistence', () => { genericLocalStoreTests(persistenceHelpers.testIndexedDbPersistence); }); -function genericLocalStoreTests( - getPersistence: () => Promise +function genericLocalStoreTests( + getPersistence: () => Promise> ): void { - let persistence: Persistence; - let localStore: LocalStore; + let persistence: Persistence; + let localStore: LocalStore; beforeEach(() => { return getPersistence().then(p => { diff --git a/packages/firestore/test/unit/local/mutation_queue.test.ts b/packages/firestore/test/unit/local/mutation_queue.test.ts index 91bf552e8aa..1c3d82691cc 100644 --- a/packages/firestore/test/unit/local/mutation_queue.test.ts +++ b/packages/firestore/test/unit/local/mutation_queue.test.ts @@ -20,10 +20,9 @@ import { Query } from '../../../src/core/query'; import { BatchId } from '../../../src/core/types'; import { EagerGarbageCollector } from '../../../src/local/eager_garbage_collector'; import { IndexedDbMutationQueue } from '../../../src/local/indexeddb_mutation_queue'; -import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; +import { IndexedDbPersistence, IndexedDbTransaction } from '../../../src/local/indexeddb_persistence'; import { DbMutationBatch } from '../../../src/local/indexeddb_schema'; -import { Persistence } from '../../../src/local/persistence'; -import { SimpleDbTransaction } from '../../../src/local/simple_db'; +import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; import { BATCHID_UNKNOWN, MutationBatch @@ -42,17 +41,8 @@ import * as persistenceHelpers from './persistence_test_helpers'; import { TestMutationQueue } from './test_mutation_queue'; import { addEqualityMatcher } from '../../util/equality_matcher'; -let persistence: Persistence; -let mutationQueue: TestMutationQueue; - describe('MemoryMutationQueue', () => { - beforeEach(() => { - return persistenceHelpers.testMemoryPersistence().then(p => { - persistence = p; - }); - }); - - genericMutationQueueTests(); + genericMutationQueueTests(persistenceHelpers.testMemoryPersistence); }); describe('IndexedDbMutationQueue', () => { @@ -61,13 +51,13 @@ describe('IndexedDbMutationQueue', () => { return; } - beforeEach(() => { - return persistenceHelpers.testIndexedDbPersistence().then(p => { - persistence = p; - }); + const persistencePromise: Promise> = persistenceHelpers.testIndexedDbPersistence(); + let persistence: Persistence; + beforeEach(async () => { + persistence = await persistencePromise; }); - genericMutationQueueTests(); + genericMutationQueueTests(() => persistencePromise); describe('loadNextBatchIdFromDb', () => { function loadNextBatchId(): Promise { @@ -82,8 +72,7 @@ describe('IndexedDbMutationQueue', () => { function addDummyBatch(userId: string, batchId: BatchId): Promise { return persistence.runTransaction('addDummyBatch', transaction => { - const txn = transaction as SimpleDbTransaction; - const store = txn.store<[string, number], DbMutationBatch>( + const store = transaction.simpleDbTransaction.store<[string, number], DbMutationBatch>( DbMutationBatch.store ); const localWriteTime = Date.now(); @@ -120,10 +109,13 @@ describe('IndexedDbMutationQueue', () => { * Defines the set of tests to run against both mutation queue * implementations. */ -function genericMutationQueueTests(): void { +function genericMutationQueueTests(persistencePromise: () => Promise>): void { addEqualityMatcher(); - beforeEach(() => { + let persistence: Persistence; + let mutationQueue: TestMutationQueue; + beforeEach(async () => { + persistence = await persistencePromise(); mutationQueue = new TestMutationQueue( persistence, persistence.getMutationQueue(new User('user')) @@ -133,6 +125,58 @@ function genericMutationQueueTests(): void { afterEach(() => persistence.shutdown(/* deleteData= */ true)); + /** + * Creates a new MutationBatch with the next batch ID and a set of dummy + * mutations. + */ + function addMutationBatch(key?: string): Promise { + let keyStr = key; + if (keyStr === undefined) { + keyStr = 'foo/bar'; + } + const mutation = setMutation(keyStr, { a: 1 }); + return mutationQueue.addMutationBatch([mutation]); + } + + /** + * Creates an array of batches containing count dummy MutationBatches. Each + * has a different batchID. + */ + async function createBatches(count: number): Promise { + const batches = []; + for (let i = 0; i < count; i++) { + const batch = await addMutationBatch(); + batches.push(batch); + } + return batches; + } + + /** + * Removes entries from from the given a batches and returns them. + * + * @param holes An array of indexes in the batches array; in increasing order. + * Indexes are relative to the original state of the batches array, not any + * intermediate state that might occur. + * @param batches The array to mutate, removing entries from it. + * @return A new array containing all the entries that were removed from + * batches. + */ + async function makeHolesInBatches( + holes: number[], + batches: MutationBatch[] + ): Promise { + const removed = []; + for (let i = 0; i < holes.length; i++) { + const index = holes[i] - i; + const batch = batches[index]; + await mutationQueue.removeMutationBatches([batch]); + + batches.splice(index, 1); + removed.push(batch); + } + return removed; + } + it('can count batches', async () => { expect(await mutationQueue.countBatches()).to.equal(0); expect(await mutationQueue.checkEmpty()).to.equal(true); @@ -552,55 +596,3 @@ function genericMutationQueueTests(): void { expect(await mutationQueue.checkEmpty()).to.equal(true); }); } - -/** - * Creates a new MutationBatch with the next batch ID and a set of dummy - * mutations. - */ -function addMutationBatch(key?: string): Promise { - let keyStr = key; - if (keyStr === undefined) { - keyStr = 'foo/bar'; - } - const mutation = setMutation(keyStr, { a: 1 }); - return mutationQueue.addMutationBatch([mutation]); -} - -/** - * Creates an array of batches containing count dummy MutationBatches. Each - * has a different batchID. - */ -async function createBatches(count: number): Promise { - const batches = []; - for (let i = 0; i < count; i++) { - const batch = await addMutationBatch(); - batches.push(batch); - } - return batches; -} - -/** - * Removes entries from from the given a batches and returns them. - * - * @param holes An array of indexes in the batches array; in increasing order. - * Indexes are relative to the original state of the batches array, not any - * intermediate state that might occur. - * @param batches The array to mutate, removing entries from it. - * @return A new array containing all the entries that were removed from - * batches. - */ -async function makeHolesInBatches( - holes: number[], - batches: MutationBatch[] -): Promise { - const removed = []; - for (let i = 0; i < holes.length; i++) { - const index = holes[i] - i; - const batch = batches[index]; - await mutationQueue.removeMutationBatches([batch]); - - batches.splice(index, 1); - removed.push(batch); - } - return removed; -} diff --git a/packages/firestore/test/unit/local/query_cache.test.ts b/packages/firestore/test/unit/local/query_cache.test.ts index dd4e2f3d3ec..4d9f0266ec4 100644 --- a/packages/firestore/test/unit/local/query_cache.test.ts +++ b/packages/firestore/test/unit/local/query_cache.test.ts @@ -19,8 +19,8 @@ import { Query } from '../../../src/core/query'; import { SnapshotVersion } from '../../../src/core/snapshot_version'; import { TargetId } from '../../../src/core/types'; import { EagerGarbageCollector } from '../../../src/local/eager_garbage_collector'; -import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; -import { Persistence } from '../../../src/local/persistence'; +import { IndexedDbPersistence, IndexedDbTransaction } from '../../../src/local/indexeddb_persistence'; +import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; import { QueryData, QueryPurpose } from '../../../src/local/query_data'; import { addEqualityMatcher } from '../../util/equality_matcher'; import { @@ -35,17 +35,8 @@ import * as persistenceHelpers from './persistence_test_helpers'; import { TestGarbageCollector } from './test_garbage_collector'; import { TestQueryCache } from './test_query_cache'; -let persistence: Persistence; -let cache: TestQueryCache; - describe('MemoryQueryCache', () => { - beforeEach(() => { - return persistenceHelpers.testMemoryPersistence().then(p => { - persistence = p; - }); - }); - - genericQueryCacheTests(); + genericQueryCacheTests(persistenceHelpers.testMemoryPersistence); }); describe('IndexedDbQueryCache', () => { @@ -54,22 +45,23 @@ describe('IndexedDbQueryCache', () => { return; } - beforeEach(() => { - return persistenceHelpers.testIndexedDbPersistence().then(p => { - persistence = p; - }); + const persistencePromise: Promise> = persistenceHelpers.testIndexedDbPersistence(); + let persistence: Persistence; + beforeEach(async () => { + persistence = await persistencePromise; }); afterEach(() => persistence.shutdown(/* deleteData= */ true)); - genericQueryCacheTests(); + genericQueryCacheTests(() => persistencePromise); }); /** * Defines the set of tests to run against both query cache implementations. */ -function genericQueryCacheTests(): void { +function genericQueryCacheTests(persistencePromise: () => Promise>): void { addEqualityMatcher(); + let cache: TestQueryCache; const QUERY_ROOMS = Query.atPath(path('rooms')); const QUERY_HALLS = Query.atPath(path('halls')); @@ -92,15 +84,18 @@ function genericQueryCacheTests(): void { return new QueryData( query, targetId, + 0, QueryPurpose.Listen, snapshotVersion, resumeToken ); } + let persistence: Persistence; beforeEach(async () => { + persistence = await persistencePromise(); cache = new TestQueryCache(persistence, persistence.getQueryCache()); - await cache.start(); + //await cache.start(); }); it('returns null for query not in cache', () => { @@ -318,7 +313,7 @@ function genericQueryCacheTests(): void { persistence, persistence.getQueryCache() ); - await otherCache.start(); + //await otherCache.start(); expect(otherCache.getHighestTargetId()).to.deep.equal(42); }); @@ -339,11 +334,13 @@ function genericQueryCacheTests(): void { persistence, persistence.getQueryCache() ); - return otherCache.start().then(() => { + expect(otherCache.getLastRemoteSnapshotVersion()).to.deep.equal( + version(42)); + /*return otherCache.start().then(() => { expect(otherCache.getLastRemoteSnapshotVersion()).to.deep.equal( version(42) ); - }); + });*/ }); }); } diff --git a/packages/firestore/test/unit/local/remote_document_cache.test.ts b/packages/firestore/test/unit/local/remote_document_cache.test.ts index 00742850470..467b54c275b 100644 --- a/packages/firestore/test/unit/local/remote_document_cache.test.ts +++ b/packages/firestore/test/unit/local/remote_document_cache.test.ts @@ -16,25 +16,16 @@ import { expect } from 'chai'; import { Query } from '../../../src/core/query'; -import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; -import { Persistence } from '../../../src/local/persistence'; +import { IndexedDbPersistence, IndexedDbTransaction } from '../../../src/local/indexeddb_persistence'; +import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; import { MaybeDocument } from '../../../src/model/document'; import { deletedDoc, doc, expectEqual, key, path } from '../../util/helpers'; import * as persistenceHelpers from './persistence_test_helpers'; import { TestRemoteDocumentCache } from './test_remote_document_cache'; -let persistence: Persistence; -let cache: TestRemoteDocumentCache; - describe('MemoryRemoteDocumentCache', () => { - beforeEach(() => { - return persistenceHelpers.testMemoryPersistence().then(p => { - persistence = p; - }); - }); - - genericRemoteDocumentCacheTests(); + genericRemoteDocumentCacheTests(persistenceHelpers.testMemoryPersistence); }); describe('IndexedDbRemoteDocumentCache', () => { @@ -43,28 +34,31 @@ describe('IndexedDbRemoteDocumentCache', () => { return; } - beforeEach(() => { - return persistenceHelpers.testIndexedDbPersistence().then(p => { - persistence = p; - }); + const persistencePromise: Promise> = persistenceHelpers.testIndexedDbPersistence(); + let persistence: Persistence; + beforeEach(async () => { + persistence = await persistencePromise; }); afterEach(() => persistence.shutdown(/* deleteData= */ true)); - genericRemoteDocumentCacheTests(); + genericRemoteDocumentCacheTests(() => persistencePromise); }); /** * Defines the set of tests to run against both remote document cache * implementations. */ -function genericRemoteDocumentCacheTests(): void { +function genericRemoteDocumentCacheTests(persistencePromise: () => Promise>): void { // Helpers for use throughout tests. const DOC_PATH = 'a/b'; const LONG_DOC_PATH = 'a/b/c/d/e/f'; const DOC_DATA = { a: 1, b: 2 }; const VERSION = 42; + let persistence: Persistence; + let cache: TestRemoteDocumentCache; + function setAndReadDocument(doc: MaybeDocument): Promise { return cache .addEntry(doc) @@ -76,7 +70,8 @@ function genericRemoteDocumentCacheTests(): void { }); } - beforeEach(() => { + beforeEach(async () => { + persistence = await persistencePromise(); cache = new TestRemoteDocumentCache( persistence, persistence.getRemoteDocumentCache() diff --git a/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts b/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts index 12173e5602c..edf4049a9ab 100644 --- a/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts +++ b/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts @@ -15,8 +15,7 @@ */ import { expect } from 'chai'; -import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; -import { Persistence } from '../../../src/local/persistence'; +import { IndexedDbPersistence, IndexedDbTransaction } from '../../../src/local/indexeddb_persistence'; import { RemoteDocumentChangeBuffer } from '../../../src/local/remote_document_change_buffer'; import { deletedDoc, doc, expectEqual, key } from '../../util/helpers'; @@ -24,9 +23,9 @@ import { testIndexedDbPersistence } from './persistence_test_helpers'; import { TestRemoteDocumentCache } from './test_remote_document_cache'; import { TestRemoteDocumentChangeBuffer } from './test_remote_document_change_buffer'; -let persistence: Persistence; -let cache: TestRemoteDocumentCache; -let buffer: TestRemoteDocumentChangeBuffer; +let persistence: IndexedDbPersistence; +let cache: TestRemoteDocumentCache; +let buffer: TestRemoteDocumentChangeBuffer; const INITIAL_DOC = doc('coll/a', 42, { test: 'data' }); describe('RemoteDocumentChangeBuffer', () => { diff --git a/packages/firestore/test/unit/local/test_garbage_collector.ts b/packages/firestore/test/unit/local/test_garbage_collector.ts index 71bae6e4598..0f36b947012 100644 --- a/packages/firestore/test/unit/local/test_garbage_collector.ts +++ b/packages/firestore/test/unit/local/test_garbage_collector.ts @@ -15,15 +15,15 @@ */ import { GarbageCollector } from '../../../src/local/garbage_collector'; -import { Persistence } from '../../../src/local/persistence'; +import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; import { DocumentKey } from '../../../src/model/document_key'; /** * A wrapper around a GarbageCollector that automatically creates a transaction * around every operation to reduce test boilerplate. */ -export class TestGarbageCollector { - constructor(public persistence: Persistence, public gc: GarbageCollector) {} +export class TestGarbageCollector { + constructor(public persistence: Persistence, public gc: GarbageCollector) {} collectGarbage(): Promise { return this.persistence diff --git a/packages/firestore/test/unit/local/test_mutation_queue.ts b/packages/firestore/test/unit/local/test_mutation_queue.ts index 31aa3d8307a..9bb1d6be2d6 100644 --- a/packages/firestore/test/unit/local/test_mutation_queue.ts +++ b/packages/firestore/test/unit/local/test_mutation_queue.ts @@ -19,7 +19,7 @@ import { Query } from '../../../src/core/query'; import { BatchId, ProtoByteString } from '../../../src/core/types'; import { GarbageCollector } from '../../../src/local/garbage_collector'; import { MutationQueue } from '../../../src/local/mutation_queue'; -import { Persistence } from '../../../src/local/persistence'; +import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; import { DocumentKeySet } from '../../../src/model/collections'; import { DocumentKey } from '../../../src/model/document_key'; import { Mutation } from '../../../src/model/mutation'; @@ -30,8 +30,8 @@ import { AnyDuringMigration } from '../../../src/util/misc'; * A wrapper around a MutationQueue that automatically creates a * transaction around every operation to reduce test boilerplate. */ -export class TestMutationQueue { - constructor(public persistence: Persistence, public queue: MutationQueue) {} +export class TestMutationQueue { + constructor(public persistence: Persistence, public queue: MutationQueue) {} start(): Promise { return this.persistence.runTransaction('start', txn => { diff --git a/packages/firestore/test/unit/local/test_query_cache.ts b/packages/firestore/test/unit/local/test_query_cache.ts index 1023f9967b0..38afbfa6a82 100644 --- a/packages/firestore/test/unit/local/test_query_cache.ts +++ b/packages/firestore/test/unit/local/test_query_cache.ts @@ -17,7 +17,7 @@ import { Query } from '../../../src/core/query'; import { SnapshotVersion } from '../../../src/core/snapshot_version'; import { TargetId } from '../../../src/core/types'; -import { Persistence } from '../../../src/local/persistence'; +import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; import { QueryCache } from '../../../src/local/query_cache'; import { QueryData } from '../../../src/local/query_data'; import { documentKeySet } from '../../../src/model/collections'; @@ -27,14 +27,14 @@ import { DocumentKey } from '../../../src/model/document_key'; * A wrapper around a QueryCache that automatically creates a * transaction around every operation to reduce test boilerplate. */ -export class TestQueryCache { - constructor(public persistence: Persistence, public cache: QueryCache) {} +export class TestQueryCache { + constructor(public persistence: Persistence, public cache: QueryCache) {} - start(): Promise { + /*start(): Promise { return this.persistence.runTransaction('start', txn => this.cache.start(txn) ); - } + }*/ addQueryData(queryData: QueryData): Promise { return this.persistence.runTransaction('addQueryData', txn => { diff --git a/packages/firestore/test/unit/local/test_remote_document_cache.ts b/packages/firestore/test/unit/local/test_remote_document_cache.ts index 4183c77c30a..46ddfef0083 100644 --- a/packages/firestore/test/unit/local/test_remote_document_cache.ts +++ b/packages/firestore/test/unit/local/test_remote_document_cache.ts @@ -15,7 +15,7 @@ */ import { Query } from '../../../src/core/query'; -import { Persistence } from '../../../src/local/persistence'; +import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; import { RemoteDocumentCache } from '../../../src/local/remote_document_cache'; import { DocumentMap } from '../../../src/model/collections'; import { MaybeDocument } from '../../../src/model/document'; @@ -25,10 +25,10 @@ import { DocumentKey } from '../../../src/model/document_key'; * A wrapper around a RemoteDocumentCache that automatically creates a * transaction around every operation to reduce test boilerplate. */ -export class TestRemoteDocumentCache { +export class TestRemoteDocumentCache { constructor( - public persistence: Persistence, - public cache: RemoteDocumentCache + public persistence: Persistence, + public cache: RemoteDocumentCache ) {} addEntry(maybeDocument: MaybeDocument): Promise { diff --git a/packages/firestore/test/unit/local/test_remote_document_change_buffer.ts b/packages/firestore/test/unit/local/test_remote_document_change_buffer.ts index b2ef7918f19..46efeec0084 100644 --- a/packages/firestore/test/unit/local/test_remote_document_change_buffer.ts +++ b/packages/firestore/test/unit/local/test_remote_document_change_buffer.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Persistence } from '../../../src/local/persistence'; +import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; import { RemoteDocumentChangeBuffer } from '../../../src/local/remote_document_change_buffer'; import { MaybeDocument } from '../../../src/model/document'; import { DocumentKey } from '../../../src/model/document_key'; @@ -23,10 +23,10 @@ import { DocumentKey } from '../../../src/model/document_key'; * A wrapper around a RemoteDocumentChangeBuffer that automatically creates a * transaction around operations to reduce test boilerplate. */ -export class TestRemoteDocumentChangeBuffer { +export class TestRemoteDocumentChangeBuffer { constructor( - public persistence: Persistence, - public buffer: RemoteDocumentChangeBuffer + public persistence: Persistence, + public buffer: RemoteDocumentChangeBuffer ) {} addEntry(maybeDocument: MaybeDocument): void { diff --git a/packages/firestore/test/unit/remote/node/serializer.test.ts b/packages/firestore/test/unit/remote/node/serializer.test.ts index b4d5bd025a5..bcc0500922b 100644 --- a/packages/firestore/test/unit/remote/node/serializer.test.ts +++ b/packages/firestore/test/unit/remote/node/serializer.test.ts @@ -88,7 +88,8 @@ describe('Serializer', () => { function wrapQueryData(query: Query): QueryData { return new QueryData( query, - 1, + 1, // arbitrary target id + 10, // arbitrary sequence number QueryPurpose.Listen, SnapshotVersion.MIN, emptyResumeToken @@ -871,16 +872,16 @@ describe('Serializer', () => { it('encodes listen request labels', () => { const query = Query.atPath(path('collection/key')); - let queryData = new QueryData(query, 2, QueryPurpose.Listen); + let queryData = new QueryData(query, 2, 3, QueryPurpose.Listen); let result = s.toListenRequestLabels(queryData); expect(result).to.be.null; - queryData = new QueryData(query, 2, QueryPurpose.LimboResolution); + queryData = new QueryData(query, 2, 3, QueryPurpose.LimboResolution); result = s.toListenRequestLabels(queryData); expect(result).to.deep.equal({ 'goog-listen-tags': 'limbo-document' }); - queryData = new QueryData(query, 2, QueryPurpose.ExistenceFilterMismatch); + queryData = new QueryData(query, 2, 3, QueryPurpose.ExistenceFilterMismatch); result = s.toListenRequestLabels(queryData); expect(result).to.deep.equal({ 'goog-listen-tags': 'existence-filter-mismatch' @@ -1183,6 +1184,7 @@ describe('Serializer', () => { new QueryData( q, 1, + 2, QueryPurpose.Listen, SnapshotVersion.MIN, new Uint8Array([1, 2, 3]) diff --git a/packages/firestore/test/unit/remote/remote_event.test.ts b/packages/firestore/test/unit/remote/remote_event.test.ts index 7bf7829f73d..aa92f50baf5 100644 --- a/packages/firestore/test/unit/remote/remote_event.test.ts +++ b/packages/firestore/test/unit/remote/remote_event.test.ts @@ -16,7 +16,7 @@ import * as objUtils from '../../../src/util/obj'; import { expect } from 'chai'; -import { TargetId } from '../../../src/core/types'; +import { TargetId, ListenSequenceNumber } from '../../../src/core/types'; import { QueryData, QueryPurpose } from '../../../src/local/query_data'; import { RemoteEvent, TargetChange } from '../../../src/remote/remote_event'; import { @@ -50,10 +50,13 @@ type PendingTargetResponses = { [targetId: number]: number; }; +// Use an arbitrary sequence number. +const SEQUENCE_NUMBER: ListenSequenceNumber = 2; + function listens(...targetIds: TargetId[]): TargetMap { const targets: TargetMap = {}; for (const target of targetIds) { - targets[target] = queryData(target, QueryPurpose.Listen, 'coll'); + targets[target] = queryData(target, SEQUENCE_NUMBER, QueryPurpose.Listen, 'coll'); } return targets; } @@ -63,6 +66,7 @@ function limboListens(...targetIds: TargetId[]): TargetMap { for (const target of targetIds) { targets[target] = queryData( target, + SEQUENCE_NUMBER, QueryPurpose.LimboResolution, 'coll/limbo' ); diff --git a/packages/firestore/test/unit/specs/spec_test_runner.ts b/packages/firestore/test/unit/specs/spec_test_runner.ts index a146585fbc4..50ac49e9395 100644 --- a/packages/firestore/test/unit/specs/spec_test_runner.ts +++ b/packages/firestore/test/unit/specs/spec_test_runner.ts @@ -39,11 +39,11 @@ import { } from '../../../src/core/view_snapshot'; import { EagerGarbageCollector } from '../../../src/local/eager_garbage_collector'; import { GarbageCollector } from '../../../src/local/garbage_collector'; -import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; +import { IndexedDbPersistence, IndexedDbTransaction } from '../../../src/local/indexeddb_persistence'; import { LocalStore } from '../../../src/local/local_store'; -import { MemoryPersistence } from '../../../src/local/memory_persistence'; +import { MemoryPersistence, MemoryPersistenceTransaction } from '../../../src/local/memory_persistence'; import { NoOpGarbageCollector } from '../../../src/local/no_op_garbage_collector'; -import { Persistence } from '../../../src/local/persistence'; +import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; import { QueryData, QueryPurpose } from '../../../src/local/query_data'; import { SimpleDb } from '../../../src/local/simple_db'; import { DocumentOptions } from '../../../src/model/document'; @@ -319,7 +319,7 @@ interface OutstandingWrite { userCallback: Deferred; } -abstract class TestRunner { +abstract class TestRunner { private connection: MockConnection; private eventManager: EventManager; private syncEngine: SyncEngine; @@ -337,9 +337,9 @@ abstract class TestRunner { }; private datastore: Datastore; - private localStore: LocalStore; + private localStore: LocalStore; private remoteStore: RemoteStore; - private persistence: Persistence; + private persistence: Persistence; private useGarbageCollection: boolean; private databaseInfo: DatabaseInfo; private user = User.UNAUTHENTICATED; @@ -414,7 +414,7 @@ abstract class TestRunner { protected abstract getPersistence( serializer: JsonProtoSerializer - ): Persistence; + ): Persistence; protected abstract destroyPersistence(): Promise; async start(): Promise { @@ -891,6 +891,7 @@ abstract class TestRunner { new QueryData( this.parseQuery(expected.query), targetId, + 0, QueryPurpose.Listen, SnapshotVersion.MIN, expected.resumeToken @@ -993,8 +994,8 @@ abstract class TestRunner { } } -class MemoryTestRunner extends TestRunner { - protected getPersistence(serializer: JsonProtoSerializer): Persistence { +class MemoryTestRunner extends TestRunner { + protected getPersistence(serializer: JsonProtoSerializer): MemoryPersistence { return new MemoryPersistence(); } @@ -1007,10 +1008,10 @@ class MemoryTestRunner extends TestRunner { * Runs the specs using IndexedDbPersistence, the creator must ensure that it is * enabled for the platform. */ -class IndexedDbTestRunner extends TestRunner { +class IndexedDbTestRunner extends TestRunner { static TEST_DB_NAME = 'specs'; - protected getPersistence(serializer: JsonProtoSerializer): Persistence { + protected getPersistence(serializer: JsonProtoSerializer): IndexedDbPersistence { return new IndexedDbPersistence( IndexedDbTestRunner.TEST_DB_NAME, serializer @@ -1035,7 +1036,7 @@ export async function runSpec( config: SpecConfig, steps: SpecStep[] ): Promise { - let runner: TestRunner; + let runner: TestRunner; if (usePersistence) { runner = new IndexedDbTestRunner(name, config); } else { From 4b75267cc2c279db59a081d2235157427420343f Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Wed, 25 Jul 2018 11:12:01 -0700 Subject: [PATCH 04/25] Back out sequence number changes --- .../firestore/src/core/listen_sequence.ts | 31 ------------------- packages/firestore/src/core/sync_engine.ts | 2 -- packages/firestore/src/core/types.ts | 6 ---- .../src/local/indexeddb_persistence.ts | 14 ++------- .../src/local/indexeddb_query_cache.ts | 6 +--- .../firestore/src/local/local_serializer.ts | 1 - packages/firestore/src/local/local_store.ts | 5 ++- .../firestore/src/local/memory_persistence.ts | 8 +---- .../firestore/src/local/memory_query_cache.ts | 7 +---- packages/firestore/src/local/persistence.ts | 2 -- packages/firestore/src/local/query_cache.ts | 4 +-- packages/firestore/src/local/query_data.ts | 6 +--- packages/firestore/src/remote/remote_store.ts | 7 ++--- .../test/unit/local/query_cache.test.ts | 1 - .../test/unit/remote/node/serializer.test.ts | 8 ++--- .../test/unit/remote/remote_event.test.ts | 8 ++--- .../test/unit/specs/spec_test_runner.ts | 1 - packages/firestore/test/util/helpers.ts | 9 +++--- 18 files changed, 21 insertions(+), 105 deletions(-) delete mode 100644 packages/firestore/src/core/listen_sequence.ts diff --git a/packages/firestore/src/core/listen_sequence.ts b/packages/firestore/src/core/listen_sequence.ts deleted file mode 100644 index 2adfd9d92ff..00000000000 --- a/packages/firestore/src/core/listen_sequence.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright 2018 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 { ListenSequenceNumber } from './types'; - -export class ListenSequence { - static readonly IRRELEVANT = -1; - - private previousSequenceNumber: ListenSequenceNumber; - - constructor(startAfter: ListenSequenceNumber) { - this.previousSequenceNumber = startAfter; - } - - next(): ListenSequenceNumber { - return ++this.previousSequenceNumber; - } -} \ No newline at end of file diff --git a/packages/firestore/src/core/sync_engine.ts b/packages/firestore/src/core/sync_engine.ts index 459ff8be5e3..9712186cceb 100644 --- a/packages/firestore/src/core/sync_engine.ts +++ b/packages/firestore/src/core/sync_engine.ts @@ -61,7 +61,6 @@ import { } from './view'; import { ViewSnapshot } from './view_snapshot'; import { SortedSet } from '../util/sorted_set'; -import { ListenSequence } from './listen_sequence'; const LOG_TAG = 'SyncEngine'; @@ -536,7 +535,6 @@ export class SyncEngine implements RemoteSyncer { new QueryData( query, limboTargetId, - ListenSequence.IRRELEVANT, QueryPurpose.LimboResolution ) ); diff --git a/packages/firestore/src/core/types.ts b/packages/firestore/src/core/types.ts index 1af76795b91..c5ef83a76bc 100644 --- a/packages/firestore/src/core/types.ts +++ b/packages/firestore/src/core/types.ts @@ -26,12 +26,6 @@ export type BatchId = number; */ export type TargetId = number; -/** - * ListenSequenceNumbers provide an ordering for activity on targets, as - * well as on document usage. - */ -export type ListenSequenceNumber = number; - // TODO(b/35918695): In GRPC / node, tokens are Uint8Array. In WebChannel, // they're strings. We should probably (de-)serialize to a common internal type. export type ProtoByteString = Uint8Array | string; diff --git a/packages/firestore/src/local/indexeddb_persistence.ts b/packages/firestore/src/local/indexeddb_persistence.ts index eb74888a412..37072e3e3cd 100644 --- a/packages/firestore/src/local/indexeddb_persistence.ts +++ b/packages/firestore/src/local/indexeddb_persistence.ts @@ -39,8 +39,6 @@ import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { RemoteDocumentCache } from './remote_document_cache'; import { SimpleDb, SimpleDbTransaction } from './simple_db'; -import { ListenSequence } from '../core/listen_sequence'; -import { ListenSequenceNumber } from '../core/types'; const LOG_TAG = 'IndexedDbPersistence'; @@ -63,8 +61,7 @@ const UNSUPPORTED_PLATFORM_ERROR_MSG = export class IndexedDbTransaction { constructor( - readonly simpleDbTransaction: SimpleDbTransaction, - readonly currentSequenceNumber: ListenSequenceNumber + readonly simpleDbTransaction: SimpleDbTransaction ) {} } @@ -125,8 +122,6 @@ export class IndexedDbPersistence implements Persistence { private queryCache: IndexedDbQueryCache; - private listenSequence: ListenSequence; - constructor(prefix: string, serializer: JsonProtoSerializer) { this.dbName = prefix + IndexedDbPersistence.MAIN_DATABASE; this.serializer = new LocalSerializer(serializer); @@ -158,9 +153,7 @@ export class IndexedDbPersistence implements Persistence { 'readonly', ALL_STORES, (txn) => this.queryCache.start(txn) - )).then(() => { - this.listenSequence = new ListenSequence(this.queryCache.getHighestListenSequenceNumber()); - }); + )); } shutdown(deleteData?: boolean): Promise { @@ -202,8 +195,7 @@ export class IndexedDbPersistence implements Persistence { // are the only reader/writer. return this.simpleDb.runTransaction('readwrite', ALL_STORES, simpleDbTxn => { // Verify that we still have the owner lease as part of every transaction. - const sequenceNumber = this.listenSequence.next(); - const txn = new IndexedDbTransaction(simpleDbTxn, sequenceNumber); + const txn = new IndexedDbTransaction(simpleDbTxn); return this.ensureOwnerLease(txn.simpleDbTransaction).next(() => operation(txn)); }); } diff --git a/packages/firestore/src/local/indexeddb_query_cache.ts b/packages/firestore/src/local/indexeddb_query_cache.ts index 9ae3efaac34..421d9d9fb55 100644 --- a/packages/firestore/src/local/indexeddb_query_cache.ts +++ b/packages/firestore/src/local/indexeddb_query_cache.ts @@ -17,7 +17,7 @@ import { Timestamp } from '../api/timestamp'; import { Query } from '../core/query'; import { SnapshotVersion } from '../core/snapshot_version'; -import { TargetId, ListenSequenceNumber } from '../core/types'; +import { TargetId } from '../core/types'; import { DocumentKeySet, documentKeySet } from '../model/collections'; import { DocumentKey } from '../model/document_key'; import { assert } from '../util/assert'; @@ -78,10 +78,6 @@ export class IndexedDbQueryCache implements QueryCache { return this.metadata.highestTargetId; } - getHighestListenSequenceNumber(): ListenSequenceNumber { - return this.metadata.highestListenSequenceNumber; - } - getLastRemoteSnapshotVersion(): SnapshotVersion { return this.lastRemoteSnapshotVersion; } diff --git a/packages/firestore/src/local/local_serializer.ts b/packages/firestore/src/local/local_serializer.ts index 2f63d687546..5fa4d85045f 100644 --- a/packages/firestore/src/local/local_serializer.ts +++ b/packages/firestore/src/local/local_serializer.ts @@ -106,7 +106,6 @@ export class LocalSerializer { return new QueryData( query, dbTarget.targetId, - dbTarget.lastListenSequenceNumber, QueryPurpose.Listen, version, dbTarget.resumeToken diff --git a/packages/firestore/src/local/local_store.ts b/packages/firestore/src/local/local_store.ts index 528e033c622..8528a731d24 100644 --- a/packages/firestore/src/local/local_store.ts +++ b/packages/firestore/src/local/local_store.ts @@ -469,8 +469,7 @@ export class LocalStore { if (resumeToken.length > 0) { queryData = queryData.copy({ resumeToken, - snapshotVersion: remoteEvent.snapshotVersion, - sequenceNumber: txn.currentSequenceNumber + snapshotVersion: remoteEvent.snapshotVersion }); this.targetIds[targetId] = queryData; promises.push(this.queryCache.updateQueryData(txn, queryData)); @@ -624,7 +623,7 @@ export class LocalStore { return PersistencePromise.resolve(); } else { const targetId = this.targetIdGenerator.next(); - queryData = new QueryData(query, targetId, txn.currentSequenceNumber, QueryPurpose.Listen); + queryData = new QueryData(query, targetId, QueryPurpose.Listen); return this.queryCache.addQueryData(txn, queryData); } }) diff --git a/packages/firestore/src/local/memory_persistence.ts b/packages/firestore/src/local/memory_persistence.ts index f2bbcddd095..61da4ab500f 100644 --- a/packages/firestore/src/local/memory_persistence.ts +++ b/packages/firestore/src/local/memory_persistence.ts @@ -26,8 +26,6 @@ import { Persistence, PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { RemoteDocumentCache } from './remote_document_cache'; -import { ListenSequenceNumber } from '../core/types'; -import { ListenSequence } from '../core/listen_sequence'; const LOG_TAG = 'MemoryPersistence'; @@ -88,8 +86,4 @@ export class MemoryPersistence implements Persistence { /** @@ -56,10 +55,6 @@ export class MemoryQueryCache implements QueryCache exte */ getHighestTargetId(): TargetId; - getHighestListenSequenceNumber(): ListenSequenceNumber; - /** * A global snapshot version representing the last consistent snapshot we * received from the backend. This is monotonically increasing and any diff --git a/packages/firestore/src/local/query_data.ts b/packages/firestore/src/local/query_data.ts index 2b9a304ebe8..9ea0886b2bf 100644 --- a/packages/firestore/src/local/query_data.ts +++ b/packages/firestore/src/local/query_data.ts @@ -16,7 +16,7 @@ import { Query } from '../core/query'; import { SnapshotVersion } from '../core/snapshot_version'; -import { ProtoByteString, TargetId, ListenSequenceNumber } from '../core/types'; +import { ProtoByteString, TargetId } from '../core/types'; import { emptyByteString } from '../platform/platform'; /** An enumeration of the different purposes we have for queries. */ @@ -45,7 +45,6 @@ export class QueryData { * LocalStore for user listens and by the SyncEngine for limbo watches. */ readonly targetId: TargetId, - readonly sequenceNumber: ListenSequenceNumber, /** The purpose of the query. */ readonly purpose: QueryPurpose, /** The latest snapshot version seen for this target. */ @@ -66,12 +65,10 @@ export class QueryData { copy(overwrite: { resumeToken?: ProtoByteString; snapshotVersion?: SnapshotVersion; - sequenceNumber: ListenSequenceNumber; }): QueryData { return new QueryData( this.query, this.targetId, - overwrite.sequenceNumber, this.purpose, overwrite.snapshotVersion || this.snapshotVersion, overwrite.resumeToken || this.resumeToken @@ -81,7 +78,6 @@ export class QueryData { isEqual(other: QueryData): boolean { return ( this.targetId === other.targetId && - this.sequenceNumber === other.sequenceNumber && this.purpose === other.purpose && this.snapshotVersion.isEqual(other.snapshotVersion) && this.resumeToken === other.resumeToken && diff --git a/packages/firestore/src/remote/remote_store.ts b/packages/firestore/src/remote/remote_store.ts index ec73c6bcc2c..36c48297a16 100644 --- a/packages/firestore/src/remote/remote_store.ts +++ b/packages/firestore/src/remote/remote_store.ts @@ -408,8 +408,7 @@ export class RemoteStore implements TargetMetadataProvider { if (queryData) { this.listenTargets[targetId] = queryData.copy({ resumeToken: change.resumeToken, - snapshotVersion, - sequenceNumber: queryData.sequenceNumber + snapshotVersion }); } } @@ -427,8 +426,7 @@ export class RemoteStore implements TargetMetadataProvider { // Clear the resume token for the query, since we're in a known mismatch // state. this.listenTargets[targetId] = queryData.copy({ - resumeToken: emptyByteString(), - sequenceNumber: queryData.sequenceNumber + resumeToken: emptyByteString() }); // Cause a hard reset by unwatching and rewatching immediately, but @@ -442,7 +440,6 @@ export class RemoteStore implements TargetMetadataProvider { const requestQueryData = new QueryData( queryData.query, targetId, - queryData.sequenceNumber, QueryPurpose.ExistenceFilterMismatch ); this.sendWatchRequest(requestQueryData); diff --git a/packages/firestore/test/unit/local/query_cache.test.ts b/packages/firestore/test/unit/local/query_cache.test.ts index 4d9f0266ec4..4cecafc7d8c 100644 --- a/packages/firestore/test/unit/local/query_cache.test.ts +++ b/packages/firestore/test/unit/local/query_cache.test.ts @@ -84,7 +84,6 @@ function genericQueryCacheTests( return new QueryData( query, targetId, - 0, QueryPurpose.Listen, snapshotVersion, resumeToken diff --git a/packages/firestore/test/unit/remote/node/serializer.test.ts b/packages/firestore/test/unit/remote/node/serializer.test.ts index bcc0500922b..a4d989c49b5 100644 --- a/packages/firestore/test/unit/remote/node/serializer.test.ts +++ b/packages/firestore/test/unit/remote/node/serializer.test.ts @@ -89,7 +89,6 @@ describe('Serializer', () => { return new QueryData( query, 1, // arbitrary target id - 10, // arbitrary sequence number QueryPurpose.Listen, SnapshotVersion.MIN, emptyResumeToken @@ -872,16 +871,16 @@ describe('Serializer', () => { it('encodes listen request labels', () => { const query = Query.atPath(path('collection/key')); - let queryData = new QueryData(query, 2, 3, QueryPurpose.Listen); + let queryData = new QueryData(query, 2, QueryPurpose.Listen); let result = s.toListenRequestLabels(queryData); expect(result).to.be.null; - queryData = new QueryData(query, 2, 3, QueryPurpose.LimboResolution); + queryData = new QueryData(query, 2, QueryPurpose.LimboResolution); result = s.toListenRequestLabels(queryData); expect(result).to.deep.equal({ 'goog-listen-tags': 'limbo-document' }); - queryData = new QueryData(query, 2, 3, QueryPurpose.ExistenceFilterMismatch); + queryData = new QueryData(query, 2, QueryPurpose.ExistenceFilterMismatch); result = s.toListenRequestLabels(queryData); expect(result).to.deep.equal({ 'goog-listen-tags': 'existence-filter-mismatch' @@ -1184,7 +1183,6 @@ describe('Serializer', () => { new QueryData( q, 1, - 2, QueryPurpose.Listen, SnapshotVersion.MIN, new Uint8Array([1, 2, 3]) diff --git a/packages/firestore/test/unit/remote/remote_event.test.ts b/packages/firestore/test/unit/remote/remote_event.test.ts index aa92f50baf5..7bf7829f73d 100644 --- a/packages/firestore/test/unit/remote/remote_event.test.ts +++ b/packages/firestore/test/unit/remote/remote_event.test.ts @@ -16,7 +16,7 @@ import * as objUtils from '../../../src/util/obj'; import { expect } from 'chai'; -import { TargetId, ListenSequenceNumber } from '../../../src/core/types'; +import { TargetId } from '../../../src/core/types'; import { QueryData, QueryPurpose } from '../../../src/local/query_data'; import { RemoteEvent, TargetChange } from '../../../src/remote/remote_event'; import { @@ -50,13 +50,10 @@ type PendingTargetResponses = { [targetId: number]: number; }; -// Use an arbitrary sequence number. -const SEQUENCE_NUMBER: ListenSequenceNumber = 2; - function listens(...targetIds: TargetId[]): TargetMap { const targets: TargetMap = {}; for (const target of targetIds) { - targets[target] = queryData(target, SEQUENCE_NUMBER, QueryPurpose.Listen, 'coll'); + targets[target] = queryData(target, QueryPurpose.Listen, 'coll'); } return targets; } @@ -66,7 +63,6 @@ function limboListens(...targetIds: TargetId[]): TargetMap { for (const target of targetIds) { targets[target] = queryData( target, - SEQUENCE_NUMBER, QueryPurpose.LimboResolution, 'coll/limbo' ); diff --git a/packages/firestore/test/unit/specs/spec_test_runner.ts b/packages/firestore/test/unit/specs/spec_test_runner.ts index 50ac49e9395..37140ad52c8 100644 --- a/packages/firestore/test/unit/specs/spec_test_runner.ts +++ b/packages/firestore/test/unit/specs/spec_test_runner.ts @@ -891,7 +891,6 @@ abstract class TestRunner { new QueryData( this.parseQuery(expected.query), targetId, - 0, QueryPurpose.Listen, SnapshotVersion.MIN, expected.resumeToken diff --git a/packages/firestore/test/util/helpers.ts b/packages/firestore/test/util/helpers.ts index e1df1f04684..5a1ce01b879 100644 --- a/packages/firestore/test/util/helpers.ts +++ b/packages/firestore/test/util/helpers.ts @@ -34,7 +34,7 @@ import { RelationOp } from '../../src/core/query'; import { SnapshotVersion } from '../../src/core/snapshot_version'; -import { ProtoByteString, TargetId, ListenSequenceNumber } from '../../src/core/types'; +import { ProtoByteString, TargetId } from '../../src/core/types'; import { AddedLimboDocument, LimboDocumentChange, @@ -240,11 +240,10 @@ export function bound( export function queryData( targetId: TargetId, - sequenceNumber: ListenSequenceNumber, queryPurpose: QueryPurpose, path: string ): QueryData { - return new QueryData(query(path)._query, targetId, sequenceNumber, queryPurpose); + return new QueryData(query(path)._query, targetId, queryPurpose); } export function docAddedRemoteEvent( @@ -265,7 +264,7 @@ export function docAddedRemoteEvent( const aggregator = new WatchChangeAggregator({ getRemoteKeysForTarget: () => documentKeySet(), getQueryDataForTarget: targetId => - queryData(targetId, 0, QueryPurpose.Listen, doc.key.toString()) + queryData(targetId, QueryPurpose.Listen, doc.key.toString()) }); aggregator.handleDocumentChange(docChange); return aggregator.createRemoteEvent(doc.version); @@ -289,7 +288,7 @@ export function docUpdateRemoteEvent( const aggregator = new WatchChangeAggregator({ getRemoteKeysForTarget: () => keys(doc), getQueryDataForTarget: targetId => - queryData(targetId, 0, QueryPurpose.Listen, doc.key.toString()) + queryData(targetId, QueryPurpose.Listen, doc.key.toString()) }); aggregator.handleDocumentChange(docChange); return aggregator.createRemoteEvent(doc.version); From 29505fc30a52113da13ef61c283ef1365766cbea Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Wed, 25 Jul 2018 11:12:40 -0700 Subject: [PATCH 05/25] [AUTOMATED]: Prettier Code Styling --- packages/firestore/src/core/sync_engine.ts | 13 +---- .../src/local/indexeddb_mutation_queue.ts | 7 ++- .../src/local/indexeddb_persistence.ts | 47 +++++++++++-------- .../src/local/indexeddb_query_cache.ts | 2 +- .../local/indexeddb_remote_document_cache.ts | 3 +- .../src/local/local_documents_view.ts | 4 +- packages/firestore/src/local/local_store.ts | 4 +- .../src/local/memory_mutation_queue.ts | 7 ++- .../firestore/src/local/memory_persistence.ts | 11 +++-- .../firestore/src/local/memory_query_cache.ts | 3 +- .../src/local/memory_remote_document_cache.ts | 3 +- .../firestore/src/local/mutation_queue.ts | 7 ++- packages/firestore/src/local/persistence.ts | 3 +- packages/firestore/src/local/query_cache.ts | 3 +- .../src/local/remote_document_cache.ts | 4 +- .../local/remote_document_change_buffer.ts | 8 +++- packages/firestore/src/local/simple_db.ts | 4 +- .../test/unit/local/local_store.test.ts | 5 +- .../test/unit/local/mutation_queue.test.ts | 25 +++++++--- .../test/unit/local/query_cache.test.ts | 21 +++++++-- .../unit/local/remote_document_cache.test.ts | 18 +++++-- .../remote_document_change_buffer.test.ts | 5 +- .../test/unit/local/test_garbage_collector.ts | 14 ++++-- .../test/unit/local/test_mutation_queue.ts | 10 +++- .../test/unit/local/test_query_cache.ts | 10 +++- .../unit/local/test_remote_document_cache.ts | 9 +++- .../test_remote_document_change_buffer.ts | 9 +++- .../test/unit/remote/node/serializer.test.ts | 2 +- .../test/unit/specs/spec_test_runner.ts | 19 ++++++-- 29 files changed, 186 insertions(+), 94 deletions(-) diff --git a/packages/firestore/src/core/sync_engine.ts b/packages/firestore/src/core/sync_engine.ts index 9712186cceb..2987b856866 100644 --- a/packages/firestore/src/core/sync_engine.ts +++ b/packages/firestore/src/core/sync_engine.ts @@ -46,12 +46,7 @@ import { Query } from './query'; import { SnapshotVersion } from './snapshot_version'; import { TargetIdGenerator } from './target_id_generator'; import { Transaction } from './transaction'; -import { - BatchId, - OnlineState, - ProtoByteString, - TargetId -} from './types'; +import { BatchId, OnlineState, ProtoByteString, TargetId } from './types'; import { AddedLimboDocument, LimboDocumentChange, @@ -532,11 +527,7 @@ export class SyncEngine implements RemoteSyncer { const query = Query.atPath(key.path); this.limboResolutionsByTarget[limboTargetId] = new LimboResolution(key); this.remoteStore.listen( - new QueryData( - query, - limboTargetId, - QueryPurpose.LimboResolution - ) + new QueryData(query, limboTargetId, QueryPurpose.LimboResolution) ); this.limboTargetsByKey = this.limboTargetsByKey.insert( key, diff --git a/packages/firestore/src/local/indexeddb_mutation_queue.ts b/packages/firestore/src/local/indexeddb_mutation_queue.ts index cb958f41d15..27c35ced00f 100644 --- a/packages/firestore/src/local/indexeddb_mutation_queue.ts +++ b/packages/firestore/src/local/indexeddb_mutation_queue.ts @@ -43,7 +43,8 @@ import { SimpleDb, SimpleDbStore } from './simple_db'; import { IndexedDbTransaction } from './indexeddb_persistence'; /** A mutation queue for a specific user, backed by IndexedDB. */ -export class IndexedDbMutationQueue implements MutationQueue { +export class IndexedDbMutationQueue + implements MutationQueue { /** * Next value to use when assigning sequential IDs to each mutation batch. * @@ -477,9 +478,7 @@ export class IndexedDbMutationQueue implements MutationQueue { + performConsistencyCheck(txn: IndexedDbTransaction): PersistencePromise { return this.checkEmpty(txn).next(empty => { if (!empty) { return PersistencePromise.resolve(); diff --git a/packages/firestore/src/local/indexeddb_persistence.ts b/packages/firestore/src/local/indexeddb_persistence.ts index 37072e3e3cd..8be293f69f8 100644 --- a/packages/firestore/src/local/indexeddb_persistence.ts +++ b/packages/firestore/src/local/indexeddb_persistence.ts @@ -60,9 +60,7 @@ const UNSUPPORTED_PLATFORM_ERROR_MSG = ' persistence has been disabled.'; export class IndexedDbTransaction { - constructor( - readonly simpleDbTransaction: SimpleDbTransaction - ) {} + constructor(readonly simpleDbTransaction: SimpleDbTransaction) {} } /** @@ -149,11 +147,12 @@ export class IndexedDbPersistence implements Persistence { .then(() => { this.scheduleOwnerLeaseRefreshes(); this.attachWindowUnloadHook(); - }).then(() => this.simpleDb.runTransaction( - 'readonly', - ALL_STORES, - (txn) => this.queryCache.start(txn) - )); + }) + .then(() => + this.simpleDb.runTransaction('readonly', ALL_STORES, txn => + this.queryCache.start(txn) + ) + ); } shutdown(deleteData?: boolean): Promise { @@ -193,11 +192,17 @@ export class IndexedDbPersistence implements Persistence { // Do all transactions as readwrite against all object stores, since we // are the only reader/writer. - return this.simpleDb.runTransaction('readwrite', ALL_STORES, simpleDbTxn => { - // Verify that we still have the owner lease as part of every transaction. - const txn = new IndexedDbTransaction(simpleDbTxn); - return this.ensureOwnerLease(txn.simpleDbTransaction).next(() => operation(txn)); - }); + return this.simpleDb.runTransaction( + 'readwrite', + ALL_STORES, + simpleDbTxn => { + // Verify that we still have the owner lease as part of every transaction. + const txn = new IndexedDbTransaction(simpleDbTxn); + return this.ensureOwnerLease(txn.simpleDbTransaction).next(() => + operation(txn) + ); + } + ); } static isAvailable(): boolean { @@ -334,12 +339,16 @@ export class IndexedDbPersistence implements Persistence { // would increase the chances of us not refreshing on time if the queue is // backed up for some reason. this.ownerLeaseRefreshHandle = setInterval(() => { - const txResult = this.simpleDb.runTransaction('readwrite', ALL_STORES, txn => { - // NOTE: We don't need to validate the current owner contents, since - // runTransaction does that automatically. - const store = txn.store(DbOwner.store); - return store.put('owner', new DbOwner(this.ownerId, Date.now())); - }); + const txResult = this.simpleDb.runTransaction( + 'readwrite', + ALL_STORES, + txn => { + // NOTE: We don't need to validate the current owner contents, since + // runTransaction does that automatically. + const store = txn.store(DbOwner.store); + return store.put('owner', new DbOwner(this.ownerId, Date.now())); + } + ); txResult.catch(reason => { // Probably means we lost the lease. Report the error and stop trying to diff --git a/packages/firestore/src/local/indexeddb_query_cache.ts b/packages/firestore/src/local/indexeddb_query_cache.ts index 421d9d9fb55..479fddcfd1e 100644 --- a/packages/firestore/src/local/indexeddb_query_cache.ts +++ b/packages/firestore/src/local/indexeddb_query_cache.ts @@ -338,7 +338,7 @@ function targetsStore( txn: IndexedDbTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn.simpleDbTransaction, + txn.simpleDbTransaction, DbTarget.store ); } diff --git a/packages/firestore/src/local/indexeddb_remote_document_cache.ts b/packages/firestore/src/local/indexeddb_remote_document_cache.ts index 64f1c5e2c5b..066396237d5 100644 --- a/packages/firestore/src/local/indexeddb_remote_document_cache.ts +++ b/packages/firestore/src/local/indexeddb_remote_document_cache.ts @@ -26,7 +26,8 @@ import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; import { SimpleDb, SimpleDbStore } from './simple_db'; -export class IndexedDbRemoteDocumentCache implements RemoteDocumentCache { +export class IndexedDbRemoteDocumentCache + implements RemoteDocumentCache { constructor(private serializer: LocalSerializer) {} addEntry( diff --git a/packages/firestore/src/local/local_documents_view.ts b/packages/firestore/src/local/local_documents_view.ts index a802ebd9b52..55bcf30edf5 100644 --- a/packages/firestore/src/local/local_documents_view.ts +++ b/packages/firestore/src/local/local_documents_view.ts @@ -40,7 +40,9 @@ import { RemoteDocumentCache } from './remote_document_cache'; * document). The view is computed by applying the mutations in the * MutationQueue to the RemoteDocumentCache. */ -export class LocalDocumentsView { +export class LocalDocumentsView< + TransactionType extends PersistenceTransaction +> { constructor( private remoteDocumentCache: RemoteDocumentCache, private mutationQueue: MutationQueue diff --git a/packages/firestore/src/local/local_store.ts b/packages/firestore/src/local/local_store.ts index 8528a731d24..b4504b56a88 100644 --- a/packages/firestore/src/local/local_store.ts +++ b/packages/firestore/src/local/local_store.ts @@ -241,9 +241,7 @@ export class LocalStore { }); }*/ - private startMutationQueue( - txn: TransactionType - ): PersistencePromise { + private startMutationQueue(txn: TransactionType): PersistencePromise { return this.mutationQueue .start(txn) .next(() => { diff --git a/packages/firestore/src/local/memory_mutation_queue.ts b/packages/firestore/src/local/memory_mutation_queue.ts index f477ce43279..fd4ca99f583 100644 --- a/packages/firestore/src/local/memory_mutation_queue.ts +++ b/packages/firestore/src/local/memory_mutation_queue.ts @@ -31,7 +31,8 @@ import { PersistencePromise } from './persistence_promise'; import { DocReference } from './reference_set'; import { MemoryPersistenceTransaction } from './memory_persistence'; -export class MemoryMutationQueue implements MutationQueue { +export class MemoryMutationQueue + implements MutationQueue { /** * The set of all mutations that have been sent but not yet been applied to * the backend. @@ -73,7 +74,9 @@ export class MemoryMutationQueue implements MutationQueue { + checkEmpty( + transaction: MemoryPersistenceTransaction + ): PersistencePromise { return PersistencePromise.resolve(this.mutationQueue.length === 0); } diff --git a/packages/firestore/src/local/memory_persistence.ts b/packages/firestore/src/local/memory_persistence.ts index 61da4ab500f..abe440246c4 100644 --- a/packages/firestore/src/local/memory_persistence.ts +++ b/packages/firestore/src/local/memory_persistence.ts @@ -33,7 +33,8 @@ const LOG_TAG = 'MemoryPersistence'; * A memory-backed instance of Persistence. Data is stored only in RAM and * not persisted across sessions. */ -export class MemoryPersistence implements Persistence { +export class MemoryPersistence + implements Persistence { /** * Note that these are retained here to make it easier to write tests * affecting both the in-memory and IndexedDB-backed persistence layers. Tests @@ -41,7 +42,9 @@ export class MemoryPersistence implements Persistence } = {}; + private mutationQueues: { + [user: string]: MutationQueue; + } = {}; private remoteDocumentCache = new MemoryRemoteDocumentCache(); private queryCache = new MemoryQueryCache(); @@ -78,7 +81,9 @@ export class MemoryPersistence implements Persistence( action: string, - operation: (transaction: MemoryPersistenceTransaction) => PersistencePromise + operation: ( + transaction: MemoryPersistenceTransaction + ) => PersistencePromise ): Promise { debug(LOG_TAG, 'Starting transaction:', action); return operation(new MemoryPersistenceTransaction()).toPromise(); diff --git a/packages/firestore/src/local/memory_query_cache.ts b/packages/firestore/src/local/memory_query_cache.ts index acdb67dec62..2ad44a02e01 100644 --- a/packages/firestore/src/local/memory_query_cache.ts +++ b/packages/firestore/src/local/memory_query_cache.ts @@ -29,7 +29,8 @@ import { ReferenceSet } from './reference_set'; import { assert } from '../util/assert'; import { MemoryPersistenceTransaction } from './memory_persistence'; -export class MemoryQueryCache implements QueryCache { +export class MemoryQueryCache + implements QueryCache { /** * Maps a query to the data about that query */ diff --git a/packages/firestore/src/local/memory_remote_document_cache.ts b/packages/firestore/src/local/memory_remote_document_cache.ts index 9999f3c59b9..f28df24a753 100644 --- a/packages/firestore/src/local/memory_remote_document_cache.ts +++ b/packages/firestore/src/local/memory_remote_document_cache.ts @@ -26,7 +26,8 @@ import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; import { MemoryPersistenceTransaction } from './memory_persistence'; -export class MemoryRemoteDocumentCache implements RemoteDocumentCache { +export class MemoryRemoteDocumentCache + implements RemoteDocumentCache { private docs = maybeDocumentMap(); addEntry( diff --git a/packages/firestore/src/local/mutation_queue.ts b/packages/firestore/src/local/mutation_queue.ts index fbab7270e03..10723e870bc 100644 --- a/packages/firestore/src/local/mutation_queue.ts +++ b/packages/firestore/src/local/mutation_queue.ts @@ -26,7 +26,8 @@ import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; /** A queue of mutations to apply to the remote store. */ -export interface MutationQueue extends GarbageSource { +export interface MutationQueue + extends GarbageSource { /** * Starts the mutation queue, performing any initial reads that might be * required to establish invariants, etc. @@ -48,9 +49,7 @@ export interface MutationQueue e * mutation queue is properly maintaining the invariant that * highestAcknowledgedBatchId is less than nextBatchId. */ - getNextBatchId( - transaction: TransactionType - ): PersistencePromise; + getNextBatchId(transaction: TransactionType): PersistencePromise; /** * Returns the highest batchId that has been acknowledged. If no batches have diff --git a/packages/firestore/src/local/persistence.ts b/packages/firestore/src/local/persistence.ts index 218c74170b7..67aae610745 100644 --- a/packages/firestore/src/local/persistence.ts +++ b/packages/firestore/src/local/persistence.ts @@ -29,8 +29,7 @@ import { RemoteDocumentCache } from './remote_document_cache'; * pass it to your callback. You then pass it to any method that operates * on persistence. */ -export interface PersistenceTransaction { -} +export interface PersistenceTransaction {} /** * Persistence is the lowest-level shared interface to persistent storage in diff --git a/packages/firestore/src/local/query_cache.ts b/packages/firestore/src/local/query_cache.ts index a3c1f428198..98ea69dd613 100644 --- a/packages/firestore/src/local/query_cache.ts +++ b/packages/firestore/src/local/query_cache.ts @@ -29,7 +29,8 @@ import { QueryData } from './query_data'; * * The cache is keyed by Query and entries in the cache are QueryData instances. */ -export interface QueryCache extends GarbageSource { +export interface QueryCache + extends GarbageSource { /** * Starts up the query cache. */ diff --git a/packages/firestore/src/local/remote_document_cache.ts b/packages/firestore/src/local/remote_document_cache.ts index 608de651002..3b72da6cf61 100644 --- a/packages/firestore/src/local/remote_document_cache.ts +++ b/packages/firestore/src/local/remote_document_cache.ts @@ -30,7 +30,9 @@ import { PersistencePromise } from './persistence_promise'; * with data) as well as NoDocument instances (indicating that the document is * known to not exist). */ -export interface RemoteDocumentCache { +export interface RemoteDocumentCache< + TransactionType extends PersistenceTransaction +> { /** * Adds or replaces an entry in the cache. * diff --git a/packages/firestore/src/local/remote_document_change_buffer.ts b/packages/firestore/src/local/remote_document_change_buffer.ts index a2ac4141500..cdfb6b773c6 100644 --- a/packages/firestore/src/local/remote_document_change_buffer.ts +++ b/packages/firestore/src/local/remote_document_change_buffer.ts @@ -36,10 +36,14 @@ import { RemoteDocumentCache } from './remote_document_cache'; * read-your-own-writes capability, this class is not technically needed, but * has been preserved as a convenience and to aid portability. */ -export class RemoteDocumentChangeBuffer { +export class RemoteDocumentChangeBuffer< + TransactionType extends PersistenceTransaction +> { private changes: MaybeDocumentMap | null = maybeDocumentMap(); - constructor(private remoteDocumentCache: RemoteDocumentCache) {} + constructor( + private remoteDocumentCache: RemoteDocumentCache + ) {} /** Buffers a `RemoteDocumentCache.addEntry()` call. */ addEntry(maybeDocument: MaybeDocument): void { diff --git a/packages/firestore/src/local/simple_db.ts b/packages/firestore/src/local/simple_db.ts index ea4700854f3..49674d5b5b8 100644 --- a/packages/firestore/src/local/simple_db.ts +++ b/packages/firestore/src/local/simple_db.ts @@ -275,9 +275,7 @@ export class SimpleDbTransaction { mode: IDBTransactionMode, objectStoreNames: string[] ): SimpleDbTransaction { - return new SimpleDbTransaction( - db.transaction(objectStoreNames, mode) - ); + return new SimpleDbTransaction(db.transaction(objectStoreNames, mode)); } constructor(private readonly transaction: IDBTransaction) { diff --git a/packages/firestore/test/unit/local/local_store.test.ts b/packages/firestore/test/unit/local/local_store.test.ts index f7089d9ea66..0d927728b0e 100644 --- a/packages/firestore/test/unit/local/local_store.test.ts +++ b/packages/firestore/test/unit/local/local_store.test.ts @@ -24,7 +24,10 @@ import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; import { LocalStore, LocalWriteResult } from '../../../src/local/local_store'; import { LocalViewChanges } from '../../../src/local/local_view_changes'; import { NoOpGarbageCollector } from '../../../src/local/no_op_garbage_collector'; -import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; +import { + Persistence, + PersistenceTransaction +} from '../../../src/local/persistence'; import { documentKeySet, DocumentMap, diff --git a/packages/firestore/test/unit/local/mutation_queue.test.ts b/packages/firestore/test/unit/local/mutation_queue.test.ts index 1c3d82691cc..b575841305f 100644 --- a/packages/firestore/test/unit/local/mutation_queue.test.ts +++ b/packages/firestore/test/unit/local/mutation_queue.test.ts @@ -20,9 +20,15 @@ import { Query } from '../../../src/core/query'; import { BatchId } from '../../../src/core/types'; import { EagerGarbageCollector } from '../../../src/local/eager_garbage_collector'; import { IndexedDbMutationQueue } from '../../../src/local/indexeddb_mutation_queue'; -import { IndexedDbPersistence, IndexedDbTransaction } from '../../../src/local/indexeddb_persistence'; +import { + IndexedDbPersistence, + IndexedDbTransaction +} from '../../../src/local/indexeddb_persistence'; import { DbMutationBatch } from '../../../src/local/indexeddb_schema'; -import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; +import { + Persistence, + PersistenceTransaction +} from '../../../src/local/persistence'; import { BATCHID_UNKNOWN, MutationBatch @@ -51,7 +57,9 @@ describe('IndexedDbMutationQueue', () => { return; } - const persistencePromise: Promise> = persistenceHelpers.testIndexedDbPersistence(); + const persistencePromise: Promise< + Persistence + > = persistenceHelpers.testIndexedDbPersistence(); let persistence: Persistence; beforeEach(async () => { persistence = await persistencePromise; @@ -72,9 +80,10 @@ describe('IndexedDbMutationQueue', () => { function addDummyBatch(userId: string, batchId: BatchId): Promise { return persistence.runTransaction('addDummyBatch', transaction => { - const store = transaction.simpleDbTransaction.store<[string, number], DbMutationBatch>( - DbMutationBatch.store - ); + const store = transaction.simpleDbTransaction.store< + [string, number], + DbMutationBatch + >(DbMutationBatch.store); const localWriteTime = Date.now(); return store.put( new DbMutationBatch(userId, batchId, localWriteTime, []) @@ -109,7 +118,9 @@ describe('IndexedDbMutationQueue', () => { * Defines the set of tests to run against both mutation queue * implementations. */ -function genericMutationQueueTests(persistencePromise: () => Promise>): void { +function genericMutationQueueTests< + TransactionType extends PersistenceTransaction +>(persistencePromise: () => Promise>): void { addEqualityMatcher(); let persistence: Persistence; diff --git a/packages/firestore/test/unit/local/query_cache.test.ts b/packages/firestore/test/unit/local/query_cache.test.ts index 4cecafc7d8c..08096dd75c7 100644 --- a/packages/firestore/test/unit/local/query_cache.test.ts +++ b/packages/firestore/test/unit/local/query_cache.test.ts @@ -19,8 +19,14 @@ import { Query } from '../../../src/core/query'; import { SnapshotVersion } from '../../../src/core/snapshot_version'; import { TargetId } from '../../../src/core/types'; import { EagerGarbageCollector } from '../../../src/local/eager_garbage_collector'; -import { IndexedDbPersistence, IndexedDbTransaction } from '../../../src/local/indexeddb_persistence'; -import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; +import { + IndexedDbPersistence, + IndexedDbTransaction +} from '../../../src/local/indexeddb_persistence'; +import { + Persistence, + PersistenceTransaction +} from '../../../src/local/persistence'; import { QueryData, QueryPurpose } from '../../../src/local/query_data'; import { addEqualityMatcher } from '../../util/equality_matcher'; import { @@ -45,7 +51,9 @@ describe('IndexedDbQueryCache', () => { return; } - const persistencePromise: Promise> = persistenceHelpers.testIndexedDbPersistence(); + const persistencePromise: Promise< + Persistence + > = persistenceHelpers.testIndexedDbPersistence(); let persistence: Persistence; beforeEach(async () => { persistence = await persistencePromise; @@ -59,7 +67,9 @@ describe('IndexedDbQueryCache', () => { /** * Defines the set of tests to run against both query cache implementations. */ -function genericQueryCacheTests(persistencePromise: () => Promise>): void { +function genericQueryCacheTests( + persistencePromise: () => Promise> +): void { addEqualityMatcher(); let cache: TestQueryCache; @@ -334,7 +344,8 @@ function genericQueryCacheTests( persistence.getQueryCache() ); expect(otherCache.getLastRemoteSnapshotVersion()).to.deep.equal( - version(42)); + version(42) + ); /*return otherCache.start().then(() => { expect(otherCache.getLastRemoteSnapshotVersion()).to.deep.equal( version(42) diff --git a/packages/firestore/test/unit/local/remote_document_cache.test.ts b/packages/firestore/test/unit/local/remote_document_cache.test.ts index 467b54c275b..1708d62350f 100644 --- a/packages/firestore/test/unit/local/remote_document_cache.test.ts +++ b/packages/firestore/test/unit/local/remote_document_cache.test.ts @@ -16,8 +16,14 @@ import { expect } from 'chai'; import { Query } from '../../../src/core/query'; -import { IndexedDbPersistence, IndexedDbTransaction } from '../../../src/local/indexeddb_persistence'; -import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; +import { + IndexedDbPersistence, + IndexedDbTransaction +} from '../../../src/local/indexeddb_persistence'; +import { + Persistence, + PersistenceTransaction +} from '../../../src/local/persistence'; import { MaybeDocument } from '../../../src/model/document'; import { deletedDoc, doc, expectEqual, key, path } from '../../util/helpers'; @@ -34,7 +40,9 @@ describe('IndexedDbRemoteDocumentCache', () => { return; } - const persistencePromise: Promise> = persistenceHelpers.testIndexedDbPersistence(); + const persistencePromise: Promise< + Persistence + > = persistenceHelpers.testIndexedDbPersistence(); let persistence: Persistence; beforeEach(async () => { persistence = await persistencePromise; @@ -49,7 +57,9 @@ describe('IndexedDbRemoteDocumentCache', () => { * Defines the set of tests to run against both remote document cache * implementations. */ -function genericRemoteDocumentCacheTests(persistencePromise: () => Promise>): void { +function genericRemoteDocumentCacheTests< + TransactionType extends PersistenceTransaction +>(persistencePromise: () => Promise>): void { // Helpers for use throughout tests. const DOC_PATH = 'a/b'; const LONG_DOC_PATH = 'a/b/c/d/e/f'; diff --git a/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts b/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts index edf4049a9ab..1505297a850 100644 --- a/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts +++ b/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts @@ -15,7 +15,10 @@ */ import { expect } from 'chai'; -import { IndexedDbPersistence, IndexedDbTransaction } from '../../../src/local/indexeddb_persistence'; +import { + IndexedDbPersistence, + IndexedDbTransaction +} from '../../../src/local/indexeddb_persistence'; import { RemoteDocumentChangeBuffer } from '../../../src/local/remote_document_change_buffer'; import { deletedDoc, doc, expectEqual, key } from '../../util/helpers'; diff --git a/packages/firestore/test/unit/local/test_garbage_collector.ts b/packages/firestore/test/unit/local/test_garbage_collector.ts index 0f36b947012..79dfd4c5688 100644 --- a/packages/firestore/test/unit/local/test_garbage_collector.ts +++ b/packages/firestore/test/unit/local/test_garbage_collector.ts @@ -15,15 +15,23 @@ */ import { GarbageCollector } from '../../../src/local/garbage_collector'; -import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; +import { + Persistence, + PersistenceTransaction +} from '../../../src/local/persistence'; import { DocumentKey } from '../../../src/model/document_key'; /** * A wrapper around a GarbageCollector that automatically creates a transaction * around every operation to reduce test boilerplate. */ -export class TestGarbageCollector { - constructor(public persistence: Persistence, public gc: GarbageCollector) {} +export class TestGarbageCollector< + TransactionType extends PersistenceTransaction +> { + constructor( + public persistence: Persistence, + public gc: GarbageCollector + ) {} collectGarbage(): Promise { return this.persistence diff --git a/packages/firestore/test/unit/local/test_mutation_queue.ts b/packages/firestore/test/unit/local/test_mutation_queue.ts index 9bb1d6be2d6..22a64524912 100644 --- a/packages/firestore/test/unit/local/test_mutation_queue.ts +++ b/packages/firestore/test/unit/local/test_mutation_queue.ts @@ -19,7 +19,10 @@ import { Query } from '../../../src/core/query'; import { BatchId, ProtoByteString } from '../../../src/core/types'; import { GarbageCollector } from '../../../src/local/garbage_collector'; import { MutationQueue } from '../../../src/local/mutation_queue'; -import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; +import { + Persistence, + PersistenceTransaction +} from '../../../src/local/persistence'; import { DocumentKeySet } from '../../../src/model/collections'; import { DocumentKey } from '../../../src/model/document_key'; import { Mutation } from '../../../src/model/mutation'; @@ -31,7 +34,10 @@ import { AnyDuringMigration } from '../../../src/util/misc'; * transaction around every operation to reduce test boilerplate. */ export class TestMutationQueue { - constructor(public persistence: Persistence, public queue: MutationQueue) {} + constructor( + public persistence: Persistence, + public queue: MutationQueue + ) {} start(): Promise { return this.persistence.runTransaction('start', txn => { diff --git a/packages/firestore/test/unit/local/test_query_cache.ts b/packages/firestore/test/unit/local/test_query_cache.ts index 38afbfa6a82..767b31a369b 100644 --- a/packages/firestore/test/unit/local/test_query_cache.ts +++ b/packages/firestore/test/unit/local/test_query_cache.ts @@ -17,7 +17,10 @@ import { Query } from '../../../src/core/query'; import { SnapshotVersion } from '../../../src/core/snapshot_version'; import { TargetId } from '../../../src/core/types'; -import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; +import { + Persistence, + PersistenceTransaction +} from '../../../src/local/persistence'; import { QueryCache } from '../../../src/local/query_cache'; import { QueryData } from '../../../src/local/query_data'; import { documentKeySet } from '../../../src/model/collections'; @@ -28,7 +31,10 @@ import { DocumentKey } from '../../../src/model/document_key'; * transaction around every operation to reduce test boilerplate. */ export class TestQueryCache { - constructor(public persistence: Persistence, public cache: QueryCache) {} + constructor( + public persistence: Persistence, + public cache: QueryCache + ) {} /*start(): Promise { return this.persistence.runTransaction('start', txn => diff --git a/packages/firestore/test/unit/local/test_remote_document_cache.ts b/packages/firestore/test/unit/local/test_remote_document_cache.ts index 46ddfef0083..d82d716a526 100644 --- a/packages/firestore/test/unit/local/test_remote_document_cache.ts +++ b/packages/firestore/test/unit/local/test_remote_document_cache.ts @@ -15,7 +15,10 @@ */ import { Query } from '../../../src/core/query'; -import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; +import { + Persistence, + PersistenceTransaction +} from '../../../src/local/persistence'; import { RemoteDocumentCache } from '../../../src/local/remote_document_cache'; import { DocumentMap } from '../../../src/model/collections'; import { MaybeDocument } from '../../../src/model/document'; @@ -25,7 +28,9 @@ import { DocumentKey } from '../../../src/model/document_key'; * A wrapper around a RemoteDocumentCache that automatically creates a * transaction around every operation to reduce test boilerplate. */ -export class TestRemoteDocumentCache { +export class TestRemoteDocumentCache< + TransactionType extends PersistenceTransaction +> { constructor( public persistence: Persistence, public cache: RemoteDocumentCache diff --git a/packages/firestore/test/unit/local/test_remote_document_change_buffer.ts b/packages/firestore/test/unit/local/test_remote_document_change_buffer.ts index 46efeec0084..94da0f4b05e 100644 --- a/packages/firestore/test/unit/local/test_remote_document_change_buffer.ts +++ b/packages/firestore/test/unit/local/test_remote_document_change_buffer.ts @@ -14,7 +14,10 @@ * limitations under the License. */ -import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; +import { + Persistence, + PersistenceTransaction +} from '../../../src/local/persistence'; import { RemoteDocumentChangeBuffer } from '../../../src/local/remote_document_change_buffer'; import { MaybeDocument } from '../../../src/model/document'; import { DocumentKey } from '../../../src/model/document_key'; @@ -23,7 +26,9 @@ import { DocumentKey } from '../../../src/model/document_key'; * A wrapper around a RemoteDocumentChangeBuffer that automatically creates a * transaction around operations to reduce test boilerplate. */ -export class TestRemoteDocumentChangeBuffer { +export class TestRemoteDocumentChangeBuffer< + TransactionType extends PersistenceTransaction +> { constructor( public persistence: Persistence, public buffer: RemoteDocumentChangeBuffer diff --git a/packages/firestore/test/unit/remote/node/serializer.test.ts b/packages/firestore/test/unit/remote/node/serializer.test.ts index a4d989c49b5..abd5c373721 100644 --- a/packages/firestore/test/unit/remote/node/serializer.test.ts +++ b/packages/firestore/test/unit/remote/node/serializer.test.ts @@ -88,7 +88,7 @@ describe('Serializer', () => { function wrapQueryData(query: Query): QueryData { return new QueryData( query, - 1, // arbitrary target id + 1, // arbitrary target id QueryPurpose.Listen, SnapshotVersion.MIN, emptyResumeToken diff --git a/packages/firestore/test/unit/specs/spec_test_runner.ts b/packages/firestore/test/unit/specs/spec_test_runner.ts index 37140ad52c8..5f3f3c430f2 100644 --- a/packages/firestore/test/unit/specs/spec_test_runner.ts +++ b/packages/firestore/test/unit/specs/spec_test_runner.ts @@ -39,11 +39,20 @@ import { } from '../../../src/core/view_snapshot'; import { EagerGarbageCollector } from '../../../src/local/eager_garbage_collector'; import { GarbageCollector } from '../../../src/local/garbage_collector'; -import { IndexedDbPersistence, IndexedDbTransaction } from '../../../src/local/indexeddb_persistence'; +import { + IndexedDbPersistence, + IndexedDbTransaction +} from '../../../src/local/indexeddb_persistence'; import { LocalStore } from '../../../src/local/local_store'; -import { MemoryPersistence, MemoryPersistenceTransaction } from '../../../src/local/memory_persistence'; +import { + MemoryPersistence, + MemoryPersistenceTransaction +} from '../../../src/local/memory_persistence'; import { NoOpGarbageCollector } from '../../../src/local/no_op_garbage_collector'; -import { Persistence, PersistenceTransaction } from '../../../src/local/persistence'; +import { + Persistence, + PersistenceTransaction +} from '../../../src/local/persistence'; import { QueryData, QueryPurpose } from '../../../src/local/query_data'; import { SimpleDb } from '../../../src/local/simple_db'; import { DocumentOptions } from '../../../src/model/document'; @@ -1010,7 +1019,9 @@ class MemoryTestRunner extends TestRunner { class IndexedDbTestRunner extends TestRunner { static TEST_DB_NAME = 'specs'; - protected getPersistence(serializer: JsonProtoSerializer): IndexedDbPersistence { + protected getPersistence( + serializer: JsonProtoSerializer + ): IndexedDbPersistence { return new IndexedDbPersistence( IndexedDbTestRunner.TEST_DB_NAME, serializer From d03f608b9627c9daafc4dcdb5857bb760fec002c Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Wed, 25 Jul 2018 13:55:34 -0700 Subject: [PATCH 06/25] Fix tests --- .../firestore/src/core/firestore_client.ts | 3 ++- .../src/local/indexeddb_mutation_queue.ts | 6 ++--- .../src/local/indexeddb_persistence.ts | 14 +++-------- .../src/local/indexeddb_query_cache.ts | 4 ++-- packages/firestore/src/local/local_store.ts | 10 ++++---- .../firestore/src/local/memory_persistence.ts | 5 +++- .../firestore/src/local/memory_query_cache.ts | 5 ++++ packages/firestore/src/local/query_cache.ts | 2 +- packages/firestore/src/local/query_data.ts | 8 +++++-- .../local/remote_document_change_buffer.ts | 1 - packages/firestore/src/local/simple_db.ts | 14 ++++------- .../local/eager_garbage_collector.test.ts | 2 -- .../test/unit/local/mutation_queue.test.ts | 5 ++-- .../test/unit/local/query_cache.test.ts | 24 ++++++++----------- .../unit/local/remote_document_cache.test.ts | 14 +++-------- .../test/unit/local/test_query_cache.ts | 4 ++-- .../test/unit/remote/node/serializer.test.ts | 2 +- 17 files changed, 53 insertions(+), 70 deletions(-) diff --git a/packages/firestore/src/core/firestore_client.ts b/packages/firestore/src/core/firestore_client.ts index f2b51e6fcbc..9c6fa3b7f91 100644 --- a/packages/firestore/src/core/firestore_client.ts +++ b/packages/firestore/src/core/firestore_client.ts @@ -76,7 +76,8 @@ export class FirestoreClient { // undefined checks. private eventMgr: EventManager; private garbageCollector: GarbageCollector; - // TODO(gsoltis): wrap these two together to enforce the same parametrized type + // Note that localStore will end up with the same type parameter as + // persistence because the LocalStore constructor enforces this. private persistence: Persistence; private localStore: LocalStore; private remoteStore: RemoteStore; diff --git a/packages/firestore/src/local/indexeddb_mutation_queue.ts b/packages/firestore/src/local/indexeddb_mutation_queue.ts index 27c35ced00f..6398607ab96 100644 --- a/packages/firestore/src/local/indexeddb_mutation_queue.ts +++ b/packages/firestore/src/local/indexeddb_mutation_queue.ts @@ -563,7 +563,7 @@ function mutationsStore( txn: IndexedDbTransaction ): SimpleDbStore { return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + txn.simpleDbTransaction, DbMutationBatch.store ); } @@ -575,7 +575,7 @@ function documentMutationsStore( txn: IndexedDbTransaction ): SimpleDbStore { return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + txn.simpleDbTransaction, DbDocumentMutation.store ); } @@ -587,7 +587,7 @@ function mutationQueuesStore( txn: IndexedDbTransaction ): SimpleDbStore { return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + txn.simpleDbTransaction, DbMutationQueue.store ); } diff --git a/packages/firestore/src/local/indexeddb_persistence.ts b/packages/firestore/src/local/indexeddb_persistence.ts index 8be293f69f8..b92b917decf 100644 --- a/packages/firestore/src/local/indexeddb_persistence.ts +++ b/packages/firestore/src/local/indexeddb_persistence.ts @@ -118,13 +118,10 @@ export class IndexedDbPersistence implements Persistence { private serializer: LocalSerializer; - private queryCache: IndexedDbQueryCache; - constructor(prefix: string, serializer: JsonProtoSerializer) { this.dbName = prefix + IndexedDbPersistence.MAIN_DATABASE; this.serializer = new LocalSerializer(serializer); this.localStoragePrefix = prefix; - this.queryCache = new IndexedDbQueryCache(this.serializer); } start(): Promise { @@ -147,12 +144,7 @@ export class IndexedDbPersistence implements Persistence { .then(() => { this.scheduleOwnerLeaseRefreshes(); this.attachWindowUnloadHook(); - }) - .then(() => - this.simpleDb.runTransaction('readonly', ALL_STORES, txn => - this.queryCache.start(txn) - ) - ); + }); } shutdown(deleteData?: boolean): Promise { @@ -173,7 +165,7 @@ export class IndexedDbPersistence implements Persistence { } getQueryCache(): QueryCache { - return this.queryCache; + return new IndexedDbQueryCache(this.serializer); } getRemoteDocumentCache(): RemoteDocumentCache { @@ -418,7 +410,7 @@ export class IndexedDbPersistence implements Persistence { return zombiedOwnerId; } catch (e) { // Gracefully handle if LocalStorage isn't available / working. - log.error('Failed to get zombie owner id.', e); + //log.error('Failed to get zombie owner id.', e); return null; } } diff --git a/packages/firestore/src/local/indexeddb_query_cache.ts b/packages/firestore/src/local/indexeddb_query_cache.ts index 479fddcfd1e..4f8e6dc8b68 100644 --- a/packages/firestore/src/local/indexeddb_query_cache.ts +++ b/packages/firestore/src/local/indexeddb_query_cache.ts @@ -57,8 +57,8 @@ export class IndexedDbQueryCache implements QueryCache { /** The garbage collector to notify about potential garbage keys. */ private garbageCollector: GarbageCollector | null = null; - start(transaction: SimpleDbTransaction): PersistencePromise { - return globalTargetStore(transaction) + start(transaction: IndexedDbTransaction): PersistencePromise { + return globalTargetStore(transaction.simpleDbTransaction) .get(DbTargetGlobal.key) .next(metadata => { assert( diff --git a/packages/firestore/src/local/local_store.ts b/packages/firestore/src/local/local_store.ts index b4504b56a88..4c6e424fee4 100644 --- a/packages/firestore/src/local/local_store.ts +++ b/packages/firestore/src/local/local_store.ts @@ -166,8 +166,6 @@ export class LocalStore { this.mutationQueue = persistence.getMutationQueue(initialUser); this.remoteDocuments = persistence.getRemoteDocumentCache(); this.queryCache = persistence.getQueryCache(); - const targetId = this.queryCache.getHighestTargetId(); - this.targetIdGenerator = TargetIdGenerator.forLocalStore(targetId); this.localDocuments = new LocalDocumentsView( this.remoteDocuments, this.mutationQueue @@ -180,7 +178,7 @@ export class LocalStore { /** Performs any initial startup actions required by the local store. */ start(): Promise { return this.persistence.runTransaction('Start LocalStore', txn => { - return this.startMutationQueue(txn); + return this.startMutationQueue(txn).next(() => this.startQueryCache(txn)); }); } @@ -232,14 +230,14 @@ export class LocalStore { }); } - /*private startQueryCache( - txn: PersistenceTransaction + private startQueryCache( + txn: TransactionType ): PersistencePromise { return this.queryCache.start(txn).next(() => { const targetId = this.queryCache.getHighestTargetId(); this.targetIdGenerator = TargetIdGenerator.forLocalStore(targetId); }); - }*/ + } private startMutationQueue(txn: TransactionType): PersistencePromise { return this.mutationQueue diff --git a/packages/firestore/src/local/memory_persistence.ts b/packages/firestore/src/local/memory_persistence.ts index abe440246c4..ab5f5500175 100644 --- a/packages/firestore/src/local/memory_persistence.ts +++ b/packages/firestore/src/local/memory_persistence.ts @@ -90,5 +90,8 @@ export class MemoryPersistence } } -/** Dummy class since memory persistence doesn't actually use transactions. */ +/** + * Memory persistence is not actually transactional, but future implementations + * may have transaction-scoped state. + */ export class MemoryPersistenceTransaction implements PersistenceTransaction {} diff --git a/packages/firestore/src/local/memory_query_cache.ts b/packages/firestore/src/local/memory_query_cache.ts index 2ad44a02e01..7203ecafb9b 100644 --- a/packages/firestore/src/local/memory_query_cache.ts +++ b/packages/firestore/src/local/memory_query_cache.ts @@ -48,6 +48,11 @@ export class MemoryQueryCache private targetCount = 0; + start(transaction: MemoryPersistenceTransaction): PersistencePromise { + // Nothing to do. + return PersistencePromise.resolve(); + } + getLastRemoteSnapshotVersion(): SnapshotVersion { return this.lastRemoteSnapshotVersion; } diff --git a/packages/firestore/src/local/query_cache.ts b/packages/firestore/src/local/query_cache.ts index 98ea69dd613..6b6372f3b1f 100644 --- a/packages/firestore/src/local/query_cache.ts +++ b/packages/firestore/src/local/query_cache.ts @@ -34,7 +34,7 @@ export interface QueryCache /** * Starts up the query cache. */ - //start(transaction: PersistenceTransaction): PersistencePromise; + start(transaction: TransactionType): PersistencePromise; /** * Returns the highest target ID of any query in the cache. Typically called diff --git a/packages/firestore/src/local/query_data.ts b/packages/firestore/src/local/query_data.ts index 9ea0886b2bf..e45f28f8e77 100644 --- a/packages/firestore/src/local/query_data.ts +++ b/packages/firestore/src/local/query_data.ts @@ -70,8 +70,12 @@ export class QueryData { this.query, this.targetId, this.purpose, - overwrite.snapshotVersion || this.snapshotVersion, - overwrite.resumeToken || this.resumeToken + overwrite.snapshotVersion === undefined + ? this.snapshotVersion + : overwrite.snapshotVersion, + overwrite.resumeToken === undefined + ? this.resumeToken + : overwrite.resumeToken ); } diff --git a/packages/firestore/src/local/remote_document_change_buffer.ts b/packages/firestore/src/local/remote_document_change_buffer.ts index cdfb6b773c6..f926a56d858 100644 --- a/packages/firestore/src/local/remote_document_change_buffer.ts +++ b/packages/firestore/src/local/remote_document_change_buffer.ts @@ -23,7 +23,6 @@ import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; -// TODO(gsoltis): delete this class. /** * An in-memory buffer of entries to be written to a RemoteDocumentCache. * It can be used to batch up a set of changes to be written to the cache, but diff --git a/packages/firestore/src/local/simple_db.ts b/packages/firestore/src/local/simple_db.ts index 49674d5b5b8..a0c21c5819d 100644 --- a/packages/firestore/src/local/simple_db.ts +++ b/packages/firestore/src/local/simple_db.ts @@ -151,11 +151,7 @@ export class SimpleDb { txn: SimpleDbTransaction, store: string ): SimpleDbStore { - if (txn instanceof SimpleDbTransaction) { - return txn.store(store); - } else { - return fail('Invalid transaction object provided!'); - } + return txn.store(store); } constructor(private db: IDBDatabase) {} @@ -532,7 +528,7 @@ export class SimpleDbStore { } private cursor(options: IterateOptions): IDBRequest { - let direction = 'next'; + let direction: IDBCursorDirection = 'next'; if (options.reverse) { direction = 'prev'; } @@ -541,15 +537,15 @@ export class SimpleDbStore { if (options.keysOnly) { return index.openKeyCursor( options.range, - direction as AnyDuringMigration + direction ); } else { - return index.openCursor(options.range, direction as AnyDuringMigration); + return index.openCursor(options.range, direction); } } else { return this.store.openCursor( options.range, - direction as AnyDuringMigration + direction ); } } diff --git a/packages/firestore/test/unit/local/eager_garbage_collector.test.ts b/packages/firestore/test/unit/local/eager_garbage_collector.test.ts index 6d8922bb89b..af5d748a2be 100644 --- a/packages/firestore/test/unit/local/eager_garbage_collector.test.ts +++ b/packages/firestore/test/unit/local/eager_garbage_collector.test.ts @@ -66,8 +66,6 @@ describe('EagerGarbageCollector', () => { referenceSet.removeReferencesForId(2); return gc.collectGarbage(null).toPromise(); - // TODO(gsoltis): true does not conform to PersistenceTransaction - //return gc.collectGarbage(true).toPromise(); }) .then(garbage => { expectSetToEqual(garbage, [key3]); diff --git a/packages/firestore/test/unit/local/mutation_queue.test.ts b/packages/firestore/test/unit/local/mutation_queue.test.ts index b575841305f..dc19acf05bf 100644 --- a/packages/firestore/test/unit/local/mutation_queue.test.ts +++ b/packages/firestore/test/unit/local/mutation_queue.test.ts @@ -57,11 +57,10 @@ describe('IndexedDbMutationQueue', () => { return; } - const persistencePromise: Promise< - Persistence - > = persistenceHelpers.testIndexedDbPersistence(); + let persistencePromise: Promise>; let persistence: Persistence; beforeEach(async () => { + persistencePromise = persistenceHelpers.testIndexedDbPersistence(); persistence = await persistencePromise; }); diff --git a/packages/firestore/test/unit/local/query_cache.test.ts b/packages/firestore/test/unit/local/query_cache.test.ts index 08096dd75c7..e4d714100a7 100644 --- a/packages/firestore/test/unit/local/query_cache.test.ts +++ b/packages/firestore/test/unit/local/query_cache.test.ts @@ -51,16 +51,11 @@ describe('IndexedDbQueryCache', () => { return; } - const persistencePromise: Promise< - Persistence - > = persistenceHelpers.testIndexedDbPersistence(); - let persistence: Persistence; + let persistencePromise: Promise>; beforeEach(async () => { - persistence = await persistencePromise; + persistencePromise = persistenceHelpers.testIndexedDbPersistence(); }); - afterEach(() => persistence.shutdown(/* deleteData= */ true)); - genericQueryCacheTests(() => persistencePromise); }); @@ -104,7 +99,11 @@ function genericQueryCacheTests( beforeEach(async () => { persistence = await persistencePromise(); cache = new TestQueryCache(persistence, persistence.getQueryCache()); - //await cache.start(); + await cache.start(); + }); + + afterEach(async () => { + persistence.shutdown(/* deletaData */ true); }); it('returns null for query not in cache', () => { @@ -322,7 +321,7 @@ function genericQueryCacheTests( persistence, persistence.getQueryCache() ); - //await otherCache.start(); + await otherCache.start(); expect(otherCache.getHighestTargetId()).to.deep.equal(42); }); @@ -343,14 +342,11 @@ function genericQueryCacheTests( persistence, persistence.getQueryCache() ); - expect(otherCache.getLastRemoteSnapshotVersion()).to.deep.equal( - version(42) - ); - /*return otherCache.start().then(() => { + return otherCache.start().then(() => { expect(otherCache.getLastRemoteSnapshotVersion()).to.deep.equal( version(42) ); - });*/ + }); }); }); } diff --git a/packages/firestore/test/unit/local/remote_document_cache.test.ts b/packages/firestore/test/unit/local/remote_document_cache.test.ts index 1708d62350f..51b410bb363 100644 --- a/packages/firestore/test/unit/local/remote_document_cache.test.ts +++ b/packages/firestore/test/unit/local/remote_document_cache.test.ts @@ -40,17 +40,7 @@ describe('IndexedDbRemoteDocumentCache', () => { return; } - const persistencePromise: Promise< - Persistence - > = persistenceHelpers.testIndexedDbPersistence(); - let persistence: Persistence; - beforeEach(async () => { - persistence = await persistencePromise; - }); - - afterEach(() => persistence.shutdown(/* deleteData= */ true)); - - genericRemoteDocumentCacheTests(() => persistencePromise); + genericRemoteDocumentCacheTests(persistenceHelpers.testIndexedDbPersistence); }); /** @@ -88,6 +78,8 @@ function genericRemoteDocumentCacheTests< ); }); + afterEach(() => persistence.shutdown(/* deleteData= */ true)); + it('returns null for document not in cache', () => { return cache.getEntry(key(DOC_PATH)).then(doc => { expect(doc).to.equal(null); diff --git a/packages/firestore/test/unit/local/test_query_cache.ts b/packages/firestore/test/unit/local/test_query_cache.ts index 767b31a369b..2105c89208a 100644 --- a/packages/firestore/test/unit/local/test_query_cache.ts +++ b/packages/firestore/test/unit/local/test_query_cache.ts @@ -36,11 +36,11 @@ export class TestQueryCache { public cache: QueryCache ) {} - /*start(): Promise { + start(): Promise { return this.persistence.runTransaction('start', txn => this.cache.start(txn) ); - }*/ + } addQueryData(queryData: QueryData): Promise { return this.persistence.runTransaction('addQueryData', txn => { diff --git a/packages/firestore/test/unit/remote/node/serializer.test.ts b/packages/firestore/test/unit/remote/node/serializer.test.ts index abd5c373721..b4d5bd025a5 100644 --- a/packages/firestore/test/unit/remote/node/serializer.test.ts +++ b/packages/firestore/test/unit/remote/node/serializer.test.ts @@ -88,7 +88,7 @@ describe('Serializer', () => { function wrapQueryData(query: Query): QueryData { return new QueryData( query, - 1, // arbitrary target id + 1, QueryPurpose.Listen, SnapshotVersion.MIN, emptyResumeToken From e7efc7b4450a24236f3911da06e75d815a243fdc Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Wed, 25 Jul 2018 13:56:05 -0700 Subject: [PATCH 07/25] [AUTOMATED]: Prettier Code Styling --- packages/firestore/src/local/local_store.ts | 4 +--- packages/firestore/src/local/memory_persistence.ts | 2 +- packages/firestore/src/local/query_data.ts | 4 ++-- packages/firestore/src/local/simple_db.ts | 10 ++-------- 4 files changed, 6 insertions(+), 14 deletions(-) diff --git a/packages/firestore/src/local/local_store.ts b/packages/firestore/src/local/local_store.ts index 4c6e424fee4..5e26e567336 100644 --- a/packages/firestore/src/local/local_store.ts +++ b/packages/firestore/src/local/local_store.ts @@ -230,9 +230,7 @@ export class LocalStore { }); } - private startQueryCache( - txn: TransactionType - ): PersistencePromise { + private startQueryCache(txn: TransactionType): PersistencePromise { return this.queryCache.start(txn).next(() => { const targetId = this.queryCache.getHighestTargetId(); this.targetIdGenerator = TargetIdGenerator.forLocalStore(targetId); diff --git a/packages/firestore/src/local/memory_persistence.ts b/packages/firestore/src/local/memory_persistence.ts index ab5f5500175..e87e635f20e 100644 --- a/packages/firestore/src/local/memory_persistence.ts +++ b/packages/firestore/src/local/memory_persistence.ts @@ -90,7 +90,7 @@ export class MemoryPersistence } } -/** +/** * Memory persistence is not actually transactional, but future implementations * may have transaction-scoped state. */ diff --git a/packages/firestore/src/local/query_data.ts b/packages/firestore/src/local/query_data.ts index e45f28f8e77..e5f7f3fdbd0 100644 --- a/packages/firestore/src/local/query_data.ts +++ b/packages/firestore/src/local/query_data.ts @@ -70,10 +70,10 @@ export class QueryData { this.query, this.targetId, this.purpose, - overwrite.snapshotVersion === undefined + overwrite.snapshotVersion === undefined ? this.snapshotVersion : overwrite.snapshotVersion, - overwrite.resumeToken === undefined + overwrite.resumeToken === undefined ? this.resumeToken : overwrite.resumeToken ); diff --git a/packages/firestore/src/local/simple_db.ts b/packages/firestore/src/local/simple_db.ts index a0c21c5819d..38256d46ba0 100644 --- a/packages/firestore/src/local/simple_db.ts +++ b/packages/firestore/src/local/simple_db.ts @@ -535,18 +535,12 @@ export class SimpleDbStore { if (options.index) { const index = this.store.index(options.index); if (options.keysOnly) { - return index.openKeyCursor( - options.range, - direction - ); + return index.openKeyCursor(options.range, direction); } else { return index.openCursor(options.range, direction); } } else { - return this.store.openCursor( - options.range, - direction - ); + return this.store.openCursor(options.range, direction); } } } From fd1359a7077931e0749f6360ef7a19b3eec1dfb3 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Wed, 25 Jul 2018 14:46:52 -0700 Subject: [PATCH 08/25] Fix lint --- packages/firestore/src/local/simple_db.ts | 2 +- .../firestore/test/unit/local/remote_document_cache.test.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/firestore/src/local/simple_db.ts b/packages/firestore/src/local/simple_db.ts index 38256d46ba0..3074ea94686 100644 --- a/packages/firestore/src/local/simple_db.ts +++ b/packages/firestore/src/local/simple_db.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { assert, fail } from '../util/assert'; +import { assert } from '../util/assert'; import { debug } from '../util/log'; import { AnyDuringMigration } from '../util/misc'; import { PersistencePromise } from './persistence_promise'; diff --git a/packages/firestore/test/unit/local/remote_document_cache.test.ts b/packages/firestore/test/unit/local/remote_document_cache.test.ts index 51b410bb363..5fe53b49faa 100644 --- a/packages/firestore/test/unit/local/remote_document_cache.test.ts +++ b/packages/firestore/test/unit/local/remote_document_cache.test.ts @@ -17,8 +17,7 @@ import { expect } from 'chai'; import { Query } from '../../../src/core/query'; import { - IndexedDbPersistence, - IndexedDbTransaction + IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; import { Persistence, From 9a7642294db9e7de20f58dbc950aa1a12235cc5c Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Wed, 25 Jul 2018 14:47:20 -0700 Subject: [PATCH 09/25] [AUTOMATED]: Prettier Code Styling --- .../firestore/test/unit/local/remote_document_cache.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/firestore/test/unit/local/remote_document_cache.test.ts b/packages/firestore/test/unit/local/remote_document_cache.test.ts index 5fe53b49faa..9086555a869 100644 --- a/packages/firestore/test/unit/local/remote_document_cache.test.ts +++ b/packages/firestore/test/unit/local/remote_document_cache.test.ts @@ -16,9 +16,7 @@ import { expect } from 'chai'; import { Query } from '../../../src/core/query'; -import { - IndexedDbPersistence -} from '../../../src/local/indexeddb_persistence'; +import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; import { Persistence, PersistenceTransaction From 3abdbbef069f16862600e708d7cbfb53c04c6b70 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Wed, 25 Jul 2018 15:14:59 -0700 Subject: [PATCH 10/25] Uncomment line --- packages/firestore/src/local/indexeddb_persistence.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firestore/src/local/indexeddb_persistence.ts b/packages/firestore/src/local/indexeddb_persistence.ts index b92b917decf..15a8e281321 100644 --- a/packages/firestore/src/local/indexeddb_persistence.ts +++ b/packages/firestore/src/local/indexeddb_persistence.ts @@ -410,7 +410,7 @@ export class IndexedDbPersistence implements Persistence { return zombiedOwnerId; } catch (e) { // Gracefully handle if LocalStorage isn't available / working. - //log.error('Failed to get zombie owner id.', e); + log.error('Failed to get zombie owner id.', e); return null; } } From a2848ff0e41a546d08f61d630bd8f62dac23f159 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Thu, 26 Jul 2018 09:48:25 -0700 Subject: [PATCH 11/25] MemoryPersistenceTransaction -> MemoryTransaction --- .../src/local/memory_mutation_queue.ts | 38 +++++++++---------- .../firestore/src/local/memory_persistence.ts | 16 ++++---- .../firestore/src/local/memory_query_cache.ts | 26 ++++++------- .../src/local/memory_remote_document_cache.ts | 12 +++--- .../test/unit/specs/spec_test_runner.ts | 4 +- 5 files changed, 48 insertions(+), 48 deletions(-) diff --git a/packages/firestore/src/local/memory_mutation_queue.ts b/packages/firestore/src/local/memory_mutation_queue.ts index fd4ca99f583..f2a985d437d 100644 --- a/packages/firestore/src/local/memory_mutation_queue.ts +++ b/packages/firestore/src/local/memory_mutation_queue.ts @@ -29,10 +29,10 @@ import { GarbageCollector } from './garbage_collector'; import { MutationQueue } from './mutation_queue'; import { PersistencePromise } from './persistence_promise'; import { DocReference } from './reference_set'; -import { MemoryPersistenceTransaction } from './memory_persistence'; +import { MemoryTransaction } from './memory_persistence'; export class MemoryMutationQueue - implements MutationQueue { + implements MutationQueue { /** * The set of all mutations that have been sent but not yet been applied to * the backend. @@ -57,7 +57,7 @@ export class MemoryMutationQueue /** An ordered mapping between documents and the mutations batch IDs. */ private batchesByDocumentKey = new SortedSet(DocReference.compareByKey); - start(transaction: MemoryPersistenceTransaction): PersistencePromise { + start(transaction: MemoryTransaction): PersistencePromise { // NOTE: The queue may be shutdown / started multiple times, since we // maintain the queue for the duration of the app session in case a user // logs out / back in. To behave like the LevelDB-backed MutationQueue (and @@ -75,25 +75,25 @@ export class MemoryMutationQueue } checkEmpty( - transaction: MemoryPersistenceTransaction + transaction: MemoryTransaction ): PersistencePromise { return PersistencePromise.resolve(this.mutationQueue.length === 0); } getNextBatchId( - transaction: MemoryPersistenceTransaction + transaction: MemoryTransaction ): PersistencePromise { return PersistencePromise.resolve(this.nextBatchId); } getHighestAcknowledgedBatchId( - transaction: MemoryPersistenceTransaction + transaction: MemoryTransaction ): PersistencePromise { return PersistencePromise.resolve(this.highestAcknowledgedBatchId); } acknowledgeBatch( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, batch: MutationBatch, streamToken: ProtoByteString ): PersistencePromise { @@ -125,13 +125,13 @@ export class MemoryMutationQueue } getLastStreamToken( - transaction: MemoryPersistenceTransaction + transaction: MemoryTransaction ): PersistencePromise { return PersistencePromise.resolve(this.lastStreamToken); } setLastStreamToken( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, streamToken: ProtoByteString ): PersistencePromise { this.lastStreamToken = streamToken; @@ -139,7 +139,7 @@ export class MemoryMutationQueue } addMutationBatch( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, localWriteTime: Timestamp, mutations: Mutation[] ): PersistencePromise { @@ -170,14 +170,14 @@ export class MemoryMutationQueue } lookupMutationBatch( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, batchId: BatchId ): PersistencePromise { return PersistencePromise.resolve(this.findMutationBatch(batchId)); } getNextMutationBatchAfterBatchId( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, batchId: BatchId ): PersistencePromise { const size = this.mutationQueue.length; @@ -203,7 +203,7 @@ export class MemoryMutationQueue } getAllMutationBatches( - transaction: MemoryPersistenceTransaction + transaction: MemoryTransaction ): PersistencePromise { return PersistencePromise.resolve( this.getAllLiveMutationBatchesBeforeIndex(this.mutationQueue.length) @@ -211,7 +211,7 @@ export class MemoryMutationQueue } getAllMutationBatchesThroughBatchId( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, batchId: BatchId ): PersistencePromise { const count = this.mutationQueue.length; @@ -233,7 +233,7 @@ export class MemoryMutationQueue } getAllMutationBatchesAffectingDocumentKey( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, documentKey: DocumentKey ): PersistencePromise { const start = new DocReference(documentKey, 0); @@ -256,7 +256,7 @@ export class MemoryMutationQueue } getAllMutationBatchesAffectingQuery( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, query: Query ): PersistencePromise { // Use the query path as a prefix for testing if a document matches the @@ -309,7 +309,7 @@ export class MemoryMutationQueue } removeMutationBatches( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, batches: MutationBatch[] ): PersistencePromise { const batchCount = batches.length; @@ -385,7 +385,7 @@ export class MemoryMutationQueue } containsKey( - txn: MemoryPersistenceTransaction, + txn: MemoryTransaction, key: DocumentKey ): PersistencePromise { const ref = new DocReference(key, 0); @@ -394,7 +394,7 @@ export class MemoryMutationQueue } performConsistencyCheck( - txn: MemoryPersistenceTransaction + txn: MemoryTransaction ): PersistencePromise { if (this.mutationQueue.length === 0) { assert( diff --git a/packages/firestore/src/local/memory_persistence.ts b/packages/firestore/src/local/memory_persistence.ts index 3836ece8b44..17207a53448 100644 --- a/packages/firestore/src/local/memory_persistence.ts +++ b/packages/firestore/src/local/memory_persistence.ts @@ -34,7 +34,7 @@ const LOG_TAG = 'MemoryPersistence'; * not persisted across sessions. */ export class MemoryPersistence - implements Persistence { + implements Persistence { /** * Note that these are retained here to make it easier to write tests * affecting both the in-memory and IndexedDB-backed persistence layers. Tests @@ -43,7 +43,7 @@ export class MemoryPersistence * persisting values. */ private mutationQueues: { - [user: string]: MutationQueue; + [user: string]: MutationQueue; } = {}; private remoteDocumentCache = new MemoryRemoteDocumentCache(); private queryCache = new MemoryQueryCache(); @@ -66,7 +66,7 @@ export class MemoryPersistence return this._started; } - getMutationQueue(user: User): MutationQueue { + getMutationQueue(user: User): MutationQueue { let queue = this.mutationQueues[user.toKey()]; if (!queue) { queue = new MemoryMutationQueue(); @@ -75,22 +75,22 @@ export class MemoryPersistence return queue; } - getQueryCache(): QueryCache { + getQueryCache(): QueryCache { return this.queryCache; } - getRemoteDocumentCache(): RemoteDocumentCache { + getRemoteDocumentCache(): RemoteDocumentCache { return this.remoteDocumentCache; } runTransaction( action: string, operation: ( - transaction: MemoryPersistenceTransaction + transaction: MemoryTransaction ) => PersistencePromise ): Promise { debug(LOG_TAG, 'Starting transaction:', action); - return operation(new MemoryPersistenceTransaction()).toPromise(); + return operation(new MemoryTransaction()).toPromise(); } } @@ -98,4 +98,4 @@ export class MemoryPersistence * Memory persistence is not actually transactional, but future implementations * may have transaction-scoped state. */ -export class MemoryPersistenceTransaction implements PersistenceTransaction {} +export class MemoryTransaction implements PersistenceTransaction {} diff --git a/packages/firestore/src/local/memory_query_cache.ts b/packages/firestore/src/local/memory_query_cache.ts index 7203ecafb9b..d7a7771d1f1 100644 --- a/packages/firestore/src/local/memory_query_cache.ts +++ b/packages/firestore/src/local/memory_query_cache.ts @@ -27,10 +27,10 @@ import { QueryCache } from './query_cache'; import { QueryData } from './query_data'; import { ReferenceSet } from './reference_set'; import { assert } from '../util/assert'; -import { MemoryPersistenceTransaction } from './memory_persistence'; +import { MemoryTransaction } from './memory_persistence'; export class MemoryQueryCache - implements QueryCache { + implements QueryCache { /** * Maps a query to the data about that query */ @@ -48,7 +48,7 @@ export class MemoryQueryCache private targetCount = 0; - start(transaction: MemoryPersistenceTransaction): PersistencePromise { + start(transaction: MemoryTransaction): PersistencePromise { // Nothing to do. return PersistencePromise.resolve(); } @@ -62,7 +62,7 @@ export class MemoryQueryCache } setLastRemoteSnapshotVersion( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, snapshotVersion: SnapshotVersion ): PersistencePromise { this.lastRemoteSnapshotVersion = snapshotVersion; @@ -79,7 +79,7 @@ export class MemoryQueryCache } addQueryData( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, queryData: QueryData ): PersistencePromise { assert( @@ -92,7 +92,7 @@ export class MemoryQueryCache } updateQueryData( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, queryData: QueryData ): PersistencePromise { assert(this.queries.has(queryData.query), 'Updating a non-existent query'); @@ -101,7 +101,7 @@ export class MemoryQueryCache } removeQueryData( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, queryData: QueryData ): PersistencePromise { assert(this.targetCount > 0, 'Removing a target from an empty cache'); @@ -120,7 +120,7 @@ export class MemoryQueryCache } getQueryData( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, query: Query ): PersistencePromise { const queryData = this.queries.get(query) || null; @@ -128,7 +128,7 @@ export class MemoryQueryCache } addMatchingKeys( - txn: MemoryPersistenceTransaction, + txn: MemoryTransaction, keys: DocumentKeySet, targetId: TargetId ): PersistencePromise { @@ -137,7 +137,7 @@ export class MemoryQueryCache } removeMatchingKeys( - txn: MemoryPersistenceTransaction, + txn: MemoryTransaction, keys: DocumentKeySet, targetId: TargetId ): PersistencePromise { @@ -146,7 +146,7 @@ export class MemoryQueryCache } removeMatchingKeysForTargetId( - txn: MemoryPersistenceTransaction, + txn: MemoryTransaction, targetId: TargetId ): PersistencePromise { this.references.removeReferencesForId(targetId); @@ -154,7 +154,7 @@ export class MemoryQueryCache } getMatchingKeysForTargetId( - txn: MemoryPersistenceTransaction, + txn: MemoryTransaction, targetId: TargetId ): PersistencePromise { const matchingKeys = this.references.referencesForId(targetId); @@ -166,7 +166,7 @@ export class MemoryQueryCache } containsKey( - txn: MemoryPersistenceTransaction | null, + txn: MemoryTransaction | null, key: DocumentKey ): PersistencePromise { return this.references.containsKey(txn, key); diff --git a/packages/firestore/src/local/memory_remote_document_cache.ts b/packages/firestore/src/local/memory_remote_document_cache.ts index f28df24a753..083700fe0fd 100644 --- a/packages/firestore/src/local/memory_remote_document_cache.ts +++ b/packages/firestore/src/local/memory_remote_document_cache.ts @@ -24,14 +24,14 @@ import { Document, MaybeDocument } from '../model/document'; import { DocumentKey } from '../model/document_key'; import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; -import { MemoryPersistenceTransaction } from './memory_persistence'; +import { MemoryTransaction } from './memory_persistence'; export class MemoryRemoteDocumentCache - implements RemoteDocumentCache { + implements RemoteDocumentCache { private docs = maybeDocumentMap(); addEntry( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, maybeDocument: MaybeDocument ): PersistencePromise { this.docs = this.docs.insert(maybeDocument.key, maybeDocument); @@ -39,7 +39,7 @@ export class MemoryRemoteDocumentCache } removeEntry( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, documentKey: DocumentKey ): PersistencePromise { this.docs = this.docs.remove(documentKey); @@ -47,14 +47,14 @@ export class MemoryRemoteDocumentCache } getEntry( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, documentKey: DocumentKey ): PersistencePromise { return PersistencePromise.resolve(this.docs.get(documentKey)); } getDocumentsMatchingQuery( - transaction: MemoryPersistenceTransaction, + transaction: MemoryTransaction, query: Query ): PersistencePromise { let results = documentMap(); diff --git a/packages/firestore/test/unit/specs/spec_test_runner.ts b/packages/firestore/test/unit/specs/spec_test_runner.ts index ebc092d8f1a..a2626beeaf2 100644 --- a/packages/firestore/test/unit/specs/spec_test_runner.ts +++ b/packages/firestore/test/unit/specs/spec_test_runner.ts @@ -46,7 +46,7 @@ import { import { LocalStore } from '../../../src/local/local_store'; import { MemoryPersistence, - MemoryPersistenceTransaction + MemoryTransaction } from '../../../src/local/memory_persistence'; import { NoOpGarbageCollector } from '../../../src/local/no_op_garbage_collector'; import { @@ -998,7 +998,7 @@ abstract class TestRunner { } } -class MemoryTestRunner extends TestRunner { +class MemoryTestRunner extends TestRunner { protected getPersistence(serializer: JsonProtoSerializer): MemoryPersistence { return new MemoryPersistence(); } From 70e8e51879326a4ade368af21f757a522406af8c Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Thu, 26 Jul 2018 09:48:55 -0700 Subject: [PATCH 12/25] [AUTOMATED]: Prettier Code Styling --- .../firestore/src/local/memory_mutation_queue.ts | 15 ++++----------- .../firestore/src/local/memory_persistence.ts | 7 ++----- .../firestore/src/local/memory_query_cache.ts | 3 +-- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/packages/firestore/src/local/memory_mutation_queue.ts b/packages/firestore/src/local/memory_mutation_queue.ts index f2a985d437d..908bf53fc81 100644 --- a/packages/firestore/src/local/memory_mutation_queue.ts +++ b/packages/firestore/src/local/memory_mutation_queue.ts @@ -31,8 +31,7 @@ import { PersistencePromise } from './persistence_promise'; import { DocReference } from './reference_set'; import { MemoryTransaction } from './memory_persistence'; -export class MemoryMutationQueue - implements MutationQueue { +export class MemoryMutationQueue implements MutationQueue { /** * The set of all mutations that have been sent but not yet been applied to * the backend. @@ -74,15 +73,11 @@ export class MemoryMutationQueue return PersistencePromise.resolve(); } - checkEmpty( - transaction: MemoryTransaction - ): PersistencePromise { + checkEmpty(transaction: MemoryTransaction): PersistencePromise { return PersistencePromise.resolve(this.mutationQueue.length === 0); } - getNextBatchId( - transaction: MemoryTransaction - ): PersistencePromise { + getNextBatchId(transaction: MemoryTransaction): PersistencePromise { return PersistencePromise.resolve(this.nextBatchId); } @@ -393,9 +388,7 @@ export class MemoryMutationQueue return PersistencePromise.resolve(key.isEqual(firstRef && firstRef.key)); } - performConsistencyCheck( - txn: MemoryTransaction - ): PersistencePromise { + performConsistencyCheck(txn: MemoryTransaction): PersistencePromise { if (this.mutationQueue.length === 0) { assert( this.batchesByDocumentKey.isEmpty(), diff --git a/packages/firestore/src/local/memory_persistence.ts b/packages/firestore/src/local/memory_persistence.ts index 17207a53448..bb74a72c3ae 100644 --- a/packages/firestore/src/local/memory_persistence.ts +++ b/packages/firestore/src/local/memory_persistence.ts @@ -33,8 +33,7 @@ const LOG_TAG = 'MemoryPersistence'; * A memory-backed instance of Persistence. Data is stored only in RAM and * not persisted across sessions. */ -export class MemoryPersistence - implements Persistence { +export class MemoryPersistence implements Persistence { /** * Note that these are retained here to make it easier to write tests * affecting both the in-memory and IndexedDB-backed persistence layers. Tests @@ -85,9 +84,7 @@ export class MemoryPersistence runTransaction( action: string, - operation: ( - transaction: MemoryTransaction - ) => PersistencePromise + operation: (transaction: MemoryTransaction) => PersistencePromise ): Promise { debug(LOG_TAG, 'Starting transaction:', action); return operation(new MemoryTransaction()).toPromise(); diff --git a/packages/firestore/src/local/memory_query_cache.ts b/packages/firestore/src/local/memory_query_cache.ts index d7a7771d1f1..de6cee094a4 100644 --- a/packages/firestore/src/local/memory_query_cache.ts +++ b/packages/firestore/src/local/memory_query_cache.ts @@ -29,8 +29,7 @@ import { ReferenceSet } from './reference_set'; import { assert } from '../util/assert'; import { MemoryTransaction } from './memory_persistence'; -export class MemoryQueryCache - implements QueryCache { +export class MemoryQueryCache implements QueryCache { /** * Maps a query to the data about that query */ From ca4bc5dab118a4c3bdbb0c9ae676af5940a1597e Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Fri, 27 Jul 2018 16:12:14 -0700 Subject: [PATCH 13/25] Review updates --- .../firestore/src/core/firestore_client.ts | 4 +- packages/firestore/src/core/sync_engine.ts | 2 +- .../src/local/indexeddb_mutation_queue.ts | 52 +++++++++---------- .../src/local/indexeddb_persistence.ts | 16 +++--- .../src/local/indexeddb_query_cache.ts | 51 +++++++++--------- .../local/indexeddb_remote_document_cache.ts | 16 +++--- .../src/local/local_documents_view.ts | 22 ++++---- packages/firestore/src/local/local_store.ts | 32 ++++++------ .../src/local/memory_mutation_queue.ts | 38 +++++++------- .../firestore/src/local/memory_persistence.ts | 12 ++--- .../firestore/src/local/memory_query_cache.ts | 26 +++++----- .../src/local/memory_remote_document_cache.ts | 13 +++-- .../firestore/src/local/mutation_queue.ts | 35 ++++++------- packages/firestore/src/local/persistence.ts | 13 +++-- packages/firestore/src/local/query_cache.ts | 9 ++-- .../src/local/remote_document_cache.ts | 12 ++--- .../local/remote_document_change_buffer.ts | 10 ++-- packages/firestore/src/remote/remote_store.ts | 2 +- .../test/unit/local/local_store.test.ts | 8 +-- .../test/unit/local/mutation_queue.test.ts | 14 ++--- .../test/unit/local/query_cache.test.ts | 10 ++-- .../unit/local/remote_document_cache.test.ts | 6 +-- .../remote_document_change_buffer.test.ts | 4 +- .../test/unit/local/test_garbage_collector.ts | 6 +-- .../test/unit/local/test_mutation_queue.ts | 6 +-- .../test/unit/local/test_query_cache.ts | 6 +-- .../unit/local/test_remote_document_cache.ts | 13 ++--- .../test_remote_document_change_buffer.ts | 13 ++--- .../test/unit/specs/spec_test_runner.ts | 29 ++++------- 29 files changed, 226 insertions(+), 254 deletions(-) diff --git a/packages/firestore/src/core/firestore_client.ts b/packages/firestore/src/core/firestore_client.ts index 9c6fa3b7f91..bd8e6c05ce9 100644 --- a/packages/firestore/src/core/firestore_client.ts +++ b/packages/firestore/src/core/firestore_client.ts @@ -78,8 +78,8 @@ export class FirestoreClient { private garbageCollector: GarbageCollector; // Note that localStore will end up with the same type parameter as // persistence because the LocalStore constructor enforces this. - private persistence: Persistence; - private localStore: LocalStore; + private persistence: Persistence; + private localStore: LocalStore; private remoteStore: RemoteStore; private syncEngine: SyncEngine; diff --git a/packages/firestore/src/core/sync_engine.ts b/packages/firestore/src/core/sync_engine.ts index 2987b856866..3607f39682c 100644 --- a/packages/firestore/src/core/sync_engine.ts +++ b/packages/firestore/src/core/sync_engine.ts @@ -143,7 +143,7 @@ export class SyncEngine implements RemoteSyncer { private targetIdGenerator = TargetIdGenerator.forSyncEngine(); constructor( - private localStore: LocalStore, + private localStore: LocalStore, private remoteStore: RemoteStore, private currentUser: User ) { diff --git a/packages/firestore/src/local/indexeddb_mutation_queue.ts b/packages/firestore/src/local/indexeddb_mutation_queue.ts index 6398607ab96..9085e3a6193 100644 --- a/packages/firestore/src/local/indexeddb_mutation_queue.ts +++ b/packages/firestore/src/local/indexeddb_mutation_queue.ts @@ -41,10 +41,10 @@ import { MutationQueue } from './mutation_queue'; import { PersistencePromise } from './persistence_promise'; import { SimpleDb, SimpleDbStore } from './simple_db'; import { IndexedDbTransaction } from './indexeddb_persistence'; +import { PersistenceTransaction } from './persistence'; /** A mutation queue for a specific user, backed by IndexedDB. */ -export class IndexedDbMutationQueue - implements MutationQueue { +export class IndexedDbMutationQueue implements MutationQueue { /** * Next value to use when assigning sequential IDs to each mutation batch. * @@ -88,7 +88,7 @@ export class IndexedDbMutationQueue return new IndexedDbMutationQueue(userId, serializer); } - start(transaction: IndexedDbTransaction): PersistencePromise { + start(transaction: PersistenceTransaction): PersistencePromise { return IndexedDbMutationQueue.loadNextBatchIdFromDb(transaction) .next(nextBatchId => { this.nextBatchId = nextBatchId; @@ -130,7 +130,7 @@ export class IndexedDbMutationQueue * are no mutations returns 0. Note that batch IDs are global. */ static loadNextBatchIdFromDb( - txn: IndexedDbTransaction + txn: PersistenceTransaction ): PersistencePromise { let maxBatchId = BATCHID_UNKNOWN; return mutationsStore(txn) @@ -153,7 +153,7 @@ export class IndexedDbMutationQueue .next(() => maxBatchId + 1); } - checkEmpty(transaction: IndexedDbTransaction): PersistencePromise { + checkEmpty(transaction: PersistenceTransaction): PersistencePromise { let empty = true; const range = IDBKeyRange.bound( this.keyForBatchId(Number.NEGATIVE_INFINITY), @@ -168,19 +168,19 @@ export class IndexedDbMutationQueue } getNextBatchId( - transaction: IndexedDbTransaction + transaction: PersistenceTransaction ): PersistencePromise { return PersistencePromise.resolve(this.nextBatchId); } getHighestAcknowledgedBatchId( - transaction: IndexedDbTransaction + transaction: PersistenceTransaction ): PersistencePromise { return PersistencePromise.resolve(this.metadata.lastAcknowledgedBatchId); } acknowledgeBatch( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, batch: MutationBatch, streamToken: ProtoByteString ): PersistencePromise { @@ -197,13 +197,13 @@ export class IndexedDbMutationQueue } getLastStreamToken( - transaction: IndexedDbTransaction + transaction: PersistenceTransaction ): PersistencePromise { return PersistencePromise.resolve(this.metadata.lastStreamToken); } setLastStreamToken( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, streamToken: ProtoByteString ): PersistencePromise { this.metadata.lastStreamToken = convertStreamToken(streamToken); @@ -211,7 +211,7 @@ export class IndexedDbMutationQueue } addMutationBatch( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, localWriteTime: Timestamp, mutations: Mutation[] ): PersistencePromise { @@ -246,7 +246,7 @@ export class IndexedDbMutationQueue } lookupMutationBatch( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, batchId: BatchId ): PersistencePromise { return mutationsStore(transaction) @@ -258,7 +258,7 @@ export class IndexedDbMutationQueue } getNextMutationBatchAfterBatchId( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, batchId: BatchId ): PersistencePromise { // All batches with batchId <= this.metadata.lastAcknowledgedBatchId have @@ -284,7 +284,7 @@ export class IndexedDbMutationQueue } getAllMutationBatches( - transaction: IndexedDbTransaction + transaction: PersistenceTransaction ): PersistencePromise { const range = IDBKeyRange.bound( this.keyForBatchId(BATCHID_UNKNOWN), @@ -298,7 +298,7 @@ export class IndexedDbMutationQueue } getAllMutationBatchesThroughBatchId( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, batchId: BatchId ): PersistencePromise { const range = IDBKeyRange.bound( @@ -313,7 +313,7 @@ export class IndexedDbMutationQueue } getAllMutationBatchesAffectingDocumentKey( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, documentKey: DocumentKey ): PersistencePromise { // Scan the document-mutation index starting with a prefix starting with @@ -364,7 +364,7 @@ export class IndexedDbMutationQueue } getAllMutationBatchesAffectingQuery( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, query: Query ): PersistencePromise { assert( @@ -440,7 +440,7 @@ export class IndexedDbMutationQueue } removeMutationBatches( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, batches: MutationBatch[] ): PersistencePromise { const txn = mutationsStore(transaction); @@ -478,7 +478,7 @@ export class IndexedDbMutationQueue return PersistencePromise.waitFor(promises); } - performConsistencyCheck(txn: IndexedDbTransaction): PersistencePromise { + performConsistencyCheck(txn: PersistenceTransaction): PersistencePromise { return this.checkEmpty(txn).next(empty => { if (!empty) { return PersistencePromise.resolve(); @@ -516,7 +516,7 @@ export class IndexedDbMutationQueue } containsKey( - txn: IndexedDbTransaction, + txn: PersistenceTransaction, key: DocumentKey ): PersistencePromise { const indexKey = DbDocumentMutation.prefixForPath(this.userId, key.path); @@ -560,10 +560,10 @@ function convertStreamToken(token: ProtoByteString): string { * Helper to get a typed SimpleDbStore for the mutations object store. */ function mutationsStore( - txn: IndexedDbTransaction + txn: PersistenceTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn.simpleDbTransaction, + (txn as IndexedDbTransaction).simpleDbTransaction, DbMutationBatch.store ); } @@ -572,10 +572,10 @@ function mutationsStore( * Helper to get a typed SimpleDbStore for the mutationQueues object store. */ function documentMutationsStore( - txn: IndexedDbTransaction + txn: PersistenceTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn.simpleDbTransaction, + (txn as IndexedDbTransaction).simpleDbTransaction, DbDocumentMutation.store ); } @@ -584,10 +584,10 @@ function documentMutationsStore( * Helper to get a typed SimpleDbStore for the mutationQueues object store. */ function mutationQueuesStore( - txn: IndexedDbTransaction + txn: PersistenceTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn.simpleDbTransaction, + (txn as IndexedDbTransaction).simpleDbTransaction, DbMutationQueue.store ); } diff --git a/packages/firestore/src/local/indexeddb_persistence.ts b/packages/firestore/src/local/indexeddb_persistence.ts index 9f849980c94..9155a85bb2e 100644 --- a/packages/firestore/src/local/indexeddb_persistence.ts +++ b/packages/firestore/src/local/indexeddb_persistence.ts @@ -34,7 +34,7 @@ import { } from './indexeddb_schema'; import { LocalSerializer } from './local_serializer'; import { MutationQueue } from './mutation_queue'; -import { Persistence } from './persistence'; +import { Persistence, PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { RemoteDocumentCache } from './remote_document_cache'; @@ -59,8 +59,10 @@ const UNSUPPORTED_PLATFORM_ERROR_MSG = ' IndexedDB or is known to have an incomplete implementation. Offline' + ' persistence has been disabled.'; -export class IndexedDbTransaction { - constructor(readonly simpleDbTransaction: SimpleDbTransaction) {} +export class IndexedDbTransaction extends PersistenceTransaction { + constructor(readonly simpleDbTransaction: SimpleDbTransaction) { + super(); + } } /** @@ -92,7 +94,7 @@ export class IndexedDbTransaction { * which acts as an indicator that another tab should go ahead and take the * owner lease immediately regardless of the current lease timestamp. */ -export class IndexedDbPersistence implements Persistence { +export class IndexedDbPersistence implements Persistence { /** * The name of the main (and currently only) IndexedDB database. this name is * appended to the prefix provided to the IndexedDbPersistence constructor. @@ -166,15 +168,15 @@ export class IndexedDbPersistence implements Persistence { return this._started; } - getMutationQueue(user: User): MutationQueue { + getMutationQueue(user: User): MutationQueue { return IndexedDbMutationQueue.forUser(user, this.serializer); } - getQueryCache(): QueryCache { + getQueryCache(): QueryCache { return new IndexedDbQueryCache(this.serializer); } - getRemoteDocumentCache(): RemoteDocumentCache { + getRemoteDocumentCache(): RemoteDocumentCache { return new IndexedDbRemoteDocumentCache(this.serializer); } diff --git a/packages/firestore/src/local/indexeddb_query_cache.ts b/packages/firestore/src/local/indexeddb_query_cache.ts index 4f8e6dc8b68..6a6df042bfc 100644 --- a/packages/firestore/src/local/indexeddb_query_cache.ts +++ b/packages/firestore/src/local/indexeddb_query_cache.ts @@ -37,10 +37,11 @@ import { LocalSerializer } from './local_serializer'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { QueryData } from './query_data'; -import { SimpleDb, SimpleDbStore, SimpleDbTransaction } from './simple_db'; +import { SimpleDb, SimpleDbStore } from './simple_db'; import { IndexedDbTransaction } from './indexeddb_persistence'; +import { PersistenceTransaction } from './persistence'; -export class IndexedDbQueryCache implements QueryCache { +export class IndexedDbQueryCache implements QueryCache { constructor(private serializer: LocalSerializer) {} /** @@ -57,8 +58,8 @@ export class IndexedDbQueryCache implements QueryCache { /** The garbage collector to notify about potential garbage keys. */ private garbageCollector: GarbageCollector | null = null; - start(transaction: IndexedDbTransaction): PersistencePromise { - return globalTargetStore(transaction.simpleDbTransaction) + start(transaction: PersistenceTransaction): PersistencePromise { + return globalTargetStore(transaction) .get(DbTargetGlobal.key) .next(metadata => { assert( @@ -83,19 +84,19 @@ export class IndexedDbQueryCache implements QueryCache { } setLastRemoteSnapshotVersion( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, snapshotVersion: SnapshotVersion ): PersistencePromise { this.lastRemoteSnapshotVersion = snapshotVersion; this.metadata.lastRemoteSnapshotVersion = snapshotVersion.toTimestamp(); - return globalTargetStore(transaction.simpleDbTransaction).put( + return globalTargetStore(transaction).put( DbTargetGlobal.key, this.metadata ); } addQueryData( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, queryData: QueryData ): PersistencePromise { return this.saveQueryData(transaction, queryData).next(() => { @@ -106,7 +107,7 @@ export class IndexedDbQueryCache implements QueryCache { } updateQueryData( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, queryData: QueryData ): PersistencePromise { return this.saveQueryData(transaction, queryData).next(() => { @@ -119,7 +120,7 @@ export class IndexedDbQueryCache implements QueryCache { } removeQueryData( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, queryData: QueryData ): PersistencePromise { assert(this.metadata.targetCount > 0, 'Removing from an empty query cache'); @@ -132,16 +133,16 @@ export class IndexedDbQueryCache implements QueryCache { } private saveMetadata( - transaction: IndexedDbTransaction + transaction: PersistenceTransaction ): PersistencePromise { - return globalTargetStore(transaction.simpleDbTransaction).put( + return globalTargetStore(transaction).put( DbTargetGlobal.key, this.metadata ); } private saveQueryData( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, queryData: QueryData ): PersistencePromise { return targetsStore(transaction).put(this.serializer.toDbTarget(queryData)); @@ -168,7 +169,7 @@ export class IndexedDbQueryCache implements QueryCache { } getQueryData( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, query: Query ): PersistencePromise { // Iterating by the canonicalId may yield more than one result because @@ -197,7 +198,7 @@ export class IndexedDbQueryCache implements QueryCache { } addMatchingKeys( - txn: IndexedDbTransaction, + txn: PersistenceTransaction, keys: DocumentKeySet, targetId: TargetId ): PersistencePromise { @@ -213,7 +214,7 @@ export class IndexedDbQueryCache implements QueryCache { } removeMatchingKeys( - txn: IndexedDbTransaction, + txn: PersistenceTransaction, keys: DocumentKeySet, targetId: TargetId ): PersistencePromise { @@ -232,7 +233,7 @@ export class IndexedDbQueryCache implements QueryCache { } removeMatchingKeysForTargetId( - txn: IndexedDbTransaction, + txn: PersistenceTransaction, targetId: TargetId ): PersistencePromise { const store = documentTargetStore(txn); @@ -248,7 +249,7 @@ export class IndexedDbQueryCache implements QueryCache { } private notifyGCForRemovedKeys( - txn: IndexedDbTransaction, + txn: PersistenceTransaction, range: IDBKeyRange ): PersistencePromise { const store = documentTargetStore(txn); @@ -272,7 +273,7 @@ export class IndexedDbQueryCache implements QueryCache { } getMatchingKeysForTargetId( - txn: IndexedDbTransaction, + txn: PersistenceTransaction, targetId: TargetId ): PersistencePromise { const range = IDBKeyRange.bound( @@ -300,7 +301,7 @@ export class IndexedDbQueryCache implements QueryCache { // TODO(gsoltis): we can let the compiler assert that txn !== null if we // drop null from the type bounds on txn. containsKey( - txn: IndexedDbTransaction | null, + txn: PersistenceTransaction | null, key: DocumentKey ): PersistencePromise { assert( @@ -335,10 +336,10 @@ export class IndexedDbQueryCache implements QueryCache { * Helper to get a typed SimpleDbStore for the queries object store. */ function targetsStore( - txn: IndexedDbTransaction + txn: PersistenceTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn.simpleDbTransaction, + (txn as IndexedDbTransaction).simpleDbTransaction, DbTarget.store ); } @@ -347,10 +348,10 @@ function targetsStore( * Helper to get a typed SimpleDbStore for the target globals object store. */ function globalTargetStore( - txn: SimpleDbTransaction + txn: PersistenceTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn, + (txn as IndexedDbTransaction).simpleDbTransaction, DbTargetGlobal.store ); } @@ -359,10 +360,10 @@ function globalTargetStore( * Helper to get a typed SimpleDbStore for the document target object store. */ function documentTargetStore( - txn: IndexedDbTransaction + txn: PersistenceTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn.simpleDbTransaction, + (txn as IndexedDbTransaction).simpleDbTransaction, DbTargetDocument.store ); } diff --git a/packages/firestore/src/local/indexeddb_remote_document_cache.ts b/packages/firestore/src/local/indexeddb_remote_document_cache.ts index 066396237d5..3bc10afb0c0 100644 --- a/packages/firestore/src/local/indexeddb_remote_document_cache.ts +++ b/packages/firestore/src/local/indexeddb_remote_document_cache.ts @@ -25,13 +25,13 @@ import { LocalSerializer } from './local_serializer'; import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; import { SimpleDb, SimpleDbStore } from './simple_db'; +import { PersistenceTransaction } from './persistence'; -export class IndexedDbRemoteDocumentCache - implements RemoteDocumentCache { +export class IndexedDbRemoteDocumentCache implements RemoteDocumentCache { constructor(private serializer: LocalSerializer) {} addEntry( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, maybeDocument: MaybeDocument ): PersistencePromise { return remoteDocumentsStore(transaction).put( @@ -41,14 +41,14 @@ export class IndexedDbRemoteDocumentCache } removeEntry( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, documentKey: DocumentKey ): PersistencePromise { return remoteDocumentsStore(transaction).delete(dbKey(documentKey)); } getEntry( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, documentKey: DocumentKey ): PersistencePromise { return remoteDocumentsStore(transaction) @@ -61,7 +61,7 @@ export class IndexedDbRemoteDocumentCache } getDocumentsMatchingQuery( - transaction: IndexedDbTransaction, + transaction: PersistenceTransaction, query: Query ): PersistencePromise { let results = documentMap(); @@ -87,10 +87,10 @@ export class IndexedDbRemoteDocumentCache * Helper to get a typed SimpleDbStore for the remoteDocuments object store. */ function remoteDocumentsStore( - txn: IndexedDbTransaction + txn: PersistenceTransaction ): SimpleDbStore { return SimpleDb.getStore( - txn.simpleDbTransaction, + (txn as IndexedDbTransaction).simpleDbTransaction, DbRemoteDocument.store ); } diff --git a/packages/firestore/src/local/local_documents_view.ts b/packages/firestore/src/local/local_documents_view.ts index 55bcf30edf5..7a37b330774 100644 --- a/packages/firestore/src/local/local_documents_view.ts +++ b/packages/firestore/src/local/local_documents_view.ts @@ -40,12 +40,10 @@ import { RemoteDocumentCache } from './remote_document_cache'; * document). The view is computed by applying the mutations in the * MutationQueue to the RemoteDocumentCache. */ -export class LocalDocumentsView< - TransactionType extends PersistenceTransaction -> { +export class LocalDocumentsView { constructor( - private remoteDocumentCache: RemoteDocumentCache, - private mutationQueue: MutationQueue + private remoteDocumentCache: RemoteDocumentCache, + private mutationQueue: MutationQueue ) {} /** @@ -55,7 +53,7 @@ export class LocalDocumentsView< * state for it. */ getDocument( - transaction: TransactionType, + transaction: PersistenceTransaction, key: DocumentKey ): PersistencePromise { return this.remoteDocumentCache @@ -72,7 +70,7 @@ export class LocalDocumentsView< * be stored for that key in the resulting set. */ getDocuments( - transaction: TransactionType, + transaction: PersistenceTransaction, keys: DocumentKeySet ): PersistencePromise { const promises = [] as Array>; @@ -93,7 +91,7 @@ export class LocalDocumentsView< /** Performs a query against the local view of all documents. */ getDocumentsMatchingQuery( - transaction: TransactionType, + transaction: PersistenceTransaction, query: Query ): PersistencePromise { if (DocumentKey.isDocumentKey(query.path)) { @@ -104,7 +102,7 @@ export class LocalDocumentsView< } private getDocumentsMatchingDocumentQuery( - transaction: TransactionType, + transaction: PersistenceTransaction, docPath: ResourcePath ): PersistencePromise { // Just do a simple document lookup. @@ -120,7 +118,7 @@ export class LocalDocumentsView< } private getDocumentsMatchingCollectionQuery( - transaction: TransactionType, + transaction: PersistenceTransaction, query: Query ): PersistencePromise { // Query the remote documents and overlay mutations. @@ -190,7 +188,7 @@ export class LocalDocumentsView< * @param document The base remote document to apply mutations to or null. */ private computeLocalDocument( - transaction: TransactionType, + transaction: PersistenceTransaction, documentKey: DocumentKey, document: MaybeDocument | null ): PersistencePromise { @@ -213,7 +211,7 @@ export class LocalDocumentsView< * @return The local view of the documents. */ private computeLocalDocuments( - transaction: TransactionType, + transaction: PersistenceTransaction, documents: DocumentMap ): PersistencePromise { const promises = [] as Array>; diff --git a/packages/firestore/src/local/local_store.ts b/packages/firestore/src/local/local_store.ts index d9fc6f0ca69..4e90348d870 100644 --- a/packages/firestore/src/local/local_store.ts +++ b/packages/firestore/src/local/local_store.ts @@ -110,21 +110,21 @@ export interface LocalWriteResult { * (unexpected) failure (e.g. failed assert) and always represent an * unrecoverable error (should be caught / reported by the async_queue). */ -export class LocalStore { +export class LocalStore { /** * The set of all mutations that have been sent but not yet been applied to * the backend. */ - private mutationQueue: MutationQueue; + private mutationQueue: MutationQueue; /** The set of all cached remote documents. */ - private remoteDocuments: RemoteDocumentCache; + private remoteDocuments: RemoteDocumentCache; /** * The "local" view of all documents (layering mutationQueue on top of * remoteDocumentCache). */ - private localDocuments: LocalDocumentsView; + private localDocuments: LocalDocumentsView; /** * The set of document references maintained by any local views. @@ -132,7 +132,7 @@ export class LocalStore { private localViewReferences = new ReferenceSet(); /** Maps a query to the data about that query. */ - private queryCache: QueryCache; + private queryCache: QueryCache; /** Maps a targetID to data about its query. */ private targetIds = {} as { [targetId: number]: QueryData }; @@ -154,7 +154,7 @@ export class LocalStore { constructor( /** Manages our in-memory or durable persistence. */ - private persistence: Persistence, + private persistence: Persistence, initialUser: User, /** * The garbage collector collects documents that should no longer be @@ -234,14 +234,14 @@ export class LocalStore { }); } - private startQueryCache(txn: TransactionType): PersistencePromise { + private startQueryCache(txn: PersistenceTransaction): PersistencePromise { return this.queryCache.start(txn).next(() => { const targetId = this.queryCache.getHighestTargetId(); this.targetIdGenerator = TargetIdGenerator.forLocalStore(targetId); }); } - private startMutationQueue(txn: TransactionType): PersistencePromise { + private startMutationQueue(txn: PersistenceTransaction): PersistencePromise { return this.mutationQueue .start(txn) .next(() => { @@ -714,8 +714,8 @@ export class LocalStore { } private releaseHeldBatchResults( - txn: TransactionType, - documentBuffer: RemoteDocumentChangeBuffer + txn: PersistenceTransaction, + documentBuffer: RemoteDocumentChangeBuffer ): PersistencePromise { const toRelease: MutationBatchResult[] = []; for (const batchResult of this.heldBatchResults) { @@ -751,9 +751,9 @@ export class LocalStore { } private releaseBatchResults( - txn: TransactionType, + txn: PersistenceTransaction, batchResults: MutationBatchResult[], - documentBuffer: RemoteDocumentChangeBuffer + documentBuffer: RemoteDocumentChangeBuffer ): PersistencePromise { let promiseChain = PersistencePromise.resolve(); for (const batchResult of batchResults) { @@ -770,7 +770,7 @@ export class LocalStore { } private removeMutationBatch( - txn: TransactionType, + txn: PersistenceTransaction, batch: MutationBatch ): PersistencePromise { return this.removeMutationBatches(txn, [batch]); @@ -778,7 +778,7 @@ export class LocalStore { /** Removes all the mutation batches named in the given array. */ private removeMutationBatches( - txn: TransactionType, + txn: PersistenceTransaction, batches: MutationBatch[] ): PersistencePromise { let affectedDocs = documentKeySet(); @@ -795,9 +795,9 @@ export class LocalStore { } private applyWriteToRemoteDocuments( - txn: TransactionType, + txn: PersistenceTransaction, batchResult: MutationBatchResult, - documentBuffer: RemoteDocumentChangeBuffer + documentBuffer: RemoteDocumentChangeBuffer ): PersistencePromise { const batch = batchResult.batch; const docKeys = batch.keys(); diff --git a/packages/firestore/src/local/memory_mutation_queue.ts b/packages/firestore/src/local/memory_mutation_queue.ts index 908bf53fc81..dcae92c0f22 100644 --- a/packages/firestore/src/local/memory_mutation_queue.ts +++ b/packages/firestore/src/local/memory_mutation_queue.ts @@ -29,9 +29,9 @@ import { GarbageCollector } from './garbage_collector'; import { MutationQueue } from './mutation_queue'; import { PersistencePromise } from './persistence_promise'; import { DocReference } from './reference_set'; -import { MemoryTransaction } from './memory_persistence'; +import { PersistenceTransaction } from './persistence'; -export class MemoryMutationQueue implements MutationQueue { +export class MemoryMutationQueue implements MutationQueue { /** * The set of all mutations that have been sent but not yet been applied to * the backend. @@ -56,7 +56,7 @@ export class MemoryMutationQueue implements MutationQueue { /** An ordered mapping between documents and the mutations batch IDs. */ private batchesByDocumentKey = new SortedSet(DocReference.compareByKey); - start(transaction: MemoryTransaction): PersistencePromise { + start(transaction: PersistenceTransaction): PersistencePromise { // NOTE: The queue may be shutdown / started multiple times, since we // maintain the queue for the duration of the app session in case a user // logs out / back in. To behave like the LevelDB-backed MutationQueue (and @@ -73,22 +73,22 @@ export class MemoryMutationQueue implements MutationQueue { return PersistencePromise.resolve(); } - checkEmpty(transaction: MemoryTransaction): PersistencePromise { + checkEmpty(transaction: PersistenceTransaction): PersistencePromise { return PersistencePromise.resolve(this.mutationQueue.length === 0); } - getNextBatchId(transaction: MemoryTransaction): PersistencePromise { + getNextBatchId(transaction: PersistenceTransaction): PersistencePromise { return PersistencePromise.resolve(this.nextBatchId); } getHighestAcknowledgedBatchId( - transaction: MemoryTransaction + transaction: PersistenceTransaction ): PersistencePromise { return PersistencePromise.resolve(this.highestAcknowledgedBatchId); } acknowledgeBatch( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, batch: MutationBatch, streamToken: ProtoByteString ): PersistencePromise { @@ -120,13 +120,13 @@ export class MemoryMutationQueue implements MutationQueue { } getLastStreamToken( - transaction: MemoryTransaction + transaction: PersistenceTransaction ): PersistencePromise { return PersistencePromise.resolve(this.lastStreamToken); } setLastStreamToken( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, streamToken: ProtoByteString ): PersistencePromise { this.lastStreamToken = streamToken; @@ -134,7 +134,7 @@ export class MemoryMutationQueue implements MutationQueue { } addMutationBatch( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, localWriteTime: Timestamp, mutations: Mutation[] ): PersistencePromise { @@ -165,14 +165,14 @@ export class MemoryMutationQueue implements MutationQueue { } lookupMutationBatch( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, batchId: BatchId ): PersistencePromise { return PersistencePromise.resolve(this.findMutationBatch(batchId)); } getNextMutationBatchAfterBatchId( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, batchId: BatchId ): PersistencePromise { const size = this.mutationQueue.length; @@ -198,7 +198,7 @@ export class MemoryMutationQueue implements MutationQueue { } getAllMutationBatches( - transaction: MemoryTransaction + transaction: PersistenceTransaction ): PersistencePromise { return PersistencePromise.resolve( this.getAllLiveMutationBatchesBeforeIndex(this.mutationQueue.length) @@ -206,7 +206,7 @@ export class MemoryMutationQueue implements MutationQueue { } getAllMutationBatchesThroughBatchId( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, batchId: BatchId ): PersistencePromise { const count = this.mutationQueue.length; @@ -228,7 +228,7 @@ export class MemoryMutationQueue implements MutationQueue { } getAllMutationBatchesAffectingDocumentKey( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, documentKey: DocumentKey ): PersistencePromise { const start = new DocReference(documentKey, 0); @@ -251,7 +251,7 @@ export class MemoryMutationQueue implements MutationQueue { } getAllMutationBatchesAffectingQuery( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, query: Query ): PersistencePromise { // Use the query path as a prefix for testing if a document matches the @@ -304,7 +304,7 @@ export class MemoryMutationQueue implements MutationQueue { } removeMutationBatches( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, batches: MutationBatch[] ): PersistencePromise { const batchCount = batches.length; @@ -380,7 +380,7 @@ export class MemoryMutationQueue implements MutationQueue { } containsKey( - txn: MemoryTransaction, + txn: PersistenceTransaction, key: DocumentKey ): PersistencePromise { const ref = new DocReference(key, 0); @@ -388,7 +388,7 @@ export class MemoryMutationQueue implements MutationQueue { return PersistencePromise.resolve(key.isEqual(firstRef && firstRef.key)); } - performConsistencyCheck(txn: MemoryTransaction): PersistencePromise { + performConsistencyCheck(txn: PersistenceTransaction): PersistencePromise { if (this.mutationQueue.length === 0) { assert( this.batchesByDocumentKey.isEmpty(), diff --git a/packages/firestore/src/local/memory_persistence.ts b/packages/firestore/src/local/memory_persistence.ts index bb74a72c3ae..f0acbaf4a8f 100644 --- a/packages/firestore/src/local/memory_persistence.ts +++ b/packages/firestore/src/local/memory_persistence.ts @@ -33,7 +33,7 @@ const LOG_TAG = 'MemoryPersistence'; * A memory-backed instance of Persistence. Data is stored only in RAM and * not persisted across sessions. */ -export class MemoryPersistence implements Persistence { +export class MemoryPersistence implements Persistence { /** * Note that these are retained here to make it easier to write tests * affecting both the in-memory and IndexedDB-backed persistence layers. Tests @@ -42,7 +42,7 @@ export class MemoryPersistence implements Persistence { * persisting values. */ private mutationQueues: { - [user: string]: MutationQueue; + [user: string]: MutationQueue; } = {}; private remoteDocumentCache = new MemoryRemoteDocumentCache(); private queryCache = new MemoryQueryCache(); @@ -65,7 +65,7 @@ export class MemoryPersistence implements Persistence { return this._started; } - getMutationQueue(user: User): MutationQueue { + getMutationQueue(user: User): MutationQueue { let queue = this.mutationQueues[user.toKey()]; if (!queue) { queue = new MemoryMutationQueue(); @@ -74,17 +74,17 @@ export class MemoryPersistence implements Persistence { return queue; } - getQueryCache(): QueryCache { + getQueryCache(): QueryCache { return this.queryCache; } - getRemoteDocumentCache(): RemoteDocumentCache { + getRemoteDocumentCache(): RemoteDocumentCache { return this.remoteDocumentCache; } runTransaction( action: string, - operation: (transaction: MemoryTransaction) => PersistencePromise + operation: (transaction: PersistenceTransaction) => PersistencePromise ): Promise { debug(LOG_TAG, 'Starting transaction:', action); return operation(new MemoryTransaction()).toPromise(); diff --git a/packages/firestore/src/local/memory_query_cache.ts b/packages/firestore/src/local/memory_query_cache.ts index de6cee094a4..acc53b4cea2 100644 --- a/packages/firestore/src/local/memory_query_cache.ts +++ b/packages/firestore/src/local/memory_query_cache.ts @@ -27,9 +27,9 @@ import { QueryCache } from './query_cache'; import { QueryData } from './query_data'; import { ReferenceSet } from './reference_set'; import { assert } from '../util/assert'; -import { MemoryTransaction } from './memory_persistence'; +import { PersistenceTransaction } from './persistence'; -export class MemoryQueryCache implements QueryCache { +export class MemoryQueryCache implements QueryCache { /** * Maps a query to the data about that query */ @@ -47,7 +47,7 @@ export class MemoryQueryCache implements QueryCache { private targetCount = 0; - start(transaction: MemoryTransaction): PersistencePromise { + start(transaction: PersistenceTransaction): PersistencePromise { // Nothing to do. return PersistencePromise.resolve(); } @@ -61,7 +61,7 @@ export class MemoryQueryCache implements QueryCache { } setLastRemoteSnapshotVersion( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, snapshotVersion: SnapshotVersion ): PersistencePromise { this.lastRemoteSnapshotVersion = snapshotVersion; @@ -78,7 +78,7 @@ export class MemoryQueryCache implements QueryCache { } addQueryData( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, queryData: QueryData ): PersistencePromise { assert( @@ -91,7 +91,7 @@ export class MemoryQueryCache implements QueryCache { } updateQueryData( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, queryData: QueryData ): PersistencePromise { assert(this.queries.has(queryData.query), 'Updating a non-existent query'); @@ -100,7 +100,7 @@ export class MemoryQueryCache implements QueryCache { } removeQueryData( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, queryData: QueryData ): PersistencePromise { assert(this.targetCount > 0, 'Removing a target from an empty cache'); @@ -119,7 +119,7 @@ export class MemoryQueryCache implements QueryCache { } getQueryData( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, query: Query ): PersistencePromise { const queryData = this.queries.get(query) || null; @@ -127,7 +127,7 @@ export class MemoryQueryCache implements QueryCache { } addMatchingKeys( - txn: MemoryTransaction, + txn: PersistenceTransaction, keys: DocumentKeySet, targetId: TargetId ): PersistencePromise { @@ -136,7 +136,7 @@ export class MemoryQueryCache implements QueryCache { } removeMatchingKeys( - txn: MemoryTransaction, + txn: PersistenceTransaction, keys: DocumentKeySet, targetId: TargetId ): PersistencePromise { @@ -145,7 +145,7 @@ export class MemoryQueryCache implements QueryCache { } removeMatchingKeysForTargetId( - txn: MemoryTransaction, + txn: PersistenceTransaction, targetId: TargetId ): PersistencePromise { this.references.removeReferencesForId(targetId); @@ -153,7 +153,7 @@ export class MemoryQueryCache implements QueryCache { } getMatchingKeysForTargetId( - txn: MemoryTransaction, + txn: PersistenceTransaction, targetId: TargetId ): PersistencePromise { const matchingKeys = this.references.referencesForId(targetId); @@ -165,7 +165,7 @@ export class MemoryQueryCache implements QueryCache { } containsKey( - txn: MemoryTransaction | null, + txn: PersistenceTransaction | null, key: DocumentKey ): PersistencePromise { return this.references.containsKey(txn, key); diff --git a/packages/firestore/src/local/memory_remote_document_cache.ts b/packages/firestore/src/local/memory_remote_document_cache.ts index 083700fe0fd..d5dfc9adae5 100644 --- a/packages/firestore/src/local/memory_remote_document_cache.ts +++ b/packages/firestore/src/local/memory_remote_document_cache.ts @@ -24,14 +24,13 @@ import { Document, MaybeDocument } from '../model/document'; import { DocumentKey } from '../model/document_key'; import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; -import { MemoryTransaction } from './memory_persistence'; +import { PersistenceTransaction } from './persistence'; -export class MemoryRemoteDocumentCache - implements RemoteDocumentCache { +export class MemoryRemoteDocumentCache implements RemoteDocumentCache { private docs = maybeDocumentMap(); addEntry( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, maybeDocument: MaybeDocument ): PersistencePromise { this.docs = this.docs.insert(maybeDocument.key, maybeDocument); @@ -39,7 +38,7 @@ export class MemoryRemoteDocumentCache } removeEntry( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, documentKey: DocumentKey ): PersistencePromise { this.docs = this.docs.remove(documentKey); @@ -47,14 +46,14 @@ export class MemoryRemoteDocumentCache } getEntry( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, documentKey: DocumentKey ): PersistencePromise { return PersistencePromise.resolve(this.docs.get(documentKey)); } getDocumentsMatchingQuery( - transaction: MemoryTransaction, + transaction: PersistenceTransaction, query: Query ): PersistencePromise { let results = documentMap(); diff --git a/packages/firestore/src/local/mutation_queue.ts b/packages/firestore/src/local/mutation_queue.ts index 10723e870bc..4c61151a9f5 100644 --- a/packages/firestore/src/local/mutation_queue.ts +++ b/packages/firestore/src/local/mutation_queue.ts @@ -26,8 +26,7 @@ import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; /** A queue of mutations to apply to the remote store. */ -export interface MutationQueue - extends GarbageSource { +export interface MutationQueue extends GarbageSource { /** * Starts the mutation queue, performing any initial reads that might be * required to establish invariants, etc. @@ -37,10 +36,10 @@ export interface MutationQueue * local store from creating new batches that the mutation queue would * consider erroneously acknowledged. */ - start(transaction: TransactionType): PersistencePromise; + start(transaction: PersistenceTransaction): PersistencePromise; /** Returns true if this queue contains no mutation batches. */ - checkEmpty(transaction: TransactionType): PersistencePromise; + checkEmpty(transaction: PersistenceTransaction): PersistencePromise; /** * Returns the next BatchId that will be assigned to a new mutation batch. @@ -49,7 +48,7 @@ export interface MutationQueue * mutation queue is properly maintaining the invariant that * highestAcknowledgedBatchId is less than nextBatchId. */ - getNextBatchId(transaction: TransactionType): PersistencePromise; + getNextBatchId(transaction: PersistenceTransaction): PersistencePromise; /** * Returns the highest batchId that has been acknowledged. If no batches have @@ -57,39 +56,39 @@ export interface MutationQueue * BATCHID_UNKNOWN. */ getHighestAcknowledgedBatchId( - transaction: TransactionType + transaction: PersistenceTransaction ): PersistencePromise; /** * Acknowledges the given batch. */ acknowledgeBatch( - transaction: TransactionType, + transaction: PersistenceTransaction, batch: MutationBatch, streamToken: ProtoByteString ): PersistencePromise; /** Returns the current stream token for this mutation queue. */ getLastStreamToken( - transaction: TransactionType + transaction: PersistenceTransaction ): PersistencePromise; /** Sets the stream token for this mutation queue. */ setLastStreamToken( - transaction: TransactionType, + transaction: PersistenceTransaction, streamToken: ProtoByteString ): PersistencePromise; /** Creates a new mutation batch and adds it to this mutation queue. */ addMutationBatch( - transaction: TransactionType, + transaction: PersistenceTransaction, localWriteTime: Timestamp, mutations: Mutation[] ): PersistencePromise; /** Loads the mutation batch with the given batchId. */ lookupMutationBatch( - transaction: TransactionType, + transaction: PersistenceTransaction, batchId: BatchId ): PersistencePromise; @@ -103,7 +102,7 @@ export interface MutationQueue * @return the next mutation or null if there wasn't one. */ getNextMutationBatchAfterBatchId( - transaction: TransactionType, + transaction: PersistenceTransaction, batchId: BatchId ): PersistencePromise; @@ -111,7 +110,7 @@ export interface MutationQueue // TODO(mikelehen): PERF: Current consumer only needs mutated keys; if we can // provide that cheaply, we should replace this. getAllMutationBatches( - transaction: TransactionType + transaction: PersistenceTransaction ): PersistencePromise; /** @@ -128,7 +127,7 @@ export interface MutationQueue // TODO(mcg): This should really return an enumerator and the caller should be // adjusted to only loop through these once. getAllMutationBatchesThroughBatchId( - transaction: TransactionType, + transaction: PersistenceTransaction, batchId: BatchId ): PersistencePromise; @@ -145,7 +144,7 @@ export interface MutationQueue // TODO(mcg): This should really return an enumerator // also for b/32992024, all backing stores should really index by document key getAllMutationBatchesAffectingDocumentKey( - transaction: TransactionType, + transaction: PersistenceTransaction, documentKey: DocumentKey ): PersistencePromise; @@ -165,7 +164,7 @@ export interface MutationQueue // TODO(mikelehen): This should perhaps return an enumerator, though I'm not // sure we can avoid loading them all in memory. getAllMutationBatchesAffectingQuery( - transaction: TransactionType, + transaction: PersistenceTransaction, query: Query ): PersistencePromise; @@ -181,7 +180,7 @@ export interface MutationQueue * getAllMutationBatchesThroughBatchId() */ removeMutationBatches( - transaction: TransactionType, + transaction: PersistenceTransaction, batches: MutationBatch[] ): PersistencePromise; @@ -190,6 +189,6 @@ export interface MutationQueue * leaks, if possible. */ performConsistencyCheck( - transaction: TransactionType + transaction: PersistenceTransaction ): PersistencePromise; } diff --git a/packages/firestore/src/local/persistence.ts b/packages/firestore/src/local/persistence.ts index 9e37c48dff4..d3902ae2f2d 100644 --- a/packages/firestore/src/local/persistence.ts +++ b/packages/firestore/src/local/persistence.ts @@ -17,7 +17,6 @@ import { User } from '../auth/user'; import { MutationQueue } from './mutation_queue'; -import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { RemoteDocumentCache } from './remote_document_cache'; @@ -29,7 +28,7 @@ import { RemoteDocumentCache } from './remote_document_cache'; * pass it to your callback. You then pass it to any method that operates * on persistence. */ -export interface PersistenceTransaction {} +export abstract class PersistenceTransaction {} /** * Persistence is the lowest-level shared interface to persistent storage in @@ -67,7 +66,7 @@ export interface PersistenceTransaction {} * writes in order to avoid relying on being able to read back uncommitted * writes. */ -export interface Persistence { +export interface Persistence { /** * Whether or not this persistence instance has been started. */ @@ -98,7 +97,7 @@ export interface Persistence { * extent possible (e.g. in the case of uid switching from * sally=>jack=>sally, sally's mutation queue will be preserved). */ - getMutationQueue(user: User): MutationQueue; + getMutationQueue(user: User): MutationQueue; /** * Returns a QueryCache representing the persisted cache of queries. @@ -107,7 +106,7 @@ export interface Persistence { * this is called. In particular, the memory-backed implementation does this * to emulate the persisted implementation to the extent possible. */ - getQueryCache(): QueryCache; + getQueryCache(): QueryCache; /** * Returns a RemoteDocumentCache representing the persisted cache of remote @@ -117,7 +116,7 @@ export interface Persistence { * this is called. In particular, the memory-backed implementation does this * to emulate the persisted implementation to the extent possible. */ - getRemoteDocumentCache(): RemoteDocumentCache; + getRemoteDocumentCache(): RemoteDocumentCache; /** * Performs an operation inside a persistence transaction. Any reads or writes @@ -137,7 +136,7 @@ export interface Persistence { runTransaction( action: string, transactionOperation: ( - transaction: TransactionType + transaction: PersistenceTransaction ) => PersistencePromise ): Promise; } diff --git a/packages/firestore/src/local/query_cache.ts b/packages/firestore/src/local/query_cache.ts index 6b6372f3b1f..47b3c410242 100644 --- a/packages/firestore/src/local/query_cache.ts +++ b/packages/firestore/src/local/query_cache.ts @@ -29,12 +29,11 @@ import { QueryData } from './query_data'; * * The cache is keyed by Query and entries in the cache are QueryData instances. */ -export interface QueryCache - extends GarbageSource { +export interface QueryCache extends GarbageSource { /** * Starts up the query cache. */ - start(transaction: TransactionType): PersistencePromise; + start(transaction: PersistenceTransaction): PersistencePromise; /** * Returns the highest target ID of any query in the cache. Typically called @@ -63,7 +62,7 @@ export interface QueryCache * @param snapshotVersion The new snapshot version. */ setLastRemoteSnapshotVersion( - transaction: TransactionType, + transaction: PersistenceTransaction, snapshotVersion: SnapshotVersion ): PersistencePromise; @@ -76,7 +75,7 @@ export interface QueryCache * @param queryData A QueryData instance to put in the cache. */ addQueryData( - transaction: TransactionType, + transaction: PersistenceTransaction, queryData: QueryData ): PersistencePromise; diff --git a/packages/firestore/src/local/remote_document_cache.ts b/packages/firestore/src/local/remote_document_cache.ts index 3b72da6cf61..ceb58d3bf91 100644 --- a/packages/firestore/src/local/remote_document_cache.ts +++ b/packages/firestore/src/local/remote_document_cache.ts @@ -30,9 +30,7 @@ import { PersistencePromise } from './persistence_promise'; * with data) as well as NoDocument instances (indicating that the document is * known to not exist). */ -export interface RemoteDocumentCache< - TransactionType extends PersistenceTransaction -> { +export interface RemoteDocumentCache { /** * Adds or replaces an entry in the cache. * @@ -42,13 +40,13 @@ export interface RemoteDocumentCache< * @param maybeDocument A Document or NoDocument to put in the cache. */ addEntry( - transaction: TransactionType, + transaction: PersistenceTransaction, maybeDocument: MaybeDocument ): PersistencePromise; /** Removes the cached entry for the given key (no-op if no entry exists). */ removeEntry( - transaction: TransactionType, + transaction: PersistenceTransaction, documentKey: DocumentKey ): PersistencePromise; @@ -60,7 +58,7 @@ export interface RemoteDocumentCache< * cached. */ getEntry( - transaction: TransactionType, + transaction: PersistenceTransaction, documentKey: DocumentKey ): PersistencePromise; @@ -76,7 +74,7 @@ export interface RemoteDocumentCache< * @return The set of matching documents. */ getDocumentsMatchingQuery( - transaction: TransactionType, + transaction: PersistenceTransaction, query: Query ): PersistencePromise; } diff --git a/packages/firestore/src/local/remote_document_change_buffer.ts b/packages/firestore/src/local/remote_document_change_buffer.ts index f926a56d858..bc0a3960479 100644 --- a/packages/firestore/src/local/remote_document_change_buffer.ts +++ b/packages/firestore/src/local/remote_document_change_buffer.ts @@ -35,13 +35,11 @@ import { RemoteDocumentCache } from './remote_document_cache'; * read-your-own-writes capability, this class is not technically needed, but * has been preserved as a convenience and to aid portability. */ -export class RemoteDocumentChangeBuffer< - TransactionType extends PersistenceTransaction -> { +export class RemoteDocumentChangeBuffer { private changes: MaybeDocumentMap | null = maybeDocumentMap(); constructor( - private remoteDocumentCache: RemoteDocumentCache + private remoteDocumentCache: RemoteDocumentCache ) {} /** Buffers a `RemoteDocumentCache.addEntry()` call. */ @@ -64,7 +62,7 @@ export class RemoteDocumentChangeBuffer< * cached. */ getEntry( - transaction: TransactionType, + transaction: PersistenceTransaction, documentKey: DocumentKey ): PersistencePromise { const changes = this.assertChanges(); @@ -81,7 +79,7 @@ export class RemoteDocumentChangeBuffer< * Applies buffered changes to the underlying RemoteDocumentCache, using * the provided transaction. */ - apply(transaction: TransactionType): PersistencePromise { + apply(transaction: PersistenceTransaction): PersistencePromise { const changes = this.assertChanges(); const promises: Array> = []; diff --git a/packages/firestore/src/remote/remote_store.ts b/packages/firestore/src/remote/remote_store.ts index 36c48297a16..0f1d49835fa 100644 --- a/packages/firestore/src/remote/remote_store.ts +++ b/packages/firestore/src/remote/remote_store.ts @@ -118,7 +118,7 @@ export class RemoteStore implements TargetMetadataProvider { /** * The local store, used to fill the write pipeline with outbound mutations. */ - private localStore: LocalStore, + private localStore: LocalStore, /** The client-side proxy for interacting with the backend. */ private datastore: Datastore, asyncQueue: AsyncQueue, diff --git a/packages/firestore/test/unit/local/local_store.test.ts b/packages/firestore/test/unit/local/local_store.test.ts index 0d927728b0e..e10b3502fff 100644 --- a/packages/firestore/test/unit/local/local_store.test.ts +++ b/packages/firestore/test/unit/local/local_store.test.ts @@ -76,7 +76,7 @@ class LocalStoreTester { private lastChanges: MaybeDocumentMap | null = null; private lastTargetId: TargetId | null = null; private batches: MutationBatch[] = []; - constructor(public localStore: LocalStore) {} + constructor(public localStore: LocalStore) {} after( op: Mutation | Mutation[] | RemoteEvent | LocalViewChanges @@ -274,10 +274,10 @@ describe('LocalStore w/ IndexedDB Persistence', () => { }); function genericLocalStoreTests( - getPersistence: () => Promise> + getPersistence: () => Promise ): void { - let persistence: Persistence; - let localStore: LocalStore; + let persistence: Persistence; + let localStore: LocalStore; beforeEach(() => { return getPersistence().then(p => { diff --git a/packages/firestore/test/unit/local/mutation_queue.test.ts b/packages/firestore/test/unit/local/mutation_queue.test.ts index dc19acf05bf..7e1c526e20c 100644 --- a/packages/firestore/test/unit/local/mutation_queue.test.ts +++ b/packages/firestore/test/unit/local/mutation_queue.test.ts @@ -57,8 +57,8 @@ describe('IndexedDbMutationQueue', () => { return; } - let persistencePromise: Promise>; - let persistence: Persistence; + let persistencePromise: Promise; + let persistence: Persistence; beforeEach(async () => { persistencePromise = persistenceHelpers.testIndexedDbPersistence(); persistence = await persistencePromise; @@ -69,7 +69,7 @@ describe('IndexedDbMutationQueue', () => { describe('loadNextBatchIdFromDb', () => { function loadNextBatchId(): Promise { return persistence.runTransaction('loadNextBatchIdFromDb', txn => { - return IndexedDbMutationQueue.loadNextBatchIdFromDb(txn).next( + return IndexedDbMutationQueue.loadNextBatchIdFromDb(txn as IndexedDbTransaction).next( batchId => { return batchId; } @@ -79,7 +79,7 @@ describe('IndexedDbMutationQueue', () => { function addDummyBatch(userId: string, batchId: BatchId): Promise { return persistence.runTransaction('addDummyBatch', transaction => { - const store = transaction.simpleDbTransaction.store< + const store = (transaction as IndexedDbTransaction).simpleDbTransaction.store< [string, number], DbMutationBatch >(DbMutationBatch.store); @@ -119,11 +119,11 @@ describe('IndexedDbMutationQueue', () => { */ function genericMutationQueueTests< TransactionType extends PersistenceTransaction ->(persistencePromise: () => Promise>): void { +>(persistencePromise: () => Promise): void { addEqualityMatcher(); - let persistence: Persistence; - let mutationQueue: TestMutationQueue; + let persistence: Persistence; + let mutationQueue: TestMutationQueue; beforeEach(async () => { persistence = await persistencePromise(); mutationQueue = new TestMutationQueue( diff --git a/packages/firestore/test/unit/local/query_cache.test.ts b/packages/firestore/test/unit/local/query_cache.test.ts index e4d714100a7..1b077c14249 100644 --- a/packages/firestore/test/unit/local/query_cache.test.ts +++ b/packages/firestore/test/unit/local/query_cache.test.ts @@ -51,7 +51,7 @@ describe('IndexedDbQueryCache', () => { return; } - let persistencePromise: Promise>; + let persistencePromise: Promise; beforeEach(async () => { persistencePromise = persistenceHelpers.testIndexedDbPersistence(); }); @@ -62,11 +62,11 @@ describe('IndexedDbQueryCache', () => { /** * Defines the set of tests to run against both query cache implementations. */ -function genericQueryCacheTests( - persistencePromise: () => Promise> +function genericQueryCacheTests( + persistencePromise: () => Promise ): void { addEqualityMatcher(); - let cache: TestQueryCache; + let cache: TestQueryCache; const QUERY_ROOMS = Query.atPath(path('rooms')); const QUERY_HALLS = Query.atPath(path('halls')); @@ -95,7 +95,7 @@ function genericQueryCacheTests( ); } - let persistence: Persistence; + let persistence: Persistence; beforeEach(async () => { persistence = await persistencePromise(); cache = new TestQueryCache(persistence, persistence.getQueryCache()); diff --git a/packages/firestore/test/unit/local/remote_document_cache.test.ts b/packages/firestore/test/unit/local/remote_document_cache.test.ts index 9086555a869..b4cba12ef89 100644 --- a/packages/firestore/test/unit/local/remote_document_cache.test.ts +++ b/packages/firestore/test/unit/local/remote_document_cache.test.ts @@ -46,15 +46,15 @@ describe('IndexedDbRemoteDocumentCache', () => { */ function genericRemoteDocumentCacheTests< TransactionType extends PersistenceTransaction ->(persistencePromise: () => Promise>): void { +>(persistencePromise: () => Promise): void { // Helpers for use throughout tests. const DOC_PATH = 'a/b'; const LONG_DOC_PATH = 'a/b/c/d/e/f'; const DOC_DATA = { a: 1, b: 2 }; const VERSION = 42; - let persistence: Persistence; - let cache: TestRemoteDocumentCache; + let persistence: Persistence; + let cache: TestRemoteDocumentCache; function setAndReadDocument(doc: MaybeDocument): Promise { return cache diff --git a/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts b/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts index 1505297a850..9d7761c4f94 100644 --- a/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts +++ b/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts @@ -27,8 +27,8 @@ import { TestRemoteDocumentCache } from './test_remote_document_cache'; import { TestRemoteDocumentChangeBuffer } from './test_remote_document_change_buffer'; let persistence: IndexedDbPersistence; -let cache: TestRemoteDocumentCache; -let buffer: TestRemoteDocumentChangeBuffer; +let cache: TestRemoteDocumentCache; +let buffer: TestRemoteDocumentChangeBuffer; const INITIAL_DOC = doc('coll/a', 42, { test: 'data' }); describe('RemoteDocumentChangeBuffer', () => { diff --git a/packages/firestore/test/unit/local/test_garbage_collector.ts b/packages/firestore/test/unit/local/test_garbage_collector.ts index 79dfd4c5688..43474b2e540 100644 --- a/packages/firestore/test/unit/local/test_garbage_collector.ts +++ b/packages/firestore/test/unit/local/test_garbage_collector.ts @@ -25,11 +25,9 @@ import { DocumentKey } from '../../../src/model/document_key'; * A wrapper around a GarbageCollector that automatically creates a transaction * around every operation to reduce test boilerplate. */ -export class TestGarbageCollector< - TransactionType extends PersistenceTransaction -> { +export class TestGarbageCollector { constructor( - public persistence: Persistence, + public persistence: Persistence, public gc: GarbageCollector ) {} diff --git a/packages/firestore/test/unit/local/test_mutation_queue.ts b/packages/firestore/test/unit/local/test_mutation_queue.ts index 22a64524912..6507274b0fd 100644 --- a/packages/firestore/test/unit/local/test_mutation_queue.ts +++ b/packages/firestore/test/unit/local/test_mutation_queue.ts @@ -33,10 +33,10 @@ import { AnyDuringMigration } from '../../../src/util/misc'; * A wrapper around a MutationQueue that automatically creates a * transaction around every operation to reduce test boilerplate. */ -export class TestMutationQueue { +export class TestMutationQueue { constructor( - public persistence: Persistence, - public queue: MutationQueue + public persistence: Persistence, + public queue: MutationQueue ) {} start(): Promise { diff --git a/packages/firestore/test/unit/local/test_query_cache.ts b/packages/firestore/test/unit/local/test_query_cache.ts index 2105c89208a..0ae6b7e2ec3 100644 --- a/packages/firestore/test/unit/local/test_query_cache.ts +++ b/packages/firestore/test/unit/local/test_query_cache.ts @@ -30,10 +30,10 @@ import { DocumentKey } from '../../../src/model/document_key'; * A wrapper around a QueryCache that automatically creates a * transaction around every operation to reduce test boilerplate. */ -export class TestQueryCache { +export class TestQueryCache { constructor( - public persistence: Persistence, - public cache: QueryCache + public persistence: Persistence, + public cache: QueryCache ) {} start(): Promise { diff --git a/packages/firestore/test/unit/local/test_remote_document_cache.ts b/packages/firestore/test/unit/local/test_remote_document_cache.ts index d82d716a526..4183c77c30a 100644 --- a/packages/firestore/test/unit/local/test_remote_document_cache.ts +++ b/packages/firestore/test/unit/local/test_remote_document_cache.ts @@ -15,10 +15,7 @@ */ import { Query } from '../../../src/core/query'; -import { - Persistence, - PersistenceTransaction -} from '../../../src/local/persistence'; +import { Persistence } from '../../../src/local/persistence'; import { RemoteDocumentCache } from '../../../src/local/remote_document_cache'; import { DocumentMap } from '../../../src/model/collections'; import { MaybeDocument } from '../../../src/model/document'; @@ -28,12 +25,10 @@ import { DocumentKey } from '../../../src/model/document_key'; * A wrapper around a RemoteDocumentCache that automatically creates a * transaction around every operation to reduce test boilerplate. */ -export class TestRemoteDocumentCache< - TransactionType extends PersistenceTransaction -> { +export class TestRemoteDocumentCache { constructor( - public persistence: Persistence, - public cache: RemoteDocumentCache + public persistence: Persistence, + public cache: RemoteDocumentCache ) {} addEntry(maybeDocument: MaybeDocument): Promise { diff --git a/packages/firestore/test/unit/local/test_remote_document_change_buffer.ts b/packages/firestore/test/unit/local/test_remote_document_change_buffer.ts index 94da0f4b05e..b2ef7918f19 100644 --- a/packages/firestore/test/unit/local/test_remote_document_change_buffer.ts +++ b/packages/firestore/test/unit/local/test_remote_document_change_buffer.ts @@ -14,10 +14,7 @@ * limitations under the License. */ -import { - Persistence, - PersistenceTransaction -} from '../../../src/local/persistence'; +import { Persistence } from '../../../src/local/persistence'; import { RemoteDocumentChangeBuffer } from '../../../src/local/remote_document_change_buffer'; import { MaybeDocument } from '../../../src/model/document'; import { DocumentKey } from '../../../src/model/document_key'; @@ -26,12 +23,10 @@ import { DocumentKey } from '../../../src/model/document_key'; * A wrapper around a RemoteDocumentChangeBuffer that automatically creates a * transaction around operations to reduce test boilerplate. */ -export class TestRemoteDocumentChangeBuffer< - TransactionType extends PersistenceTransaction -> { +export class TestRemoteDocumentChangeBuffer { constructor( - public persistence: Persistence, - public buffer: RemoteDocumentChangeBuffer + public persistence: Persistence, + public buffer: RemoteDocumentChangeBuffer ) {} addEntry(maybeDocument: MaybeDocument): void { diff --git a/packages/firestore/test/unit/specs/spec_test_runner.ts b/packages/firestore/test/unit/specs/spec_test_runner.ts index a2626beeaf2..83634c8f876 100644 --- a/packages/firestore/test/unit/specs/spec_test_runner.ts +++ b/packages/firestore/test/unit/specs/spec_test_runner.ts @@ -39,20 +39,11 @@ import { } from '../../../src/core/view_snapshot'; import { EagerGarbageCollector } from '../../../src/local/eager_garbage_collector'; import { GarbageCollector } from '../../../src/local/garbage_collector'; -import { - IndexedDbPersistence, - IndexedDbTransaction -} from '../../../src/local/indexeddb_persistence'; +import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; import { LocalStore } from '../../../src/local/local_store'; -import { - MemoryPersistence, - MemoryTransaction -} from '../../../src/local/memory_persistence'; +import { MemoryPersistence } from '../../../src/local/memory_persistence'; import { NoOpGarbageCollector } from '../../../src/local/no_op_garbage_collector'; -import { - Persistence, - PersistenceTransaction -} from '../../../src/local/persistence'; +import { Persistence } from '../../../src/local/persistence'; import { QueryData, QueryPurpose } from '../../../src/local/query_data'; import { SimpleDb } from '../../../src/local/simple_db'; import { DocumentOptions } from '../../../src/model/document'; @@ -328,7 +319,7 @@ interface OutstandingWrite { userCallback: Deferred; } -abstract class TestRunner { +abstract class TestRunner { private connection: MockConnection; private eventManager: EventManager; private syncEngine: SyncEngine; @@ -346,9 +337,9 @@ abstract class TestRunner { }; private datastore: Datastore; - private localStore: LocalStore; + private localStore: LocalStore; private remoteStore: RemoteStore; - private persistence: Persistence; + private persistence: Persistence; private useGarbageCollection: boolean; private databaseInfo: DatabaseInfo; private user = User.UNAUTHENTICATED; @@ -429,7 +420,7 @@ abstract class TestRunner { protected abstract getPersistence( serializer: JsonProtoSerializer - ): Persistence; + ): Persistence; protected abstract destroyPersistence(): Promise; async shutdown(): Promise { @@ -998,7 +989,7 @@ abstract class TestRunner { } } -class MemoryTestRunner extends TestRunner { +class MemoryTestRunner extends TestRunner { protected getPersistence(serializer: JsonProtoSerializer): MemoryPersistence { return new MemoryPersistence(); } @@ -1012,7 +1003,7 @@ class MemoryTestRunner extends TestRunner { * Runs the specs using IndexedDbPersistence, the creator must ensure that it is * enabled for the platform. */ -class IndexedDbTestRunner extends TestRunner { +class IndexedDbTestRunner extends TestRunner { static TEST_DB_NAME = 'specs'; protected getPersistence( @@ -1042,7 +1033,7 @@ export async function runSpec( config: SpecConfig, steps: SpecStep[] ): Promise { - let runner: TestRunner; + let runner: TestRunner; if (usePersistence) { runner = new IndexedDbTestRunner(name, config); } else { From 7909aef315e73c6f4f5b5b3f3577c5e81e65d730 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Fri, 27 Jul 2018 16:13:26 -0700 Subject: [PATCH 14/25] Style --- .../firestore/src/local/indexeddb_mutation_queue.ts | 4 +++- packages/firestore/src/local/local_store.ts | 8 ++++++-- packages/firestore/src/local/memory_mutation_queue.ts | 8 ++++++-- packages/firestore/src/local/mutation_queue.ts | 4 +++- .../src/local/remote_document_change_buffer.ts | 4 +--- .../firestore/test/unit/local/mutation_queue.test.ts | 10 +++++----- .../test/unit/local/test_garbage_collector.ts | 5 +---- .../firestore/test/unit/local/test_mutation_queue.ts | 5 +---- packages/firestore/test/unit/local/test_query_cache.ts | 5 +---- 9 files changed, 27 insertions(+), 26 deletions(-) diff --git a/packages/firestore/src/local/indexeddb_mutation_queue.ts b/packages/firestore/src/local/indexeddb_mutation_queue.ts index 9085e3a6193..e87256e6dba 100644 --- a/packages/firestore/src/local/indexeddb_mutation_queue.ts +++ b/packages/firestore/src/local/indexeddb_mutation_queue.ts @@ -478,7 +478,9 @@ export class IndexedDbMutationQueue implements MutationQueue { return PersistencePromise.waitFor(promises); } - performConsistencyCheck(txn: PersistenceTransaction): PersistencePromise { + performConsistencyCheck( + txn: PersistenceTransaction + ): PersistencePromise { return this.checkEmpty(txn).next(empty => { if (!empty) { return PersistencePromise.resolve(); diff --git a/packages/firestore/src/local/local_store.ts b/packages/firestore/src/local/local_store.ts index 4e90348d870..6ee96ccba35 100644 --- a/packages/firestore/src/local/local_store.ts +++ b/packages/firestore/src/local/local_store.ts @@ -234,14 +234,18 @@ export class LocalStore { }); } - private startQueryCache(txn: PersistenceTransaction): PersistencePromise { + private startQueryCache( + txn: PersistenceTransaction + ): PersistencePromise { return this.queryCache.start(txn).next(() => { const targetId = this.queryCache.getHighestTargetId(); this.targetIdGenerator = TargetIdGenerator.forLocalStore(targetId); }); } - private startMutationQueue(txn: PersistenceTransaction): PersistencePromise { + private startMutationQueue( + txn: PersistenceTransaction + ): PersistencePromise { return this.mutationQueue .start(txn) .next(() => { diff --git a/packages/firestore/src/local/memory_mutation_queue.ts b/packages/firestore/src/local/memory_mutation_queue.ts index dcae92c0f22..36675f90760 100644 --- a/packages/firestore/src/local/memory_mutation_queue.ts +++ b/packages/firestore/src/local/memory_mutation_queue.ts @@ -77,7 +77,9 @@ export class MemoryMutationQueue implements MutationQueue { return PersistencePromise.resolve(this.mutationQueue.length === 0); } - getNextBatchId(transaction: PersistenceTransaction): PersistencePromise { + getNextBatchId( + transaction: PersistenceTransaction + ): PersistencePromise { return PersistencePromise.resolve(this.nextBatchId); } @@ -388,7 +390,9 @@ export class MemoryMutationQueue implements MutationQueue { return PersistencePromise.resolve(key.isEqual(firstRef && firstRef.key)); } - performConsistencyCheck(txn: PersistenceTransaction): PersistencePromise { + performConsistencyCheck( + txn: PersistenceTransaction + ): PersistencePromise { if (this.mutationQueue.length === 0) { assert( this.batchesByDocumentKey.isEmpty(), diff --git a/packages/firestore/src/local/mutation_queue.ts b/packages/firestore/src/local/mutation_queue.ts index 4c61151a9f5..8ad262a9e67 100644 --- a/packages/firestore/src/local/mutation_queue.ts +++ b/packages/firestore/src/local/mutation_queue.ts @@ -48,7 +48,9 @@ export interface MutationQueue extends GarbageSource { * mutation queue is properly maintaining the invariant that * highestAcknowledgedBatchId is less than nextBatchId. */ - getNextBatchId(transaction: PersistenceTransaction): PersistencePromise; + getNextBatchId( + transaction: PersistenceTransaction + ): PersistencePromise; /** * Returns the highest batchId that has been acknowledged. If no batches have diff --git a/packages/firestore/src/local/remote_document_change_buffer.ts b/packages/firestore/src/local/remote_document_change_buffer.ts index bc0a3960479..184e5301f5f 100644 --- a/packages/firestore/src/local/remote_document_change_buffer.ts +++ b/packages/firestore/src/local/remote_document_change_buffer.ts @@ -38,9 +38,7 @@ import { RemoteDocumentCache } from './remote_document_cache'; export class RemoteDocumentChangeBuffer { private changes: MaybeDocumentMap | null = maybeDocumentMap(); - constructor( - private remoteDocumentCache: RemoteDocumentCache - ) {} + constructor(private remoteDocumentCache: RemoteDocumentCache) {} /** Buffers a `RemoteDocumentCache.addEntry()` call. */ addEntry(maybeDocument: MaybeDocument): void { diff --git a/packages/firestore/test/unit/local/mutation_queue.test.ts b/packages/firestore/test/unit/local/mutation_queue.test.ts index 7e1c526e20c..da0fb152c0e 100644 --- a/packages/firestore/test/unit/local/mutation_queue.test.ts +++ b/packages/firestore/test/unit/local/mutation_queue.test.ts @@ -69,11 +69,11 @@ describe('IndexedDbMutationQueue', () => { describe('loadNextBatchIdFromDb', () => { function loadNextBatchId(): Promise { return persistence.runTransaction('loadNextBatchIdFromDb', txn => { - return IndexedDbMutationQueue.loadNextBatchIdFromDb(txn as IndexedDbTransaction).next( - batchId => { - return batchId; - } - ); + return IndexedDbMutationQueue.loadNextBatchIdFromDb( + txn as IndexedDbTransaction + ).next(batchId => { + return batchId; + }); }); } diff --git a/packages/firestore/test/unit/local/test_garbage_collector.ts b/packages/firestore/test/unit/local/test_garbage_collector.ts index 43474b2e540..e7a3a465b5f 100644 --- a/packages/firestore/test/unit/local/test_garbage_collector.ts +++ b/packages/firestore/test/unit/local/test_garbage_collector.ts @@ -26,10 +26,7 @@ import { DocumentKey } from '../../../src/model/document_key'; * around every operation to reduce test boilerplate. */ export class TestGarbageCollector { - constructor( - public persistence: Persistence, - public gc: GarbageCollector - ) {} + constructor(public persistence: Persistence, public gc: GarbageCollector) {} collectGarbage(): Promise { return this.persistence diff --git a/packages/firestore/test/unit/local/test_mutation_queue.ts b/packages/firestore/test/unit/local/test_mutation_queue.ts index 6507274b0fd..77efde62aee 100644 --- a/packages/firestore/test/unit/local/test_mutation_queue.ts +++ b/packages/firestore/test/unit/local/test_mutation_queue.ts @@ -34,10 +34,7 @@ import { AnyDuringMigration } from '../../../src/util/misc'; * transaction around every operation to reduce test boilerplate. */ export class TestMutationQueue { - constructor( - public persistence: Persistence, - public queue: MutationQueue - ) {} + constructor(public persistence: Persistence, public queue: MutationQueue) {} start(): Promise { return this.persistence.runTransaction('start', txn => { diff --git a/packages/firestore/test/unit/local/test_query_cache.ts b/packages/firestore/test/unit/local/test_query_cache.ts index 0ae6b7e2ec3..aa79e002872 100644 --- a/packages/firestore/test/unit/local/test_query_cache.ts +++ b/packages/firestore/test/unit/local/test_query_cache.ts @@ -31,10 +31,7 @@ import { DocumentKey } from '../../../src/model/document_key'; * transaction around every operation to reduce test boilerplate. */ export class TestQueryCache { - constructor( - public persistence: Persistence, - public cache: QueryCache - ) {} + constructor(public persistence: Persistence, public cache: QueryCache) {} start(): Promise { return this.persistence.runTransaction('start', txn => From 9fc2b89040c6530099e372abe3d976477b4f8596 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Fri, 27 Jul 2018 16:40:20 -0700 Subject: [PATCH 15/25] Lint and style --- packages/firestore/src/core/firestore_client.ts | 2 +- packages/firestore/src/core/sync_engine.ts | 1 - packages/firestore/src/remote/remote_store.ts | 1 - packages/firestore/test/unit/local/query_cache.test.ts | 10 ++-------- .../unit/local/remote_document_change_buffer.test.ts | 5 +---- .../test/unit/local/test_garbage_collector.ts | 5 +---- .../firestore/test/unit/local/test_mutation_queue.ts | 5 +---- packages/firestore/test/unit/local/test_query_cache.ts | 5 +---- 8 files changed, 7 insertions(+), 27 deletions(-) diff --git a/packages/firestore/src/core/firestore_client.ts b/packages/firestore/src/core/firestore_client.ts index bd8e6c05ce9..b4e40763ca4 100644 --- a/packages/firestore/src/core/firestore_client.ts +++ b/packages/firestore/src/core/firestore_client.ts @@ -30,7 +30,7 @@ import { IndexedDbPersistence } from '../local/indexeddb_persistence'; import { LocalStore } from '../local/local_store'; import { MemoryPersistence } from '../local/memory_persistence'; import { NoOpGarbageCollector } from '../local/no_op_garbage_collector'; -import { Persistence, PersistenceTransaction } from '../local/persistence'; +import { Persistence } from '../local/persistence'; import { DocumentKeySet, documentKeySet, diff --git a/packages/firestore/src/core/sync_engine.ts b/packages/firestore/src/core/sync_engine.ts index 3607f39682c..edca3cca2cc 100644 --- a/packages/firestore/src/core/sync_engine.ts +++ b/packages/firestore/src/core/sync_engine.ts @@ -41,7 +41,6 @@ import { ObjectMap } from '../util/obj_map'; import { Deferred } from '../util/promise'; import { SortedMap } from '../util/sorted_map'; import { isNullOrUndefined } from '../util/types'; -import { PersistenceTransaction } from '../local/persistence'; import { Query } from './query'; import { SnapshotVersion } from './snapshot_version'; import { TargetIdGenerator } from './target_id_generator'; diff --git a/packages/firestore/src/remote/remote_store.ts b/packages/firestore/src/remote/remote_store.ts index 0f1d49835fa..ea24b364eeb 100644 --- a/packages/firestore/src/remote/remote_store.ts +++ b/packages/firestore/src/remote/remote_store.ts @@ -51,7 +51,6 @@ import { import { OnlineStateTracker } from './online_state_tracker'; import { AsyncQueue } from '../util/async_queue'; import { DocumentKeySet } from '../model/collections'; -import { PersistenceTransaction } from '../local/persistence'; const LOG_TAG = 'RemoteStore'; diff --git a/packages/firestore/test/unit/local/query_cache.test.ts b/packages/firestore/test/unit/local/query_cache.test.ts index 1b077c14249..388fd6ae0a0 100644 --- a/packages/firestore/test/unit/local/query_cache.test.ts +++ b/packages/firestore/test/unit/local/query_cache.test.ts @@ -19,14 +19,8 @@ import { Query } from '../../../src/core/query'; import { SnapshotVersion } from '../../../src/core/snapshot_version'; import { TargetId } from '../../../src/core/types'; import { EagerGarbageCollector } from '../../../src/local/eager_garbage_collector'; -import { - IndexedDbPersistence, - IndexedDbTransaction -} from '../../../src/local/indexeddb_persistence'; -import { - Persistence, - PersistenceTransaction -} from '../../../src/local/persistence'; +import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; +import { Persistence } from '../../../src/local/persistence'; import { QueryData, QueryPurpose } from '../../../src/local/query_data'; import { addEqualityMatcher } from '../../util/equality_matcher'; import { diff --git a/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts b/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts index 9d7761c4f94..8105005ab26 100644 --- a/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts +++ b/packages/firestore/test/unit/local/remote_document_change_buffer.test.ts @@ -15,10 +15,7 @@ */ import { expect } from 'chai'; -import { - IndexedDbPersistence, - IndexedDbTransaction -} from '../../../src/local/indexeddb_persistence'; +import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; import { RemoteDocumentChangeBuffer } from '../../../src/local/remote_document_change_buffer'; import { deletedDoc, doc, expectEqual, key } from '../../util/helpers'; diff --git a/packages/firestore/test/unit/local/test_garbage_collector.ts b/packages/firestore/test/unit/local/test_garbage_collector.ts index e7a3a465b5f..71bae6e4598 100644 --- a/packages/firestore/test/unit/local/test_garbage_collector.ts +++ b/packages/firestore/test/unit/local/test_garbage_collector.ts @@ -15,10 +15,7 @@ */ import { GarbageCollector } from '../../../src/local/garbage_collector'; -import { - Persistence, - PersistenceTransaction -} from '../../../src/local/persistence'; +import { Persistence } from '../../../src/local/persistence'; import { DocumentKey } from '../../../src/model/document_key'; /** diff --git a/packages/firestore/test/unit/local/test_mutation_queue.ts b/packages/firestore/test/unit/local/test_mutation_queue.ts index 77efde62aee..31aa3d8307a 100644 --- a/packages/firestore/test/unit/local/test_mutation_queue.ts +++ b/packages/firestore/test/unit/local/test_mutation_queue.ts @@ -19,10 +19,7 @@ import { Query } from '../../../src/core/query'; import { BatchId, ProtoByteString } from '../../../src/core/types'; import { GarbageCollector } from '../../../src/local/garbage_collector'; import { MutationQueue } from '../../../src/local/mutation_queue'; -import { - Persistence, - PersistenceTransaction -} from '../../../src/local/persistence'; +import { Persistence } from '../../../src/local/persistence'; import { DocumentKeySet } from '../../../src/model/collections'; import { DocumentKey } from '../../../src/model/document_key'; import { Mutation } from '../../../src/model/mutation'; diff --git a/packages/firestore/test/unit/local/test_query_cache.ts b/packages/firestore/test/unit/local/test_query_cache.ts index aa79e002872..1023f9967b0 100644 --- a/packages/firestore/test/unit/local/test_query_cache.ts +++ b/packages/firestore/test/unit/local/test_query_cache.ts @@ -17,10 +17,7 @@ import { Query } from '../../../src/core/query'; import { SnapshotVersion } from '../../../src/core/snapshot_version'; import { TargetId } from '../../../src/core/types'; -import { - Persistence, - PersistenceTransaction -} from '../../../src/local/persistence'; +import { Persistence } from '../../../src/local/persistence'; import { QueryCache } from '../../../src/local/query_cache'; import { QueryData } from '../../../src/local/query_data'; import { documentKeySet } from '../../../src/model/collections'; From d4f1dcccb157dac4fa9494ae212ad72fb98e67c4 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 30 Jul 2018 11:08:57 -0700 Subject: [PATCH 16/25] Review feedback --- packages/firestore/src/core/firestore_client.ts | 2 -- packages/firestore/src/local/indexeddb_persistence.ts | 5 ++--- packages/firestore/src/local/memory_persistence.ts | 4 +--- .../src/local/memory_remote_document_cache.ts | 3 ++- .../firestore/test/unit/local/local_store.test.ts | 2 +- .../firestore/test/unit/local/mutation_queue.test.ts | 11 +++++------ .../firestore/test/unit/local/query_cache.test.ts | 2 +- 7 files changed, 12 insertions(+), 17 deletions(-) diff --git a/packages/firestore/src/core/firestore_client.ts b/packages/firestore/src/core/firestore_client.ts index b4e40763ca4..c45f4591e2d 100644 --- a/packages/firestore/src/core/firestore_client.ts +++ b/packages/firestore/src/core/firestore_client.ts @@ -76,8 +76,6 @@ export class FirestoreClient { // undefined checks. private eventMgr: EventManager; private garbageCollector: GarbageCollector; - // Note that localStore will end up with the same type parameter as - // persistence because the LocalStore constructor enforces this. private persistence: Persistence; private localStore: LocalStore; private remoteStore: RemoteStore; diff --git a/packages/firestore/src/local/indexeddb_persistence.ts b/packages/firestore/src/local/indexeddb_persistence.ts index 9155a85bb2e..a070bb44a6d 100644 --- a/packages/firestore/src/local/indexeddb_persistence.ts +++ b/packages/firestore/src/local/indexeddb_persistence.ts @@ -197,9 +197,8 @@ export class IndexedDbPersistence implements Persistence { ALL_STORES, simpleDbTxn => { // Verify that we still have the owner lease as part of every transaction. - const txn = new IndexedDbTransaction(simpleDbTxn); - return this.ensureOwnerLease(txn.simpleDbTransaction).next(() => - operation(txn) + return this.ensureOwnerLease(simpleDbTxn).next(() => + operation(new IndexedDbTransaction(simpleDbTxn)) ); } ); diff --git a/packages/firestore/src/local/memory_persistence.ts b/packages/firestore/src/local/memory_persistence.ts index f0acbaf4a8f..9991d33d76b 100644 --- a/packages/firestore/src/local/memory_persistence.ts +++ b/packages/firestore/src/local/memory_persistence.ts @@ -41,9 +41,7 @@ export class MemoryPersistence implements Persistence { * will make the in-memory persistence layer behave as if it were actually * persisting values. */ - private mutationQueues: { - [user: string]: MutationQueue; - } = {}; + private mutationQueues: { [user: string]: MutationQueue; } = {}; private remoteDocumentCache = new MemoryRemoteDocumentCache(); private queryCache = new MemoryQueryCache(); diff --git a/packages/firestore/src/local/memory_remote_document_cache.ts b/packages/firestore/src/local/memory_remote_document_cache.ts index d5dfc9adae5..881ab8c186d 100644 --- a/packages/firestore/src/local/memory_remote_document_cache.ts +++ b/packages/firestore/src/local/memory_remote_document_cache.ts @@ -22,9 +22,10 @@ import { } from '../model/collections'; import { Document, MaybeDocument } from '../model/document'; import { DocumentKey } from '../model/document_key'; + +import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; -import { PersistenceTransaction } from './persistence'; export class MemoryRemoteDocumentCache implements RemoteDocumentCache { private docs = maybeDocumentMap(); diff --git a/packages/firestore/test/unit/local/local_store.test.ts b/packages/firestore/test/unit/local/local_store.test.ts index e10b3502fff..5ab90cd56d6 100644 --- a/packages/firestore/test/unit/local/local_store.test.ts +++ b/packages/firestore/test/unit/local/local_store.test.ts @@ -273,7 +273,7 @@ describe('LocalStore w/ IndexedDB Persistence', () => { genericLocalStoreTests(persistenceHelpers.testIndexedDbPersistence); }); -function genericLocalStoreTests( +function genericLocalStoreTests( getPersistence: () => Promise ): void { let persistence: Persistence; diff --git a/packages/firestore/test/unit/local/mutation_queue.test.ts b/packages/firestore/test/unit/local/mutation_queue.test.ts index da0fb152c0e..e127514048e 100644 --- a/packages/firestore/test/unit/local/mutation_queue.test.ts +++ b/packages/firestore/test/unit/local/mutation_queue.test.ts @@ -69,9 +69,8 @@ describe('IndexedDbMutationQueue', () => { describe('loadNextBatchIdFromDb', () => { function loadNextBatchId(): Promise { return persistence.runTransaction('loadNextBatchIdFromDb', txn => { - return IndexedDbMutationQueue.loadNextBatchIdFromDb( - txn as IndexedDbTransaction - ).next(batchId => { + return IndexedDbMutationQueue.loadNextBatchIdFromDb(txn) + .next(batchId => { return batchId; }); }); @@ -117,9 +116,9 @@ describe('IndexedDbMutationQueue', () => { * Defines the set of tests to run against both mutation queue * implementations. */ -function genericMutationQueueTests< - TransactionType extends PersistenceTransaction ->(persistencePromise: () => Promise): void { +function genericMutationQueueTests( + persistencePromise: () => Promise +): void { addEqualityMatcher(); let persistence: Persistence; diff --git a/packages/firestore/test/unit/local/query_cache.test.ts b/packages/firestore/test/unit/local/query_cache.test.ts index 388fd6ae0a0..97908e316b8 100644 --- a/packages/firestore/test/unit/local/query_cache.test.ts +++ b/packages/firestore/test/unit/local/query_cache.test.ts @@ -97,7 +97,7 @@ function genericQueryCacheTests( }); afterEach(async () => { - persistence.shutdown(/* deletaData */ true); + persistence.shutdown(/* deletaData= */ true); }); it('returns null for query not in cache', () => { From a94c026128082a82de120eed77b5efcac9753198 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 30 Jul 2018 11:09:27 -0700 Subject: [PATCH 17/25] [AUTOMATED]: Prettier Code Styling --- packages/firestore/src/local/memory_persistence.ts | 2 +- .../firestore/test/unit/local/mutation_queue.test.ts | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/firestore/src/local/memory_persistence.ts b/packages/firestore/src/local/memory_persistence.ts index 9991d33d76b..19e106d0b68 100644 --- a/packages/firestore/src/local/memory_persistence.ts +++ b/packages/firestore/src/local/memory_persistence.ts @@ -41,7 +41,7 @@ export class MemoryPersistence implements Persistence { * will make the in-memory persistence layer behave as if it were actually * persisting values. */ - private mutationQueues: { [user: string]: MutationQueue; } = {}; + private mutationQueues: { [user: string]: MutationQueue } = {}; private remoteDocumentCache = new MemoryRemoteDocumentCache(); private queryCache = new MemoryQueryCache(); diff --git a/packages/firestore/test/unit/local/mutation_queue.test.ts b/packages/firestore/test/unit/local/mutation_queue.test.ts index e127514048e..a68a96215b5 100644 --- a/packages/firestore/test/unit/local/mutation_queue.test.ts +++ b/packages/firestore/test/unit/local/mutation_queue.test.ts @@ -69,10 +69,11 @@ describe('IndexedDbMutationQueue', () => { describe('loadNextBatchIdFromDb', () => { function loadNextBatchId(): Promise { return persistence.runTransaction('loadNextBatchIdFromDb', txn => { - return IndexedDbMutationQueue.loadNextBatchIdFromDb(txn) - .next(batchId => { - return batchId; - }); + return IndexedDbMutationQueue.loadNextBatchIdFromDb(txn).next( + batchId => { + return batchId; + } + ); }); } From 068a4afa72c24d91bb806197889fa3d9c9c2797b Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 30 Jul 2018 11:23:53 -0700 Subject: [PATCH 18/25] Revert some unintentional import churn --- packages/firestore/src/local/indexeddb_mutation_queue.ts | 2 +- packages/firestore/src/local/indexeddb_query_cache.ts | 2 +- packages/firestore/src/local/memory_mutation_queue.ts | 2 +- packages/firestore/src/local/memory_query_cache.ts | 2 +- packages/firestore/test/unit/local/local_store.test.ts | 5 +---- packages/firestore/test/unit/local/mutation_queue.test.ts | 5 +---- 6 files changed, 6 insertions(+), 12 deletions(-) diff --git a/packages/firestore/src/local/indexeddb_mutation_queue.ts b/packages/firestore/src/local/indexeddb_mutation_queue.ts index e87256e6dba..d57e1cdc866 100644 --- a/packages/firestore/src/local/indexeddb_mutation_queue.ts +++ b/packages/firestore/src/local/indexeddb_mutation_queue.ts @@ -38,10 +38,10 @@ import { } from './indexeddb_schema'; import { LocalSerializer } from './local_serializer'; import { MutationQueue } from './mutation_queue'; +import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { SimpleDb, SimpleDbStore } from './simple_db'; import { IndexedDbTransaction } from './indexeddb_persistence'; -import { PersistenceTransaction } from './persistence'; /** A mutation queue for a specific user, backed by IndexedDB. */ export class IndexedDbMutationQueue implements MutationQueue { diff --git a/packages/firestore/src/local/indexeddb_query_cache.ts b/packages/firestore/src/local/indexeddb_query_cache.ts index 6a6df042bfc..e2893035f36 100644 --- a/packages/firestore/src/local/indexeddb_query_cache.ts +++ b/packages/firestore/src/local/indexeddb_query_cache.ts @@ -34,12 +34,12 @@ import { DbTargetKey } from './indexeddb_schema'; import { LocalSerializer } from './local_serializer'; +import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { QueryData } from './query_data'; import { SimpleDb, SimpleDbStore } from './simple_db'; import { IndexedDbTransaction } from './indexeddb_persistence'; -import { PersistenceTransaction } from './persistence'; export class IndexedDbQueryCache implements QueryCache { constructor(private serializer: LocalSerializer) {} diff --git a/packages/firestore/src/local/memory_mutation_queue.ts b/packages/firestore/src/local/memory_mutation_queue.ts index 36675f90760..add67d47220 100644 --- a/packages/firestore/src/local/memory_mutation_queue.ts +++ b/packages/firestore/src/local/memory_mutation_queue.ts @@ -27,9 +27,9 @@ import { SortedSet } from '../util/sorted_set'; import { GarbageCollector } from './garbage_collector'; import { MutationQueue } from './mutation_queue'; +import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { DocReference } from './reference_set'; -import { PersistenceTransaction } from './persistence'; export class MemoryMutationQueue implements MutationQueue { /** diff --git a/packages/firestore/src/local/memory_query_cache.ts b/packages/firestore/src/local/memory_query_cache.ts index acc53b4cea2..6b0166b1d52 100644 --- a/packages/firestore/src/local/memory_query_cache.ts +++ b/packages/firestore/src/local/memory_query_cache.ts @@ -22,12 +22,12 @@ import { DocumentKey } from '../model/document_key'; import { ObjectMap } from '../util/obj_map'; import { GarbageCollector } from './garbage_collector'; +import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { QueryData } from './query_data'; import { ReferenceSet } from './reference_set'; import { assert } from '../util/assert'; -import { PersistenceTransaction } from './persistence'; export class MemoryQueryCache implements QueryCache { /** diff --git a/packages/firestore/test/unit/local/local_store.test.ts b/packages/firestore/test/unit/local/local_store.test.ts index 5ab90cd56d6..3a687040c7c 100644 --- a/packages/firestore/test/unit/local/local_store.test.ts +++ b/packages/firestore/test/unit/local/local_store.test.ts @@ -24,10 +24,7 @@ import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; import { LocalStore, LocalWriteResult } from '../../../src/local/local_store'; import { LocalViewChanges } from '../../../src/local/local_view_changes'; import { NoOpGarbageCollector } from '../../../src/local/no_op_garbage_collector'; -import { - Persistence, - PersistenceTransaction -} from '../../../src/local/persistence'; +import { Persistence } from '../../../src/local/persistence'; import { documentKeySet, DocumentMap, diff --git a/packages/firestore/test/unit/local/mutation_queue.test.ts b/packages/firestore/test/unit/local/mutation_queue.test.ts index a68a96215b5..c0144138c57 100644 --- a/packages/firestore/test/unit/local/mutation_queue.test.ts +++ b/packages/firestore/test/unit/local/mutation_queue.test.ts @@ -25,10 +25,7 @@ import { IndexedDbTransaction } from '../../../src/local/indexeddb_persistence'; import { DbMutationBatch } from '../../../src/local/indexeddb_schema'; -import { - Persistence, - PersistenceTransaction -} from '../../../src/local/persistence'; +import { Persistence } from '../../../src/local/persistence'; import { BATCHID_UNKNOWN, MutationBatch From 8e46ab9db0807c90a8db09c65bf4230d45b50a8f Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 30 Jul 2018 11:27:13 -0700 Subject: [PATCH 19/25] Line 44 should definitely be empty --- packages/firestore/src/core/sync_engine.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/firestore/src/core/sync_engine.ts b/packages/firestore/src/core/sync_engine.ts index edca3cca2cc..29a515478cb 100644 --- a/packages/firestore/src/core/sync_engine.ts +++ b/packages/firestore/src/core/sync_engine.ts @@ -41,6 +41,7 @@ import { ObjectMap } from '../util/obj_map'; import { Deferred } from '../util/promise'; import { SortedMap } from '../util/sorted_map'; import { isNullOrUndefined } from '../util/types'; + import { Query } from './query'; import { SnapshotVersion } from './snapshot_version'; import { TargetIdGenerator } from './target_id_generator'; From 091038c008245918de80e56010a5ca63abe487bd Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 30 Jul 2018 11:47:35 -0700 Subject: [PATCH 20/25] Checkpoint before adding helper function for stores --- .../local/indexeddb_remote_document_cache.ts | 2 +- .../test/unit/local/mutation_queue.test.ts | 28 ++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/firestore/src/local/indexeddb_remote_document_cache.ts b/packages/firestore/src/local/indexeddb_remote_document_cache.ts index 3bc10afb0c0..a0b2d63a015 100644 --- a/packages/firestore/src/local/indexeddb_remote_document_cache.ts +++ b/packages/firestore/src/local/indexeddb_remote_document_cache.ts @@ -22,10 +22,10 @@ import { DocumentKey } from '../model/document_key'; import { DbRemoteDocument, DbRemoteDocumentKey } from './indexeddb_schema'; import { IndexedDbTransaction } from './indexeddb_persistence'; import { LocalSerializer } from './local_serializer'; +import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; import { SimpleDb, SimpleDbStore } from './simple_db'; -import { PersistenceTransaction } from './persistence'; export class IndexedDbRemoteDocumentCache implements RemoteDocumentCache { constructor(private serializer: LocalSerializer) {} diff --git a/packages/firestore/test/unit/local/mutation_queue.test.ts b/packages/firestore/test/unit/local/mutation_queue.test.ts index c0144138c57..2e1e1c13e31 100644 --- a/packages/firestore/test/unit/local/mutation_queue.test.ts +++ b/packages/firestore/test/unit/local/mutation_queue.test.ts @@ -44,8 +44,16 @@ import * as persistenceHelpers from './persistence_test_helpers'; import { TestMutationQueue } from './test_mutation_queue'; import { addEqualityMatcher } from '../../util/equality_matcher'; +let persistence: Persistence; +let mutationQueue: TestMutationQueue; describe('MemoryMutationQueue', () => { - genericMutationQueueTests(persistenceHelpers.testMemoryPersistence); + beforeEach(() => { + return persistenceHelpers.testMemoryPersistence().then(p => { + persistence = p; + }); + }); + + genericMutationQueueTests(); }); describe('IndexedDbMutationQueue', () => { @@ -54,14 +62,13 @@ describe('IndexedDbMutationQueue', () => { return; } - let persistencePromise: Promise; - let persistence: Persistence; - beforeEach(async () => { - persistencePromise = persistenceHelpers.testIndexedDbPersistence(); - persistence = await persistencePromise; + beforeEach(() => { + return persistenceHelpers.testIndexedDbPersistence().then(p => { + persistence = p; + }); }); - genericMutationQueueTests(() => persistencePromise); + genericMutationQueueTests(); describe('loadNextBatchIdFromDb', () => { function loadNextBatchId(): Promise { @@ -114,15 +121,10 @@ describe('IndexedDbMutationQueue', () => { * Defines the set of tests to run against both mutation queue * implementations. */ -function genericMutationQueueTests( - persistencePromise: () => Promise -): void { +function genericMutationQueueTests(): void { addEqualityMatcher(); - let persistence: Persistence; - let mutationQueue: TestMutationQueue; beforeEach(async () => { - persistence = await persistencePromise(); mutationQueue = new TestMutationQueue( persistence, persistence.getMutationQueue(new User('user')) From f0ed2dd9eb7da49bd42dbb5438043f3c343988fc Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 30 Jul 2018 12:25:14 -0700 Subject: [PATCH 21/25] Use a helper for casting PersistenceTransaction to IndexedDbTransaction --- .../src/local/indexeddb_mutation_queue.ts | 16 ++++++++-------- .../firestore/src/local/indexeddb_persistence.ts | 15 +++++++++++++-- .../firestore/src/local/indexeddb_query_cache.ts | 16 ++++++++-------- .../src/local/indexeddb_remote_document_cache.ts | 8 ++++---- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/packages/firestore/src/local/indexeddb_mutation_queue.ts b/packages/firestore/src/local/indexeddb_mutation_queue.ts index d57e1cdc866..e2178f724ea 100644 --- a/packages/firestore/src/local/indexeddb_mutation_queue.ts +++ b/packages/firestore/src/local/indexeddb_mutation_queue.ts @@ -40,8 +40,8 @@ import { LocalSerializer } from './local_serializer'; import { MutationQueue } from './mutation_queue'; import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; -import { SimpleDb, SimpleDbStore } from './simple_db'; -import { IndexedDbTransaction } from './indexeddb_persistence'; +import { SimpleDbStore } from './simple_db'; +import { IndexedDbPersistence } from './indexeddb_persistence'; /** A mutation queue for a specific user, backed by IndexedDB. */ export class IndexedDbMutationQueue implements MutationQueue { @@ -564,8 +564,8 @@ function convertStreamToken(token: ProtoByteString): string { function mutationsStore( txn: PersistenceTransaction ): SimpleDbStore { - return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + return IndexedDbPersistence.getStore( + txn, DbMutationBatch.store ); } @@ -576,8 +576,8 @@ function mutationsStore( function documentMutationsStore( txn: PersistenceTransaction ): SimpleDbStore { - return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + return IndexedDbPersistence.getStore( + txn, DbDocumentMutation.store ); } @@ -588,8 +588,8 @@ function documentMutationsStore( function mutationQueuesStore( txn: PersistenceTransaction ): SimpleDbStore { - return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + return IndexedDbPersistence.getStore( + txn, DbMutationQueue.store ); } diff --git a/packages/firestore/src/local/indexeddb_persistence.ts b/packages/firestore/src/local/indexeddb_persistence.ts index a070bb44a6d..65032e0d289 100644 --- a/packages/firestore/src/local/indexeddb_persistence.ts +++ b/packages/firestore/src/local/indexeddb_persistence.ts @@ -17,7 +17,7 @@ import { User } from '../auth/user'; import { DatabaseInfo } from '../core/database_info'; import { JsonProtoSerializer } from '../remote/serializer'; -import { assert } from '../util/assert'; +import { assert, fail } from '../util/assert'; import { Code, FirestoreError } from '../util/error'; import * as log from '../util/log'; import { AutoId } from '../util/misc'; @@ -38,7 +38,7 @@ import { Persistence, PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { RemoteDocumentCache } from './remote_document_cache'; -import { SimpleDb, SimpleDbTransaction } from './simple_db'; +import { SimpleDb, SimpleDbStore, SimpleDbTransaction } from './simple_db'; const LOG_TAG = 'IndexedDbPersistence'; @@ -95,6 +95,17 @@ export class IndexedDbTransaction extends PersistenceTransaction { * owner lease immediately regardless of the current lease timestamp. */ export class IndexedDbPersistence implements Persistence { + static getStore( + txn: PersistenceTransaction, + store: string + ): SimpleDbStore { + if (txn instanceof IndexedDbTransaction) { + return SimpleDb.getStore(txn.simpleDbTransaction, store); + } else { + fail('IndexedDbPersistence must use instances of IndexedDbTransaction'); + } + } + /** * The name of the main (and currently only) IndexedDB database. this name is * appended to the prefix provided to the IndexedDbPersistence constructor. diff --git a/packages/firestore/src/local/indexeddb_query_cache.ts b/packages/firestore/src/local/indexeddb_query_cache.ts index e2893035f36..09a6db2a2e0 100644 --- a/packages/firestore/src/local/indexeddb_query_cache.ts +++ b/packages/firestore/src/local/indexeddb_query_cache.ts @@ -38,8 +38,8 @@ import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { QueryCache } from './query_cache'; import { QueryData } from './query_data'; -import { SimpleDb, SimpleDbStore } from './simple_db'; -import { IndexedDbTransaction } from './indexeddb_persistence'; +import { SimpleDbStore } from './simple_db'; +import { IndexedDbPersistence } from './indexeddb_persistence'; export class IndexedDbQueryCache implements QueryCache { constructor(private serializer: LocalSerializer) {} @@ -338,8 +338,8 @@ export class IndexedDbQueryCache implements QueryCache { function targetsStore( txn: PersistenceTransaction ): SimpleDbStore { - return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + return IndexedDbPersistence.getStore( + txn, DbTarget.store ); } @@ -350,8 +350,8 @@ function targetsStore( function globalTargetStore( txn: PersistenceTransaction ): SimpleDbStore { - return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + return IndexedDbPersistence.getStore( + txn, DbTargetGlobal.store ); } @@ -362,8 +362,8 @@ function globalTargetStore( function documentTargetStore( txn: PersistenceTransaction ): SimpleDbStore { - return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + return IndexedDbPersistence.getStore( + txn, DbTargetDocument.store ); } diff --git a/packages/firestore/src/local/indexeddb_remote_document_cache.ts b/packages/firestore/src/local/indexeddb_remote_document_cache.ts index a0b2d63a015..da51ef0a8d9 100644 --- a/packages/firestore/src/local/indexeddb_remote_document_cache.ts +++ b/packages/firestore/src/local/indexeddb_remote_document_cache.ts @@ -20,12 +20,12 @@ import { Document, MaybeDocument } from '../model/document'; import { DocumentKey } from '../model/document_key'; import { DbRemoteDocument, DbRemoteDocumentKey } from './indexeddb_schema'; -import { IndexedDbTransaction } from './indexeddb_persistence'; +import { IndexedDbPersistence } from './indexeddb_persistence'; import { LocalSerializer } from './local_serializer'; import { PersistenceTransaction } from './persistence'; import { PersistencePromise } from './persistence_promise'; import { RemoteDocumentCache } from './remote_document_cache'; -import { SimpleDb, SimpleDbStore } from './simple_db'; +import { SimpleDbStore } from './simple_db'; export class IndexedDbRemoteDocumentCache implements RemoteDocumentCache { constructor(private serializer: LocalSerializer) {} @@ -89,8 +89,8 @@ export class IndexedDbRemoteDocumentCache implements RemoteDocumentCache { function remoteDocumentsStore( txn: PersistenceTransaction ): SimpleDbStore { - return SimpleDb.getStore( - (txn as IndexedDbTransaction).simpleDbTransaction, + return IndexedDbPersistence.getStore( + txn, DbRemoteDocument.store ); } From ca53e3122fff70bc70e4fda801941b5abf82d45e Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 30 Jul 2018 12:25:46 -0700 Subject: [PATCH 22/25] [AUTOMATED]: Prettier Code Styling --- packages/firestore/src/local/indexeddb_mutation_queue.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/firestore/src/local/indexeddb_mutation_queue.ts b/packages/firestore/src/local/indexeddb_mutation_queue.ts index e2178f724ea..441ca0f91d3 100644 --- a/packages/firestore/src/local/indexeddb_mutation_queue.ts +++ b/packages/firestore/src/local/indexeddb_mutation_queue.ts @@ -576,10 +576,10 @@ function mutationsStore( function documentMutationsStore( txn: PersistenceTransaction ): SimpleDbStore { - return IndexedDbPersistence.getStore( - txn, - DbDocumentMutation.store - ); + return IndexedDbPersistence.getStore< + DbDocumentMutationKey, + DbDocumentMutation + >(txn, DbDocumentMutation.store); } /** From 4193323dd55def1413fc8ea20441613a308abb0c Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 30 Jul 2018 13:20:42 -0700 Subject: [PATCH 23/25] Remove errant generic type --- .../firestore/test/unit/local/mutation_queue.test.ts | 9 +++------ .../test/unit/local/remote_document_cache.test.ts | 6 +++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/firestore/test/unit/local/mutation_queue.test.ts b/packages/firestore/test/unit/local/mutation_queue.test.ts index 2e1e1c13e31..fc47f045f8a 100644 --- a/packages/firestore/test/unit/local/mutation_queue.test.ts +++ b/packages/firestore/test/unit/local/mutation_queue.test.ts @@ -20,10 +20,7 @@ import { Query } from '../../../src/core/query'; import { BatchId } from '../../../src/core/types'; import { EagerGarbageCollector } from '../../../src/local/eager_garbage_collector'; import { IndexedDbMutationQueue } from '../../../src/local/indexeddb_mutation_queue'; -import { - IndexedDbPersistence, - IndexedDbTransaction -} from '../../../src/local/indexeddb_persistence'; +import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; import { DbMutationBatch } from '../../../src/local/indexeddb_schema'; import { Persistence } from '../../../src/local/persistence'; import { @@ -83,10 +80,10 @@ describe('IndexedDbMutationQueue', () => { function addDummyBatch(userId: string, batchId: BatchId): Promise { return persistence.runTransaction('addDummyBatch', transaction => { - const store = (transaction as IndexedDbTransaction).simpleDbTransaction.store< + const store = IndexedDbPersistence.getStore< [string, number], DbMutationBatch - >(DbMutationBatch.store); + >(transaction, DbMutationBatch.store); const localWriteTime = Date.now(); return store.put( new DbMutationBatch(userId, batchId, localWriteTime, []) diff --git a/packages/firestore/test/unit/local/remote_document_cache.test.ts b/packages/firestore/test/unit/local/remote_document_cache.test.ts index b4cba12ef89..6c44c4df9eb 100644 --- a/packages/firestore/test/unit/local/remote_document_cache.test.ts +++ b/packages/firestore/test/unit/local/remote_document_cache.test.ts @@ -44,9 +44,9 @@ describe('IndexedDbRemoteDocumentCache', () => { * Defines the set of tests to run against both remote document cache * implementations. */ -function genericRemoteDocumentCacheTests< - TransactionType extends PersistenceTransaction ->(persistencePromise: () => Promise): void { +function genericRemoteDocumentCacheTests( + persistencePromise: () => Promise +): void { // Helpers for use throughout tests. const DOC_PATH = 'a/b'; const LONG_DOC_PATH = 'a/b/c/d/e/f'; From 1a39850bfbaef91e60b069e0ba235d84b7eca3d3 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 30 Jul 2018 13:39:26 -0700 Subject: [PATCH 24/25] Lint --- .../firestore/test/unit/local/remote_document_cache.test.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/firestore/test/unit/local/remote_document_cache.test.ts b/packages/firestore/test/unit/local/remote_document_cache.test.ts index 6c44c4df9eb..6293db77677 100644 --- a/packages/firestore/test/unit/local/remote_document_cache.test.ts +++ b/packages/firestore/test/unit/local/remote_document_cache.test.ts @@ -17,10 +17,7 @@ import { expect } from 'chai'; import { Query } from '../../../src/core/query'; import { IndexedDbPersistence } from '../../../src/local/indexeddb_persistence'; -import { - Persistence, - PersistenceTransaction -} from '../../../src/local/persistence'; +import { Persistence } from '../../../src/local/persistence'; import { MaybeDocument } from '../../../src/model/document'; import { deletedDoc, doc, expectEqual, key, path } from '../../util/helpers'; From 9e570c87326061f957d2ece60ebb0db1493fe369 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Tue, 31 Jul 2018 09:28:17 -0700 Subject: [PATCH 25/25] Fix typo --- packages/firestore/test/unit/local/query_cache.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firestore/test/unit/local/query_cache.test.ts b/packages/firestore/test/unit/local/query_cache.test.ts index 97908e316b8..b268419e773 100644 --- a/packages/firestore/test/unit/local/query_cache.test.ts +++ b/packages/firestore/test/unit/local/query_cache.test.ts @@ -97,7 +97,7 @@ function genericQueryCacheTests( }); afterEach(async () => { - persistence.shutdown(/* deletaData= */ true); + persistence.shutdown(/* deleteData= */ true); }); it('returns null for query not in cache', () => {