Skip to content

Commit 5902cb8

Browse files
Extract Offline-only component provider
1 parent e117354 commit 5902cb8

File tree

16 files changed

+606
-439
lines changed

16 files changed

+606
-439
lines changed

packages/firestore/exp/dependencies.json

Lines changed: 191 additions & 189 deletions
Large diffs are not rendered by default.

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

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@ import {
2828
} from '../../../src/core/firestore_client';
2929
import { AsyncQueue } from '../../../src/util/async_queue';
3030
import {
31-
ComponentProvider,
32-
IndexedDbComponentProvider,
33-
MemoryComponentProvider,
34-
MultiTabIndexedDbComponentProvider
31+
OnlineComponentProvider,
32+
MemoryOfflineComponentProvider,
33+
OfflineComponentProvider,
34+
IndexedDbOfflineComponentProvider,
35+
MultiTabOfflineComponentProvider,
36+
MultiTabOnlineComponentProvider
3537
} from '../../../src/core/component_provider';
3638

3739
import {
@@ -60,7 +62,8 @@ export class Firestore extends LiteFirestore
6062
private readonly _queue = new AsyncQueue();
6163
private readonly _firestoreClient: FirestoreClient;
6264
private readonly _persistenceKey: string;
63-
private _componentProvider: ComponentProvider = new MemoryComponentProvider();
65+
private _offlineComponentProvider: OfflineComponentProvider = new MemoryOfflineComponentProvider();
66+
private _onlineComponentProvider = new OnlineComponentProvider();
6467

6568
// Assigned via _getFirestoreClient()
6669
private _deferredInitialization?: Promise<void>;
@@ -106,7 +109,8 @@ export class Firestore extends LiteFirestore
106109

107110
this._deferredInitialization = this._firestoreClient.start(
108111
databaseInfo,
109-
this._componentProvider,
112+
this._offlineComponentProvider,
113+
this._onlineComponentProvider,
110114
this._persistenceSettings
111115
);
112116
}
@@ -117,7 +121,8 @@ export class Firestore extends LiteFirestore
117121
// TODO(firestorexp): Factor out MultiTabComponentProvider and remove
118122
// `synchronizeTabs` argument
119123
_enablePersistence(
120-
persistenceProvider: ComponentProvider,
124+
offlineComponentProvider: OfflineComponentProvider,
125+
onlineComponentProvider: OnlineComponentProvider,
121126
synchronizeTabs: boolean
122127
): Promise<void> {
123128
if (this._deferredInitialization) {
@@ -137,7 +142,7 @@ export class Firestore extends LiteFirestore
137142
cacheSizeBytes:
138143
settings.cacheSizeBytes ?? LruParams.DEFAULT_CACHE_SIZE_BYTES
139144
};
140-
this._componentProvider = persistenceProvider;
145+
this._offlineComponentProvider = offlineComponentProvider;
141146

142147
// TODO(firestorexp): Add support for Persistence fallback
143148
return this._getFirestoreClient().then(() => {});
@@ -235,7 +240,8 @@ export function enableIndexedDbPersistence(
235240
): Promise<void> {
236241
const firestoreImpl = cast(firestore, Firestore);
237242
return firestoreImpl._enablePersistence(
238-
new IndexedDbComponentProvider(),
243+
new IndexedDbOfflineComponentProvider(),
244+
new OnlineComponentProvider(),
239245
/*synchronizeTabs=*/ false
240246
);
241247
}
@@ -245,7 +251,8 @@ export function enableMultiTabIndexedDbPersistence(
245251
): Promise<void> {
246252
const firestoreImpl = cast(firestore, Firestore);
247253
return firestoreImpl._enablePersistence(
248-
new MultiTabIndexedDbComponentProvider(),
254+
new MultiTabOfflineComponentProvider(),
255+
new MultiTabOnlineComponentProvider(),
249256
/*synchronizeTabs=*/ false
250257
);
251258
}

packages/firestore/index.memory.ts

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

2121
import { Firestore } from './src/api/database';
22-
import { MemoryComponentProvider } from './src/core/component_provider';
22+
import {
23+
MemoryOfflineComponentProvider,
24+
OnlineComponentProvider
25+
} from './src/core/component_provider';
2326
import { configureForFirebase } from './src/config';
2427

2528
import './register-module';
@@ -32,7 +35,13 @@ import { name, version } from './package.json';
3235
export function registerFirestore(instance: FirebaseNamespace): void {
3336
configureForFirebase(
3437
instance,
35-
(app, auth) => new Firestore(app, auth, new MemoryComponentProvider())
38+
(app, auth) =>
39+
new Firestore(
40+
app,
41+
auth,
42+
new MemoryOfflineComponentProvider(),
43+
new OnlineComponentProvider()
44+
)
3645
);
3746
instance.registerVersion(name, version);
3847
}

packages/firestore/index.node.memory.ts

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

2121
import { Firestore } from './src/api/database';
22-
import { MemoryComponentProvider } from './src/core/component_provider';
22+
import {
23+
MemoryOfflineComponentProvider,
24+
OnlineComponentProvider
25+
} from './src/core/component_provider';
2326
import { configureForFirebase } from './src/config';
2427
import './register-module';
2528

@@ -32,7 +35,13 @@ import { name, version } from './package.json';
3235
export function registerFirestore(instance: FirebaseNamespace): void {
3336
configureForFirebase(
3437
instance,
35-
(app, auth) => new Firestore(app, auth, new MemoryComponentProvider())
38+
(app, auth) =>
39+
new Firestore(
40+
app,
41+
auth,
42+
new MemoryOfflineComponentProvider(),
43+
new OnlineComponentProvider()
44+
)
3645
);
3746
instance.registerVersion(name, version, 'node');
3847
}

packages/firestore/index.node.ts

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

2020
import { Firestore } from './src/api/database';
21-
import { MultiTabIndexedDbComponentProvider } from './src/core/component_provider';
21+
import {
22+
MultiTabOfflineComponentProvider, MultiTabOnlineComponentProvider
23+
} from './src/core/component_provider';
2224
import { configureForFirebase } from './src/config';
2325

2426
import './register-module';
@@ -33,7 +35,12 @@ export function registerFirestore(instance: FirebaseNamespace): void {
3335
configureForFirebase(
3436
instance,
3537
(app, auth) =>
36-
new Firestore(app, auth, new MultiTabIndexedDbComponentProvider())
38+
new Firestore(
39+
app,
40+
auth,
41+
new MultiTabOfflineComponentProvider(),
42+
new MultiTabOnlineComponentProvider()
43+
)
3744
);
3845
instance.registerVersion(name, version, 'node');
3946
}

packages/firestore/index.rn.memory.ts

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

2121
import { Firestore } from './src/api/database';
22-
import { MemoryComponentProvider } from './src/core/component_provider';
22+
import {
23+
MemoryOfflineComponentProvider,
24+
OnlineComponentProvider
25+
} from './src/core/component_provider';
2326
import { configureForFirebase } from './src/config';
2427

2528
import './register-module';
@@ -33,7 +36,13 @@ import { name, version } from './package.json';
3336
export function registerFirestore(instance: FirebaseNamespace): void {
3437
configureForFirebase(
3538
instance,
36-
(app, auth) => new Firestore(app, auth, new MemoryComponentProvider())
39+
(app, auth) =>
40+
new Firestore(
41+
app,
42+
auth,
43+
new MemoryOfflineComponentProvider(),
44+
new OnlineComponentProvider()
45+
)
3746
);
3847
instance.registerVersion(name, version, 'rn');
3948
}

packages/firestore/index.rn.ts

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

2020
import { Firestore } from './src/api/database';
21-
import { MultiTabIndexedDbComponentProvider } from './src/core/component_provider';
21+
import {
22+
MultiTabOfflineComponentProvider,
23+
MultiTabOnlineComponentProvider
24+
} from './src/core/component_provider';
2225
import { configureForFirebase } from './src/config';
2326

2427
import './register-module';
@@ -32,7 +35,12 @@ export function registerFirestore(instance: FirebaseNamespace): void {
3235
configureForFirebase(
3336
instance,
3437
(app, auth) =>
35-
new Firestore(app, auth, new MultiTabIndexedDbComponentProvider())
38+
new Firestore(
39+
app,
40+
auth,
41+
new MultiTabOfflineComponentProvider(),
42+
new MultiTabOnlineComponentProvider()
43+
)
3644
);
3745
instance.registerVersion(name, version, 'rn');
3846
}

packages/firestore/index.ts

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

2121
import { Firestore } from './src/api/database';
22-
import { MultiTabIndexedDbComponentProvider } from './src/core/component_provider';
22+
import {
23+
MultiTabOfflineComponentProvider, MultiTabOnlineComponentProvider
24+
} from './src/core/component_provider';
2325
import { configureForFirebase } from './src/config';
2426
import { name, version } from './package.json';
2527

@@ -33,7 +35,12 @@ export function registerFirestore(instance: FirebaseNamespace): void {
3335
configureForFirebase(
3436
instance,
3537
(app, auth) =>
36-
new Firestore(app, auth, new MultiTabIndexedDbComponentProvider())
38+
new Firestore(
39+
app,
40+
auth,
41+
new MultiTabOfflineComponentProvider(),
42+
new MultiTabOnlineComponentProvider()
43+
)
3744
);
3845
instance.registerVersion(name, version);
3946
}

packages/firestore/lite/src/api/reference.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,11 @@ export function parent<T>(
526526
if (parentPath.isEmpty()) {
527527
return null;
528528
} else {
529-
return new DocumentReference(child.firestore, /* converter= */ null, parentPath);
529+
return new DocumentReference(
530+
child.firestore,
531+
/* converter= */ null,
532+
parentPath
533+
);
530534
}
531535
} else {
532536
const doc = cast<DocumentReference<T>>(child, DocumentReference);

packages/firestore/src/api/database.ts

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ import { _FirebaseApp, FirebaseService } from '@firebase/app-types/private';
2424
import { DatabaseId, DatabaseInfo } from '../core/database_info';
2525
import { ListenOptions } from '../core/event_manager';
2626
import {
27-
ComponentProvider,
28-
MemoryComponentProvider
27+
OnlineComponentProvider,
28+
MemoryOfflineComponentProvider,
29+
OfflineComponentProvider
2930
} from '../core/component_provider';
3031
import { FirestoreClient, PersistenceSettings } from '../core/firestore_client';
3132
import {
@@ -290,7 +291,6 @@ export class Firestore implements firestore.FirebaseFirestore, FirebaseService {
290291
// underscore to discourage their use.
291292
readonly _databaseId: DatabaseId;
292293
private readonly _persistenceKey: string;
293-
private readonly _componentProvider: ComponentProvider;
294294
private _credentials: CredentialsProvider;
295295
private readonly _firebaseApp: FirebaseApp | null = null;
296296
private _settings: FirestoreSettings;
@@ -315,7 +315,8 @@ export class Firestore implements firestore.FirebaseFirestore, FirebaseService {
315315
constructor(
316316
databaseIdOrApp: FirestoreDatabase | FirebaseApp,
317317
authProvider: Provider<FirebaseAuthInternalName>,
318-
componentProvider: ComponentProvider = new MemoryComponentProvider()
318+
private _offlineComponentProvider: OfflineComponentProvider = new MemoryOfflineComponentProvider(),
319+
private _onlineComponentProvider = new OnlineComponentProvider()
319320
) {
320321
if (typeof (databaseIdOrApp as FirebaseApp).options === 'object') {
321322
// This is very likely a Firebase app object
@@ -340,7 +341,6 @@ export class Firestore implements firestore.FirebaseFirestore, FirebaseService {
340341
this._credentials = new EmptyCredentialsProvider();
341342
}
342343

343-
this._componentProvider = componentProvider;
344344
this._settings = new FirestoreSettings({});
345345
}
346346

@@ -425,12 +425,16 @@ export class Firestore implements firestore.FirebaseFirestore, FirebaseService {
425425
}
426426
}
427427

428-
return this.configureClient(this._componentProvider, {
429-
durable: true,
430-
cacheSizeBytes: this._settings.cacheSizeBytes,
431-
synchronizeTabs,
432-
forceOwningTab: experimentalForceOwningTab
433-
});
428+
return this.configureClient(
429+
this._offlineComponentProvider,
430+
this._onlineComponentProvider,
431+
{
432+
durable: true,
433+
cacheSizeBytes: this._settings.cacheSizeBytes,
434+
synchronizeTabs,
435+
forceOwningTab: experimentalForceOwningTab
436+
}
437+
);
434438
}
435439

436440
async clearPersistence(): Promise<void> {
@@ -448,7 +452,7 @@ export class Firestore implements firestore.FirebaseFirestore, FirebaseService {
448452
const deferred = new Deferred<void>();
449453
this._queue.enqueueAndForgetEvenAfterShutdown(async () => {
450454
try {
451-
await this._componentProvider.clearPersistence(
455+
await this._offlineComponentProvider.clearPersistence(
452456
this._databaseId,
453457
this._persistenceKey
454458
);
@@ -498,9 +502,13 @@ export class Firestore implements firestore.FirebaseFirestore, FirebaseService {
498502
if (!this._firestoreClient) {
499503
// Kick off starting the client but don't actually wait for it.
500504
// eslint-disable-next-line @typescript-eslint/no-floating-promises
501-
this.configureClient(new MemoryComponentProvider(), {
502-
durable: false
503-
});
505+
this.configureClient(
506+
new MemoryOfflineComponentProvider(),
507+
new OnlineComponentProvider(),
508+
{
509+
durable: false
510+
}
511+
);
504512
}
505513
return this._firestoreClient as FirestoreClient;
506514
}
@@ -516,7 +524,8 @@ export class Firestore implements firestore.FirebaseFirestore, FirebaseService {
516524
}
517525

518526
private configureClient(
519-
componentProvider: ComponentProvider,
527+
offlineComponentProvider: OfflineComponentProvider,
528+
onlineComponentProvider: OnlineComponentProvider,
520529
persistenceSettings: PersistenceSettings
521530
): Promise<void> {
522531
debugAssert(!!this._settings.host, 'FirestoreSettings.host is not set');
@@ -532,7 +541,8 @@ export class Firestore implements firestore.FirebaseFirestore, FirebaseService {
532541

533542
return this._firestoreClient.start(
534543
databaseInfo,
535-
componentProvider,
544+
offlineComponentProvider,
545+
onlineComponentProvider,
536546
persistenceSettings
537547
);
538548
}

0 commit comments

Comments
 (0)