Files
WRNexusJS/examples/basic-app/app/realtime/chat.ts
2026-07-12 15:55:18 +05:30

29 lines
1006 B
TypeScript

// ws://<host>/realtime/chat — a broadcast chat room.
//
// The whole client side is the framework's realtime runtime (the /chat page just
// declares `data-room="chat"`). Here we only handle room events.
import { defineRoom } from "@wrnexus/core";
type ChatIn = { user?: string; text?: string };
export default defineRoom({
onConnect(client) {
// Tell everyone else someone joined (the joiner sees the status badge).
client.broadcast({ type: "system", text: "A user joined", online: client.room.count() });
},
onMessage(client, msg: ChatIn) {
const text = String(msg.text ?? "")
.slice(0, 500)
.trim();
if (!text) return;
const user = String(msg.user ?? "anon").slice(0, 40) || "anon";
// Broadcast to the whole room, including the sender, so everyone stays in sync.
client.room.broadcast({ type: "message", user, text });
},
onLeave(client) {
client.broadcast({ type: "system", text: "A user left", online: client.room.count() - 1 });
},
});