@@ -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,22 +49,12 @@ 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
- // remove from room
54
- rooms [ roomId ] . sockets = rooms [ roomId ] . sockets . filter ( socket => socket !== ws ) ;
55
- rooms [ roomId ] . userIds = rooms [ roomId ] . userIds . filter ( user => user !== userId ) ;
56
-
57
- console . log ( `User ${ userId } left the room ${ roomId } ` ) ;
58
-
59
- // if no one in room delete room
60
- if ( rooms [ roomId ] . sockets . length === 0 ) {
61
- delete rooms [ roomId ] ;
62
- console . log ( `Room ${ roomId } is empty and deleted` ) ;
63
- } else {
64
- broadcastUserListUpdate ( roomId ) ;
65
- }
57
+ handleUserLeave ( ws , roomId , userId ) ;
66
58
break ;
67
59
default :
68
60
console . error ( `Unknown room management type: ${ type } ` ) ;
@@ -71,24 +63,29 @@ function manageRoom(ws, roomId, userId, type) {
71
63
72
64
// Remove user when they disconnect
73
65
ws . on ( 'close' , ( ) => {
66
+ handleUserLeave ( ws , roomId , userId )
67
+
68
+ } ) ;
69
+
70
+ function handleUserLeave ( ws , roomId , userId , leaveType ) {
71
+ if ( ws . hasLeft ) return ;
72
+ ws . hasLeft = true ;
74
73
75
74
if ( rooms [ roomId ] ) {
76
75
rooms [ roomId ] . sockets = rooms [ roomId ] . sockets . filter ( client => client !== ws ) ;
77
- rooms [ roomId ] . userIds = rooms [ roomId ] . userIds . filter ( user => user != userId ) ;
76
+ rooms [ roomId ] . userIds = rooms [ roomId ] . userIds . filter ( user => user !== userId ) ;
78
77
79
78
console . log ( `User ${ userId } left room ${ roomId } ` ) ;
80
79
81
80
if ( rooms [ roomId ] . sockets . length === 0 ) {
82
81
delete rooms [ roomId ] ;
83
82
console . log ( `Room ${ roomId } is empty and deleted` ) ;
84
83
} else {
85
- // notify the remaining party about leave
86
84
broadcastUserListUpdate ( roomId ) ;
85
+ broadcastUserLeft ( roomId , userId ) ;
87
86
}
88
-
89
87
}
90
-
91
- } ) ;
88
+ }
92
89
93
90
function broadcastUserListUpdate ( roomId ) {
94
91
const userList = rooms [ roomId ] . userIds ;
@@ -99,6 +96,24 @@ function manageRoom(ws, roomId, userId, type) {
99
96
}
100
97
} )
101
98
}
99
+
100
+ function broadcastUserLeft ( roomId , userId ) {
101
+
102
+ rooms [ roomId ] . sockets . forEach ( ( client ) => {
103
+ if ( client . readyState == WebSocket . OPEN ) {
104
+ client . send ( JSON . stringify ( { type : 'userLeft' , user : userId } ) ) ;
105
+ }
106
+ } )
107
+ }
108
+
109
+ function broadcastUserJoin ( roomId , userId ) {
110
+
111
+ rooms [ roomId ] . sockets . forEach ( ( client ) => {
112
+ if ( client . readyState == WebSocket . OPEN ) {
113
+ client . send ( JSON . stringify ( { type : 'userJoin' , user : userId } ) ) ;
114
+ }
115
+ } )
116
+ }
102
117
}
103
118
104
119
function getRoom ( roomId ) {
0 commit comments