Vendors github.com/pion/webrtc/v4 v4.2.11 and its transitive dependencies (datachannel, dtls/v3, ice/v4, interceptor, logging, mdns/v2, sctp, sdp/v3, srtp/v3, stun/v3, transport/v4, turn/v4).
47 lines
1.6 KiB
Go
47 lines
1.6 KiB
Go
package webrtc
|
|
|
|
import (
|
|
"github.com/pion/webrtc/v4"
|
|
)
|
|
|
|
// BuildICEConfig translates a Config into the two Pion config pieces every
|
|
// PeerConnection needs: a webrtc.Configuration (with ICE servers) and a
|
|
// SettingEngine (with NAT1To1 and port range tuning).
|
|
//
|
|
// The returned *SettingEngine may be nil if no engine-level tuning is
|
|
// required (i.e. PublicIP unset and UDPPortRange at defaults). Callers
|
|
// should only pass it to webrtc.NewAPI when non-nil.
|
|
func BuildICEConfig(c Config) (webrtc.Configuration, *webrtc.SettingEngine, error) {
|
|
if err := c.Validate(); err != nil {
|
|
return webrtc.Configuration{}, nil, err
|
|
}
|
|
|
|
rtcConfig := webrtc.Configuration{
|
|
ICEServers: make([]webrtc.ICEServer, 0, len(c.ICEServers)),
|
|
}
|
|
for _, uri := range c.ICEServers {
|
|
rtcConfig.ICEServers = append(rtcConfig.ICEServers, webrtc.ICEServer{
|
|
URLs: []string{uri},
|
|
})
|
|
}
|
|
|
|
var se *webrtc.SettingEngine
|
|
if c.PublicIP != "" || c.UDPPortRange.Low > 0 {
|
|
engine := webrtc.SettingEngine{}
|
|
if c.PublicIP != "" {
|
|
engine.SetNAT1To1IPs([]string{c.PublicIP}, webrtc.ICECandidateTypeHost)
|
|
}
|
|
// Constrain the ephemeral UDP range Pion allocates for ICE candidates.
|
|
// Note: this is a separate concern from our FFmpeg→Source UDP ports;
|
|
// Pion uses its own port pool for the WebRTC media path.
|
|
if c.UDPPortRange.Low > 0 && c.UDPPortRange.High >= c.UDPPortRange.Low {
|
|
if err := engine.SetEphemeralUDPPortRange(
|
|
uint16(c.UDPPortRange.Low), uint16(c.UDPPortRange.High)); err != nil {
|
|
return webrtc.Configuration{}, nil, err
|
|
}
|
|
}
|
|
se = &engine
|
|
}
|
|
|
|
return rtcConfig, se, nil
|
|
}
|