75 lines
1.9 KiB
TypeScript
75 lines
1.9 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) {
|
|
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<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 :${socket.port}`);
|