github.com/MetalBlockchain/metalgo@v1.11.9/utils/dynamicip/resolver.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package dynamicip 5 6 import ( 7 "context" 8 "errors" 9 "fmt" 10 "net/netip" 11 "strings" 12 ) 13 14 const ( 15 ifConfigCoURL = "http://ifconfig.co" 16 ifConfigMeURL = "http://ifconfig.me" 17 // Note: All of the names below must be lowercase 18 // because we lowercase the user's input in NewResolver. 19 // TODO remove either ifConfig or ifConfigCo. 20 // They do the same thing. 21 OpenDNSName = "opendns" 22 IFConfigName = "ifconfig" 23 IFConfigCoName = "ifconfigco" 24 IFConfigMeName = "ifconfigme" 25 ) 26 27 var errUnknownResolver = errors.New("unknown resolver") 28 29 // Resolver resolves our public IP 30 type Resolver interface { 31 // Resolve and return our public IP. 32 Resolve(context.Context) (netip.Addr, error) 33 } 34 35 // Returns a new Resolver that uses the given service 36 // to resolve our public IP. 37 // [resolverName] must be one of: 38 // [OpenDNSName], [IFConfigName], [IFConfigCoName], [IFConfigMeName]. 39 // If [resolverService] isn't one of the above, returns an error 40 func NewResolver(resolverName string) (Resolver, error) { 41 switch strings.ToLower(resolverName) { 42 case OpenDNSName: 43 return newOpenDNSResolver(), nil 44 case IFConfigName, IFConfigCoName: 45 return &ifConfigResolver{url: ifConfigCoURL}, nil 46 case IFConfigMeName: 47 return &ifConfigResolver{url: ifConfigMeURL}, nil 48 default: 49 return nil, fmt.Errorf("%w: %s", errUnknownResolver, resolverName) 50 } 51 }