@@ -16,8 +16,6 @@ function waitForLogMessage (loggerSpy, message, max = 100) {
1616 return new Promise ( ( resolve , reject ) => {
1717 let count = 0
1818 const fn = ( received ) => {
19- console . log ( received )
20-
2119 if ( received . msg === message ) {
2220 loggerSpy . off ( 'data' , fn )
2321 resolve ( )
@@ -32,17 +30,27 @@ function waitForLogMessage (loggerSpy, message, max = 100) {
3230 } )
3331}
3432
35- async function createServices ( { t, upstream , wsReconnectOptions , wsTargetOptions, wsServerOptions } ) {
33+ async function createTargetServer ( t , wsTargetOptions , port = 0 ) {
3634 const targetServer = createServer ( )
3735 const targetWs = new WebSocket . Server ( { server : targetServer , ...wsTargetOptions } )
36+ await promisify ( targetServer . listen . bind ( targetServer ) ) ( { port, host : '127.0.0.1' } )
37+
38+ t . after ( ( ) => {
39+ targetWs . close ( )
40+ targetServer . close ( )
41+ } )
42+
43+ return { targetServer, targetWs }
44+ }
3845
39- await promisify ( targetServer . listen . bind ( targetServer ) ) ( { port : 0 , host : '127.0.0.1' } )
46+ async function createServices ( { t, wsReconnectOptions, wsTargetOptions, wsServerOptions, targetPort = 0 } ) {
47+ const { targetServer, targetWs } = await createTargetServer ( t , wsTargetOptions , targetPort )
4048
4149 const loggerSpy = pinoTest . sink ( )
4250 const logger = pino ( loggerSpy )
4351 const proxy = Fastify ( { loggerInstance : logger } )
4452 proxy . register ( proxyPlugin , {
45- upstream : upstream || `ws://127.0.0.1:${ targetServer . address ( ) . port } ` ,
53+ upstream : `ws://127.0.0.1:${ targetServer . address ( ) . port } ` ,
4654 websocket : true ,
4755 wsReconnect : wsReconnectOptions ,
4856 wsServerOptions
@@ -55,8 +63,6 @@ async function createServices ({ t, upstream, wsReconnectOptions, wsTargetOption
5563
5664 t . after ( async ( ) => {
5765 client . close ( )
58- targetWs . close ( )
59- targetServer . close ( )
6066 await proxy . close ( )
6167 } )
6268
@@ -67,8 +73,7 @@ async function createServices ({ t, upstream, wsReconnectOptions, wsTargetOption
6773 } ,
6874 proxy,
6975 client,
70- loggerSpy,
71- upstream
76+ loggerSpy
7277 }
7378}
7479
@@ -94,13 +99,13 @@ test('should reconnect on broken connection', async (t) => {
9499
95100 const { target, loggerSpy } = await createServices ( { t, wsReconnectOptions, wsTargetOptions : { autoPong : false } } )
96101
97- const breakConnection = true
102+ let breakConnection = true
98103 target . ws . on ( 'connection' , async ( socket ) => {
99104 socket . on ( 'ping' , async ( ) => {
100105 // add latency to break the connection once
101106 if ( breakConnection ) {
102107 await wait ( wsReconnectOptions . pingInterval * 2 )
103- // breakConnection = false
108+ breakConnection = false
104109 }
105110 socket . pong ( )
106111 } )
@@ -157,12 +162,11 @@ test('should reconnect on regular target connection close', async (t) => {
157162 await waitForLogMessage ( loggerSpy , 'proxy ws close link' )
158163} )
159164
160- /*
161- TODO fix
162- test('should reconnect with retry', async (t) => {
163- const wsReconnectOptions = { pingInterval: 150, reconnectInterval: 100, reconnectOnClose: true }
165+ test ( 'should reconnect retrying after a few failures' , async ( t ) => {
166+ const wsReconnectOptions = { pingInterval : 150 , reconnectInterval : 100 , reconnectDecay : 2 , logs : true , maxReconnectionRetries : Infinity }
164167
165- const { target, loggerSpy, upstream } = await createServices({ t, wsReconnectOptions, wsTargetOptions: { autoPong: false } })
168+ const wsTargetOptions = { autoPong : false }
169+ const { target, loggerSpy } = await createServices ( { t, wsReconnectOptions, wsTargetOptions } )
166170
167171 let breakConnection = true
168172
@@ -179,14 +183,17 @@ test('should reconnect with retry', async (t) => {
179183
180184 await waitForLogMessage ( loggerSpy , 'proxy ws connection is broken' )
181185
182- // recreate a new target with the same upstream
183-
186+ // recreate a new target
187+ const targetPort = target . server . address ( ) . port
184188 target . ws . close ( )
185189 target . server . close ( )
186- await createServices({ t, upstream, wsReconnectOptions, wsTargetOptions: { autoPong: false } })
187190
188191 await waitForLogMessage ( loggerSpy , 'proxy ws target close event' )
192+ // make reconnection fail 2 times
189193 await waitForLogMessage ( loggerSpy , 'proxy ws reconnect error' )
194+ await waitForLogMessage ( loggerSpy , 'proxy ws reconnect in 200 ms' )
195+
196+ // recreate the target
197+ await createTargetServer ( t , { autoPong : true } , targetPort )
190198 await waitForLogMessage ( loggerSpy , 'proxy ws reconnected' )
191199} )
192- */
0 commit comments