Files
overlord/Overlord-Server/src/server/websocket-runtime.ts
T

50 lines
1.6 KiB
TypeScript
Raw Normal View History

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,
2026-03-20 22:38:17 -05:00
) => void | Promise<void>;
2026-03-05 00:04:26 -06:00
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>;
}) {
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);
},
};
}