import { STATUS_CODE, STATUS_TEXT, type StatusCode } from "jsr:@std/http"; const ALLOWED_ORIGIN = "http://0.0.0.0:8042"; type Session = { id: string; connId: number; createdAt: number; lastSeenAt: number; }; function createResponse( status: StatusCode, body: BodyInit | null = null, ): Response { return new Response(body, { status, statusText: STATUS_TEXT[status] }); } const sessions = new Map(); const connections = new Map(); export function createSession(): string { const id = crypto.randomUUID(); const now = Date.now(); sessions.set(id, { id, connId: 0, createdAt: now, lastSeenAt: 0, }); return id; } let currentId = 1; const nextId = (): number => { return currentId++; }; const connectSession = (session: Session, request: Request): Response => { const { response, socket } = Deno.upgradeWebSocket(request); const connId = nextId(); socket.onopen = () => { session.lastSeenAt = Date.now(); session.connId = connId; connections.set(connId, socket); }; socket.onclose = () => { session.lastSeenAt = Date.now(); connections.delete(connId); }; socket.onmessage = () => { session.lastSeenAt = Date.now(); }; socket.onerror = (e) => { session.lastSeenAt = Date.now(); console.error(e); }; return response; }; export default function (request: Request): Response { if (request.headers.get("upgrade")?.toLowerCase() !== "websocket") { return createResponse(STATUS_CODE.UpgradeRequired); } const url = new URL(request.url); const sessionId = url.searchParams.get("sessionId"); if (url.origin !== ALLOWED_ORIGIN || sessionId === null) { return createResponse(STATUS_CODE.BadRequest); } const session = sessions.get(sessionId); if (session === undefined) { return createResponse(STATUS_CODE.Unauthorized); } return connectSession(session, request); }