Skip to content

Commit b78bbba

Browse files
Schedule everything on the AsyncQueue
1 parent 249d40c commit b78bbba

File tree

7 files changed

+430
-440
lines changed

7 files changed

+430
-440
lines changed

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

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import { Firestore } from './database';
1919
import { PersistenceSettings } from '../../../src/core/firestore_client';
20-
import { Code, FirestoreError } from '../../../src/util/error';
2120
import {
2221
MemoryOfflineComponentProvider,
2322
OfflineComponentProvider,
@@ -109,7 +108,7 @@ export async function setOnlineComponentProvider(
109108
function getOfflineComponentProvider(
110109
firestore: Firestore
111110
): Promise<OfflineComponentProvider> {
112-
verifyNotTerminated(firestore);
111+
firestore._queue.verifyOperationInProgress();
113112

114113
if (!offlineComponentProviders.has(firestore)) {
115114
logDebug(LOG_TAG, 'Using default OfflineComponentProvider');
@@ -126,7 +125,7 @@ function getOfflineComponentProvider(
126125
function getOnlineComponentProvider(
127126
firestore: Firestore
128127
): Promise<OnlineComponentProvider> {
129-
verifyNotTerminated(firestore);
128+
firestore._queue.verifyOperationInProgress();
130129

131130
if (!onlineComponentProviders.has(firestore)) {
132131
logDebug(LOG_TAG, 'Using default OnlineComponentProvider');
@@ -136,15 +135,6 @@ function getOnlineComponentProvider(
136135
return onlineComponentProviders.get(firestore)!;
137136
}
138137

139-
function verifyNotTerminated(firestore: Firestore): void {
140-
if (firestore._terminated) {
141-
throw new FirestoreError(
142-
Code.FAILED_PRECONDITION,
143-
'The client has already been terminated.'
144-
);
145-
}
146-
}
147-
148138
// Note: These functions cannot be `async` since we want to throw an exception
149139
// when Firestore is terminated (via `getOnlineComponentProvider()`).
150140

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

Lines changed: 63 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,7 @@ import { _FirebaseService, FirebaseApp } from '@firebase/app-types-exp';
2222
import { Provider } from '@firebase/component';
2323

2424
import { FirebaseAuthInternalName } from '@firebase/auth-interop-types';
25-
import {
26-
enqueueNetworkEnabled,
27-
enqueueWaitForPendingWrites,
28-
MAX_CONCURRENT_LIMBO_RESOLUTIONS
29-
} from '../../../src/core/firestore_client';
25+
import { MAX_CONCURRENT_LIMBO_RESOLUTIONS } from '../../../src/core/firestore_client';
3026
import {
3127
AsyncQueue,
3228
wrapInUserErrorIfRecoverable
@@ -62,6 +58,7 @@ import { AutoId } from '../../../src/util/misc';
6258
import { User } from '../../../src/auth/user';
6359
import { CredentialChangeListener } from '../../../src/api/credentials';
6460
import { logDebug } from '../../../src/util/log';
61+
import { registerPendingWritesCallback } from '../../../src/core/sync_engine';
6562

6663
const LOG_TAG = 'Firestore';
6764

@@ -157,6 +154,15 @@ export class Firestore
157154
});
158155
return deferred.promise;
159156
}
157+
158+
_verifyNotTerminated(): void {
159+
if (this._terminated) {
160+
throw new FirestoreError(
161+
Code.FAILED_PRECONDITION,
162+
'The client has already been terminated.'
163+
);
164+
}
165+
}
160166
}
161167

162168
export function initializeFirestore(
@@ -199,17 +205,19 @@ export function enableIndexedDbPersistence(
199205
// `getOnlineComponentProvider()`
200206
const settings = firestoreImpl._getSettings();
201207

202-
// TODO(firestoreexp): Add forceOwningTab
203-
return setOfflineComponentProvider(
204-
firestoreImpl,
205-
{
206-
durable: true,
207-
synchronizeTabs: false,
208-
cacheSizeBytes:
209-
settings.cacheSizeBytes || LruParams.DEFAULT_CACHE_SIZE_BYTES,
210-
forceOwningTab: false
211-
},
212-
new IndexedDbOfflineComponentProvider()
208+
return firestoreImpl._queue.enqueue(() =>
209+
// TODO(firestoreexp): Add forceOwningTab
210+
setOfflineComponentProvider(
211+
firestoreImpl,
212+
{
213+
durable: true,
214+
synchronizeTabs: false,
215+
cacheSizeBytes:
216+
settings.cacheSizeBytes || LruParams.DEFAULT_CACHE_SIZE_BYTES,
217+
forceOwningTab: false
218+
},
219+
new IndexedDbOfflineComponentProvider()
220+
)
213221
);
214222
}
215223

@@ -229,19 +237,20 @@ export function enableMultiTabIndexedDbPersistence(
229237
const offlineComponentProvider = new MultiTabOfflineComponentProvider(
230238
onlineComponentProvider
231239
);
232-
return setOfflineComponentProvider(
233-
firestoreImpl,
234-
{
235-
durable: true,
236-
synchronizeTabs: true,
237-
cacheSizeBytes:
238-
settings.cacheSizeBytes || LruParams.DEFAULT_CACHE_SIZE_BYTES,
239-
forceOwningTab: false
240-
},
241-
offlineComponentProvider
242-
).then(() =>
243-
setOnlineComponentProvider(firestoreImpl, onlineComponentProvider)
244-
);
240+
return firestoreImpl._queue.enqueue(async () => {
241+
await setOfflineComponentProvider(
242+
firestoreImpl,
243+
{
244+
durable: true,
245+
synchronizeTabs: true,
246+
cacheSizeBytes:
247+
settings.cacheSizeBytes || LruParams.DEFAULT_CACHE_SIZE_BYTES,
248+
forceOwningTab: false
249+
},
250+
offlineComponentProvider
251+
);
252+
await setOnlineComponentProvider(firestoreImpl, onlineComponentProvider);
253+
});
245254
}
246255

247256
export function clearIndexedDbPersistence(
@@ -277,43 +286,42 @@ export function waitForPendingWrites(
277286
firestore: firestore.FirebaseFirestore
278287
): Promise<void> {
279288
const firestoreImpl = cast(firestore, Firestore);
280-
return getSyncEngine(firestoreImpl).then(syncEngine =>
281-
enqueueWaitForPendingWrites(firestoreImpl._queue, syncEngine)
282-
);
289+
firestoreImpl._verifyNotTerminated();
290+
291+
const deferred = new Deferred<void>();
292+
firestoreImpl._queue.enqueueAndForget(async () => {
293+
const syncEngine = await getSyncEngine(firestoreImpl);
294+
return registerPendingWritesCallback(syncEngine, deferred);
295+
});
296+
return deferred.promise;
283297
}
284298

285299
export function enableNetwork(
286300
firestore: firestore.FirebaseFirestore
287301
): Promise<void> {
288302
const firestoreImpl = cast(firestore, Firestore);
289-
return Promise.all([
290-
getRemoteStore(firestoreImpl),
291-
getPersistence(firestoreImpl)
292-
]).then(([remoteStore, persistence]) =>
293-
enqueueNetworkEnabled(
294-
firestoreImpl._queue,
295-
remoteStore,
296-
persistence,
297-
/* enabled= */ true
298-
)
299-
);
303+
firestoreImpl._verifyNotTerminated();
304+
305+
return firestoreImpl._queue.enqueue(async () => {
306+
const remoteStore = await getRemoteStore(firestoreImpl);
307+
const persistence = await getPersistence(firestoreImpl);
308+
persistence.setNetworkEnabled(true);
309+
return remoteStore.enableNetwork();
310+
});
300311
}
301312

302313
export function disableNetwork(
303314
firestore: firestore.FirebaseFirestore
304315
): Promise<void> {
305316
const firestoreImpl = cast(firestore, Firestore);
306-
return Promise.all([
307-
getRemoteStore(firestoreImpl),
308-
getPersistence(firestoreImpl)
309-
]).then(([remoteStore, persistence]) =>
310-
enqueueNetworkEnabled(
311-
firestoreImpl._queue,
312-
remoteStore,
313-
persistence,
314-
/* enabled= */ false
315-
)
316-
);
317+
firestoreImpl._verifyNotTerminated();
318+
319+
return firestoreImpl._queue.enqueue(async () => {
320+
const remoteStore = await getRemoteStore(firestoreImpl);
321+
const persistence = await getPersistence(firestoreImpl);
322+
persistence.setNetworkEnabled(false);
323+
return remoteStore.disableNetwork();
324+
});
317325
}
318326

319327
export function terminate(
@@ -325,7 +333,7 @@ export function terminate(
325333
}
326334

327335
function verifyNotInitialized(firestore: Firestore): void {
328-
if (firestore._initialized) {
336+
if (firestore._initialized || firestore._terminated) {
329337
throw new FirestoreError(
330338
Code.FAILED_PRECONDITION,
331339
'Firestore has already been started and persistence can no longer be ' +

0 commit comments

Comments
 (0)