File size: 1,827 Bytes
a7476ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3a72b90
 
 
 
 
 
 
 
 
 
 
 
 
 
a7476ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import WebSocket from 'ws';
export class RoomManager {
    // Map<RoomId, Map<Username, WebSocket>>
    rooms;
    constructor() {
        this.rooms = new Map();
    }
    /**
     * Adds a user to a specific room.
     * Creates the room if it doesn't exist.
     */
    joinRoom(roomId, username, socket) {
        if (!this.rooms.has(roomId)) {
            this.rooms.set(roomId, new Map());
        }
        this.rooms.get(roomId)?.set(username, socket);
    }
    renameUser(roomId, username, newUsername, socket) {
        const room = this.rooms.get(roomId);
        if (!room)
            return false;
        if (!room.has(username))
            return false;
        if (room.has(newUsername))
            return false;
        // Remove old username
        room.delete(username);
        // Add new username with same socket
        room.set(newUsername, socket);
        return true;
    }
    /**
     * Removes a user from a room.
     * Cleans up the room if it becomes empty.
     */
    leaveRoom(roomId, username) {
        const room = this.rooms.get(roomId);
        if (room) {
            const deleted = room.delete(username);
            if (room.size === 0) {
                this.rooms.delete(roomId);
            }
            return deleted;
        }
        return false;
    }
    /**
     * Checks if a room exists.
     */
    hasRoom(roomId) {
        return this.rooms.has(roomId);
    }
    /**
     * Sends a message to all users in a specific room.
     */
    broadcast(roomId, message) {
        const room = this.rooms.get(roomId);
        if (!room)
            return;
        for (const client of room.values()) {
            if (client.readyState === WebSocket.OPEN) {
                client.send(message);
            }
        }
    }
}
//# sourceMappingURL=RoomManager.js.map