2014-10-25 04:13:28 -07:00
|
|
|
package dht_pb
|
2014-08-01 13:21:51 -07:00
|
|
|
|
2014-08-09 22:28:46 -07:00
|
|
|
import (
|
2014-10-11 06:33:57 -07:00
|
|
|
"errors"
|
|
|
|
|
|
|
|
ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
|
2014-08-09 22:28:46 -07:00
|
|
|
peer "github.com/jbenet/go-ipfs/peer"
|
|
|
|
)
|
|
|
|
|
2014-10-25 04:13:28 -07:00
|
|
|
func NewMessage(typ Message_MessageType, key string, level int) *Message {
|
2014-09-16 07:17:55 -07:00
|
|
|
m := &Message{
|
|
|
|
Type: &typ,
|
|
|
|
Key: &key,
|
|
|
|
}
|
|
|
|
m.SetClusterLevel(level)
|
|
|
|
return m
|
|
|
|
}
|
|
|
|
|
2014-10-20 03:26:44 -07:00
|
|
|
func peerToPBPeer(p peer.Peer) *Message_Peer {
|
2014-09-16 00:52:57 -07:00
|
|
|
pbp := new(Message_Peer)
|
2014-11-20 10:46:56 -08:00
|
|
|
|
|
|
|
maddrs := p.Addresses()
|
|
|
|
pbp.Addrs = make([]string, len(maddrs))
|
|
|
|
for i, maddr := range maddrs {
|
|
|
|
pbp.Addrs[i] = maddr.String()
|
2014-08-09 22:28:46 -07:00
|
|
|
}
|
2014-10-20 03:26:44 -07:00
|
|
|
pid := string(p.ID())
|
2014-08-09 22:28:46 -07:00
|
|
|
pbp.Id = &pid
|
|
|
|
return pbp
|
2014-08-01 13:21:51 -07:00
|
|
|
}
|
|
|
|
|
2014-11-20 10:46:19 -08:00
|
|
|
// PeersToPBPeers converts a slice of Peers into a slice of *Message_Peers,
|
|
|
|
// ready to go out on the wire.
|
2014-10-25 04:13:28 -07:00
|
|
|
func PeersToPBPeers(peers []peer.Peer) []*Message_Peer {
|
2014-09-16 07:17:55 -07:00
|
|
|
pbpeers := make([]*Message_Peer, len(peers))
|
2014-09-16 01:09:34 -07:00
|
|
|
for i, p := range peers {
|
|
|
|
pbpeers[i] = peerToPBPeer(p)
|
|
|
|
}
|
|
|
|
return pbpeers
|
|
|
|
}
|
|
|
|
|
2014-11-20 10:46:56 -08:00
|
|
|
// Addresses returns a multiaddr associated with the Message_Peer entry
|
|
|
|
func (m *Message_Peer) Addresses() ([]ma.Multiaddr, error) {
|
2014-10-11 06:33:57 -07:00
|
|
|
if m == nil {
|
|
|
|
return nil, errors.New("MessagePeer is nil")
|
|
|
|
}
|
2014-11-20 10:46:56 -08:00
|
|
|
|
|
|
|
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
|
2014-10-11 06:33:57 -07:00
|
|
|
}
|
|
|
|
|
2014-09-16 00:52:57 -07:00
|
|
|
// 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)
|
2014-09-16 07:17:55 -07:00
|
|
|
func (m *Message) GetClusterLevel() int {
|
2014-09-16 01:09:34 -07:00
|
|
|
level := m.GetClusterLevelRaw() - 1
|
|
|
|
if level < 0 {
|
2014-10-25 04:13:28 -07:00
|
|
|
return 0
|
2014-09-16 01:09:34 -07:00
|
|
|
}
|
2014-09-16 07:17:55 -07:00
|
|
|
return int(level)
|
2014-09-16 00:52:57 -07:00
|
|
|
}
|
2014-08-01 13:21:51 -07:00
|
|
|
|
2014-09-16 00:52:57 -07:00
|
|
|
// 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)
|
2014-09-16 07:17:55 -07:00
|
|
|
func (m *Message) SetClusterLevel(level int) {
|
|
|
|
lvl := int32(level)
|
|
|
|
m.ClusterLevelRaw = &lvl
|
2014-08-01 13:21:51 -07:00
|
|
|
}
|
2014-11-15 18:31:06 -08:00
|
|
|
|
|
|
|
func (m *Message) Loggable() map[string]interface{} {
|
|
|
|
return map[string]interface{}{
|
|
|
|
"message": map[string]string{
|
|
|
|
"type": m.Type.String(),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|