import type { IncomingMessage } from "http"; import type { Duplex } from "stream"; import type { WebSocketServer, WebSocket } from "ws"; import { fromNodeHeaders } from "better-auth/node"; import { auth } from "../lib/auth.js"; export const handleUpgrade = async ( request: IncomingMessage, socket: Duplex, head: Buffer, wss: WebSocketServer, ): Promise => { try { const session = await auth.api.getSession({ headers: fromNodeHeaders(request.headers), }); if (!session) { socket.write("HTTP/1.1 401 Unauthorized\r\n\r\n"); socket.destroy(); return; } wss.handleUpgrade(request, socket, head, (ws: WebSocket) => { wss.emit("connection", ws, request, session); }); } catch (err) { console.error("WebSocket auth error:", err); socket.write("HTTP/1.1 500 Internal Server Error\r\n\r\n"); socket.destroy(); } };