import type { Socket } from "bun"; import type { PartySocketEvent, PartyState } from "../api/src/party-types"; const sockets = new Set(); let lastData: string; const socket = Bun.listen({ port: 7070, hostname: "0.0.0.0", socket: { data(socket, buf) { console.log("Data from", socket.remoteAddress, socket.remotePort) const str = new TextDecoder().decode(buf); console.log(str); }, open(socket) { console.log("Connection from", socket.remoteAddress, socket.remotePort) sockets.add(socket); socket.setKeepAlive(true); if (lastData) socket.write(lastData); }, close(socket) { console.log("Connection closed", socket.remoteAddress, socket.remotePort) sockets.delete(socket); }, }, }); const ws: WebSocket | null = new WebSocket( "ws://localhost:4000/api/dev-socket/ws", ); ws.onerror = (e) => { console.error(e); }; ws.onopen = () => { console.log("WebSocket open"); }; ws.onmessage = (e) => { const data = JSON.parse(e.data) as PartySocketEvent; console.log(data); switch (data.type) { case "party_status": { const { party } = data; if (!party) return; const partyData = party.data; if (!partyData) return; const { currentQuestion } = partyData; console.log(currentQuestion); const text = currentQuestion?.text; if (!text) return; const obj = { type: currentQuestion.type, points: currentQuestion.points, } as Record; if (currentQuestion.type === "numeric") { obj.rangeMin = currentQuestion.range.min; obj.rangeMax = currentQuestion.range.max; } const objText = Object.entries(obj) .map(([k, v]) => `${k}=${v}`) .join(" "); const writeData = `$$\n${objText}\n${text}\n`; lastData = writeData; for (const socket of sockets) { socket.write(writeData); } break; } } }; console.log(`Started on :${socket.port}`);