diff --git a/apps/server/src/routes/realtime/classes.ts b/apps/server/src/routes/realtime/classes.ts index 50a671e..2608fea 100644 --- a/apps/server/src/routes/realtime/classes.ts +++ b/apps/server/src/routes/realtime/classes.ts @@ -8,6 +8,14 @@ export class Clients { this.clients = new Map(); } + get clientList(): ClientList { + return this.clients; + } + + get roomList(): string[] { + return Array.from(this.clients.keys()); + } + userInRoom(username: string): boolean { this.clients.forEach((room) => { if (room.some((client) => client.username === username)) { @@ -18,10 +26,6 @@ export class Clients { return false; } - get clientList(): ClientList { - return this.clients; - } - addClient(roomId: string, username: string, ws: ElysiaWS) { if (!this.clients.has(roomId)) { this.clients.set(roomId, []); diff --git a/apps/server/src/routes/realtime/index.ts b/apps/server/src/routes/realtime/index.ts index 2c72a2b..699de66 100644 --- a/apps/server/src/routes/realtime/index.ts +++ b/apps/server/src/routes/realtime/index.ts @@ -1,6 +1,6 @@ import Elysia from "elysia"; import type { ElysiaWS } from "elysia/ws"; -import { ClientMessage, ClientMessageSchema } from "./types"; +import { ClientMessage, ClientMessageSchema, ServerMessage } from "./types"; import { Clients } from "./classes"; import { db, message as messageTable } from "@/lib/db"; @@ -57,6 +57,13 @@ async function handleMessage(ws: ElysiaWS, message: ClientMessage) { break; } + case "rooms": { + ws.send({ + type: "rooms", + rooms: clients.roomList, + } as ServerMessage); + break; + } } } diff --git a/apps/server/src/routes/realtime/types.ts b/apps/server/src/routes/realtime/types.ts index 9b0d461..ad53a52 100644 --- a/apps/server/src/routes/realtime/types.ts +++ b/apps/server/src/routes/realtime/types.ts @@ -33,6 +33,9 @@ const ClientMessageSchema = t.Union([ roomId: t.String(), // No need for username as we can just directly send the sync through the WS }), + t.Object({ + type: t.Literal("rooms"), + }), ]); // Server -> Client(s) @@ -55,6 +58,10 @@ const ServerMessageSchema = t.Union([ roomId: t.String(), messages: t.Array(MessageSchema), }), + t.Object({ + type: t.Literal("rooms"), + rooms: t.Array(t.String()), + }), ]); type ClientList = Map< diff --git a/bruno/connect.yml b/bruno/connect.yml index 4631bc3..6290032 100644 --- a/bruno/connect.yml +++ b/bruno/connect.yml @@ -9,3 +9,7 @@ websocket: type: json data: "{}" auth: inherit + +settings: + timeout: 0 + keepAliveInterval: 0 diff --git a/bruno/join.yml b/bruno/join.yml new file mode 100644 index 0000000..db10d96 --- /dev/null +++ b/bruno/join.yml @@ -0,0 +1,20 @@ +info: + name: join + type: websocket + seq: 3 + +websocket: + url: ws://localhost:3000/realtime + message: + type: json + data: |- + { + "type": "join", + "username": "camila", + "roomId": "67676767676767" + } + auth: inherit + +settings: + timeout: 0 + keepAliveInterval: 0 diff --git a/bruno/leave.yml b/bruno/leave.yml new file mode 100644 index 0000000..02a0c75 --- /dev/null +++ b/bruno/leave.yml @@ -0,0 +1,20 @@ +info: + name: leave + type: websocket + seq: 6 + +websocket: + url: ws://localhost:3000/realtime + message: + type: json + data: |- + { + "type": "leave", + "username": "camila", + "roomId": "67676767676767" + } + auth: inherit + +settings: + timeout: 0 + keepAliveInterval: 0 diff --git a/bruno/message.yml b/bruno/message.yml new file mode 100644 index 0000000..42f4ec4 --- /dev/null +++ b/bruno/message.yml @@ -0,0 +1,28 @@ +info: + name: message + type: websocket + seq: 5 + +websocket: + url: ws://localhost:3000/realtime + message: + type: json + data: |- + { + "type": "message", + "username": "bob", + "roomId": "67676767676767", + "m": { + "id": 1, + "roomId": "67676767676767", + "username": "bob", + "content": "I alone am the honored one.", + "timestamp": 1784349801729, + "deleted": false + } + } + auth: inherit + +settings: + timeout: 0 + keepAliveInterval: 0 diff --git a/bruno/rooms.yml b/bruno/rooms.yml new file mode 100644 index 0000000..f71ed2f --- /dev/null +++ b/bruno/rooms.yml @@ -0,0 +1,18 @@ +info: + name: rooms + type: websocket + seq: 4 + +websocket: + url: ws://localhost:3000/realtime + message: + type: text + data: |- + { + "type": "rooms" + } + auth: inherit + +settings: + timeout: 0 + keepAliveInterval: 0