message.go 1.99 KB
Newer Older
1
package dht_pb
2

Jeromy's avatar
Jeromy committed
3
import (
4 5 6
	"errors"

	ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
Jeromy's avatar
Jeromy committed
7 8 9
	peer "github.com/jbenet/go-ipfs/peer"
)

10
func NewMessage(typ Message_MessageType, key string, level int) *Message {
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
11 12 13 14 15 16 17 18
	m := &Message{
		Type: &typ,
		Key:  &key,
	}
	m.SetClusterLevel(level)
	return m
}

19
func peerToPBPeer(p peer.Peer) *Message_Peer {
20
	pbp := new(Message_Peer)
21 22 23 24 25

	maddrs := p.Addresses()
	pbp.Addrs = make([]string, len(maddrs))
	for i, maddr := range maddrs {
		pbp.Addrs[i] = maddr.String()
Jeromy's avatar
Jeromy committed
26
	}
27
	pid := string(p.ID())
Jeromy's avatar
Jeromy committed
28 29
	pbp.Id = &pid
	return pbp
30 31
}

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
32 33
// PeersToPBPeers converts a slice of Peers into a slice of *Message_Peers,
// ready to go out on the wire.
34
func PeersToPBPeers(peers []peer.Peer) []*Message_Peer {
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
35
	pbpeers := make([]*Message_Peer, len(peers))
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
36 37 38 39 40 41
	for i, p := range peers {
		pbpeers[i] = peerToPBPeer(p)
	}
	return pbpeers
}

42 43
// Addresses returns a multiaddr associated with the Message_Peer entry
func (m *Message_Peer) Addresses() ([]ma.Multiaddr, error) {
44 45 46
	if m == nil {
		return nil, errors.New("MessagePeer is nil")
	}
47 48 49 50 51 52 53 54 55 56

	var err error
	maddrs := make([]ma.Multiaddr, len(m.Addrs))
	for i, addr := range m.Addrs {
		maddrs[i], err = ma.NewMultiaddr(addr)
		if err != nil {
			return nil, err
		}
	}
	return maddrs, nil
57 58
}

59 60 61
// GetClusterLevel gets and adjusts the cluster level on the message.
// a +/- 1 adjustment is needed to distinguish a valid first level (1) and
// default "no value" protobuf behavior (0)
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
62
func (m *Message) GetClusterLevel() int {
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
63 64
	level := m.GetClusterLevelRaw() - 1
	if level < 0 {
65
		return 0
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
66
	}
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
67
	return int(level)
68
}
69

70 71 72
// SetClusterLevel adjusts and sets the cluster level on the message.
// a +/- 1 adjustment is needed to distinguish a valid first level (1) and
// default "no value" protobuf behavior (0)
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
73 74 75
func (m *Message) SetClusterLevel(level int) {
	lvl := int32(level)
	m.ClusterLevelRaw = &lvl
76
}
77 78 79 80 81 82 83 84

func (m *Message) Loggable() map[string]interface{} {
	return map[string]interface{}{
		"message": map[string]string{
			"type": m.Type.String(),
		},
	}
}