feat: user registration and chat messaging (wip)
This commit is contained in:
parent
b0ce2fe0af
commit
18dd8b83f0
14 changed files with 243 additions and 33 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
},
|
||||
},
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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>;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue