Skip to content

Commit ac2f643

Browse files
WIP
1 parent b78bbba commit ac2f643

File tree

11 files changed

+1454
-1302
lines changed

11 files changed

+1454
-1302
lines changed

packages/firestore/exp/dependencies.json

Lines changed: 518 additions & 611 deletions
Large diffs are not rendered by default.

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,15 @@ import {
2525
import { handleUserChange, LocalStore } from '../../../src/local/local_store';
2626
import { Deferred } from '../../../src/util/promise';
2727
import { logDebug } from '../../../src/util/log';
28+
import {
29+
RemoteStore,
30+
remoteStoreHandleCredentialChange
31+
} from '../../../src/remote/remote_store';
2832
import {
2933
SyncEngine,
3034
syncEngineListen,
3135
syncEngineUnlisten
3236
} from '../../../src/core/sync_engine';
33-
import { RemoteStore } from '../../../src/remote/remote_store';
3437
import { Persistence } from '../../../src/local/persistence';
3538
import { EventManager } from '../../../src/core/event_manager';
3639
export const LOG_TAG = 'ComponentProvider';
@@ -99,7 +102,10 @@ export async function setOnlineComponentProvider(
99102
firestore._setCredentialChangeListener(user =>
100103
// TODO(firestoreexp): This should be enqueueRetryable.
101104
firestore._queue.enqueueAndForget(() =>
102-
onlineComponentProvider.remoteStore.handleCredentialChange(user)
105+
remoteStoreHandleCredentialChange(
106+
onlineComponentProvider.remoteStore,
107+
user
108+
)
103109
)
104110
);
105111
onlineDeferred.resolve(onlineComponentProvider);

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

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,21 @@ import {
5151
setOfflineComponentProvider,
5252
setOnlineComponentProvider
5353
} from './components';
54-
5554
import { DEFAULT_HOST, DEFAULT_SSL } from '../../../lite/src/api/components';
5655
import { DatabaseInfo } from '../../../src/core/database_info';
5756
import { AutoId } from '../../../src/util/misc';
5857
import { User } from '../../../src/auth/user';
5958
import { CredentialChangeListener } from '../../../src/api/credentials';
6059
import { logDebug } from '../../../src/util/log';
61-
import { registerPendingWritesCallback } from '../../../src/core/sync_engine';
60+
import {
61+
fillWritePipeline,
62+
remoteStoreDisableNetwork,
63+
remoteStoreEnableNetwork
64+
} from '../../../src/remote/remote_store';
65+
import {
66+
ensureWriteCallbacks,
67+
registerPendingWritesCallback
68+
} from '../../../src/core/sync_engine';
6269

6370
const LOG_TAG = 'Firestore';
6471

@@ -205,9 +212,14 @@ export function enableIndexedDbPersistence(
205212
// `getOnlineComponentProvider()`
206213
const settings = firestoreImpl._getSettings();
207214

208-
return firestoreImpl._queue.enqueue(() =>
215+
const onlineComponentProvider = new OnlineComponentProvider();
216+
const offlineComponentProvider = new IndexedDbOfflineComponentProvider(
217+
onlineComponentProvider
218+
);
219+
220+
return firestoreImpl._queue.enqueue(async () => {
209221
// TODO(firestoreexp): Add forceOwningTab
210-
setOfflineComponentProvider(
222+
await setOfflineComponentProvider(
211223
firestoreImpl,
212224
{
213225
durable: true,
@@ -216,9 +228,10 @@ export function enableIndexedDbPersistence(
216228
settings.cacheSizeBytes || LruParams.DEFAULT_CACHE_SIZE_BYTES,
217229
forceOwningTab: false
218230
},
219-
new IndexedDbOfflineComponentProvider()
220-
)
221-
);
231+
offlineComponentProvider
232+
);
233+
await setOnlineComponentProvider(firestoreImpl, onlineComponentProvider);
234+
});
222235
}
223236

224237
export function enableMultiTabIndexedDbPersistence(
@@ -306,7 +319,7 @@ export function enableNetwork(
306319
const remoteStore = await getRemoteStore(firestoreImpl);
307320
const persistence = await getPersistence(firestoreImpl);
308321
persistence.setNetworkEnabled(true);
309-
return remoteStore.enableNetwork();
322+
return remoteStoreEnableNetwork(remoteStore);
310323
});
311324
}
312325

@@ -320,7 +333,7 @@ export function disableNetwork(
320333
const remoteStore = await getRemoteStore(firestoreImpl);
321334
const persistence = await getPersistence(firestoreImpl);
322335
persistence.setNetworkEnabled(false);
323-
return remoteStore.disableNetwork();
336+
return remoteStoreDisableNetwork(remoteStore);
324337
});
325338
}
326339

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,6 @@ export class Firestore
113113
removeComponents(this);
114114
return Promise.resolve();
115115
}
116-
117-
// TODO(firestoreexp): `deleteApp()` should call the delete method above,
118-
// but it still calls INTERNAL.delete().
119-
INTERNAL = {
120-
delete: () => this._delete()
121-
};
122116
}
123117

124118
export function initializeFirestore(

packages/firestore/src/core/component_provider.ts

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,19 @@ import {
3333
applyPrimaryState,
3434
applyTargetState,
3535
getActiveClients,
36-
handleCredentialChange,
36+
syncEngineHandleCredentialChange,
3737
newSyncEngine,
38-
SyncEngine
38+
SyncEngine,
39+
ensureWriteCallbacks
3940
} from './sync_engine';
40-
import { RemoteStore } from '../remote/remote_store';
4141
import {
42-
EventManager,
43-
newEventManager,
44-
eventManagerOnOnlineStateChange,
45-
eventManagerOnWatchChange,
46-
eventManagerOnWatchError
47-
} from './event_manager';
42+
fillWritePipeline,
43+
newRemoteStore,
44+
RemoteStore,
45+
remoteStoreApplyPrimaryState,
46+
remoteStoreShutdown
47+
} from '../remote/remote_store';
48+
import { EventManager, newEventManager } from './event_manager';
4849
import { AsyncQueue } from '../util/async_queue';
4950
import { DatabaseId, DatabaseInfo } from './database_info';
5051
import { Datastore, newDatastore } from '../remote/datastore';
@@ -69,6 +70,7 @@ import { newConnection, newConnectivityMonitor } from '../platform/connection';
6970
import { newSerializer } from '../platform/serializer';
7071
import { getDocument, getWindow } from '../platform/dom';
7172
import { CredentialsProvider } from '../api/credentials';
73+
import { getRemoteStore, getSyncEngine } from '../../exp/src/api/components';
7274

7375
const MEMORY_ONLY_PERSISTENCE_ERROR_MESSAGE =
7476
'You are using the memory-only build of Firestore. Persistence support is ' +
@@ -180,9 +182,21 @@ export class IndexedDbOfflineComponentProvider extends MemoryOfflineComponentPro
180182
localStore!: LocalStore;
181183
gcScheduler!: GarbageCollectionScheduler | null;
182184

185+
constructor(
186+
protected readonly onlineComponentProvider: OnlineComponentProvider
187+
) {
188+
super();
189+
}
190+
183191
async initialize(cfg: ComponentConfiguration): Promise<void> {
184192
await super.initialize(cfg);
185193
await synchronizeLastDocumentChangeReadTime(this.localStore);
194+
195+
await this.onlineComponentProvider.initialize(this, cfg);
196+
197+
// Enqueue writes from a previous session
198+
await ensureWriteCallbacks(this.onlineComponentProvider.syncEngine);
199+
await fillWritePipeline(this.onlineComponentProvider.remoteStore);
186200
}
187201

188202
createGarbageCollectionScheduler(
@@ -241,16 +255,9 @@ export class IndexedDbOfflineComponentProvider extends MemoryOfflineComponentPro
241255
* `synchronizeTabs` will be enabled.
242256
*/
243257
export class MultiTabOfflineComponentProvider extends IndexedDbOfflineComponentProvider {
244-
constructor(
245-
private readonly onlineComponentProvider: OnlineComponentProvider
246-
) {
247-
super();
248-
}
249-
250258
async initialize(cfg: ComponentConfiguration): Promise<void> {
251259
await super.initialize(cfg);
252260

253-
await this.onlineComponentProvider.initialize(this, cfg);
254261
const syncEngine = this.onlineComponentProvider.syncEngine;
255262

256263
if (this.sharedClientState instanceof WebStorageSharedClientState) {
@@ -337,17 +344,8 @@ export class OnlineComponentProvider {
337344
this.sharedClientState = offlineComponentProvider.sharedClientState;
338345
this.datastore = this.createDatastore(cfg);
339346
this.remoteStore = this.createRemoteStore(cfg);
340-
this.syncEngine = this.createSyncEngine(cfg);
341347
this.eventManager = this.createEventManager(cfg);
342-
343-
this.syncEngine.subscribe({
344-
onWatchChange: eventManagerOnWatchChange.bind(null, this.eventManager),
345-
onWatchError: eventManagerOnWatchError.bind(null, this.eventManager),
346-
onOnlineStateChange: eventManagerOnOnlineStateChange.bind(
347-
null,
348-
this.eventManager
349-
)
350-
});
348+
this.syncEngine = this.createSyncEngine(cfg);
351349

352350
this.sharedClientState.onlineStateHandler = onlineState =>
353351
applyOnlineStateChange(
@@ -356,13 +354,15 @@ export class OnlineComponentProvider {
356354
OnlineStateSource.SharedClientState
357355
);
358356

359-
this.remoteStore.remoteSyncer.handleCredentialChange = handleCredentialChange.bind(
357+
this.remoteStore.remoteSyncer.handleCredentialChange = syncEngineHandleCredentialChange.bind(
360358
null,
361359
this.syncEngine
362360
);
363361

364-
await this.remoteStore.start();
365-
await this.remoteStore.applyPrimaryState(this.syncEngine.isPrimaryClient);
362+
await remoteStoreApplyPrimaryState(
363+
this.remoteStore,
364+
this.syncEngine.isPrimaryClient
365+
);
366366
}
367367

368368
createEventManager(cfg: ComponentConfiguration): EventManager {
@@ -376,7 +376,7 @@ export class OnlineComponentProvider {
376376
}
377377

378378
createRemoteStore(cfg: ComponentConfiguration): RemoteStore {
379-
return new RemoteStore(
379+
return newRemoteStore(
380380
this.localStore,
381381
this.datastore,
382382
cfg.asyncQueue,
@@ -394,6 +394,7 @@ export class OnlineComponentProvider {
394394
return newSyncEngine(
395395
this.localStore,
396396
this.remoteStore,
397+
this.eventManager,
397398
this.sharedClientState,
398399
cfg.initialUser,
399400
cfg.maxConcurrentLimboResolutions,
@@ -403,6 +404,6 @@ export class OnlineComponentProvider {
403404
}
404405

405406
terminate(): Promise<void> {
406-
return this.remoteStore.shutdown();
407+
return remoteStoreShutdown(this.remoteStore);
407408
}
408409
}

packages/firestore/src/core/firestore_client.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@ import { GarbageCollectionScheduler, Persistence } from '../local/persistence';
2828
import { Document, NoDocument } from '../model/document';
2929
import { DocumentKey } from '../model/document_key';
3030
import { Mutation } from '../model/mutation';
31-
import { RemoteStore } from '../remote/remote_store';
31+
import {
32+
remoteStoreHandleCredentialChange,
33+
RemoteStore,
34+
remoteStoreEnableNetwork,
35+
remoteStoreDisableNetwork,
36+
remoteStoreShutdown
37+
} from '../remote/remote_store';
3238
import { AsyncQueue, wrapInUserErrorIfRecoverable } from '../util/async_queue';
3339
import { Code, FirestoreError } from '../util/error';
3440
import { logDebug } from '../util/log';
@@ -208,7 +214,7 @@ export class FirestoreClient {
208214
).then(this.initializationDone.resolve, this.initializationDone.reject);
209215
} else {
210216
this.asyncQueue.enqueueRetryable(() =>
211-
this.remoteStore.handleCredentialChange(user)
217+
remoteStoreHandleCredentialChange(this.remoteStore, user)
212218
);
213219
}
214220
});
@@ -227,7 +233,7 @@ export class FirestoreClient {
227233
this.verifyNotTerminated();
228234
return this.asyncQueue.enqueue(() => {
229235
this.persistence.setNetworkEnabled(true);
230-
return this.remoteStore.enableNetwork();
236+
return remoteStoreEnableNetwork(this.remoteStore);
231237
});
232238
}
233239

@@ -374,7 +380,7 @@ export class FirestoreClient {
374380
this.verifyNotTerminated();
375381
return this.asyncQueue.enqueue(() => {
376382
this.persistence.setNetworkEnabled(false);
377-
return this.remoteStore.disableNetwork();
383+
return remoteStoreDisableNetwork(this.remoteStore);
378384
});
379385
}
380386

@@ -388,7 +394,7 @@ export class FirestoreClient {
388394
this.gcScheduler.stop();
389395
}
390396

391-
await this.remoteStore.shutdown();
397+
await remoteStoreShutdown(this.remoteStore);
392398
await this.sharedClientState.shutdown();
393399
await this.persistence.shutdown();
394400

0 commit comments

Comments
 (0)