addrinfo.go 1.33 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
package peer

import (
	"fmt"

	ma "github.com/multiformats/go-multiaddr"
)

// AddrInfo is a small struct used to pass around a peer with
// a set of addresses (and later, keys?).
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 AddrInfoFromP2pAddr(m ma.Multiaddr) (*AddrInfo, error) {
	if m == nil {
		return nil, ErrInvalidAddr
	}

Steven Allen's avatar
Steven Allen committed
29 30
	transport, p2ppart := ma.SplitLast(m)
	if p2ppart == nil || p2ppart.Protocol().Code != ma.P_P2P {
31 32
		return nil, ErrInvalidAddr
	}
Steven Allen's avatar
Steven Allen committed
33
	id, err := IDFromBytes(p2ppart.RawValue())
34 35 36
	if err != nil {
		return nil, err
	}
Steven Allen's avatar
Steven Allen committed
37 38 39
	info := &AddrInfo{ID: id}
	if transport != nil {
		info.Addrs = []ma.Multiaddr{transport}
40
	}
Steven Allen's avatar
Steven Allen committed
41
	return info, nil
42 43 44 45
}

func AddrInfoToP2pAddrs(pi *AddrInfo) ([]ma.Multiaddr, error) {
	var addrs []ma.Multiaddr
Steven Allen's avatar
Steven Allen committed
46 47 48 49
	p2ppart, err := ma.NewComponent("p2p", IDB58Encode(pi.ID))
	if err != nil {
		return nil, err
	}
Steven Allen's avatar
Steven Allen committed
50 51 52
	if len(pi.Addrs) == 0 {
		return []ma.Multiaddr{p2ppart}, nil
	}
53
	for _, addr := range pi.Addrs {
Steven Allen's avatar
Steven Allen committed
54
		addrs = append(addrs, addr.Encapsulate(p2ppart))
55 56 57 58 59 60 61 62 63 64
	}
	return addrs, nil
}

func (pi *AddrInfo) Loggable() map[string]interface{} {
	return map[string]interface{}{
		"peerID": pi.ID.Pretty(),
		"addrs":  pi.Addrs,
	}
}