@@ -4,6 +4,8 @@ const rooms = {}; // { roomId: [sockets] }
4
4
function manageRoom ( ws , roomId , userId , type ) {
5
5
console . log ( `manageRoom function: ${ type } ${ userId } ` )
6
6
7
+ ws . hasLeft = false ;
8
+
7
9
switch ( type ) {
8
10
case "join" :
9
11
@@ -47,10 +49,14 @@ function manageRoom(ws, roomId, userId, type) {
47
49
48
50
// notify users of roomId of updated user list to display in frontend
49
51
broadcastUserListUpdate ( roomId ) ;
52
+ // notify users of user joining the room
53
+ broadcastUserJoin ( roomId , userId ) ;
50
54
break ;
51
55
52
56
case "leave" :
53
57
// remove from room
58
+
59
+ /*
54
60
rooms[roomId].sockets = rooms[roomId].sockets.filter(socket => socket !== ws);
55
61
rooms[roomId].userIds = rooms[roomId].userIds.filter(user => user !== userId);
56
62
@@ -63,6 +69,8 @@ function manageRoom(ws, roomId, userId, type) {
63
69
} else {
64
70
broadcastUserListUpdate(roomId);
65
71
}
72
+ */
73
+ handleUserLeave ( ws , roomId , userId ) ;
66
74
break ;
67
75
default :
68
76
console . error ( `Unknown room management type: ${ type } ` ) ;
@@ -72,6 +80,7 @@ function manageRoom(ws, roomId, userId, type) {
72
80
// Remove user when they disconnect
73
81
ws . on ( 'close' , ( ) => {
74
82
83
+ /*
75
84
if (rooms[roomId]) {
76
85
rooms[roomId].sockets = rooms[roomId].sockets.filter(client => client !== ws);
77
86
rooms[roomId].userIds = rooms[roomId].userIds.filter(user => user != userId);
@@ -82,14 +91,38 @@ function manageRoom(ws, roomId, userId, type) {
82
91
delete rooms[roomId];
83
92
console.log(`Room ${roomId} is empty and deleted`);
84
93
} else {
85
- // notify the remaining party about leave
94
+ // notify users of roomId of updated user list to display in frontend
86
95
broadcastUserListUpdate(roomId);
96
+ // notify users of user leaving the room
97
+ broadcastUserLeaveFromSocketClose(roomId, userId);
87
98
}
88
99
89
100
}
101
+ */
102
+ handleUserLeave ( ws , roomId , userId )
90
103
91
104
} ) ;
92
105
106
+ function handleUserLeave ( ws , roomId , userId , leaveType ) {
107
+ if ( ws . hasLeft ) return ;
108
+ ws . hasLeft = true ;
109
+
110
+ if ( rooms [ roomId ] ) {
111
+ rooms [ roomId ] . sockets = rooms [ roomId ] . sockets . filter ( client => client !== ws ) ;
112
+ rooms [ roomId ] . userIds = rooms [ roomId ] . userIds . filter ( user => user !== userId ) ;
113
+
114
+ console . log ( `User ${ userId } left room ${ roomId } ` ) ;
115
+
116
+ if ( rooms [ roomId ] . sockets . length === 0 ) {
117
+ delete rooms [ roomId ] ;
118
+ console . log ( `Room ${ roomId } is empty and deleted` ) ;
119
+ } else {
120
+ broadcastUserListUpdate ( roomId ) ;
121
+ broadcastUserLeft ( roomId , userId ) ;
122
+ }
123
+ }
124
+ }
125
+
93
126
function broadcastUserListUpdate ( roomId ) {
94
127
const userList = rooms [ roomId ] . userIds ;
95
128
@@ -99,6 +132,24 @@ function manageRoom(ws, roomId, userId, type) {
99
132
}
100
133
} )
101
134
}
135
+
136
+ function broadcastUserLeft ( roomId , userId ) {
137
+
138
+ rooms [ roomId ] . sockets . forEach ( ( client ) => {
139
+ if ( client . readyState == WebSocket . OPEN ) {
140
+ client . send ( JSON . stringify ( { type : 'userLeft' , user : userId } ) ) ;
141
+ }
142
+ } )
143
+ }
144
+
145
+ function broadcastUserJoin ( roomId , userId ) {
146
+
147
+ rooms [ roomId ] . sockets . forEach ( ( client ) => {
148
+ if ( client . readyState == WebSocket . OPEN ) {
149
+ client . send ( JSON . stringify ( { type : 'userJoin' , user : userId } ) ) ;
150
+ }
151
+ } )
152
+ }
102
153
}
103
154
104
155
function getRoom ( roomId ) {
0 commit comments