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 }