17
17
18
18
import { debugAssert , debugCast } from '../util/assert' ;
19
19
import { wrapInUserErrorIfRecoverable } from '../util/async_queue' ;
20
- import { FirestoreError } from '../util/error' ;
20
+ import { Code , FirestoreError } from '../util/error' ;
21
21
import { EventHandler } from '../util/misc' ;
22
22
import { ObjectMap } from '../util/obj_map' ;
23
23
@@ -64,19 +64,17 @@ export interface EventManager {
64
64
onUnlisten ?: ( query : Query , disableRemoteListen : boolean ) => Promise < void > ;
65
65
onFirstRemoteStoreListen ?: ( query : Query ) => Promise < void > ;
66
66
onLastRemoteStoreUnlisten ?: ( query : Query ) => Promise < void > ;
67
+ terminate ( ) : void ;
67
68
}
68
69
69
70
export function newEventManager ( ) : EventManager {
70
71
return new EventManagerImpl ( ) ;
71
72
}
72
73
73
74
export class EventManagerImpl implements EventManager {
74
- queries = new ObjectMap < Query , QueryListenersInfo > (
75
- q => canonifyQuery ( q ) ,
76
- queryEquals
77
- ) ;
75
+ queries : ObjectMap < Query , QueryListenersInfo > = newQueriesObjectMap ( ) ;
78
76
79
- onlineState = OnlineState . Unknown ;
77
+ onlineState : OnlineState = OnlineState . Unknown ;
80
78
81
79
snapshotsInSyncListeners : Set < Observer < void > > = new Set ( ) ;
82
80
@@ -98,6 +96,20 @@ export class EventManagerImpl implements EventManager {
98
96
* still listening to the cache.
99
97
*/
100
98
onLastRemoteStoreUnlisten ?: ( query : Query ) => Promise < void > ;
99
+
100
+ terminate ( ) : void {
101
+ errorAllTargets (
102
+ this ,
103
+ new FirestoreError ( Code . ABORTED , 'Firestore shutting down' )
104
+ ) ;
105
+ }
106
+ }
107
+
108
+ function newQueriesObjectMap ( ) : ObjectMap < Query , QueryListenersInfo > {
109
+ return new ObjectMap < Query , QueryListenersInfo > (
110
+ q => canonifyQuery ( q ) ,
111
+ queryEquals
112
+ ) ;
101
113
}
102
114
103
115
function validateEventManager ( eventManagerImpl : EventManagerImpl ) : void {
@@ -334,6 +346,23 @@ export function removeSnapshotsInSyncListener(
334
346
eventManagerImpl . snapshotsInSyncListeners . delete ( observer ) ;
335
347
}
336
348
349
+ function errorAllTargets (
350
+ eventManager : EventManager ,
351
+ error : FirestoreError
352
+ ) : void {
353
+ const eventManagerImpl = debugCast ( eventManager , EventManagerImpl ) ;
354
+ const queries = eventManagerImpl . queries ;
355
+
356
+ // Prevent further access by clearing ObjectMap.
357
+ eventManagerImpl . queries = newQueriesObjectMap ( ) ;
358
+
359
+ queries . forEach ( ( _ , queryInfo ) => {
360
+ for ( const listener of queryInfo . listeners ) {
361
+ listener . onError ( error ) ;
362
+ }
363
+ } ) ;
364
+ }
365
+
337
366
// Call all global snapshot listeners that have been set.
338
367
function raiseSnapshotsInSyncEvent ( eventManagerImpl : EventManagerImpl ) : void {
339
368
eventManagerImpl . snapshotsInSyncListeners . forEach ( observer => {
0 commit comments