gitee.com/lh-her-team/common@v1.5.1/helper/libp2ppeer/addrinfo.go (about)

     1  package libp2ppeer
     2  
     3  import (
     4  	"fmt"
     5  
     6  	ma "github.com/multiformats/go-multiaddr"
     7  )
     8  
     9  var ErrInvalidAddr = fmt.Errorf("invalid p2p multiaddr")
    10  
    11  type AddrInfo struct {
    12  	ID    ID
    13  	Addrs []ma.Multiaddr
    14  }
    15  
    16  func (pi AddrInfo) String() string {
    17  	return fmt.Sprintf("{%v: %v}", pi.ID, pi.Addrs)
    18  }
    19  
    20  // AddrInfoFromP2pAddr converts a Multiaddr to an AddrInfo.
    21  func AddrInfoFromP2pAddr(m ma.Multiaddr) (*AddrInfo, error) {
    22  	transport, id := SplitAddr(m)
    23  	if id == "" {
    24  		return nil, ErrInvalidAddr
    25  	}
    26  	info := &AddrInfo{ID: id}
    27  	if transport != nil {
    28  		info.Addrs = []ma.Multiaddr{transport}
    29  	}
    30  	return info, nil
    31  }
    32  
    33  // SplitAddr splits a p2p Multiaddr into a transport multiaddr and a peer ID.
    34  //
    35  // * Returns a nil transport if the address only contains a /p2p part.
    36  // * Returns a empty peer ID if the address doesn't contain a /p2p part.
    37  func SplitAddr(m ma.Multiaddr) (transport ma.Multiaddr, id ID) {
    38  	if m == nil {
    39  		return nil, ""
    40  	}
    41  	transport, p2ppart := ma.SplitLast(m)
    42  	if p2ppart == nil || p2ppart.Protocol().Code != ma.P_P2P {
    43  		return m, ""
    44  	}
    45  	id = ID(p2ppart.RawValue()) // already validated by the multiaddr library.
    46  	return transport, id
    47  }