itpdp/dev-proxy/index.ts
2026-05-05 23:19:31 +02:00

70 lines
1.6 KiB
TypeScript

import type { Socket } from "bun";
import type { PartySocketEvent, PartyState } from "../api/src/party-types";
const sockets = new Set<Socket>();
let lastData: string;
const socket = Bun.listen({
port: 7070,
hostname: "0.0.0.0",
socket: {
data(socket, buf) {
const str = new TextDecoder().decode(buf);
},
open(socket) {
sockets.add(socket);
if (lastData) socket.write(lastData);
},
close(socket) {
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<string, string | number>;
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 :7070");