@@ -27,7 +27,10 @@ import {
27
27
enqueueWaitForPendingWrites ,
28
28
MAX_CONCURRENT_LIMBO_RESOLUTIONS
29
29
} from '../../../src/core/firestore_client' ;
30
- import { AsyncQueue } from '../../../src/util/async_queue' ;
30
+ import {
31
+ AsyncQueue ,
32
+ wrapInUserErrorIfRecoverable
33
+ } from '../../../src/util/async_queue' ;
31
34
import {
32
35
ComponentConfiguration ,
33
36
IndexedDbOfflineComponentProvider ,
@@ -59,7 +62,6 @@ import { AutoId } from '../../../src/util/misc';
59
62
import { User } from '../../../src/auth/user' ;
60
63
import { CredentialChangeListener } from '../../../src/api/credentials' ;
61
64
import { logDebug } from '../../../src/util/log' ;
62
- import { debugAssert } from '../../../src/util/assert' ;
63
65
64
66
const LOG_TAG = 'Firestore' ;
65
67
@@ -131,16 +133,28 @@ export class Firestore extends LiteFirestore
131
133
}
132
134
133
135
_terminate ( ) : Promise < void > {
134
- debugAssert ( ! this . _terminated , 'Cannot invoke _terminate() more than once' ) ;
135
- return this . _queue . enqueueAndInitiateShutdown ( async ( ) => {
136
- await super . _terminate ( ) ;
137
- await removeComponents ( this ) ;
138
-
139
- // `removeChangeListener` must be called after shutting down the
140
- // RemoteStore as it will prevent the RemoteStore from retrieving
141
- // auth tokens.
142
- this . _credentials . removeChangeListener ( ) ;
136
+ this . _queue . enterRestrictedMode ( ) ;
137
+ const deferred = new Deferred ( ) ;
138
+ this . _queue . enqueueAndForgetEvenWhileRestricted ( async ( ) => {
139
+ try {
140
+ await super . _terminate ( ) ;
141
+ await removeComponents ( this ) ;
142
+
143
+ // `removeChangeListener` must be called after shutting down the
144
+ // RemoteStore as it will prevent the RemoteStore from retrieving
145
+ // auth tokens.
146
+ this . _credentials . removeChangeListener ( ) ;
147
+
148
+ deferred . resolve ( ) ;
149
+ } catch ( e ) {
150
+ const firestoreError = wrapInUserErrorIfRecoverable (
151
+ e ,
152
+ `Failed to shutdown persistence`
153
+ ) ;
154
+ deferred . reject ( firestoreError ) ;
155
+ }
143
156
} ) ;
157
+ return deferred . promise ;
144
158
}
145
159
}
146
160
@@ -242,7 +256,7 @@ export function clearIndexedDbPersistence(
242
256
}
243
257
244
258
const deferred = new Deferred < void > ( ) ;
245
- firestoreImpl . _queue . enqueueAndForgetEvenAfterShutdown ( async ( ) => {
259
+ firestoreImpl . _queue . enqueueAndForgetEvenWhileRestricted ( async ( ) => {
246
260
try {
247
261
await indexedDbClearPersistence (
248
262
indexedDbStoragePrefix (
0 commit comments