package ice
import (
"net"
"net/netip"
)
type CandidateRelay struct {
candidateBase
relayProtocol string
onClose func () error
}
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
}
func NewCandidateRelay (config *CandidateRelayConfig ) (*CandidateRelay , error ) {
candidateID := config .CandidateID
if candidateID == "" {
candidateID = globalCandidateIDGenerator .Generate ()
}
ipAddr , err := netip .ParseAddr (config .Address )
if err != nil {
return nil , err
}
networkType , err := determineNetworkType (config .Network , ipAddr )
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 : ipAddr .AsSlice (),
Port : config .Port ,
Zone : ipAddr .Zone (),
},
component : config .Component ,
foundationOverride : config .Foundation ,
priorityOverride : config .Priority ,
relatedAddress : &CandidateRelatedAddress {
Address : config .RelAddr ,
Port : config .RelPort ,
},
remoteCandidateCaches : map [AddrPort ]Candidate {},
},
relayProtocol : config .RelayProtocol ,
onClose : config .OnClose ,
}, nil
}
func (c *CandidateRelay ) LocalPreference () uint16 {
var relayPreference uint16
switch c .relayProtocol {
case relayProtocolTLS , relayProtocolDTLS :
relayPreference = 2
case tcp :
relayPreference = 1
default :
relayPreference = 0
}
return c .candidateBase .LocalPreference () + relayPreference
}
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
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .