Relocate multiaddrJoin and multiaddrSplit to api/types.h

So they can serve as multi-module helpers without having circular deps.

License: MIT
Signed-off-by: Hector Sanjuan <code@hector.link>
This commit is contained in:
Hector Sanjuan 2018-03-16 13:37:32 +01:00
parent 2227e5e25f
commit a73d7e6f7e
8 changed files with 49 additions and 68 deletions

View File

@ -8,7 +8,6 @@ import (
logging "github.com/ipfs/go-log" logging "github.com/ipfs/go-log"
host "github.com/libp2p/go-libp2p-host" host "github.com/libp2p/go-libp2p-host"
peer "github.com/libp2p/go-libp2p-peer"
ma "github.com/multiformats/go-multiaddr" ma "github.com/multiformats/go-multiaddr"
madns "github.com/multiformats/go-multiaddr-dns" madns "github.com/multiformats/go-multiaddr-dns"
manet "github.com/multiformats/go-multiaddr-net" manet "github.com/multiformats/go-multiaddr-net"
@ -161,23 +160,3 @@ func (c *Client) setupHostname() error {
} }
return nil return nil
} }
func multiaddrSplit(addr ma.Multiaddr) (peer.ID, ma.Multiaddr, error) {
pid, err := addr.ValueForProtocol(ma.P_IPFS)
if err != nil {
err = fmt.Errorf("invalid peer multiaddress: %s: %s", addr, err)
logger.Error(err)
return "", nil, err
}
ipfs, _ := ma.NewMultiaddr("/ipfs/" + pid)
decapAddr := addr.Decapsulate(ipfs)
peerID, err := peer.IDB58Decode(pid)
if err != nil {
err = fmt.Errorf("invalid peer ID in multiaddress: %s: %s", pid, err)
logger.Error(err)
return "", nil, err
}
return peerID, decapAddr, nil
}

View File

@ -7,6 +7,8 @@ import (
"net/http" "net/http"
"time" "time"
"github.com/ipfs/ipfs-cluster/api"
p2phttp "github.com/hsanjuan/go-libp2p-http" p2phttp "github.com/hsanjuan/go-libp2p-http"
libp2p "github.com/libp2p/go-libp2p" libp2p "github.com/libp2p/go-libp2p"
ipnet "github.com/libp2p/go-libp2p-interface-pnet" ipnet "github.com/libp2p/go-libp2p-interface-pnet"
@ -37,7 +39,7 @@ func (c *Client) defaultTransport() {
func (c *Client) enableLibp2p() error { func (c *Client) enableLibp2p() error {
c.defaultTransport() c.defaultTransport()
pid, addr, err := multiaddrSplit(c.config.PeerAddr) pid, addr, err := api.Libp2pMultiaddrSplit(c.config.PeerAddr)
if err != nil { if err != nil {
return err return err
} }

View File

@ -22,7 +22,7 @@ import (
// needed to parse /ws multiaddresses // needed to parse /ws multiaddresses
_ "github.com/libp2p/go-ws-transport" _ "github.com/libp2p/go-ws-transport"
// needed to prase /dns* multiaddresses // needed to parse /dns* multiaddresses
_ "github.com/multiformats/go-multiaddr-dns" _ "github.com/multiformats/go-multiaddr-dns"
) )
@ -687,3 +687,37 @@ type Error struct {
func (e *Error) Error() string { func (e *Error) Error() string {
return fmt.Sprintf("%s (%d)", e.Message, e.Code) return fmt.Sprintf("%s (%d)", e.Message, e.Code)
} }
// Libp2pMultiaddrSplit takes a LibP2P multiaddress (/<multiaddr>/ipfs/<peerID>)
// and decapsulates it, parsing the peer ID. Returns an error if there is
// any problem (for example, the provided address not being a Libp2p one).
func Libp2pMultiaddrSplit(addr ma.Multiaddr) (peer.ID, ma.Multiaddr, error) {
pid, err := addr.ValueForProtocol(ma.P_IPFS)
if err != nil {
err = fmt.Errorf("invalid peer multiaddress: %s: %s", addr, err)
logger.Error(err)
return "", nil, err
}
ipfs, _ := ma.NewMultiaddr("/ipfs/" + pid)
decapAddr := addr.Decapsulate(ipfs)
peerID, err := peer.IDB58Decode(pid)
if err != nil {
err = fmt.Errorf("invalid peer ID in multiaddress: %s: %s", pid, err)
logger.Error(err)
return "", nil, err
}
return peerID, decapAddr, nil
}
// Libp2pMultiaddrJoin takes a LibP2P multiaddress and a peer ID and
// encapsulates a new /ipfs/<peerID> address.
func Libp2pMultiaddrJoin(addr ma.Multiaddr, p peer.ID) ma.Multiaddr {
pidAddr, err := ma.NewMultiaddr("/ipfs/" + peer.IDB58Encode(p))
// let this break badly
if err != nil {
panic("called Libp2pMultiaddrJoin with bad peer!")
}
return addr.Encapsulate(pidAddr)
}

View File

@ -580,7 +580,7 @@ func (c *Cluster) ID() api.ID {
} }
for k := range addrsSet { for k := range addrsSet {
addr, _ := ma.NewMultiaddr(k) addr, _ := ma.NewMultiaddr(k)
addrs = append(addrs, multiaddrJoin(addr, c.id)) addrs = append(addrs, api.Libp2pMultiaddrJoin(addr, c.id))
} }
peers := []peer.ID{} peers := []peer.ID{}
@ -617,7 +617,7 @@ func (c *Cluster) PeerAdd(addr ma.Multiaddr) (api.ID, error) {
c.paMux.Lock() c.paMux.Lock()
defer c.paMux.Unlock() defer c.paMux.Unlock()
logger.Debugf("peerAdd called with %s", addr) logger.Debugf("peerAdd called with %s", addr)
pid, decapAddr, err := multiaddrSplit(addr) pid, decapAddr, err := api.Libp2pMultiaddrSplit(addr)
if err != nil { if err != nil {
id := api.ID{ id := api.ID{
Error: err.Error(), Error: err.Error(),
@ -749,7 +749,7 @@ func (c *Cluster) Join(addr ma.Multiaddr) error {
// return errors.New("only single-node clusters can be joined") // return errors.New("only single-node clusters can be joined")
//} //}
pid, _, err := multiaddrSplit(addr) pid, _, err := api.Libp2pMultiaddrSplit(addr)
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
return err return err
@ -771,7 +771,7 @@ func (c *Cluster) Join(addr ma.Multiaddr) error {
"Cluster", "Cluster",
"PeerAdd", "PeerAdd",
api.MultiaddrToSerial( api.MultiaddrToSerial(
multiaddrJoin(c.config.ListenAddr, c.id)), api.Libp2pMultiaddrJoin(c.config.ListenAddr, c.id)),
&myID) &myID)
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)

View File

@ -5,6 +5,8 @@ import (
"fmt" "fmt"
"time" "time"
"github.com/ipfs/ipfs-cluster/api"
host "github.com/libp2p/go-libp2p-host" host "github.com/libp2p/go-libp2p-host"
peer "github.com/libp2p/go-libp2p-peer" peer "github.com/libp2p/go-libp2p-peer"
peerstore "github.com/libp2p/go-libp2p-peerstore" peerstore "github.com/libp2p/go-libp2p-peerstore"
@ -27,7 +29,7 @@ func newPeerManager(h host.Host) *peerManager {
func (pm *peerManager) addPeer(addr ma.Multiaddr, connect bool) error { func (pm *peerManager) addPeer(addr ma.Multiaddr, connect bool) error {
logger.Debugf("adding peer address %s", addr) logger.Debugf("adding peer address %s", addr)
pid, decapAddr, err := multiaddrSplit(addr) pid, decapAddr, err := api.Libp2pMultiaddrSplit(addr)
if err != nil { if err != nil {
return err return err
} }

View File

@ -36,7 +36,6 @@ func peerManagerClusters(t *testing.T) ([]*Cluster, []*test.IpfsMock) {
func clusterAddr(c *Cluster) ma.Multiaddr { func clusterAddr(c *Cluster) ma.Multiaddr {
cAddr, _ := ma.NewMultiaddr(fmt.Sprintf("%s/ipfs/%s", c.host.Addrs()[0], c.id.Pretty())) cAddr, _ := ma.NewMultiaddr(fmt.Sprintf("%s/ipfs/%s", c.host.Addrs()[0], c.id.Pretty()))
return cAddr return cAddr
//return multiaddrJoin(c.config.ListenAddr, c.ID().ID)
} }
func TestClustersPeerAdd(t *testing.T) { func TestClustersPeerAdd(t *testing.T) {

View File

@ -389,6 +389,6 @@ func (rpcapi *RPCAPI) RemoteMultiaddrForPeer(ctx context.Context, in peer.ID, ou
if len(conns) == 0 { if len(conns) == 0 {
return errors.New("no connections to: " + in.Pretty()) return errors.New("no connections to: " + in.Pretty())
} }
*out = api.MultiaddrToSerial(multiaddrJoin(conns[0].RemoteMultiaddr(), in)) *out = api.MultiaddrToSerial(api.Libp2pMultiaddrJoin(conns[0].RemoteMultiaddr(), in))
return nil return nil
} }

41
util.go
View File

@ -60,41 +60,6 @@ func copyEmptyStructToIfaces(in []struct{}) []interface{} {
return ifaces return ifaces
} }
// MultiaddrSplit takes a /proto/value/ipfs/id multiaddress and returns
// the id on one side and the /proto/value multiaddress on the other.
func MultiaddrSplit(addr ma.Multiaddr) (peer.ID, ma.Multiaddr, error) {
return multiaddrSplit(addr)
}
func multiaddrSplit(addr ma.Multiaddr) (peer.ID, ma.Multiaddr, error) {
pid, err := addr.ValueForProtocol(ma.P_IPFS)
if err != nil {
err = fmt.Errorf("invalid peer multiaddress: %s: %s", addr, err)
logger.Error(err)
return "", nil, err
}
ipfs, _ := ma.NewMultiaddr("/ipfs/" + pid)
decapAddr := addr.Decapsulate(ipfs)
peerID, err := peer.IDB58Decode(pid)
if err != nil {
err = fmt.Errorf("invalid peer ID in multiaddress: %s: %s", pid, err)
logger.Error(err)
return "", nil, err
}
return peerID, decapAddr, nil
}
func multiaddrJoin(addr ma.Multiaddr, p peer.ID) ma.Multiaddr {
pidAddr, err := ma.NewMultiaddr("/ipfs/" + peer.IDB58Encode(p))
// let this break badly
if err != nil {
panic("called multiaddrJoin with bad peer!")
}
return addr.Encapsulate(pidAddr)
}
// PeersFromMultiaddrs returns all the different peers in the given addresses. // PeersFromMultiaddrs returns all the different peers in the given addresses.
// each peer only will appear once in the result, even if several // each peer only will appear once in the result, even if several
// multiaddresses for it are provided. // multiaddresses for it are provided.
@ -102,7 +67,7 @@ func PeersFromMultiaddrs(addrs []ma.Multiaddr) []peer.ID {
var pids []peer.ID var pids []peer.ID
pm := make(map[peer.ID]struct{}) pm := make(map[peer.ID]struct{})
for _, addr := range addrs { for _, addr := range addrs {
pid, _, err := multiaddrSplit(addr) pid, _, err := api.Libp2pMultiaddrSplit(addr)
if err != nil { if err != nil {
continue continue
} }
@ -140,9 +105,9 @@ func PeersFromMultiaddrs(addrs []ma.Multiaddr) []peer.ID {
func getRemoteMultiaddr(h host.Host, pid peer.ID, addr ma.Multiaddr) ma.Multiaddr { func getRemoteMultiaddr(h host.Host, pid peer.ID, addr ma.Multiaddr) ma.Multiaddr {
conns := h.Network().ConnsToPeer(pid) conns := h.Network().ConnsToPeer(pid)
if len(conns) > 0 { if len(conns) > 0 {
return multiaddrJoin(conns[0].RemoteMultiaddr(), pid) return api.Libp2pMultiaddrJoin(conns[0].RemoteMultiaddr(), pid)
} }
return multiaddrJoin(addr, pid) return api.Libp2pMultiaddrJoin(addr, pid)
} }
func pinInfoSliceToSerial(pi []api.PinInfo) []api.PinInfoSerial { func pinInfoSliceToSerial(pi []api.PinInfo) []api.PinInfoSerial {