Skip to content

Commit 565004d

Browse files
Schedule everything on the AsyncQueue (#3701)
1 parent 0119d66 commit 565004d

File tree

9 files changed

+436
-444
lines changed

9 files changed

+436
-444
lines changed

packages-exp/installations-exp/src/api/on-id-change.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export type IdChangeUnsubscribeFn = () => void;
3131
/**
3232
* Sets a new callback that will get called when Installation ID changes.
3333
* Returns an unsubscribe function that will remove the callback when called.
34-
*
34+
*
3535
* @public
3636
*/
3737
export function onIdChange(

packages-exp/installations-types-exp/index.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export interface FirebaseInstallations {}
2222

2323
/**
2424
* An interface for Firebase internal SDKs use only.
25-
*
25+
*
2626
* @internal
2727
*/
2828
export interface _FirebaseInstallationsInternal {

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

+2-12
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,
@@ -115,7 +114,7 @@ export async function setOnlineComponentProvider(
115114
function getOfflineComponentProvider(
116115
firestore: Firestore
117116
): Promise<OfflineComponentProvider> {
118-
verifyNotTerminated(firestore);
117+
firestore._queue.verifyOperationInProgress();
119118

120119
if (!offlineComponentProviders.has(firestore)) {
121120
logDebug(LOG_TAG, 'Using default OfflineComponentProvider');
@@ -132,7 +131,7 @@ function getOfflineComponentProvider(
132131
function getOnlineComponentProvider(
133132
firestore: Firestore
134133
): Promise<OnlineComponentProvider> {
135-
verifyNotTerminated(firestore);
134+
firestore._queue.verifyOperationInProgress();
136135

137136
if (!onlineComponentProviders.has(firestore)) {
138137
logDebug(LOG_TAG, 'Using default OnlineComponentProvider');
@@ -142,15 +141,6 @@ function getOnlineComponentProvider(
142141
return onlineComponentProviders.get(firestore)!;
143142
}
144143

145-
function verifyNotTerminated(firestore: Firestore): void {
146-
if (firestore._terminated) {
147-
throw new FirestoreError(
148-
Code.FAILED_PRECONDITION,
149-
'The client has already been terminated.'
150-
);
151-
}
152-
}
153-
154144
// Note: These functions cannot be `async` since we want to throw an exception
155145
// when Firestore is terminated (via `getOnlineComponentProvider()`).
156146

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

+67-55
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,11 @@ 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';
62+
import {
63+
remoteStoreDisableNetwork,
64+
remoteStoreEnableNetwork
65+
} from '../../../src/remote/remote_store';
6566

6667
const LOG_TAG = 'Firestore';
6768

@@ -157,6 +158,15 @@ export class Firestore
157158
});
158159
return deferred.promise;
159160
}
161+
162+
_verifyNotTerminated(): void {
163+
if (this._terminated) {
164+
throw new FirestoreError(
165+
Code.FAILED_PRECONDITION,
166+
'The client has already been terminated.'
167+
);
168+
}
169+
}
160170
}
161171

162172
export function initializeFirestore(
@@ -199,17 +209,19 @@ export function enableIndexedDbPersistence(
199209
// `getOnlineComponentProvider()`
200210
const settings = firestoreImpl._getSettings();
201211

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()
212+
return firestoreImpl._queue.enqueue(() =>
213+
// TODO(firestoreexp): Add forceOwningTab
214+
setOfflineComponentProvider(
215+
firestoreImpl,
216+
{
217+
durable: true,
218+
synchronizeTabs: false,
219+
cacheSizeBytes:
220+
settings.cacheSizeBytes || LruParams.DEFAULT_CACHE_SIZE_BYTES,
221+
forceOwningTab: false
222+
},
223+
new IndexedDbOfflineComponentProvider()
224+
)
213225
);
214226
}
215227

@@ -229,19 +241,20 @@ export function enableMultiTabIndexedDbPersistence(
229241
const offlineComponentProvider = new MultiTabOfflineComponentProvider(
230242
onlineComponentProvider
231243
);
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-
);
244+
return firestoreImpl._queue.enqueue(async () => {
245+
await setOfflineComponentProvider(
246+
firestoreImpl,
247+
{
248+
durable: true,
249+
synchronizeTabs: true,
250+
cacheSizeBytes:
251+
settings.cacheSizeBytes || LruParams.DEFAULT_CACHE_SIZE_BYTES,
252+
forceOwningTab: false
253+
},
254+
offlineComponentProvider
255+
);
256+
await setOnlineComponentProvider(firestoreImpl, onlineComponentProvider);
257+
});
245258
}
246259

247260
export function clearIndexedDbPersistence(
@@ -277,43 +290,42 @@ export function waitForPendingWrites(
277290
firestore: firestore.FirebaseFirestore
278291
): Promise<void> {
279292
const firestoreImpl = cast(firestore, Firestore);
280-
return getSyncEngine(firestoreImpl).then(syncEngine =>
281-
enqueueWaitForPendingWrites(firestoreImpl._queue, syncEngine)
282-
);
293+
firestoreImpl._verifyNotTerminated();
294+
295+
const deferred = new Deferred<void>();
296+
firestoreImpl._queue.enqueueAndForget(async () => {
297+
const syncEngine = await getSyncEngine(firestoreImpl);
298+
return registerPendingWritesCallback(syncEngine, deferred);
299+
});
300+
return deferred.promise;
283301
}
284302

285303
export function enableNetwork(
286304
firestore: firestore.FirebaseFirestore
287305
): Promise<void> {
288306
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-
);
307+
firestoreImpl._verifyNotTerminated();
308+
309+
return firestoreImpl._queue.enqueue(async () => {
310+
const remoteStore = await getRemoteStore(firestoreImpl);
311+
const persistence = await getPersistence(firestoreImpl);
312+
persistence.setNetworkEnabled(true);
313+
return remoteStoreEnableNetwork(remoteStore);
314+
});
300315
}
301316

302317
export function disableNetwork(
303318
firestore: firestore.FirebaseFirestore
304319
): Promise<void> {
305320
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-
);
321+
firestoreImpl._verifyNotTerminated();
322+
323+
return firestoreImpl._queue.enqueue(async () => {
324+
const remoteStore = await getRemoteStore(firestoreImpl);
325+
const persistence = await getPersistence(firestoreImpl);
326+
persistence.setNetworkEnabled(false);
327+
return remoteStoreDisableNetwork(remoteStore);
328+
});
317329
}
318330

319331
export function terminate(
@@ -325,7 +337,7 @@ export function terminate(
325337
}
326338

327339
function verifyNotInitialized(firestore: Firestore): void {
328-
if (firestore._initialized) {
340+
if (firestore._initialized || firestore._terminated) {
329341
throw new FirestoreError(
330342
Code.FAILED_PRECONDITION,
331343
'Firestore has already been started and persistence can no longer be ' +

0 commit comments

Comments
 (0)