feat: user registration and chat messaging (wip)

This commit is contained in:
Alexander Daichendt 2025-02-12 11:21:57 +01:00
parent b0ce2fe0af
commit 18dd8b83f0
14 changed files with 243 additions and 33 deletions

View file

@ -1,12 +1,62 @@
import type { ServerWebSocket } from "bun";
import type { ClientMessage } from "../../shared";
import { randomUUIDv7, type ServerWebSocket } from "bun";
import type {
ClientMessage,
ServerChatMessage,
ServerUserJoinedMessage,
User,
} from "../../shared";
import type { Room, WebSocketData } from "./types";
export default function handleClientMessage(
client: ServerWebSocket<WebSocketData>,
data: ClientMessage,
room: Room,
sender: User | undefined,
) {
// handle client messages
console.log("Received new message ", data);
switch (data.type) {
case "JOIN":
const userId = randomUUIDv7();
const name = data.payload.username;
room.userConnections.set(client, {
name,
userId,
});
const joinMessage: ServerUserJoinedMessage = {
type: "USER_JOINED",
payload: {
user: {
name,
userId,
},
},
};
for (const [socket] of room.userConnections) {
socket.send(JSON.stringify(joinMessage));
}
break;
case "CHAT_MESSAGE":
const chatMessage: ServerChatMessage = {
type: "CHAT_MESSAGE",
payload: {
id: randomUUIDv7(),
author: sender!,
content: data.payload.content,
timestamp: Date.now(),
},
};
// broadcast the message to all clients in the room
for (const [socket] of room.userConnections) {
socket.send(JSON.stringify(chatMessage));
}
break;
}
}

View file

@ -78,7 +78,14 @@ const server = Bun.serve<WebSocketData>({
const data = JSON.parse(message.toString()) as ClientMessage;
handleClientMessage(ws, data, room);
const sender = room.userConnections.get(ws);
if (!sender && data.type !== "JOIN") {
console.log("User not found in room", roomId);
return;
}
handleClientMessage(ws, data, room, sender);
},
},
});

View file

@ -7,11 +7,5 @@ export interface WebSocketData {
export interface Room {
roomId: string;
userConnections: Map<
string, // userId
{
user: User;
socket: ServerWebSocket<WebSocketData>;
}
>;
userConnections: Map<ServerWebSocket<WebSocketData>, User>;
}