@@ -7,6 +7,13 @@ const root: any = (typeof globalThis !== 'undefined' && globalThis)
7
7
|| ( typeof self !== 'undefined' && self )
8
8
|| global ;
9
9
10
+ enum WebSocketState {
11
+ CONNECTING = 0 ,
12
+ OPEN = 1 ,
13
+ CLOSING = 2 ,
14
+ CLOSED = 3
15
+ }
16
+
10
17
/** @test {webSocket} */
11
18
describe ( 'webSocket' , ( ) => {
12
19
let __ws : any ;
@@ -131,15 +138,18 @@ describe('webSocket', () => {
131
138
const socket = MockWebSocket . lastSocket ;
132
139
socket . open ( ) ;
133
140
134
- expect ( socket . readyState ) . to . equal ( 1 ) ; // open
141
+ expect ( socket . readyState ) . to . equal ( WebSocketState . OPEN ) ;
135
142
136
143
sinon . spy ( socket , 'close' ) ;
137
144
138
145
expect ( socket . close ) . not . have . been . called ;
139
146
140
147
subject . complete ( ) ;
141
148
expect ( socket . close ) . have . been . called ;
142
- expect ( socket . readyState ) . to . equal ( 3 ) ; // closed
149
+ expect ( socket . readyState ) . to . equal ( WebSocketState . CLOSING ) ;
150
+
151
+ socket . triggerClose ( { wasClean : true } ) ;
152
+ expect ( socket . readyState ) . to . equal ( WebSocketState . CLOSED ) ;
143
153
144
154
subject . unsubscribe ( ) ;
145
155
( < any > socket . close ) . restore ( ) ;
@@ -154,7 +164,7 @@ describe('webSocket', () => {
154
164
socket . open ( ) ;
155
165
156
166
expect ( socket . close ) . have . been . called ;
157
- expect ( socket . readyState ) . to . equal ( 3 ) ; // closed
167
+ expect ( socket . readyState ) . to . equal ( WebSocketState . CLOSING ) ;
158
168
159
169
( < any > socket . close ) . restore ( ) ;
160
170
} ) ;
@@ -168,7 +178,7 @@ describe('webSocket', () => {
168
178
socket . open ( ) ;
169
179
170
180
expect ( socket . close ) . have . been . called ;
171
- expect ( socket . readyState ) . to . equal ( 3 ) ; // closed
181
+ expect ( socket . readyState ) . to . equal ( WebSocketState . CLOSING ) ;
172
182
173
183
( < any > socket . close ) . restore ( ) ;
174
184
} ) ;
@@ -181,7 +191,7 @@ describe('webSocket', () => {
181
191
subject . unsubscribe ( ) ;
182
192
183
193
expect ( socket . close ) . have . been . called ;
184
- expect ( socket . readyState ) . to . equal ( 3 ) ; // closed
194
+ expect ( socket . readyState ) . to . equal ( WebSocketState . CLOSING ) ;
185
195
186
196
( < any > socket . close ) . restore ( ) ;
187
197
} ) ;
@@ -194,7 +204,36 @@ describe('webSocket', () => {
194
204
subscription . unsubscribe ( ) ;
195
205
196
206
expect ( socket . close ) . have . been . called ;
197
- expect ( socket . readyState ) . to . equal ( 3 ) ; // closed
207
+ expect ( socket . readyState ) . to . equal ( WebSocketState . CLOSING ) ;
208
+
209
+ ( < any > socket . close ) . restore ( ) ;
210
+ } ) ;
211
+
212
+ it ( 'should close a socket that opens before the previous socket has closed' , ( ) => {
213
+ const subject = webSocket < string > ( 'ws://mysocket' ) ;
214
+ const subscription = subject . subscribe ( ) ;
215
+ const socket = MockWebSocket . lastSocket ;
216
+ sinon . spy ( socket , 'close' ) ;
217
+ subscription . unsubscribe ( ) ;
218
+
219
+ expect ( socket . close ) . have . been . called ;
220
+ expect ( socket . readyState ) . to . equal ( WebSocketState . CLOSING ) ;
221
+
222
+ const subscription2 = subject . subscribe ( ) ;
223
+ const socket2 = MockWebSocket . lastSocket ;
224
+ sinon . spy ( socket2 , 'close' ) ;
225
+
226
+ // Close socket after socket2 has opened
227
+ socket2 . open ( ) ;
228
+ expect ( socket2 . readyState ) . to . equal ( WebSocketState . OPEN ) ;
229
+ socket . triggerClose ( { wasClean : true } ) ;
230
+
231
+ expect ( socket . readyState ) . to . equal ( WebSocketState . CLOSED ) ;
232
+ expect ( socket2 . close ) . have . not . been . called ;
233
+
234
+ subscription2 . unsubscribe ( ) ;
235
+ expect ( socket2 . close ) . have . been . called ;
236
+ expect ( socket2 . readyState ) . to . equal ( WebSocketState . CLOSING ) ;
198
237
199
238
( < any > socket . close ) . restore ( ) ;
200
239
} ) ;
@@ -747,7 +786,7 @@ class MockWebSocket {
747
786
748
787
sent : string [ ] = [ ] ;
749
788
handlers : any = { } ;
750
- readyState : number = 0 ;
789
+ readyState : WebSocketState = WebSocketState . CONNECTING ;
751
790
closeCode : any ;
752
791
closeReason : any ;
753
792
binaryType ?: string ;
@@ -766,8 +805,8 @@ class MockWebSocket {
766
805
return length > 0 ? sent [ length - 1 ] : undefined ! ;
767
806
}
768
807
769
- triggerClose ( e : any ) : void {
770
- this . readyState = 3 ;
808
+ triggerClose ( e : Partial < CloseEvent > ) : void {
809
+ this . readyState = WebSocketState . CLOSED ;
771
810
this . trigger ( 'close' , e ) ;
772
811
}
773
812
@@ -783,16 +822,15 @@ class MockWebSocket {
783
822
}
784
823
785
824
open ( ) : void {
786
- this . readyState = 1 ;
825
+ this . readyState = WebSocketState . OPEN ;
787
826
this . trigger ( 'open' , { } ) ;
788
827
}
789
828
790
829
close ( code : any , reason : any ) : void {
791
- if ( this . readyState < 2 ) {
792
- this . readyState = 2 ;
830
+ if ( this . readyState < WebSocketState . CLOSING ) {
831
+ this . readyState = WebSocketState . CLOSING ;
793
832
this . closeCode = code ;
794
833
this . closeReason = reason ;
795
- this . triggerClose ( { wasClean : true } ) ;
796
834
}
797
835
}
798
836
0 commit comments