Skip to content

Commit de138b5

Browse files
Merge
2 parents 0612525 + f22f300 commit de138b5

File tree

9 files changed

+98
-69
lines changed

9 files changed

+98
-69
lines changed

.changeset/late-ladybugs-wash.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---

packages/firestore/exp/src/api/database.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ import { AsyncQueue } from '../../../src/util/async_queue';
3030
import {
3131
ComponentProvider,
3232
IndexedDbComponentProvider,
33-
MemoryComponentProvider
33+
MemoryComponentProvider,
34+
MultiTabIndexedDbComponentProvider
3435
} from '../../../src/core/component_provider';
3536

3637
import {
@@ -244,8 +245,8 @@ export function enableMultiTabIndexedDbPersistence(
244245
): Promise<void> {
245246
const firestoreImpl = cast(firestore, Firestore);
246247
return firestoreImpl._enablePersistence(
247-
new IndexedDbComponentProvider(),
248-
/*synchronizeTabs=*/ true
248+
new MultiTabIndexedDbComponentProvider(),
249+
/*synchronizeTabs=*/ false
249250
);
250251
}
251252

packages/firestore/exp/test/deps/dependencies.json

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8881,11 +8881,6 @@
88818881
"createQueryCache",
88828882
"createRemoteDocumentCache",
88838883
"createRemoteDocumentReadTimeIndex",
8884-
"createWebStorageClientStateKey",
8885-
"createWebStorageMutationBatchKey",
8886-
"createWebStorageOnlineStateKey",
8887-
"createWebStorageQueryTargetMetadataKey",
8888-
"createWebStorageSequenceNumberKey",
88898884
"dbDocumentSize",
88908885
"dbKey",
88918886
"debugAssert",
@@ -8950,7 +8945,6 @@
89508945
"fromVersion",
89518946
"fromWatchChange",
89528947
"fromWatchTargetChangeState",
8953-
"fromWebStorageSequenceNumber",
89548948
"fromWriteResult",
89558949
"fromWriteResults",
89568950
"fullyQualifiedPrefixPath",
@@ -8984,7 +8978,6 @@
89848978
"isPermanentError",
89858979
"isPermanentWriteError",
89868980
"isReferenceValue",
8987-
"isSafeInteger",
89888981
"isServerTimestamp",
89898982
"isValidResourceName",
89908983
"loadProtos",
@@ -9003,8 +8996,6 @@
90038996
"newConnectivityMonitor",
90048997
"newDatastore",
90058998
"newLocalStore",
9006-
"newMultiTabLocalStore",
9007-
"newMultiTabSyncEngine",
90088999
"newPersistentWatchStream",
90099000
"newPersistentWriteStream",
90109001
"newQueryComparator",
@@ -9192,12 +9183,9 @@
91929183
"MemorySharedClientState",
91939184
"MemoryTargetCache",
91949185
"MemoryTransaction",
9195-
"MultiTabLocalStoreImpl",
9196-
"MultiTabSyncEngineImpl",
91979186
"Mutation",
91989187
"MutationBatch",
91999188
"MutationBatchResult",
9200-
"MutationMetadata",
92019189
"MutationResult",
92029190
"NoDocument",
92039191
"NoopConnectivityMonitor",
@@ -9218,10 +9206,8 @@
92189206
"Query",
92199207
"QueryListener",
92209208
"QueryListenersInfo",
9221-
"QueryTargetMetadata",
92229209
"QueryView",
92239210
"ReferenceSet",
9224-
"RemoteClientState",
92259211
"RemoteDocumentChangeBuffer",
92269212
"RemoteEvent",
92279213
"RemoteStore",
@@ -9231,7 +9217,6 @@
92319217
"SchemaConverter",
92329218
"ServerTimestampTransform",
92339219
"SetMutation",
9234-
"SharedOnlineState",
92359220
"SimpleDb",
92369221
"SimpleDbStore",
92379222
"SimpleDbTransaction",
@@ -9258,12 +9243,15 @@
92589243
"View",
92599244
"ViewSnapshot",
92609245
"WatchChangeAggregator",
9261-
"WatchTargetChange",
9262-
"WebStorageSharedClientState"
9246+
"WatchTargetChange"
92639247
],
92649248
"variables": []
92659249
},
9250+
<<<<<<< HEAD
92669251
"sizeInBytes": 335996
9252+
=======
9253+
"sizeInBytes": 311847
9254+
>>>>>>> mrschmidt/optmultitab
92679255
},
92689256
"enableMultiTabIndexedDbPersistence": {
92699257
"dependencies": {
@@ -9642,6 +9630,7 @@
96429630
"MemorySharedClientState",
96439631
"MemoryTargetCache",
96449632
"MemoryTransaction",
9633+
"MultiTabIndexedDbComponentProvider",
96459634
"MultiTabLocalStoreImpl",
96469635
"MultiTabSyncEngineImpl",
96479636
"Mutation",
@@ -9713,7 +9702,11 @@
97139702
],
97149703
"variables": []
97159704
},
9705+
<<<<<<< HEAD
97169706
"sizeInBytes": 336011
9707+
=======
9708+
"sizeInBytes": 336213
9709+
>>>>>>> mrschmidt/optmultitab
97179710
},
97189711
"enableNetwork": {
97199712
"dependencies": {

packages/firestore/index.node.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import firebase from '@firebase/app';
1818
import { FirebaseNamespace } from '@firebase/app-types';
1919

2020
import { Firestore } from './src/api/database';
21-
import { IndexedDbComponentProvider } from './src/core/component_provider';
21+
import { MultiTabIndexedDbComponentProvider } from './src/core/component_provider';
2222
import { configureForFirebase } from './src/config';
2323

2424
import './register-module';
@@ -32,7 +32,8 @@ import { name, version } from './package.json';
3232
export function registerFirestore(instance: FirebaseNamespace): void {
3333
configureForFirebase(
3434
instance,
35-
(app, auth) => new Firestore(app, auth, new IndexedDbComponentProvider())
35+
(app, auth) =>
36+
new Firestore(app, auth, new MultiTabIndexedDbComponentProvider())
3637
);
3738
instance.registerVersion(name, version, 'node');
3839
}

packages/firestore/index.rn.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import firebase from '@firebase/app';
1818
import { FirebaseNamespace } from '@firebase/app-types';
1919

2020
import { Firestore } from './src/api/database';
21-
import { IndexedDbComponentProvider } from './src/core/component_provider';
21+
import { MultiTabIndexedDbComponentProvider } from './src/core/component_provider';
2222
import { configureForFirebase } from './src/config';
2323

2424
import './register-module';
@@ -31,7 +31,8 @@ import { name, version } from './package.json';
3131
export function registerFirestore(instance: FirebaseNamespace): void {
3232
configureForFirebase(
3333
instance,
34-
(app, auth) => new Firestore(app, auth, new IndexedDbComponentProvider())
34+
(app, auth) =>
35+
new Firestore(app, auth, new MultiTabIndexedDbComponentProvider())
3536
);
3637
instance.registerVersion(name, version, 'rn');
3738
}

packages/firestore/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import firebase from '@firebase/app';
1919
import { FirebaseNamespace } from '@firebase/app-types';
2020

2121
import { Firestore } from './src/api/database';
22-
import { IndexedDbComponentProvider } from './src/core/component_provider';
22+
import { MultiTabIndexedDbComponentProvider } from './src/core/component_provider';
2323
import { configureForFirebase } from './src/config';
2424
import { name, version } from './package.json';
2525

@@ -32,7 +32,8 @@ import './register-module';
3232
export function registerFirestore(instance: FirebaseNamespace): void {
3333
configureForFirebase(
3434
instance,
35-
(app, auth) => new Firestore(app, auth, new IndexedDbComponentProvider())
35+
(app, auth) =>
36+
new Firestore(app, auth, new MultiTabIndexedDbComponentProvider())
3637
);
3738
instance.registerVersion(name, version);
3839
}

packages/firestore/src/core/component_provider.ts

Lines changed: 68 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -206,52 +206,23 @@ export class MemoryComponentProvider implements ComponentProvider {
206206
export class IndexedDbComponentProvider extends MemoryComponentProvider {
207207
persistence!: IndexedDbPersistence;
208208

209-
// TODO(tree-shaking): Create an IndexedDbComponentProvider and a
210-
// MultiTabComponentProvider. The IndexedDbComponentProvider should depend
211-
// on LocalStore and SyncEngine.
212-
localStore!: MultiTabLocalStore;
213-
syncEngine!: MultiTabSyncEngine;
214-
215-
async initialize(cfg: ComponentConfiguration): Promise<void> {
216-
await super.initialize(cfg);
217-
218-
// NOTE: This will immediately call the listener, so we make sure to
219-
// set it after localStore / remoteStore are started.
220-
await this.persistence.setPrimaryStateListener(async isPrimary => {
221-
await (this.syncEngine as MultiTabSyncEngine).applyPrimaryState(
222-
isPrimary
223-
);
224-
if (this.gcScheduler) {
225-
if (isPrimary && !this.gcScheduler.started) {
226-
this.gcScheduler.start(this.localStore);
227-
} else if (!isPrimary) {
228-
this.gcScheduler.stop();
229-
}
230-
}
231-
});
232-
}
233-
234209
createLocalStore(cfg: ComponentConfiguration): LocalStore {
235-
return newMultiTabLocalStore(
210+
return newLocalStore(
236211
this.persistence,
237212
new IndexFreeQueryEngine(),
238213
cfg.initialUser
239214
);
240215
}
241216

242217
createSyncEngine(cfg: ComponentConfiguration): SyncEngine {
243-
const syncEngine = newMultiTabSyncEngine(
218+
return newSyncEngine(
244219
this.localStore,
245220
this.remoteStore,
246221
cfg.datastore,
247222
this.sharedClientState,
248223
cfg.initialUser,
249224
cfg.maxConcurrentLimboResolutions
250225
);
251-
if (this.sharedClientState instanceof WebStorageSharedClientState) {
252-
this.sharedClientState.syncEngine = syncEngine;
253-
}
254-
return syncEngine;
255226
}
256227

257228
createGarbageCollectionScheduler(
@@ -287,6 +258,72 @@ export class IndexedDbComponentProvider extends MemoryComponentProvider {
287258
);
288259
}
289260

261+
createSharedClientState(cfg: ComponentConfiguration): SharedClientState {
262+
return new MemorySharedClientState();
263+
}
264+
265+
clearPersistence(
266+
databaseId: DatabaseId,
267+
persistenceKey: string
268+
): Promise<void> {
269+
return clearPersistence(buildStoragePrefix(databaseId, persistenceKey));
270+
}
271+
}
272+
273+
/**
274+
* Provides all components needed for Firestore with multi-tab IndexedDB
275+
* persistence.
276+
*
277+
* In the legacy client, this provider is used to provide both multi-tab and
278+
* non-multi-tab persistence since we cannot tell at build time whether
279+
* `synchronizeTabs` will be enabled.
280+
*/
281+
export class MultiTabIndexedDbComponentProvider extends IndexedDbComponentProvider {
282+
localStore!: MultiTabLocalStore;
283+
syncEngine!: MultiTabSyncEngine;
284+
285+
async initialize(cfg: ComponentConfiguration): Promise<void> {
286+
await super.initialize(cfg);
287+
288+
// NOTE: This will immediately call the listener, so we make sure to
289+
// set it after localStore / remoteStore are started.
290+
await this.persistence.setPrimaryStateListener(async isPrimary => {
291+
await (this.syncEngine as MultiTabSyncEngine).applyPrimaryState(
292+
isPrimary
293+
);
294+
if (this.gcScheduler) {
295+
if (isPrimary && !this.gcScheduler.started) {
296+
this.gcScheduler.start(this.localStore);
297+
} else if (!isPrimary) {
298+
this.gcScheduler.stop();
299+
}
300+
}
301+
});
302+
}
303+
304+
createLocalStore(cfg: ComponentConfiguration): LocalStore {
305+
return newMultiTabLocalStore(
306+
this.persistence,
307+
new IndexFreeQueryEngine(),
308+
cfg.initialUser
309+
);
310+
}
311+
312+
createSyncEngine(cfg: ComponentConfiguration): SyncEngine {
313+
const syncEngine = newMultiTabSyncEngine(
314+
this.localStore,
315+
this.remoteStore,
316+
cfg.datastore,
317+
this.sharedClientState,
318+
cfg.initialUser,
319+
cfg.maxConcurrentLimboResolutions
320+
);
321+
if (this.sharedClientState instanceof WebStorageSharedClientState) {
322+
this.sharedClientState.syncEngine = syncEngine;
323+
}
324+
return syncEngine;
325+
}
326+
290327
createSharedClientState(cfg: ComponentConfiguration): SharedClientState {
291328
if (
292329
cfg.persistenceSettings.durable &&
@@ -313,11 +350,4 @@ export class IndexedDbComponentProvider extends MemoryComponentProvider {
313350
}
314351
return new MemorySharedClientState();
315352
}
316-
317-
clearPersistence(
318-
databaseId: DatabaseId,
319-
persistenceKey: string
320-
): Promise<void> {
321-
return clearPersistence(buildStoragePrefix(databaseId, persistenceKey));
322-
}
323353
}

packages/firestore/test/unit/specs/spec_test_components.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717

1818
import {
1919
ComponentConfiguration,
20-
IndexedDbComponentProvider,
21-
MemoryComponentProvider
20+
MemoryComponentProvider,
21+
MultiTabIndexedDbComponentProvider
2222
} from '../../../src/core/component_provider';
2323
import {
2424
GarbageCollectionScheduler,
@@ -117,7 +117,7 @@ function failTransactionIfNeeded(
117117
}
118118
}
119119

120-
export class MockIndexedDbComponentProvider extends IndexedDbComponentProvider {
120+
export class MockIndexedDbComponentProvider extends MultiTabIndexedDbComponentProvider {
121121
persistence!: MockIndexedDbPersistence;
122122

123123
constructor(

packages/firestore/test/util/api_helpers.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {
2626
Query,
2727
QuerySnapshot
2828
} from '../../src/api/database';
29-
import { IndexedDbComponentProvider } from '../../src/core/component_provider';
29+
import { MultiTabIndexedDbComponentProvider } from '../../src/core/component_provider';
3030
import { Query as InternalQuery } from '../../src/core/query';
3131
import {
3232
ChangeType,
@@ -49,7 +49,7 @@ export const FIRESTORE = new Firestore(
4949
database: '(default)'
5050
},
5151
new Provider('auth-internal', new ComponentContainer('default')),
52-
new IndexedDbComponentProvider()
52+
new MultiTabIndexedDbComponentProvider()
5353
);
5454

5555
export function firestore(): Firestore {

0 commit comments

Comments
 (0)