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 }