Skip to content

Commit 5918781

Browse files
committed
fix: handle websocket connections using experimental deno:request event
1 parent 1506734 commit 5918781

1 file changed

Lines changed: 16 additions & 0 deletions

File tree

packages/plugin-vite/src/plugins/dev_server.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,22 @@ export function devServer(): Plugin[] {
1515
configureServer(server) {
1616
const IGNORE_URLS = /^\/(@(vite|fs|id)|\.vite)\//;
1717

18+
server.httpServer?.on("deno:request", (ev) => {
19+
const { headers } = ev.req;
20+
if (
21+
headers.get("upgrade") !== "websocket" ||
22+
// Vite uses websockets with protocol set to vite-hmr, vite-ping
23+
headers.get("sec-websocket-protocol")?.startsWith("vite-")
24+
) {
25+
return;
26+
}
27+
// When pendingResponse is set, rest of the handlers won't fire for any request, so websocket requests
28+
// are going straight to the fresh server.
29+
ev.pendingResponse = server.ssrLoadModule("fresh:server_entry").then(
30+
(mod) => mod.default.fetch(ev.req) as Promise<Response>,
31+
);
32+
});
33+
1834
server.middlewares.use(async (nodeReq, nodeRes, next) => {
1935
const serverCfg = server.config.server;
2036

0 commit comments

Comments
 (0)