From 6072e28b8833a2a3932f4d72dbd92023d87965ca Mon Sep 17 00:00:00 2001 From: Benjamin Pracht Date: Fri, 25 Apr 2025 16:26:45 -0700 Subject: [PATCH] Use TURN to establish external IP --- pkg/sip/config.go | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/pkg/sip/config.go b/pkg/sip/config.go index 0242ecc..bacf340 100644 --- a/pkg/sip/config.go +++ b/pkg/sip/config.go @@ -15,14 +15,16 @@ package sip import ( - "encoding/json" + "context" "fmt" - "io" "net" - "net/http" "net/netip" + "time" + "github.com/livekit/mediatransportutil/pkg/rtcconfig" + "github.com/livekit/protocol/logger" "github.com/livekit/sip/pkg/config" + "github.com/pkg/errors" ) func GetServiceConfig(conf *config.Config) (*ServiceConfig, error) { @@ -65,29 +67,18 @@ func GetServiceConfig(conf *config.Config) (*ServiceConfig, error) { } func getPublicIP() (netip.Addr, error) { - req, err := http.Get("http://ip-api.com/json/") - if err != nil { - return netip.Addr{}, err - } - defer req.Body.Close() - - body, err := io.ReadAll(req.Body) - if err != nil { - return netip.Addr{}, err - } - - ip := struct { - Query string - }{} - if err = json.Unmarshal(body, &ip); err != nil { - return netip.Addr{}, err - } - - if ip.Query == "" { - return netip.Addr{}, fmt.Errorf("Query entry was not populated") + var err error + for i := 0; i < 3; i++ { + var ip string + ip, err = rtcconfig.GetExternalIP(context.Background(), rtcconfig.DefaultStunServers, nil) + if err == nil { + return netip.ParseAddr(ip) + } else { + time.Sleep(500 * time.Millisecond) + } } - - return netip.ParseAddr(ip.Query) + logger.Warnw("could not resolve external IP", err) + return netip.Addr{}, errors.Errorf("could not resolve external IP: %v", err) } func getLocalIP(localNet string) (netip.Addr, error) {