import type { ServerWebSocket } from "bun"; import type { SocketData } from "../sessions/types"; type OpenHandler = ( ws: ServerWebSocket, deps: TLifecycleDeps, ) => void; type MessageHandler = ( ws: ServerWebSocket, message: string | ArrayBuffer | Uint8Array, deps: TLifecycleDeps, ) => void | Promise; type CloseHandler = ( ws: ServerWebSocket, code: number, reason: string, deps: TLifecycleDeps, ) => void; export function createWebSocketRuntime(deps: { maxClientPayloadBytes: number; maxViewerPayloadBytes: number; lifecycleDeps: TLifecycleDeps; handleWebSocketOpen: OpenHandler; handleWebSocketMessage: MessageHandler; handleWebSocketClose: CloseHandler; }) { const wsDeflateEnabled = String(process.env.OVERLORD_WS_PERMESSAGE_DEFLATE || "false") .trim() .toLowerCase() !== "false"; return { perMessageDeflate: wsDeflateEnabled, maxPayloadLength: Math.max(deps.maxClientPayloadBytes, deps.maxViewerPayloadBytes), idleTimeout: 255, sendPings: true, open(ws: ServerWebSocket) { deps.handleWebSocketOpen(ws, deps.lifecycleDeps); }, message(ws: ServerWebSocket, message: string | ArrayBuffer | Uint8Array) { deps.handleWebSocketMessage(ws, message, deps.lifecycleDeps); }, close(ws: ServerWebSocket, code: number, reason: string) { deps.handleWebSocketClose(ws, code, reason, deps.lifecycleDeps); }, }; }