@@ -666,7 +666,7 @@ describe('dev server handover', () => {
666666} )
667667
668668describe ( 'dev server websocket upgrades' , ( ) => {
669- function upgrade ( server : InstanceType < typeof NuxtDevServer > , path : string , protocol = 'vite-ping' ) {
669+ function upgrade ( server : InstanceType < typeof NuxtDevServer > , path : string , protocol : string | null = 'vite-ping' ) {
670670 const { port } = server . listener . address as AddressInfo
671671 const client = connect ( port , '127.0.0.1' )
672672 client . on ( 'error' , ( ) => { } )
@@ -675,7 +675,7 @@ describe('dev server websocket upgrades', () => {
675675 response += chunk
676676 } )
677677 const closed = new Promise < void > ( resolve => client . once ( 'close' , ( ) => resolve ( ) ) )
678- client . write ( `GET ${ path } HTTP/1.1\r\nHost: 127.0.0.1\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec -WebSocket-Protocol: ${ protocol } \r\nSec -WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\n\r\n` )
678+ client . write ( `GET ${ path } HTTP/1.1\r\nHost: 127.0.0.1\r\nUpgrade: websocket\r\nConnection: Upgrade\r\n ${ protocol ? `Sec -WebSocket-Protocol: ${ protocol } \r\n` : '' } Sec -WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\n\r\n` )
679679 return { client, closed, response : ( ) => response }
680680 }
681681
@@ -789,16 +789,26 @@ describe('dev server websocket upgrades', () => {
789789 it . each ( [
790790 [ 'another asset path' , '/_nuxt/other' , 'vite-ping' ] ,
791791 [ 'another protocol' , '/_nuxt/' , 'graphql-ws' ] ,
792- ] ) ( 'should route upgrades Vite does not accept to the Nuxt server (%s)' , async ( _label , path , protocol ) => {
792+ ] ) ( 'should leave asset upgrades Vite does not accept to other listeners (%s)' , async ( _label , path , protocol ) => {
793793 const nuxt = createNuxt ( )
794794 const nitroUpgrade = vi . fn ( ( _req : unknown , socket : Socket ) => socket . destroy ( ) )
795795 Object . assign ( nuxt . server , { upgrade : nitroUpgrade } )
796+ nuxt . hook ( 'listen' , ( server : import ( 'node:http' ) . Server ) => {
797+ server . on ( 'upgrade' , ( req : import ( 'node:http' ) . IncomingMessage , socket : Socket ) => {
798+ if ( req . url === path && req . headers [ 'sec-websocket-protocol' ] === protocol ) {
799+ accept ( req , socket )
800+ }
801+ } )
802+ } )
796803 const server = await startServer ( nuxt )
797804 await attachFakeVite ( nuxt )
798805
799- const { closed } = upgrade ( server , path , protocol )
800- await expectClosedPromptly ( closed )
801- expect ( nitroUpgrade ) . toHaveBeenCalledTimes ( 1 )
806+ const { client, response } = upgrade ( server , path , protocol )
807+ await vi . waitFor ( ( ) => expect ( response ( ) ) . toContain ( '101 Switching Protocols' ) )
808+ await new Promise ( resolve => setTimeout ( resolve , 50 ) )
809+ expect ( client . destroyed ) . toBe ( false )
810+ expect ( nitroUpgrade ) . not . toHaveBeenCalled ( )
811+ client . destroy ( )
802812 } )
803813
804814 it . each ( [ '//a:b' , 'http://a:b/' ] ) ( 'should not throw on an upgrade to %s' , async ( path ) => {
@@ -845,13 +855,34 @@ describe('dev server websocket upgrades', () => {
845855 client . destroy ( )
846856 } )
847857
848- it . each ( [ ' @nuxt/webpack-builder', '@nuxt/rspack-builder' ] ) ( 'should route asset upgrades to the Nuxt server with %s' , async ( builder ) => {
858+ it . each ( [ undefined , 'vite' , 'webpack' , 'rspack' , ' @nuxt/webpack-builder', '@nuxt/rspack-builder' ] ) ( 'should leave asset upgrades to the bundler with %s' , async ( builder ) => {
849859 const nuxt = createNuxt ( { builder } )
850860 const nitroUpgrade = vi . fn ( ( _req : unknown , socket : Socket ) => socket . destroy ( ) )
851861 Object . assign ( nuxt . server , { upgrade : nitroUpgrade } )
862+ nuxt . hook ( 'listen' , ( server : import ( 'node:http' ) . Server ) => {
863+ server . on ( 'upgrade' , ( req : import ( 'node:http' ) . IncomingMessage , socket : Socket ) => {
864+ if ( new URL ( `http://example.com${ req . url } ` ) . pathname === '/_nuxt/rsbuild-hmr' ) {
865+ accept ( req , socket )
866+ }
867+ } )
868+ } )
852869 const server = await startServer ( nuxt )
853870
854- const { closed } = upgrade ( server , '/_nuxt/' )
871+ const { client, response } = upgrade ( server , '/_nuxt/rsbuild-hmr?token=abc' , null )
872+ await vi . waitFor ( ( ) => expect ( response ( ) ) . toContain ( '101 Switching Protocols' ) )
873+ await new Promise ( resolve => setTimeout ( resolve , 50 ) )
874+ expect ( client . destroyed ) . toBe ( false )
875+ expect ( nitroUpgrade ) . not . toHaveBeenCalled ( )
876+ client . destroy ( )
877+ } )
878+
879+ it . each ( [ 'webpack' , 'rspack' ] ) ( 'should route other upgrades to the Nuxt server with %s' , async ( builder ) => {
880+ const nuxt = createNuxt ( { builder } )
881+ const nitroUpgrade = vi . fn ( ( _req : unknown , socket : Socket ) => socket . destroy ( ) )
882+ Object . assign ( nuxt . server , { upgrade : nitroUpgrade } )
883+ const server = await startServer ( nuxt )
884+
885+ const { closed } = upgrade ( server , '/_ws' , null )
855886 await expectClosedPromptly ( closed )
856887 expect ( nitroUpgrade ) . toHaveBeenCalledTimes ( 1 )
857888 } )
0 commit comments