@@ -4,6 +4,7 @@ const WebSocket = require('ws');
4
4
const expectedCloseReasons = {
5
5
invalidFrame :'Received invalid WebSocket frame' ,
6
6
tcpFinBeforeClose :'Received TCP FIN before WebSocket close frame' ,
7
+ timeout :'WebSocket timed out from inactivity' ,
7
8
} ;
8
9
9
10
let closeTestsPassed = true ;
@@ -12,6 +13,8 @@ let closeTestsPassed = true;
12
13
const port = 9001 ;
13
14
14
15
const server = uWS . App ( ) . ws ( '/*' , {
16
+ idleTimeout :8 , // Set idle timeout to 8 seconds
17
+ sendPingsAutomatically :false , // Needed for timeout
15
18
open :( ws ) => {
16
19
console . log ( 'A WebSocket connected!' ) ;
17
20
} ,
@@ -27,6 +30,8 @@ const server = uWS.App().ws('/*', {
27
30
console . log ( 'Test passed: Invalid WebSocket frame' ) ;
28
31
} else if ( reason === expectedCloseReasons . tcpFinBeforeClose ) {
29
32
console . log ( 'Test passed: TCP FIN before WebSocket close frame' ) ;
33
+ } else if ( reason === expectedCloseReasons . timeout ) {
34
+ console . log ( 'Test passed: WebSocket timed out from inactivity' ) ;
30
35
} else {
31
36
console . error ( 'Test failed: Unexpected close reason:' , reason ) ;
32
37
closeTestsPassed = false ;
@@ -40,15 +45,17 @@ const server = uWS.App().ws('/*', {
40
45
if ( token ) {
41
46
console . log ( 'Listening to port' , port ) ;
42
47
43
- const triggerClosure = ( malformedData , useEnd ) => {
48
+ const triggerClosure = ( malformedData , useEnd , useTimeout ) => {
44
49
const client = new WebSocket ( `ws://localhost:${ port } ` ) ;
45
50
46
51
client . on ( 'open' , ( ) => {
47
52
console . log ( 'Client connected to server' ) ;
48
-
49
53
if ( useEnd ) {
50
54
// Trigger "Received TCP FIN before WebSocket close frame"
51
55
client . _socket . end ( ) ;
56
+ } else if ( useTimeout ) {
57
+ // Trigger timeout by keeping connection idle
58
+ console . log ( 'Starting timeout test: Keeping connection open for timeout' ) ;
52
59
} else {
53
60
// Trigger "Received invalid WebSocket frame"
54
61
client . _socket . write ( malformedData ) ;
@@ -66,15 +73,21 @@ const server = uWS.App().ws('/*', {
66
73
67
74
// Test 1: Trigger invalid WebSocket frame
68
75
const malformedData = Buffer . from ( [ 0xFF , 0x80 , 0x00 , 0x00 , 0x00 , 0x01 ] ) ;
69
- triggerClosure ( malformedData , false ) ;
76
+ triggerClosure ( malformedData , false , false ) ;
70
77
71
- // Wait fora short period before triggering the next test to ensure the server handles sequentially
78
+ // Wait forTest 1 to complete before triggering the next test
72
79
setTimeout ( ( ) => {
73
80
// Test 2: Trigger TCP FIN before WebSocket close frame
74
- triggerClosure ( null , true ) ;
75
- } , 1000 ) ; // Adjust the delay as necessary
81
+ triggerClosure ( null , true , false ) ;
82
+
83
+ // Wait for Test 2 to complete before starting Test 3
84
+ setTimeout ( ( ) => {
85
+ // Test 3: Trigger timeout (idleTimeout = 8 should close after ~32s)
86
+ triggerClosure ( null , false , true ) ;
87
+ } , 1000 ) ;
88
+ } , 1000 ) ;
76
89
77
- // Allowsome time for tests torun before exiting
90
+ // Allow time forall tests tocomplete before exiting
78
91
setTimeout ( ( ) => {
79
92
if ( closeTestsPassed ) {
80
93
console . log ( 'All tests passed.' ) ;
@@ -83,7 +96,7 @@ const server = uWS.App().ws('/*', {
83
96
console . error ( 'Some tests failed.' ) ;
84
97
process . exit ( 1 ) ;
85
98
}
86
- } , 3000 ) ; //Adjust the delay as necessary
99
+ } , 16000 ) ; //Increased to 40s to account for timeout test (~32s + buffer)
87
100
} else {
88
101
console . log ( 'Failed to listen to port' , port ) ;
89
102
process . exit ( 1 ) ;