diff --git a/icecandidate.go b/icecandidate.go index 91cf6a1f361..f45ed1481a8 100644 --- a/icecandidate.go +++ b/icecandidate.go @@ -24,6 +24,7 @@ type ICECandidate struct { TCPType string `json:"tcpType"` SDPMid string `json:"sdpMid"` SDPMLineIndex uint16 `json:"sdpMLineIndex"` + extensions []ice.CandidateExtension } // Conversion for package ice. @@ -67,6 +68,7 @@ func newICECandidateFromICE(candidate ice.Candidate, sdpMid string, sdpMLineInde TCPType: candidate.TCPType().String(), SDPMid: sdpMid, SDPMLineIndex: sdpMLineIndex, + extensions: candidate.Extensions(), } if candidate.RelatedAddress() != nil { @@ -77,7 +79,7 @@ func newICECandidateFromICE(candidate ice.Candidate, sdpMid string, sdpMLineInde return newCandidate, nil } -func (c ICECandidate) toICE() (ice.Candidate, error) { +func (c ICECandidate) toICE() (cand ice.Candidate, err error) { candidateID := c.statsID switch c.Typ { case ICECandidateTypeHost: @@ -92,7 +94,7 @@ func (c ICECandidate) toICE() (ice.Candidate, error) { Priority: c.Priority, } - return ice.NewCandidateHost(&config) + cand, err = ice.NewCandidateHost(&config) case ICECandidateTypeSrflx: config := ice.CandidateServerReflexiveConfig{ CandidateID: candidateID, @@ -106,7 +108,7 @@ func (c ICECandidate) toICE() (ice.Candidate, error) { RelPort: int(c.RelatedPort), } - return ice.NewCandidateServerReflexive(&config) + cand, err = ice.NewCandidateServerReflexive(&config) case ICECandidateTypePrflx: config := ice.CandidatePeerReflexiveConfig{ CandidateID: candidateID, @@ -120,7 +122,7 @@ func (c ICECandidate) toICE() (ice.Candidate, error) { RelPort: int(c.RelatedPort), } - return ice.NewCandidatePeerReflexive(&config) + cand, err = ice.NewCandidatePeerReflexive(&config) case ICECandidateTypeRelay: config := ice.CandidateRelayConfig{ CandidateID: candidateID, @@ -134,10 +136,21 @@ func (c ICECandidate) toICE() (ice.Candidate, error) { RelPort: int(c.RelatedPort), } - return ice.NewCandidateRelay(&config) + cand, err = ice.NewCandidateRelay(&config) default: return nil, fmt.Errorf("%w: %s", errICECandidateTypeUnknown, c.Typ) } + + if cand != nil && err == nil { + for i := range c.extensions { + err = cand.AddExtension(c.extensions[i]) + if err != nil { + return nil, err + } + } + } + + return cand, err } func convertTypeFromICE(t ice.CandidateType) (ICECandidateType, error) { diff --git a/icecandidate_test.go b/icecandidate_test.go index c553f2c1882..9e5d1ed2449 100644 --- a/icecandidate_test.go +++ b/icecandidate_test.go @@ -248,3 +248,20 @@ func TestICECandidateSDPMid_ToJSON(t *testing.T) { assert.Equal(t, candidate.SDPMid, "0") assert.Equal(t, candidate.SDPMLineIndex, uint16(1)) } + +func TestICECandidateExtensions_ToJSON(t *testing.T) { + cand := "2637185494 1 udp 2121932543 192.168.1.4 50723 typ host generation 1 ufrag Jzd0 network-id 1" + candidate, err := ice.UnmarshalCandidate(cand) + assert.NoError(t, err) + + sdpMid := "1" + sdpMLineIndex := uint16(2) + + iceCandidate, err := newICECandidateFromICE(candidate, sdpMid, sdpMLineIndex) + assert.NoError(t, err) + + candidateInit := iceCandidate.ToJSON() + + assert.Equal(t, sdpMLineIndex, *candidateInit.SDPMLineIndex) + assert.Equal(t, "candidate:"+cand, candidateInit.Candidate) +}