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  }