@@ -18,7 +18,7 @@ import {
1818import { randomHex } from "@miniflare/shared" ;
1919import { coupleWebSocket } from "@miniflare/web-sockets" ;
2020import { BodyInit , Headers } from "undici" ;
21- import StandardWebSocket , { WebSocketServer } from "ws" ;
21+ import { WebSocketServer } from "ws" ;
2222import { getAccessibleHosts } from "./helpers" ;
2323import { HTTPPlugin , RequestMeta } from "./plugin" ;
2424
@@ -305,38 +305,6 @@ export function createRequestListener<Plugins extends HTTPPluginSignatures>(
305305 } ;
306306}
307307
308- export type WebSocketUpgradeListener = (
309- ws : StandardWebSocket ,
310- req : http . IncomingMessage
311- ) => void ;
312-
313- export function createWebSocketUpgradeListener <
314- Plugins extends CorePluginSignatures
315- > (
316- mf : MiniflareCore < Plugins > ,
317- listener : RequestListener
318- ) : WebSocketUpgradeListener {
319- return async ( ws , req ) => {
320- // Handle request in worker
321- const response = await listener ( req ) ;
322-
323- // Check web socket response was returned
324- const webSocket = response ?. webSocket ;
325- if ( response ?. status !== 101 || ! webSocket ) {
326- ws . close ( 1002 , "Protocol Error" ) ;
327- mf . log . error (
328- new TypeError (
329- "Web Socket request did not return status 101 Switching Protocols response with Web Socket"
330- )
331- ) ;
332- return ;
333- }
334-
335- // Couple the web socket here
336- await coupleWebSocket ( ws , webSocket ) ;
337- } ;
338- }
339-
340308export async function createServer < Plugins extends HTTPPluginSignatures > (
341309 mf : MiniflareCore < Plugins > ,
342310 options ?: http . ServerOptions & https . ServerOptions
@@ -355,17 +323,39 @@ export async function createServer<Plugins extends HTTPPluginSignatures>(
355323 }
356324
357325 // Setup WebSocket servers
358- const upgrader = createWebSocketUpgradeListener ( mf , listener ) ;
359326 const webSocketServer = new WebSocketServer ( { noServer : true } ) ;
360- webSocketServer . on ( "connection" , upgrader ) ;
361327 const liveReloadServer = new WebSocketServer ( { noServer : true } ) ;
362- server . on ( "upgrade" , ( request , socket , head ) => {
328+ server . on ( "upgrade" , async ( request , socket , head ) => {
329+ // Only interested in pathname so base URL doesn't matter
363330 const { pathname } = new URL ( request . url ?? "" , "http://localhost" ) ;
364- const server =
365- pathname === "/cdn-cgi/mf/reload" ? liveReloadServer : webSocketServer ;
366- server . handleUpgrade ( request , socket as any , head , ( ws ) =>
367- server . emit ( "connection" , ws , request )
368- ) ;
331+ if ( pathname === "/cdn-cgi/mf/reload" ) {
332+ // If this is the for live-reload, handle the request ourselves
333+ liveReloadServer . handleUpgrade ( request , socket as any , head , ( ws ) => {
334+ liveReloadServer . emit ( "connection" , ws , request ) ;
335+ } ) ;
336+ } else {
337+ // Otherwise, handle the request in the worker
338+ const response = await listener ( request ) ;
339+
340+ // Check web socket response was returned
341+ const webSocket = response ?. webSocket ;
342+ if ( response ?. status !== 101 || ! webSocket ) {
343+ socket . write ( "HTTP/1.1 500 Internal Server Error\r\n\r\n" ) ;
344+ socket . destroy ( ) ;
345+ mf . log . error (
346+ new TypeError (
347+ "Web Socket request did not return status 101 Switching Protocols response with Web Socket"
348+ )
349+ ) ;
350+ return ;
351+ }
352+
353+ // Accept and couple the Web Socket
354+ webSocketServer . handleUpgrade ( request , socket as any , head , ( ws ) => {
355+ void coupleWebSocket ( ws , webSocket ) ;
356+ webSocketServer . emit ( "connection" , ws , request ) ;
357+ } ) ;
358+ }
369359 } ) ;
370360 const reloadListener = ( ) => {
371361 // Reload all connected live reload clients
0 commit comments