@@ -22,7 +22,6 @@ import { Query } from './query';
22
22
import { SyncEngine , SyncEngineListener } from './sync_engine' ;
23
23
import { OnlineState , TargetId } from './types' ;
24
24
import { DocumentViewChange , ChangeType , ViewSnapshot } from './view_snapshot' ;
25
- import { AsyncObserver } from '../util/async_observer' ;
26
25
27
26
/**
28
27
* Holds the listeners and the last received ViewSnapshot for a query being
@@ -54,7 +53,7 @@ export class EventManager implements SyncEngineListener {
54
53
55
54
private onlineState : OnlineState = OnlineState . Unknown ;
56
55
57
- private snapshotsInSyncListeners : Set < AsyncObserver < void > > = new Set ( ) ;
56
+ private snapshotsInSyncListeners : Set < Observer < void > > = new Set ( ) ;
58
57
59
58
constructor ( private syncEngine : SyncEngine ) {
60
59
this . syncEngine . subscribe ( this ) ;
@@ -73,12 +72,17 @@ export class EventManager implements SyncEngineListener {
73
72
queryInfo . listeners . push ( listener ) ;
74
73
75
74
// Run global snapshot listeners if a consistent snapshot has been emitted.
76
- if ( listener . applyOnlineStateChange ( this . onlineState ) ) {
77
- this . runSnapshotsInSyncListeners ( ) ;
78
- }
75
+ const raisedEvent = listener . applyOnlineStateChange ( this . onlineState ) ;
76
+ assert (
77
+ ! raisedEvent ,
78
+ "applyOnlineStateChange() shouldn't raise an event for brand-new listeners."
79
+ ) ;
79
80
80
- if ( queryInfo . viewSnap && listener . onViewSnapshot ( queryInfo . viewSnap ) ) {
81
- this . runSnapshotsInSyncListeners ( ) ;
81
+ if ( queryInfo . viewSnap ) {
82
+ const raisedEvent = listener . onViewSnapshot ( queryInfo . viewSnap ) ;
83
+ if ( raisedEvent ) {
84
+ this . raiseSnapshotsInSyncEvent ( ) ;
85
+ }
82
86
}
83
87
84
88
if ( firstListen ) {
@@ -111,22 +115,21 @@ export class EventManager implements SyncEngineListener {
111
115
}
112
116
113
117
onWatchChange ( viewSnaps : ViewSnapshot [ ] ) : void {
114
- let shouldRunInSyncListeners = false ;
118
+ let raisedEvent = false ;
115
119
for ( const viewSnap of viewSnaps ) {
116
120
const query = viewSnap . query ;
117
121
const queryInfo = this . queries . get ( query ) ;
118
122
if ( queryInfo ) {
119
123
for ( const listener of queryInfo . listeners ) {
120
124
if ( listener . onViewSnapshot ( viewSnap ) ) {
121
- shouldRunInSyncListeners = true ;
125
+ raisedEvent = true ;
122
126
}
123
127
}
124
128
queryInfo . viewSnap = viewSnap ;
125
129
}
126
130
}
127
- if ( shouldRunInSyncListeners ) {
128
- // Run global snapshot listeners if a consistent snapshot has been emitted.
129
- this . runSnapshotsInSyncListeners ( ) ;
131
+ if ( raisedEvent ) {
132
+ this . raiseSnapshotsInSyncEvent ( ) ;
130
133
}
131
134
}
132
135
@@ -145,34 +148,34 @@ export class EventManager implements SyncEngineListener {
145
148
146
149
onOnlineStateChange ( onlineState : OnlineState ) : void {
147
150
this . onlineState = onlineState ;
148
- let shouldRunInSyncListeners = false ;
151
+ let raisedEvent = false ;
149
152
this . queries . forEach ( ( _ , queryInfo ) => {
150
153
for ( const listener of queryInfo . listeners ) {
151
154
// Run global snapshot listeners if a consistent snapshot has been emitted.
152
155
if ( listener . applyOnlineStateChange ( onlineState ) ) {
153
- shouldRunInSyncListeners = true ;
156
+ raisedEvent = true ;
154
157
}
155
158
}
156
159
} ) ;
157
- if ( shouldRunInSyncListeners ) {
158
- this . runSnapshotsInSyncListeners ( ) ;
160
+ if ( raisedEvent ) {
161
+ this . raiseSnapshotsInSyncEvent ( ) ;
159
162
}
160
163
}
161
164
162
- hasQueries ( ) : boolean {
163
- return ! this . queries . isEmpty ( ) ;
164
- }
165
-
166
- addSnapshotsInSyncListener ( asyncObserver : AsyncObserver < void > ) : void {
167
- this . snapshotsInSyncListeners . add ( asyncObserver ) ;
165
+ addSnapshotsInSyncListener ( observer : Observer < void > ) : void {
166
+ // If there are no active query listeners, run the callback immediately.
167
+ if ( this . queries . isEmpty ( ) ) {
168
+ observer . next ( ) ;
169
+ }
170
+ this . snapshotsInSyncListeners . add ( observer ) ;
168
171
}
169
172
170
- removeSnapshotsInSyncListener ( asyncObserver : AsyncObserver < void > ) : void {
171
- this . snapshotsInSyncListeners . delete ( asyncObserver ) ;
173
+ removeSnapshotsInSyncListener ( observer : Observer < void > ) : void {
174
+ this . snapshotsInSyncListeners . delete ( observer ) ;
172
175
}
173
176
174
177
// Call all global snapshot listeners that have been set.
175
- private runSnapshotsInSyncListeners ( ) : void {
178
+ private raiseSnapshotsInSyncEvent ( ) : void {
176
179
this . snapshotsInSyncListeners . forEach ( observer => {
177
180
observer . next ( ) ;
178
181
} ) ;
@@ -217,7 +220,12 @@ export class QueryListener {
217
220
this . options = options || { } ;
218
221
}
219
222
220
- /** Processes the ViewSnapshots and returns whether a snapshot was raised. */
223
+ /**
224
+ * Applies the new ViewSnapshot to this listener, raising a user-facing event
225
+ * if applicable (depending on what changed, whether the user has opted into
226
+ * metadata-only changes, etc.). Returns true if a user-facing event was
227
+ * indeed raised.
228
+ */
221
229
onViewSnapshot ( snap : ViewSnapshot ) : boolean {
222
230
assert (
223
231
snap . docChanges . length > 0 || snap . syncStateChanged ,
@@ -243,19 +251,19 @@ export class QueryListener {
243
251
/* excludesMetadataChanges= */ true
244
252
) ;
245
253
}
246
- let didRaiseSnapshot = false ;
254
+ let raisedEvent = false ;
247
255
if ( ! this . raisedInitialEvent ) {
248
256
if ( this . shouldRaiseInitialEvent ( snap , this . onlineState ) ) {
249
257
this . raiseInitialEvent ( snap ) ;
250
- didRaiseSnapshot = true ;
258
+ raisedEvent = true ;
251
259
}
252
260
} else if ( this . shouldRaiseEvent ( snap ) ) {
253
261
this . queryObserver . next ( snap ) ;
254
- didRaiseSnapshot = true ;
262
+ raisedEvent = true ;
255
263
}
256
264
257
265
this . snap = snap ;
258
- return didRaiseSnapshot ;
266
+ return raisedEvent ;
259
267
}
260
268
261
269
onError ( error : Error ) : void {
@@ -265,16 +273,16 @@ export class QueryListener {
265
273
/** Returns whether a snapshot was raised. */
266
274
applyOnlineStateChange ( onlineState : OnlineState ) : boolean {
267
275
this . onlineState = onlineState ;
268
- let didRaiseSnapshot = false ;
276
+ let raisedEvent = false ;
269
277
if (
270
278
this . snap &&
271
279
! this . raisedInitialEvent &&
272
280
this . shouldRaiseInitialEvent ( this . snap , onlineState )
273
281
) {
274
282
this . raiseInitialEvent ( this . snap ) ;
275
- didRaiseSnapshot = true ;
283
+ raisedEvent = true ;
276
284
}
277
- return didRaiseSnapshot ;
285
+ return raisedEvent ;
278
286
}
279
287
280
288
private shouldRaiseInitialEvent (
0 commit comments