@@ -4,6 +4,72 @@ const config = require('../fixtures/simple-config/rspack.config');
44const runBrowser = require ( '../helpers/run-browser' ) ;
55const port = require ( '../helpers/ports-map' ) [ 'client-reconnect-option' ] ;
66
7+ const DISCONNECTED_MESSAGE = 'Disconnected!' ;
8+ const RECONNECT_MESSAGE = 'Trying to reconnect...' ;
9+ const FAST_RECONNECT_DELAY = 100 ;
10+
11+ const delay = ( ms ) => new Promise ( ( resolve ) => setTimeout ( resolve , ms ) ) ;
12+
13+ const waitForMessages = async (
14+ consoleMessages ,
15+ predicate ,
16+ errorMessage ,
17+ timeout = 10000 ,
18+ ) => {
19+ const startedAt = Date . now ( ) ;
20+
21+ while ( Date . now ( ) - startedAt < timeout ) {
22+ const texts = consoleMessages . map ( ( message ) => message . text ( ) ) ;
23+
24+ if ( predicate ( texts ) ) {
25+ return ;
26+ }
27+
28+ await delay ( 50 ) ;
29+ }
30+
31+ throw new Error ( errorMessage ) ;
32+ } ;
33+
34+ const waitForReconnectMessages = ( consoleMessages , expectedCount ) =>
35+ waitForMessages (
36+ consoleMessages ,
37+ ( texts ) =>
38+ texts . filter ( ( text ) => text . includes ( RECONNECT_MESSAGE ) ) . length >=
39+ expectedCount ,
40+ `Expected ${ expectedCount } reconnect messages.` ,
41+ 15000 ,
42+ ) ;
43+
44+ const waitForDisconnectMessage = ( consoleMessages ) =>
45+ waitForMessages (
46+ consoleMessages ,
47+ ( texts ) => texts . some ( ( text ) => text . includes ( DISCONNECTED_MESSAGE ) ) ,
48+ `Expected "${ DISCONNECTED_MESSAGE } " message.` ,
49+ ) ;
50+
51+ const waitForConsoleMessages = ( consoleMessages , expectedCount ) =>
52+ waitForMessages (
53+ consoleMessages ,
54+ ( texts ) => texts . length >= expectedCount ,
55+ `Expected ${ expectedCount } console messages.` ,
56+ ) ;
57+
58+ const useFastPageReconnectTimers = async ( page ) => {
59+ await page . evaluateOnNewDocument ( ( fastReconnectDelay ) => {
60+ const originalSetTimeout = window . setTimeout . bind ( window ) ;
61+
62+ window . setTimeout = ( handler , timeout , ...args ) =>
63+ originalSetTimeout (
64+ handler ,
65+ typeof timeout === 'number' && timeout >= 1000
66+ ? fastReconnectDelay
67+ : timeout ,
68+ ...args ,
69+ ) ;
70+ } , FAST_RECONNECT_DELAY ) ;
71+ } ;
72+
773describe ( 'client.reconnect option' , ( ) => {
874 describe ( 'specified as true' , ( ) => {
975 let compiler ;
@@ -21,6 +87,7 @@ describe('client.reconnect option', () => {
2187 await server . start ( ) ;
2288
2389 ( { page, browser } = await runBrowser ( ) ) ;
90+ await useFastPageReconnectTimers ( page ) ;
2491
2592 pageErrors = [ ] ;
2693 consoleMessages = [ ] ;
@@ -49,21 +116,7 @@ describe('client.reconnect option', () => {
49116 await server . stop ( ) ;
50117 }
51118
52- let interval ;
53-
54- await new Promise ( ( resolve ) => {
55- interval = setInterval ( ( ) => {
56- const retryingMessages = consoleMessages . filter ( ( message ) =>
57- message . text ( ) . includes ( 'Trying to reconnect...' ) ,
58- ) ;
59-
60- if ( retryingMessages . length >= 5 ) {
61- clearInterval ( interval ) ;
62-
63- resolve ( ) ;
64- }
65- } , 1000 ) ;
66- } ) ;
119+ await waitForReconnectMessages ( consoleMessages , 5 ) ;
67120
68121 expect ( pageErrors ) . toMatchSnapshot ( 'page errors' ) ;
69122 } ) ;
@@ -85,6 +138,7 @@ describe('client.reconnect option', () => {
85138 await server . start ( ) ;
86139
87140 ( { page, browser } = await runBrowser ( ) ) ;
141+ await useFastPageReconnectTimers ( page ) ;
88142
89143 pageErrors = [ ] ;
90144 consoleMessages = [ ] ;
@@ -113,16 +167,7 @@ describe('client.reconnect option', () => {
113167 await server . stop ( ) ;
114168 }
115169
116- // Can't wait to check for unlimited times so wait only for couple retries
117- await new Promise ( ( resolve ) =>
118- setTimeout (
119- ( ) => {
120- resolve ( ) ;
121- } ,
122- // eslint-disable-next-line no-restricted-properties
123- 1000 * 2 ** 3 ,
124- ) ,
125- ) ;
170+ await waitForDisconnectMessage ( consoleMessages ) ;
126171
127172 expect ( consoleMessages . map ( ( message ) => message . text ( ) ) ) . toMatchSnapshot (
128173 'console messages' ,
@@ -148,6 +193,7 @@ describe('client.reconnect option', () => {
148193 await server . start ( ) ;
149194
150195 ( { page, browser } = await runBrowser ( ) ) ;
196+ await useFastPageReconnectTimers ( page ) ;
151197
152198 pageErrors = [ ] ;
153199 consoleMessages = [ ] ;
@@ -176,16 +222,8 @@ describe('client.reconnect option', () => {
176222 await server . stop ( ) ;
177223 }
178224
179- // Can't wait to check for unlimited times so wait only for couple retries
180- await new Promise ( ( resolve ) =>
181- setTimeout (
182- ( ) => {
183- resolve ( ) ;
184- } ,
185- // eslint-disable-next-line no-restricted-properties
186- 1000 * 2 ** 3 ,
187- ) ,
188- ) ;
225+ await waitForReconnectMessages ( consoleMessages , 2 ) ;
226+ await waitForConsoleMessages ( consoleMessages , 10 ) ;
189227
190228 expect ( consoleMessages . map ( ( message ) => message . text ( ) ) ) . toMatchSnapshot (
191229 'console messages' ,
0 commit comments