Simplify peer track replacement after negotiation sequencing fix

This commit is contained in:
Jage9
2026-02-25 02:49:49 -05:00
parent 97ed7b4b61
commit 2e532f5471
2 changed files with 15 additions and 30 deletions

View File

@@ -1,5 +1,5 @@
// Maintainer-controlled web client version. // Maintainer-controlled web client version.
// Format: YYYY.MM.DD Rn (example: 2026.02.20 R2) // Format: YYYY.MM.DD Rn (example: 2026.02.20 R2)
window.CHGRID_WEB_VERSION = "2026.02.25 R267"; window.CHGRID_WEB_VERSION = "2026.02.25 R268";
// Optional display timezone for timestamps. Falls back to America/Detroit if unset/invalid. // Optional display timezone for timestamps. Falls back to America/Detroit if unset/invalid.
window.CHGRID_TIME_ZONE = "America/Detroit"; window.CHGRID_TIME_ZONE = "America/Detroit";

View File

@@ -4,7 +4,6 @@ import type { RemoteUser } from '../network/protocol';
export type PeerRuntime = SpatialPeerRuntime & { export type PeerRuntime = SpatialPeerRuntime & {
id: string; id: string;
pc: RTCPeerConnection; pc: RTCPeerConnection;
initiator: boolean;
remoteStream?: MediaStream; remoteStream?: MediaStream;
}; };
@@ -39,7 +38,6 @@ export class PeerManager {
const peer: PeerRuntime = { const peer: PeerRuntime = {
id: targetId, id: targetId,
initiator: isInitiator,
nickname: userData.nickname ?? 'user...', nickname: userData.nickname ?? 'user...',
x: userData.x ?? 20, x: userData.x ?? 20,
y: userData.y ?? 20, y: userData.y ?? 20,
@@ -119,9 +117,7 @@ export class PeerManager {
if (!newTrack) { if (!newTrack) {
return; return;
} }
const peersToRenegotiate: PeerRuntime[] = [];
for (const peer of this.peers.values()) { for (const peer of this.peers.values()) {
let shouldRenegotiate = false;
const sender = const sender =
peer.pc.getSenders().find((candidate) => candidate.track?.kind === 'audio') ?? peer.pc.getSenders().find((candidate) => candidate.track?.kind === 'audio') ??
peer.pc peer.pc
@@ -130,35 +126,24 @@ export class PeerManager {
?.sender; ?.sender;
if (!sender) { if (!sender) {
peer.pc.addTrack(newTrack, stream); peer.pc.addTrack(newTrack, stream);
shouldRenegotiate = true; await this.renegotiatePeer(peer);
} else { } else {
if (!sender.track) {
shouldRenegotiate = true;
}
await sender.replaceTrack(newTrack); await sender.replaceTrack(newTrack);
} }
const audioTransceiver = peer.pc
.getTransceivers()
.find((transceiver) => transceiver.receiver.track?.kind === 'audio' || transceiver.sender.track?.kind === 'audio');
if (audioTransceiver && (audioTransceiver.direction === 'recvonly' || audioTransceiver.direction === 'inactive')) {
audioTransceiver.direction = 'sendrecv';
shouldRenegotiate = true;
}
if (shouldRenegotiate && peer.initiator) {
peersToRenegotiate.push(peer);
}
} }
for (const peer of peersToRenegotiate) { }
if (peer.pc.connectionState === 'closed') continue;
if (peer.pc.signalingState !== 'stable') continue; /** Re-negotiate one peer connection after adding a new outbound track. */
try { private async renegotiatePeer(peer: PeerRuntime): Promise<void> {
let offer = await peer.pc.createOffer(); if (peer.pc.connectionState === 'closed') return;
offer = this.tuneOpus(offer); if (peer.pc.signalingState !== 'stable') return;
await peer.pc.setLocalDescription(offer); try {
this.sendSignal(peer.id, { sdp: peer.pc.localDescription ?? undefined }); let offer = await peer.pc.createOffer();
} catch { offer = this.tuneOpus(offer);
// Best-effort renegotiation; transport-level failures recover on subsequent signaling. await peer.pc.setLocalDescription(offer);
} this.sendSignal(peer.id, { sdp: peer.pc.localDescription ?? undefined });
} catch {
// Best-effort renegotiation; transport-level failures recover on subsequent signaling.
} }
} }