2026-03-05 00:04:26 -06:00
|
|
|
import type { ServerWebSocket } from "bun";
|
|
|
|
|
import type { SocketData } from "../sessions/types";
|
|
|
|
|
|
|
|
|
|
type OpenHandler<TLifecycleDeps> = (
|
|
|
|
|
ws: ServerWebSocket<SocketData>,
|
|
|
|
|
deps: TLifecycleDeps,
|
|
|
|
|
) => void;
|
|
|
|
|
|
|
|
|
|
type MessageHandler<TLifecycleDeps> = (
|
|
|
|
|
ws: ServerWebSocket<SocketData>,
|
|
|
|
|
message: string | ArrayBuffer | Uint8Array,
|
|
|
|
|
deps: TLifecycleDeps,
|
|
|
|
|
) => void;
|
|
|
|
|
|
|
|
|
|
type CloseHandler<TLifecycleDeps> = (
|
|
|
|
|
ws: ServerWebSocket<SocketData>,
|
|
|
|
|
code: number,
|
|
|
|
|
reason: string,
|
|
|
|
|
deps: TLifecycleDeps,
|
|
|
|
|
) => void;
|
|
|
|
|
|
|
|
|
|
export function createWebSocketRuntime<TLifecycleDeps>(deps: {
|
|
|
|
|
maxClientPayloadBytes: number;
|
|
|
|
|
maxViewerPayloadBytes: number;
|
|
|
|
|
lifecycleDeps: TLifecycleDeps;
|
|
|
|
|
handleWebSocketOpen: OpenHandler<TLifecycleDeps>;
|
|
|
|
|
handleWebSocketMessage: MessageHandler<TLifecycleDeps>;
|
|
|
|
|
handleWebSocketClose: CloseHandler<TLifecycleDeps>;
|
|
|
|
|
}) {
|
2026-03-13 09:28:16 -05:00
|
|
|
const wsDeflateEnabled = String(process.env.OVERLORD_WS_PERMESSAGE_DEFLATE || "false")
|
2026-03-09 22:43:33 -05:00
|
|
|
.trim()
|
|
|
|
|
.toLowerCase() !== "false";
|
|
|
|
|
|
2026-03-05 00:04:26 -06:00
|
|
|
return {
|
2026-03-09 22:43:33 -05:00
|
|
|
perMessageDeflate: wsDeflateEnabled,
|
2026-03-05 00:04:26 -06:00
|
|
|
maxPayloadLength: Math.max(deps.maxClientPayloadBytes, deps.maxViewerPayloadBytes),
|
|
|
|
|
idleTimeout: 255,
|
|
|
|
|
sendPings: true,
|
|
|
|
|
open(ws: ServerWebSocket<SocketData>) {
|
|
|
|
|
deps.handleWebSocketOpen(ws, deps.lifecycleDeps);
|
|
|
|
|
},
|
|
|
|
|
message(ws: ServerWebSocket<SocketData>, message: string | ArrayBuffer | Uint8Array) {
|
|
|
|
|
deps.handleWebSocketMessage(ws, message, deps.lifecycleDeps);
|
|
|
|
|
},
|
|
|
|
|
close(ws: ServerWebSocket<SocketData>, code: number, reason: string) {
|
|
|
|
|
deps.handleWebSocketClose(ws, code, reason, deps.lifecycleDeps);
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
}
|