diff --git a/packages/input/src/webrtc-stream.ts b/packages/input/src/webrtc-stream.ts index 0b90faf2..8d202034 100644 --- a/packages/input/src/webrtc-stream.ts +++ b/packages/input/src/webrtc-stream.ts @@ -123,8 +123,6 @@ export class WebRTCStream { } else { iceHolder.push(cand); } - } else { - iceHolder.push(cand); } }); @@ -143,6 +141,14 @@ export class WebRTCStream { sdp: data.sdp.sdp, type: data.sdp.type as RTCSdpType, }); + // Add held candidates + iceHolder.forEach((candidate) => { + this._pc!.addIceCandidate(candidate).catch((err) => { + console.error("Error adding held ICE candidate:", err); + }); + }); + iceHolder = []; + // Create our answer const answer = await this._pc!.createAnswer(); // Force stereo in Chromium browsers diff --git a/packages/relay/internal/core/protocol_stream.go b/packages/relay/internal/core/protocol_stream.go index 925eb4bf..4832f726 100644 --- a/packages/relay/internal/core/protocol_stream.go +++ b/packages/relay/internal/core/protocol_stream.go @@ -271,12 +271,16 @@ func (sp *StreamProtocol) handleStreamRequest(stream network.Stream) { } candInit := candidate.ToJSON() - biggified := uint32(*candInit.SDPMLineIndex) + var sdpMLineIndex *uint32 + if candInit.SDPMLineIndex != nil { + idx := uint32(*candInit.SDPMLineIndex) + sdpMLineIndex = &idx + } iceMsg, err := common.CreateMessage( &gen.ProtoICE{ Candidate: &gen.RTCIceCandidateInit{ Candidate: candInit.Candidate, - SdpMLineIndex: &biggified, + SdpMLineIndex: sdpMLineIndex, SdpMid: candInit.SDPMid, }, }, @@ -338,13 +342,15 @@ func (sp *StreamProtocol) handleStreamRequest(stream network.Stream) { case "ice-candidate": iceMsg := msgWrapper.GetIce() if iceMsg != nil { - smollified := uint16(*iceMsg.Candidate.SdpMLineIndex) cand := webrtc.ICECandidateInit{ Candidate: iceMsg.Candidate.Candidate, SDPMid: iceMsg.Candidate.SdpMid, - SDPMLineIndex: &smollified, UsernameFragment: iceMsg.Candidate.UsernameFragment, } + if iceMsg.Candidate.SdpMLineIndex != nil { + smollified := uint16(*iceMsg.Candidate.SdpMLineIndex) + cand.SDPMLineIndex = &smollified + } iceHelper.AddCandidate(cand) } else { slog.Error("Could not GetIce from ice-candidate") diff --git a/packages/relay/internal/shared/participant.go b/packages/relay/internal/shared/participant.go index 9fef6ad1..f9db6637 100644 --- a/packages/relay/internal/shared/participant.go +++ b/packages/relay/internal/shared/participant.go @@ -63,13 +63,13 @@ func (p *Participant) SetTrack(trackType webrtc.RTPCodecType, track *webrtc.Trac p.AudioTrack = track _, err := p.PeerConnection.AddTrack(track) if err != nil { - slog.Error("Failed to add Participant audio track", "participant", p.ID, "err", err) + slog.Error("Failed to add audio track", "participant", p.ID, "err", err) } case webrtc.RTPCodecTypeVideo: p.VideoTrack = track _, err := p.PeerConnection.AddTrack(track) if err != nil { - slog.Error("Failed to add Participant video track", "participant", p.ID, "err", err) + slog.Error("Failed to add video track", "participant", p.ID, "err", err) } default: slog.Warn("Unknown track type", "participant", p.ID, "trackType", trackType) @@ -84,14 +84,14 @@ func (p *Participant) Close() { if p.DataChannel != nil { err := p.DataChannel.Close() if err != nil { - slog.Error("Failed to close Participant DataChannel", err) + slog.Error("Failed to close DataChannel", "participant", p.ID, "err", err) } p.DataChannel = nil } if p.PeerConnection != nil { err := p.PeerConnection.Close() if err != nil { - slog.Error("Failed to close Participant PeerConnection", err) + slog.Error("Failed to close PeerConnection", "participant", p.ID, "err", err) } p.PeerConnection = nil }