48 lines
1.6 KiB
Go
48 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
|
||
|
|
}
|