@@ -22,7 +22,10 @@ import {
22
22
Token
23
23
} from '../../../src/api/credentials' ;
24
24
import { SnapshotVersion } from '../../../src/core/snapshot_version' ;
25
+ import { Target } from '../../../src/core/target' ;
26
+ import { TargetData , TargetPurpose } from '../../../src/local/target_data' ;
25
27
import { MutationResult } from '../../../src/model/mutation' ;
28
+ import { ResourcePath } from '../../../src/model/path' ;
26
29
import {
27
30
newPersistentWatchStream ,
28
31
newPersistentWriteStream
@@ -57,7 +60,8 @@ type StreamEventType =
57
60
| 'mutationResult'
58
61
| 'watchChange'
59
62
| 'open'
60
- | 'close' ;
63
+ | 'close'
64
+ | 'connected' ;
61
65
62
66
const SINGLE_MUTATION = [ setMutation ( 'docs/1' , { foo : 'bar' } ) ] ;
63
67
@@ -117,6 +121,10 @@ class StreamStatusListener implements WatchStreamListener, WriteStreamListener {
117
121
return this . resolvePending ( 'watchChange' ) ;
118
122
}
119
123
124
+ onConnected ( ) : Promise < void > {
125
+ return this . resolvePending ( 'connected' ) ;
126
+ }
127
+
120
128
onOpen ( ) : Promise < void > {
121
129
return this . resolvePending ( 'open' ) ;
122
130
}
@@ -148,6 +156,14 @@ describe('Watch Stream', () => {
148
156
} ) ;
149
157
} ) ;
150
158
} ) ;
159
+
160
+ it ( 'gets connected event before first message' , ( ) => {
161
+ return withTestWatchStream ( async ( watchStream , streamListener ) => {
162
+ await streamListener . awaitCallback ( 'open' ) ;
163
+ watchStream . watch ( sampleTargetData ( ) ) ;
164
+ await streamListener . awaitCallback ( 'connected' ) ;
165
+ } ) ;
166
+ } ) ;
151
167
} ) ;
152
168
153
169
class MockAuthCredentialsProvider extends EmptyAuthCredentialsProvider {
@@ -190,6 +206,7 @@ describe('Write Stream', () => {
190
206
'Handshake must be complete before writing mutations'
191
207
) ;
192
208
writeStream . writeHandshake ( ) ;
209
+ await streamListener . awaitCallback ( 'connected' ) ;
193
210
await streamListener . awaitCallback ( 'handshakeComplete' ) ;
194
211
195
212
// Now writes should succeed
@@ -205,9 +222,10 @@ describe('Write Stream', () => {
205
222
return withTestWriteStream ( ( writeStream , streamListener , queue ) => {
206
223
return streamListener
207
224
. awaitCallback ( 'open' )
208
- . then ( ( ) => {
225
+ . then ( async ( ) => {
209
226
writeStream . writeHandshake ( ) ;
210
- return streamListener . awaitCallback ( 'handshakeComplete' ) ;
227
+ await streamListener . awaitCallback ( 'connected' ) ;
228
+ await streamListener . awaitCallback ( 'handshakeComplete' ) ;
211
229
} )
212
230
. then ( ( ) => {
213
231
writeStream . markIdle ( ) ;
@@ -228,6 +246,7 @@ describe('Write Stream', () => {
228
246
return withTestWriteStream ( async ( writeStream , streamListener , queue ) => {
229
247
await streamListener . awaitCallback ( 'open' ) ;
230
248
writeStream . writeHandshake ( ) ;
249
+ await streamListener . awaitCallback ( 'connected' ) ;
231
250
await streamListener . awaitCallback ( 'handshakeComplete' ) ;
232
251
233
252
// Mark the stream idle, but immediately cancel the idle timer by issuing another write.
@@ -336,3 +355,16 @@ export async function withTestWatchStream(
336
355
streamListener . verifyNoPendingCallbacks ( ) ;
337
356
} ) ;
338
357
}
358
+
359
+ function sampleTargetData ( ) : TargetData {
360
+ const target : Target = {
361
+ path : ResourcePath . emptyPath ( ) ,
362
+ collectionGroup : null ,
363
+ orderBy : [ ] ,
364
+ filters : [ ] ,
365
+ limit : null ,
366
+ startAt : null ,
367
+ endAt : null
368
+ } ;
369
+ return new TargetData ( target , 1 , TargetPurpose . Listen , 1 ) ;
370
+ }
0 commit comments