Skip to content

Commit 489fcb4

Browse files
Offline-only components
1 parent e117354 commit 489fcb4

16 files changed

+559
-422
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: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ 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
3536
} from '../../../src/core/component_provider';
3637

3738
import {
@@ -60,7 +61,8 @@ export class Firestore extends LiteFirestore
6061
private readonly _queue = new AsyncQueue();
6162
private readonly _firestoreClient: FirestoreClient;
6263
private readonly _persistenceKey: string;
63-
private _componentProvider: ComponentProvider = new MemoryComponentProvider();
64+
private _offlineComponentProvider: OfflineComponentProvider = new MemoryOfflineComponentProvider();
65+
private _onlineComponentProvider = new OnlineComponentProvider();
6466

6567
// Assigned via _getFirestoreClient()
6668
private _deferredInitialization?: Promise<void>;
@@ -106,7 +108,8 @@ export class Firestore extends LiteFirestore
106108

107109
this._deferredInitialization = this._firestoreClient.start(
108110
databaseInfo,
109-
this._componentProvider,
111+
this._offlineComponentProvider,
112+
this._onlineComponentProvider,
110113
this._persistenceSettings
111114
);
112115
}
@@ -117,7 +120,8 @@ export class Firestore extends LiteFirestore
117120
// TODO(firestorexp): Factor out MultiTabComponentProvider and remove
118121
// `synchronizeTabs` argument
119122
_enablePersistence(
120-
persistenceProvider: ComponentProvider,
123+
offlineComponentProvider: OfflineComponentProvider,
124+
onlineComponentProvider: OnlineComponentProvider,
121125
synchronizeTabs: boolean
122126
): Promise<void> {
123127
if (this._deferredInitialization) {
@@ -137,7 +141,7 @@ export class Firestore extends LiteFirestore
137141
cacheSizeBytes:
138142
settings.cacheSizeBytes ?? LruParams.DEFAULT_CACHE_SIZE_BYTES
139143
};
140-
this._componentProvider = persistenceProvider;
144+
this._offlineComponentProvider = offlineComponentProvider;
141145

142146
// TODO(firestorexp): Add support for Persistence fallback
143147
return this._getFirestoreClient().then(() => {});
@@ -235,7 +239,8 @@ export function enableIndexedDbPersistence(
235239
): Promise<void> {
236240
const firestoreImpl = cast(firestore, Firestore);
237241
return firestoreImpl._enablePersistence(
238-
new IndexedDbComponentProvider(),
242+
new IndexedDbOfflineComponentProvider(),
243+
new OnlineComponentProvider(),
239244
/*synchronizeTabs=*/ false
240245
);
241246
}
@@ -244,8 +249,13 @@ export function enableMultiTabIndexedDbPersistence(
244249
firestore: firestore.FirebaseFirestore
245250
): Promise<void> {
246251
const firestoreImpl = cast(firestore, Firestore);
252+
const onlineComponentProvider = new OnlineComponentProvider();
253+
const offlineComponentProvider = new MultiTabOfflineComponentProvider(
254+
onlineComponentProvider
255+
);
247256
return firestoreImpl._enablePersistence(
248-
new MultiTabIndexedDbComponentProvider(),
257+
offlineComponentProvider,
258+
onlineComponentProvider,
249259
/*synchronizeTabs=*/ false
250260
);
251261
}

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: 14 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+
OnlineComponentProvider
24+
} from './src/core/component_provider';
2225
import { configureForFirebase } from './src/config';
2326

2427
import './register-module';
@@ -30,10 +33,19 @@ import { name, version } from './package.json';
3033
* Persistence can be enabled via `firebase.firestore().enablePersistence()`.
3134
*/
3235
export function registerFirestore(instance: FirebaseNamespace): void {
36+
const onlineComponentProvider = new OnlineComponentProvider();
37+
const offlineComponentProvider = new MultiTabOfflineComponentProvider(
38+
onlineComponentProvider
39+
);
3340
configureForFirebase(
3441
instance,
3542
(app, auth) =>
36-
new Firestore(app, auth, new MultiTabIndexedDbComponentProvider())
43+
new Firestore(
44+
app,
45+
auth,
46+
offlineComponentProvider,
47+
onlineComponentProvider
48+
)
3749
);
3850
instance.registerVersion(name, version, 'node');
3951
}

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: 14 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+
OnlineComponentProvider
24+
} from './src/core/component_provider';
2225
import { configureForFirebase } from './src/config';
2326

2427
import './register-module';
@@ -29,10 +32,19 @@ import { name, version } from './package.json';
2932
* Persistence can be enabled via `firebase.firestore().enablePersistence()`.
3033
*/
3134
export function registerFirestore(instance: FirebaseNamespace): void {
35+
const onlineComponentProvider = new OnlineComponentProvider();
36+
const offlineComponentProvider = new MultiTabOfflineComponentProvider(
37+
onlineComponentProvider
38+
);
3239
configureForFirebase(
3340
instance,
3441
(app, auth) =>
35-
new Firestore(app, auth, new MultiTabIndexedDbComponentProvider())
42+
new Firestore(
43+
app,
44+
auth,
45+
offlineComponentProvider,
46+
onlineComponentProvider
47+
)
3648
);
3749
instance.registerVersion(name, version, 'rn');
3850
}

packages/firestore/index.ts

Lines changed: 14 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 { MultiTabIndexedDbComponentProvider } from './src/core/component_provider';
22+
import {
23+
MultiTabOfflineComponentProvider,
24+
OnlineComponentProvider
25+
} from './src/core/component_provider';
2326
import { configureForFirebase } from './src/config';
2427
import { name, version } from './package.json';
2528

@@ -30,10 +33,19 @@ import './register-module';
3033
* Persistence can be enabled via `firebase.firestore().enablePersistence()`.
3134
*/
3235
export function registerFirestore(instance: FirebaseNamespace): void {
36+
const onlineComponentProvider = new OnlineComponentProvider();
37+
const offlineComponentProvider = new MultiTabOfflineComponentProvider(
38+
onlineComponentProvider
39+
);
3340
configureForFirebase(
3441
instance,
3542
(app, auth) =>
36-
new Firestore(app, auth, new MultiTabIndexedDbComponentProvider())
43+
new Firestore(
44+
app,
45+
auth,
46+
offlineComponentProvider,
47+
onlineComponentProvider
48+
)
3749
);
3850
instance.registerVersion(name, version);
3951
}

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/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"dev": "rollup -c -w",
1919
"lint": "eslint -c .eslintrc.js '**/*.ts' --ignore-path '../../.gitignore'",
2020
"lint:fix": "eslint --fix -c .eslintrc.js '**/*.ts' --ignore-path '../../.gitignore'",
21-
"prettier": "prettier --write '*.js' '{,!(dist)}/**/*.ts'",
21+
"prettier": "prettier --write '*.js' '*.ts' '{,!(dist)}/**/*.ts'",
2222
"pregendeps:exp" : "node scripts/build-bundle.js --input ./exp/index.ts --output ./dist/exp/tmp.js",
2323
"gendeps:exp": "../../scripts/exp/extract-deps.sh --types ./exp-types/index.d.ts --bundle ./dist/exp/tmp.js --output ./exp/dependencies.json",
2424
"pregendeps:lite" : "node scripts/build-bundle.js --input ./lite/index.ts --output ./dist/lite/tmp.js",

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)