media-state-changed 消息,如果状态没变化的话,不更新状态

This commit is contained in:
2026-06-03 21:00:15 +08:00
parent 600f64dc6d
commit 37f195b48c
3 changed files with 141 additions and 14 deletions

View File

@@ -13,6 +13,19 @@ import { MeetingRecorder } from './media/meeting-recorder.js';
import { ServerRecordingPeer } from './media/server-recording-peer.js';
const logger = createLogger('store');
const MEDIA_STATE_KEYS = ['audio', 'video', 'screenShare', 'recording', 'isSpeaking'];
function hasMediaStateChanged(current = {}, next = {}) {
if (!next || typeof next !== 'object') {
return false;
}
return MEDIA_STATE_KEYS.some(key => (
Object.prototype.hasOwnProperty.call(next, key)
&& Boolean(current?.[key]) !== Boolean(next[key])
));
}
class CallStateManager {
constructor() {
this.state = {
@@ -932,29 +945,34 @@ class CallStateManager {
_handleMediaStateChangedMessage(data) {
logger.debug('收到媒体状态更新:', data.data, 'from participant:', data.participantId);
if (this.role === 'host') {
if (data.participantId && this.state.participants[data.participantId]) {
this._upsertParticipant(data.participantId, {
mediaState: data.data
});
const participantChanged = this._updateParticipantMediaStateIfChanged(data.participantId, data.data);
const remoteChanged = this._updateRemoteMediaIfChanged(data.data, data.participantId);
if (participantChanged) {
this._notifyParticipantsUpdate();
this.broadcastParticipantsList();
}
if (!participantChanged && !remoteChanged) {
logger.debug('媒体状态未变化,跳过更新:', data.participantId);
}
this.updateRemoteMedia(data.data, data.participantId);
this._notifyParticipantsUpdate();
this.broadcastParticipantsList();
return;
}
if (data.participantId && data.participantId !== this.selfParticipantId && this.state.participants[data.participantId]) {
this._upsertParticipant(data.participantId, {
mediaState: data.data
});
this._notifyParticipantsUpdate();
if (this._updateParticipantMediaStateIfChanged(data.participantId, data.data)) {
this._notifyParticipantsUpdate();
} else {
logger.debug('媒体状态未变化,跳过参与者更新:', data.participantId);
}
return;
}
if (data.participantId === this.selfParticipantId) {
return;
}
logger.debug('Received media-state-changed from Host, updating remoteUser:', data.data);
this.updateRemoteMedia(data.data, data.participantId);
this._notifyParticipantsUpdate();
if (this._updateRemoteMediaIfChanged(data.data, data.participantId)) {
this._notifyParticipantsUpdate();
} else {
logger.debug('媒体状态未变化,跳过远端用户更新:', data.participantId);
}
}
_handleUserInfoMessage(data) {
logger.debug('收到用户信息:', data.data, 'from participant:', data.participantId);
@@ -1046,6 +1064,25 @@ class CallStateManager {
_upsertParticipant(participantId, patch = {}) {
return upsertParticipant(this.state.participants, participantId, patch);
}
_updateParticipantMediaStateIfChanged(participantId, mediaState) {
if (!participantId || !this.state.participants[participantId]) {
return false;
}
if (!hasMediaStateChanged(this.state.participants[participantId].mediaState, mediaState)) {
return false;
}
this._upsertParticipant(participantId, {
mediaState
});
return true;
}
_updateRemoteMediaIfChanged(mediaState, participantId) {
if (!hasMediaStateChanged(this.state.session.remoteUser.mediaState, mediaState)) {
return false;
}
this.updateRemoteMedia(mediaState, participantId);
return true;
}
_removeParticipant(participantId) {
return removeParticipant(this.state.participants, participantId);
}