@@ -133,7 +133,9 @@ export function createWebSocketServer(
133
133
wss = new WebSocketServerRaw ( { noServer : true } )
134
134
hmrServerWsListener = ( req , socket , head ) => {
135
135
if (
136
- req . headers [ 'sec-websocket-protocol' ] === HMR_HEADER &&
136
+ [ HMR_HEADER , 'vite-ping' ] . includes (
137
+ req . headers [ 'sec-websocket-protocol' ] ! ,
138
+ ) &&
137
139
req . url === hmrBase
138
140
) {
139
141
wss . handleUpgrade ( req , socket as Socket , head , ( ws ) => {
@@ -157,17 +159,46 @@ export function createWebSocketServer(
157
159
} )
158
160
res . end ( body )
159
161
} ) as Parameters < typeof createHttpServer > [ 1 ]
162
+ // vite dev server in middleware mode
163
+ // need to call ws listen manually
160
164
if ( httpsOptions ) {
161
165
wsHttpServer = createHttpsServer ( httpsOptions , route )
162
166
} else {
163
167
wsHttpServer = createHttpServer ( route )
164
168
}
165
- // vite dev server in middleware mode
166
- // need to call ws listen manually
167
- wss = new WebSocketServerRaw ( { server : wsHttpServer } )
169
+ wss = new WebSocketServerRaw ( { noServer : true } )
170
+ wsHttpServer . on ( 'upgrade' , ( req , socket , head ) => {
171
+ const protocol = req . headers [ 'sec-websocket-protocol' ] !
172
+ if ( protocol === 'vite-ping' && server && ! server . listening ) {
173
+ // reject connection to tell the vite/client that the server is not ready
174
+ // if the http server is not listening
175
+ // because the ws server listens before the http server listens
176
+ req . destroy ( )
177
+ return
178
+ }
179
+ wss . handleUpgrade ( req , socket as Socket , head , ( ws ) => {
180
+ wss . emit ( 'connection' , ws , req )
181
+ } )
182
+ } )
183
+ wsHttpServer . on ( 'error' , ( e : Error & { code : string } ) => {
184
+ if ( e . code === 'EADDRINUSE' ) {
185
+ config . logger . error (
186
+ colors . red ( `WebSocket server error: Port is already in use` ) ,
187
+ { error : e } ,
188
+ )
189
+ } else {
190
+ config . logger . error (
191
+ colors . red ( `WebSocket server error:\n${ e . stack || e . message } ` ) ,
192
+ { error : e } ,
193
+ )
194
+ }
195
+ } )
168
196
}
169
197
170
198
wss . on ( 'connection' , ( socket ) => {
199
+ if ( socket . protocol === 'vite-ping' ) {
200
+ return
201
+ }
171
202
socket . on ( 'message' , ( raw ) => {
172
203
if ( ! customListeners . size ) return
173
204
let parsed : any
0 commit comments