成员列表

This commit is contained in:
2026-04-25 17:43:53 +08:00
parent b92f433613
commit 261acf8bc1
3 changed files with 142 additions and 23 deletions

View File

@@ -341,7 +341,13 @@ class CallStateManager {
// 保存角色信息host/participant
if (data && data.role) {
this.role = data.role;
console.log(`Connected as ${this.role}`);
// 更新localUser的isHost标志
this.state.session.localUser.isHost = (this.role === 'host');
// 保存自身的participantId用于从participants-sync中过滤自身
if (data.participantId) {
this.selfParticipantId = data.participantId;
}
console.log(`Connected as ${this.role}, participantId: ${this.selfParticipantId}`);
}
// 连接建立后更新状态为ongoing
this.state.session.status = 'ongoing';
@@ -401,6 +407,7 @@ class CallStateManager {
};
}
this.notify({ type: 'PARTICIPANTS_UPDATE', participants: this.state.participants });
this.broadcastParticipantsList();
};
// participant离开回调host收到房间仍然存在
@@ -423,6 +430,7 @@ class CallStateManager {
// 通知UI更新用participantId作为connectionId传给renderer
this.notify({ type: 'PARTICIPANT_LEFT', connectionId: participantId });
this.notify({ type: 'PARTICIPANTS_UPDATE', participants: this.state.participants });
this.broadcastParticipantsList();
};
// 轨道事件回调
@@ -468,6 +476,7 @@ class CallStateManager {
status: 'online'
};
this.notify({ type: 'PARTICIPANTS_UPDATE', participants: this.state.participants });
this.broadcastParticipantsList();
}
// 通知UI远程流已更新
@@ -523,10 +532,21 @@ class CallStateManager {
this.state.participants[data.participantId].avatar = data.message.senderAvatar;
}
this.notify({ type: 'PARTICIPANTS_UPDATE', participants: this.state.participants });
this.broadcastParticipantsList();
}
// Participant端从消息中提取Host用户信息并更新remoteUser
// Participant端根据消息来源更新对应用户信息
if (!this.role || this.role !== 'host') {
if (data.message && data.message.senderId !== this.state.session.localUser.id) {
if (data.participantId && this.state.participants[data.participantId]) {
// 来自其他Participant的消息更新participants中对应条目
if (data.message.senderName) {
this.state.participants[data.participantId].name = data.message.senderName;
}
if (data.message.senderAvatar) {
this.state.participants[data.participantId].avatar = data.message.senderAvatar;
}
this.notify({ type: 'PARTICIPANTS_UPDATE', participants: this.state.participants });
} else if (data.message && data.message.senderId !== this.state.session.localUser.id) {
// 来自Host的消息更新remoteUser
this.state.session.remoteUser = {
...this.state.session.remoteUser,
id: data.message.senderId,
@@ -550,6 +570,8 @@ class CallStateManager {
this.updateRemoteMedia(data.data, data.participantId);
// 通知UI更新participants
this.notify({ type: 'PARTICIPANTS_UPDATE', participants: this.state.participants });
// Host端广播最新成员列表含媒体状态给所有Participant
this.broadcastParticipantsList();
} else if (data.type === 'user-info') {
// 处理用户信息更新
console.log('收到用户信息:', data.data, 'from participant:', data.participantId);
@@ -569,6 +591,7 @@ class CallStateManager {
this.state.participants[data.participantId].name = data.data.name || '参与者';
this.state.participants[data.participantId].avatar = data.data.avatar || '/images/p2.png';
this.notify({ type: 'PARTICIPANTS_UPDATE', participants: this.state.participants });
this.broadcastParticipantsList();
} else {
// Participant端更新单一remoteUserHost的信息
this.state.session.remoteUser = {
@@ -580,6 +603,20 @@ class CallStateManager {
this.notify({ type: 'REMOTE_MEDIA_CHANGE', mediaState: this.state.session.remoteUser.mediaState });
}
}
} else if (data.type === 'participants-sync') {
// Participant端接收Host广播的完整成员列表
if (this.role !== 'host' && data.data) {
console.log('收到成员列表同步:', data.data);
// 过滤掉自身条目避免在列表中重复显示自身已作为localUser显示
const filtered = {};
for (const [pid, pInfo] of Object.entries(data.data)) {
if (pid !== this.selfParticipantId) {
filtered[pid] = pInfo;
}
}
this.state.participants = filtered;
this.notify({ type: 'PARTICIPANTS_UPDATE', participants: this.state.participants });
}
}
};
@@ -640,6 +677,7 @@ class CallStateManager {
this.updateRemoteUserNetworkQuality('no_signal');
// 清理participants
this.state.participants = {};
this.selfParticipantId = null;
this.connectionId = null;
this.role = null;
this.state.session.status = 'ended';
@@ -660,6 +698,41 @@ class CallStateManager {
}
}
/**
* Host端广播完整成员列表给所有Participant
* 包含Host自身信息 + 所有Participant信息
* Participant收到后可展示完整通话成员列表
*/
broadcastParticipantsList() {
if (this.role !== 'host' || !this.renderstreaming) return;
const memberList = {};
// 添加Host自身信息
memberList['host'] = {
id: this.state.session.localUser.id,
name: this.state.session.localUser.name,
avatar: this.state.session.localUser.avatar,
mediaState: { ...this.state.session.localUser.mediaState },
status: 'online',
role: 'host'
};
// 添加所有Participant信息
for (const [pid, pInfo] of Object.entries(this.state.participants)) {
memberList[pid] = {
...pInfo,
role: 'participant'
};
}
this.renderstreaming.sendMessage({
type: 'participants-sync',
data: memberList
});
console.log('Broadcast participants list:', Object.keys(memberList));
}
/**
* 设置编解码器偏好
*/