Files
nextup/index.ts

110 lines
4.5 KiB
TypeScript

import type { ServerWebSocket } from "bun";
import { callTicket, completeTicket, getCurrentTicket, getDisplayTickets, getLogEntries, getTicket, noShowTicket } from "./redis";
const roomstxt = await Bun.file("./rooms.txt").text();
const ROOMS = roomstxt.split("\n");
const MOTD = process.env.MOTD || "50;";
export let displaySockets: ServerWebSocket<unknown>[] = [];
export async function broadcastDisplayUpdate() {
for (const ws of displaySockets) {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ type: "display", tickets: await getDisplayTickets() }));
}
}
}
Bun.serve({
fetch(req, server) {
// upgrade the request to a WebSocket
if (server.upgrade(req)) {
return; // do not return a Response
}
return new Response("Upgrade failed", { status: 500 });
},
websocket: {
async message(ws, message) {
console.log("Received message:", message);
const data = JSON.parse(message.toString());
if (data.type === "hello") {
} else if (data.type === "call-ticket") {
// const ticket = await getTicket(data.ticket);
// if(!ticket || ticket.status == "completed" || ticket.status == "no-show") {
// return void ws.send(JSON.stringify({ type: "error", code: -3, message: "Ticket does not exist or is completed or no-show", ticket, num: data.ticket, room: data.room }) );
// }
await callTicket(data.ticket, data.room);
ws.send(JSON.stringify({ type: "call-ticket", status: "called", ticket: await getTicket(data.ticket), num: data.ticket, room: data.room }) );
await broadcastDisplayUpdate();
} else if (data.type === "complete-ticket") {
const ticket = await getTicket(data.ticket);
if(ticket?.status !== "called") {
await completeTicket(data.ticket);
await broadcastDisplayUpdate();
return void ws.send(JSON.stringify({ type: "complete-ticket", status: "skipped", ticket, num: data.ticket }) );
}
// // Check how long since called
// const calledDate = new Date(ticket.calledDate || "1970-01-01T00:00:00.000Z");
// const now = new Date();
// const diff = now.getTime() - calledDate.getTime();
// if(diff < 5 * 60 * 1000) { // 5 minutes
// // Mark as no-show
// await noShowTicket(data.ticket);
// await broadcastDisplayUpdate();
// return void ws.send(JSON.stringify({ type: "complete-ticket", status: "no-show", ticket, num: data.ticket }));
// }
await completeTicket(data.ticket);
ws.send(JSON.stringify({ type: "complete-ticket", status: "completed", ticket, num: data.ticket }));
await broadcastDisplayUpdate();
} else if (data.type === "no-show") {
const ticket = await getTicket(data.ticket);
if(!ticket) {
return;
}
// // Check how long since called
// const calledDate = new Date(ticket.calledDate || "1970-01-01T00:00:00.000Z");
// const now = new Date();
// const diff = now.getTime() - calledDate.getTime();
// if(diff < 5 * 60 * 1000) { // 5 minutes
// // Mark as no-show
// await noShowTicket(data.ticket);
// await broadcastDisplayUpdate();
// return void ws.send(JSON.stringify({ type: "complete-ticket", status: "no-show", ticket, num: data.ticket }));
// }
await noShowTicket(data.ticket);
ws.send(JSON.stringify({ type: "complete-ticket", status: "no-show", ticket, num: data.ticket }));
await broadcastDisplayUpdate();
} else if (data.type === "get-log") {
const log = await getLogEntries();
ws.send(JSON.stringify({ type: "log", log }));
} else if (data.type === "get-ticket") {
const ticket = await getTicket(data.ticket);
ws.send(JSON.stringify({ type: "ticket", ticket, num: data.ticket }));
} else if (data.type === "get-current-ticket") {
const ticket = await getCurrentTicket(data.room);
ws.send(JSON.stringify({ type: "current-ticket", ...ticket, room: data.room }));
} else if (data.type == "display") {
if(!displaySockets.includes(ws)) {
displaySockets.push(ws);
console.log("Added display socket. Total:", displaySockets.length);
ws.send(JSON.stringify({ type: "display", tickets: await getDisplayTickets(), motd: MOTD }));
}
} else if (data.type == "rooms") {
ws.send(JSON.stringify({ type: "rooms", rooms: ROOMS }));
}
}, // a message is received
open(ws) {
console.log("WebSocket opened");
ws.send(JSON.stringify({ type: "hello" }));
}, // a socket is opened
close(ws, code, message) {
console.log("WebSocket closed");
}, // a socket is closed
drain(ws) {
}, // the socket is ready to receive more data
}
});