@@ -31,22 +31,25 @@ class Members extends EventEmitter<MemberEventsMap> {
31
31
processPresenceMessage ( message : PresenceMember ) {
32
32
const { action, connectionId } = message ;
33
33
const isLeaver = ! ! this . leavers . getByConnectionId ( connectionId ) ;
34
- const isMember = ! ! this . getByConnectionId ( connectionId ) ;
34
+ const isMember = this . members . some ( ( m ) => m . connectionId === connectionId ) ;
35
35
const memberUpdate = this . createMember ( message ) ;
36
36
37
37
if ( action === 'leave' ) {
38
- this . leavers . addLeaver ( memberUpdate , ( ) => this . removeMember ( connectionId ) ) ;
38
+ this . leavers . addLeaver ( memberUpdate , ( ) => this . onMemberOffline ( memberUpdate ) ) ;
39
39
this . emit ( 'leave' , memberUpdate ) ;
40
40
} else if ( isLeaver ) {
41
41
this . leavers . removeLeaver ( connectionId ) ;
42
42
}
43
43
44
- if ( ! isMember ) {
44
+ if ( ! isMember && action !== 'leave' ) {
45
45
this . members . push ( memberUpdate ) ;
46
46
this . emit ( 'enter' , memberUpdate ) ;
47
- } else if ( [ 'enter' , 'update' , 'leave' ] . includes ( action ) && isMember ) {
47
+ } else if ( [ 'enter' , 'update' ] . includes ( action ) && isMember ) {
48
48
const index = this . members . findIndex ( ( m ) => m . connectionId === connectionId ) ;
49
49
this . members [ index ] = memberUpdate ;
50
+ } else if ( action === 'leave' && isMember ) {
51
+ const index = this . members . findIndex ( ( m ) => m . connectionId === connectionId ) ;
52
+ this . members . splice ( index , 1 ) ;
50
53
}
51
54
52
55
// Emit profileData updates only if they are different then the last held update.
@@ -62,11 +65,11 @@ class Members extends EventEmitter<MemberEventsMap> {
62
65
}
63
66
64
67
getAll ( ) : SpaceMember [ ] {
65
- return this . members ;
68
+ return this . members . concat ( this . leavers . getAll ( ) . map ( ( l ) => l . member ) ) ;
66
69
}
67
70
68
71
getOthers ( ) : SpaceMember [ ] {
69
- return this . members . filter ( ( m ) => m . connectionId !== this . space . connectionId ) ;
72
+ return this . getAll ( ) . filter ( ( m ) => m . connectionId !== this . space . connectionId ) ;
70
73
}
71
74
72
75
subscribe < K extends EventKey < MemberEventsMap > > (
@@ -110,7 +113,7 @@ class Members extends EventEmitter<MemberEventsMap> {
110
113
}
111
114
112
115
getByConnectionId ( connectionId : string ) : SpaceMember | undefined {
113
- return this . members . find ( ( m ) => m . connectionId === connectionId ) ;
116
+ return this . getAll ( ) . find ( ( m ) => m . connectionId === connectionId ) ;
114
117
}
115
118
116
119
createMember ( message : PresenceMember ) : SpaceMember {
@@ -127,24 +130,20 @@ class Members extends EventEmitter<MemberEventsMap> {
127
130
} ;
128
131
}
129
132
130
- removeMember ( connectionId : string ) : void {
131
- const index = this . members . findIndex ( ( m ) => m . connectionId === connectionId ) ;
132
-
133
- if ( index >= 0 ) {
134
- const member = this . members . splice ( index , 1 ) [ 0 ] ;
133
+ onMemberOffline ( member : SpaceMember ) {
134
+ this . leavers . removeLeaver ( member . connectionId ) ;
135
135
136
- this . emit ( 'remove' , member ) ;
136
+ this . emit ( 'remove' , member ) ;
137
137
138
- if ( member . location ) {
139
- this . space . locations . emit ( 'update' , {
140
- previousLocation : member . location ,
141
- currentLocation : null ,
142
- member : { ...member , location : null } ,
143
- } ) ;
144
- }
145
-
146
- this . space . emit ( 'update' , { members : this . getAll ( ) } ) ;
138
+ if ( member . location ) {
139
+ this . space . locations . emit ( 'update' , {
140
+ previousLocation : member . location ,
141
+ currentLocation : null ,
142
+ member : { ...member , location : null } ,
143
+ } ) ;
147
144
}
145
+
146
+ this . space . emit ( 'update' , { members : this . getAll ( ) } ) ;
148
147
}
149
148
}
150
149
0 commit comments