@@ -38,21 +38,19 @@ function fastifyWebsocket (fastify, opts, next) {
3838 const wss = new WebSocket . Server ( wssOptions )
3939 fastify . decorate ( 'websocketServer' , wss )
4040
41- websocketListenServer . on ( 'upgrade' , ( rawRequest , socket , head ) => {
41+ function onUpgrade ( rawRequest , socket , head ) {
4242 // Save a reference to the socket and then dispatch the request through the normal fastify router so that it will invoke hooks and then eventually a route handler that might upgrade the socket.
4343 rawRequest [ kWs ] = socket
4444 rawRequest [ kWsHead ] = head
45-
46- if ( closing ) {
47- handleUpgrade ( rawRequest , ( connection ) => {
48- connection . socket . close ( 1001 )
49- } )
50- } else {
51- const rawResponse = new ServerResponse ( rawRequest )
45+ const rawResponse = new ServerResponse ( rawRequest )
46+ try {
5247 rawResponse . assignSocket ( socket )
5348 fastify . routing ( rawRequest , rawResponse )
49+ } catch ( err ) {
50+ fastify . log . warn ( { err } , 'websocket upgrade failed' )
5451 }
55- } )
52+ }
53+ websocketListenServer . on ( 'upgrade' , onUpgrade )
5654
5755 const handleUpgrade = ( rawRequest , callback ) => {
5856 wss . handleUpgrade ( rawRequest , rawRequest [ kWs ] , rawRequest [ kWsHead ] , ( socket ) => {
@@ -147,24 +145,23 @@ function fastifyWebsocket (fastify, opts, next) {
147145
148146 fastify . addHook ( 'onClose' , close )
149147
150- let closing = false
151-
152148 // Fastify is missing a pre-close event, or the ability to
153149 // add a hook before the server.close call. We need to resort
154150 // to monkeypatching for now.
155- const oldClose = fastify . server . close
156- fastify . server . close = function ( cb ) {
157- closing = true
158-
159- // Call oldClose first so that we stop listening. This ensures the
160- // server.clients list will be up to date when we start closing below.
161- oldClose . call ( this , cb )
151+ fastify . addHook ( 'preClose' , function ( done ) {
152+ const server = this . websocketServer
153+ if ( server . clients ) {
154+ for ( const client of server . clients ) {
155+ client . close ( )
156+ }
157+ }
158+ fastify . server . removeListener ( 'upgrade' , onUpgrade )
159+ done ( )
160+ } )
162161
162+ function close ( fastify , done ) {
163163 const server = fastify . websocketServer
164- if ( ! server . clients ) return
165- for ( const client of server . clients ) {
166- client . close ( )
167- }
164+ server . close ( done )
168165 }
169166
170167 function noHandle ( connection , rawRequest ) {
@@ -185,13 +182,8 @@ function fastifyWebsocket (fastify, opts, next) {
185182 next ( )
186183}
187184
188- function close ( fastify , done ) {
189- const server = fastify . websocketServer
190- server . close ( done )
191- }
192-
193185module . exports = fp ( fastifyWebsocket , {
194- fastify : '>= 4.0 .0' ,
186+ fastify : '^4.16 .0' ,
195187 name : '@fastify/websocket'
196188} )
197189module . exports . default = fastifyWebsocket
0 commit comments