mirror of
https://github.com/pion/ice.git
synced 2025-10-26 08:50:34 +08:00
Relay candidates have an additional field "relayProtocol" which is not marshaled and hence not copied by the candidateBase's copy() method. This change is required to properly expose the relay protocol for via the agents GetSelectedCandidatePair() function as it internally copies the candidates.
95 lines
2.1 KiB
Go
95 lines
2.1 KiB
Go
package ice
|
|
|
|
import (
|
|
"net"
|
|
)
|
|
|
|
// CandidateRelay ...
|
|
type CandidateRelay struct {
|
|
candidateBase
|
|
|
|
relayProtocol string
|
|
onClose func() error
|
|
}
|
|
|
|
// CandidateRelayConfig is the config required to create a new CandidateRelay
|
|
type CandidateRelayConfig struct {
|
|
CandidateID string
|
|
Network string
|
|
Address string
|
|
Port int
|
|
Component uint16
|
|
Priority uint32
|
|
Foundation string
|
|
RelAddr string
|
|
RelPort int
|
|
RelayProtocol string
|
|
OnClose func() error
|
|
}
|
|
|
|
// NewCandidateRelay creates a new relay candidate
|
|
func NewCandidateRelay(config *CandidateRelayConfig) (*CandidateRelay, error) {
|
|
candidateID := config.CandidateID
|
|
|
|
if candidateID == "" {
|
|
candidateID = globalCandidateIDGenerator.Generate()
|
|
}
|
|
|
|
ip := net.ParseIP(config.Address)
|
|
if ip == nil {
|
|
return nil, ErrAddressParseFailed
|
|
}
|
|
|
|
networkType, err := determineNetworkType(config.Network, ip)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &CandidateRelay{
|
|
candidateBase: candidateBase{
|
|
id: candidateID,
|
|
networkType: networkType,
|
|
candidateType: CandidateTypeRelay,
|
|
address: config.Address,
|
|
port: config.Port,
|
|
resolvedAddr: &net.UDPAddr{IP: ip, Port: config.Port},
|
|
component: config.Component,
|
|
foundationOverride: config.Foundation,
|
|
priorityOverride: config.Priority,
|
|
relatedAddress: &CandidateRelatedAddress{
|
|
Address: config.RelAddr,
|
|
Port: config.RelPort,
|
|
},
|
|
},
|
|
relayProtocol: config.RelayProtocol,
|
|
onClose: config.OnClose,
|
|
}, nil
|
|
}
|
|
|
|
// RelayProtocol returns the protocol used between the endpoint and the relay server.
|
|
func (c *CandidateRelay) RelayProtocol() string {
|
|
return c.relayProtocol
|
|
}
|
|
|
|
func (c *CandidateRelay) close() error {
|
|
err := c.candidateBase.close()
|
|
if c.onClose != nil {
|
|
err = c.onClose()
|
|
c.onClose = nil
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (c *CandidateRelay) copy() (Candidate, error) {
|
|
cc, err := c.candidateBase.copy()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if ccr, ok := cc.(*CandidateRelay); ok {
|
|
ccr.relayProtocol = c.relayProtocol
|
|
}
|
|
|
|
return cc, nil
|
|
}
|