@@ -26,19 +26,21 @@ describePlugin('websocket', () => {
2626 const messages = await tauri ( async ( api , url ) => {
2727 const ws = await api . websocket . connect ( url )
2828 const received : Message [ ] = [ ]
29- await new Promise < void > ( ( resolve , reject ) => {
29+ // a copy taken once the echoes are in: the close acknowledgement that
30+ // `disconnect` triggers may arrive before this function returns
31+ const echoes = await new Promise < Message [ ] > ( ( resolve , reject ) => {
3032 setTimeout ( ( ) => reject ( new Error ( 'echo not received' ) ) , 5000 )
3133 ws . addListener ( ( message ) => {
3234 received . push ( message )
33- if ( received . length === 3 ) resolve ( )
35+ if ( received . length === 3 ) resolve ( received . slice ( ) )
3436 } )
3537 ws . send ( 'hello' )
3638 . then ( ( ) => ws . send ( [ 1 , 2 , 3 ] ) )
3739 . then ( ( ) => ws . send ( { type : 'Text' , data : 'explicit' } ) )
3840 . catch ( reject )
3941 } )
4042 await ws . disconnect ( )
41- return received
43+ return echoes
4244 } , WEBSOCKET_FIXTURE_URL )
4345 expect ( messages ) . toEqual ( [
4446 { type : 'Text' , data : 'hello' } ,
@@ -84,21 +86,25 @@ describePlugin('websocket', () => {
8486 let removed = 0
8587 let kept = 0
8688 const remove = ws . addListener ( ( ) => removed ++ )
87- await new Promise < void > ( ( resolve , reject ) => {
88- setTimeout ( ( ) => reject ( new Error ( 'echoes not received' ) ) , 5000 )
89- ws . addListener ( ( ) => {
90- kept ++
91- if ( kept === 1 ) {
92- remove ( )
93- ws . send ( 'second' ) . catch ( reject )
94- } else {
95- resolve ( )
96- }
97- } )
98- ws . send ( 'first' ) . catch ( reject )
99- } )
89+ // counted once both echoes are in, before `disconnect`'s close
90+ // acknowledgement can reach the listener still attached
91+ const counts = await new Promise < { removed : number ; kept : number } > (
92+ ( resolve , reject ) => {
93+ setTimeout ( ( ) => reject ( new Error ( 'echoes not received' ) ) , 5000 )
94+ ws . addListener ( ( ) => {
95+ kept ++
96+ if ( kept === 1 ) {
97+ remove ( )
98+ ws . send ( 'second' ) . catch ( reject )
99+ } else {
100+ resolve ( { removed, kept } )
101+ }
102+ } )
103+ ws . send ( 'first' ) . catch ( reject )
104+ }
105+ )
100106 await ws . disconnect ( )
101- return { removed , kept }
107+ return counts
102108 } , WEBSOCKET_FIXTURE_URL )
103109 expect ( counts ) . toEqual ( { removed : 1 , kept : 2 } )
104110 } )
0 commit comments