package peer
import (
"fmt"
ma "github.com/multiformats/go-multiaddr"
)
type AddrInfo struct {
ID ID
Addrs []ma .Multiaddr
}
var _ fmt .Stringer = AddrInfo {}
func (pi AddrInfo ) String () string {
return fmt .Sprintf ("{%v: %v}" , pi .ID , pi .Addrs )
}
var ErrInvalidAddr = fmt .Errorf ("invalid p2p multiaddr" )
func AddrInfosFromP2pAddrs (maddrs ...ma .Multiaddr ) ([]AddrInfo , error ) {
m := make (map [ID ][]ma .Multiaddr )
for _ , maddr := range maddrs {
transport , id := SplitAddr (maddr )
if id == "" {
return nil , ErrInvalidAddr
}
if transport == nil {
if _ , ok := m [id ]; !ok {
m [id ] = nil
}
} else {
m [id ] = append (m [id ], transport )
}
}
ais := make ([]AddrInfo , 0 , len (m ))
for id , maddrs := range m {
ais = append (ais , AddrInfo {ID : id , Addrs : maddrs })
}
return ais , nil
}
func SplitAddr (m ma .Multiaddr ) (transport ma .Multiaddr , id ID ) {
if m == nil {
return nil , ""
}
transport , p2ppart := ma .SplitLast (m )
if p2ppart == nil || p2ppart .Protocol ().Code != ma .P_P2P {
return m , ""
}
id = ID (p2ppart .RawValue ())
return transport , id
}
func IDFromP2PAddr (m ma .Multiaddr ) (ID , error ) {
if m == nil {
return "" , ErrInvalidAddr
}
var lastComponent ma .Component
ma .ForEach (m , func (c ma .Component ) bool {
lastComponent = c
return true
})
if lastComponent .Protocol ().Code != ma .P_P2P {
return "" , ErrInvalidAddr
}
id := ID (lastComponent .RawValue ())
return id , nil
}
func AddrInfoFromString (s string ) (*AddrInfo , error ) {
a , err := ma .NewMultiaddr (s )
if err != nil {
return nil , err
}
return AddrInfoFromP2pAddr (a )
}
func AddrInfoFromP2pAddr (m ma .Multiaddr ) (*AddrInfo , error ) {
transport , id := SplitAddr (m )
if id == "" {
return nil , ErrInvalidAddr
}
info := &AddrInfo {ID : id }
if transport != nil {
info .Addrs = []ma .Multiaddr {transport }
}
return info , nil
}
func AddrInfoToP2pAddrs (pi *AddrInfo ) ([]ma .Multiaddr , error ) {
p2ppart , err := ma .NewComponent ("p2p" , pi .ID .String ())
if err != nil {
return nil , err
}
if len (pi .Addrs ) == 0 {
return []ma .Multiaddr {p2ppart .Multiaddr ()}, nil
}
addrs := make ([]ma .Multiaddr , 0 , len (pi .Addrs ))
for _ , addr := range pi .Addrs {
addrs = append (addrs , addr .Encapsulate (p2ppart ))
}
return addrs , nil
}
func (pi *AddrInfo ) Loggable () map [string ]interface {} {
return map [string ]interface {}{
"peerID" : pi .ID .String (),
"addrs" : pi .Addrs ,
}
}
func AddrInfosToIDs (pis []AddrInfo ) []ID {
ps := make ([]ID , len (pis ))
for i , pi := range pis {
ps [i ] = pi .ID
}
return ps
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .