2018-04-19 20:18:42 +03:00
|
|
|
package rendezvous
|
|
|
|
|
|
|
|
|
|
import (
|
2018-04-23 11:54:25 +03:00
|
|
|
"errors"
|
2018-04-21 12:06:27 +03:00
|
|
|
"fmt"
|
|
|
|
|
|
2018-04-26 14:06:58 +03:00
|
|
|
db "github.com/libp2p/go-libp2p-rendezvous/db"
|
2018-04-19 20:18:42 +03:00
|
|
|
pb "github.com/libp2p/go-libp2p-rendezvous/pb"
|
|
|
|
|
|
2020-10-28 14:39:21 +01:00
|
|
|
logging "github.com/ipfs/go-log/v2"
|
2019-05-28 14:41:28 -04:00
|
|
|
"github.com/libp2p/go-libp2p-core/peer"
|
|
|
|
|
"github.com/libp2p/go-libp2p-core/protocol"
|
2018-04-19 20:18:42 +03:00
|
|
|
ma "github.com/multiformats/go-multiaddr"
|
|
|
|
|
)
|
|
|
|
|
|
2018-04-23 11:54:25 +03:00
|
|
|
var log = logging.Logger("rendezvous")
|
|
|
|
|
|
2018-04-19 20:18:42 +03:00
|
|
|
const (
|
|
|
|
|
RendezvousProto = protocol.ID("/rendezvous/1.0.0")
|
2018-04-23 11:54:25 +03:00
|
|
|
|
|
|
|
|
DefaultTTL = 2 * 3600 // 2hr
|
2018-04-19 20:18:42 +03:00
|
|
|
)
|
|
|
|
|
|
2018-04-21 12:06:27 +03:00
|
|
|
type RendezvousError struct {
|
|
|
|
|
Status pb.Message_ResponseStatus
|
|
|
|
|
Text string
|
|
|
|
|
}
|
2018-04-20 14:38:12 +03:00
|
|
|
|
2018-04-21 12:06:27 +03:00
|
|
|
func (e RendezvousError) Error() string {
|
|
|
|
|
return fmt.Sprintf("Rendezvous error: %s (%s)", e.Text, pb.Message_ResponseStatus(e.Status).String())
|
2018-04-20 14:38:12 +03:00
|
|
|
}
|
|
|
|
|
|
2019-05-28 14:41:28 -04:00
|
|
|
func newRegisterMessage(ns string, pi peer.AddrInfo, ttl int) *pb.Message {
|
2018-04-19 20:18:42 +03:00
|
|
|
msg := new(pb.Message)
|
|
|
|
|
msg.Type = pb.Message_REGISTER.Enum()
|
|
|
|
|
msg.Register = new(pb.Message_Register)
|
|
|
|
|
if ns != "" {
|
|
|
|
|
msg.Register.Ns = &ns
|
|
|
|
|
}
|
|
|
|
|
if ttl > 0 {
|
|
|
|
|
ttl64 := int64(ttl)
|
|
|
|
|
msg.Register.Ttl = &ttl64
|
|
|
|
|
}
|
|
|
|
|
msg.Register.Peer = new(pb.Message_PeerInfo)
|
|
|
|
|
msg.Register.Peer.Id = []byte(pi.ID)
|
|
|
|
|
msg.Register.Peer.Addrs = make([][]byte, len(pi.Addrs))
|
|
|
|
|
for i, addr := range pi.Addrs {
|
|
|
|
|
msg.Register.Peer.Addrs[i] = addr.Bytes()
|
|
|
|
|
}
|
|
|
|
|
return msg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newUnregisterMessage(ns string, pid peer.ID) *pb.Message {
|
|
|
|
|
msg := new(pb.Message)
|
|
|
|
|
msg.Type = pb.Message_UNREGISTER.Enum()
|
|
|
|
|
msg.Unregister = new(pb.Message_Unregister)
|
|
|
|
|
if ns != "" {
|
|
|
|
|
msg.Unregister.Ns = &ns
|
|
|
|
|
}
|
|
|
|
|
msg.Unregister.Id = []byte(pid)
|
|
|
|
|
return msg
|
|
|
|
|
}
|
|
|
|
|
|
2018-04-19 22:29:52 +03:00
|
|
|
func newDiscoverMessage(ns string, limit int, cookie []byte) *pb.Message {
|
2018-04-19 20:18:42 +03:00
|
|
|
msg := new(pb.Message)
|
|
|
|
|
msg.Type = pb.Message_DISCOVER.Enum()
|
|
|
|
|
msg.Discover = new(pb.Message_Discover)
|
|
|
|
|
if ns != "" {
|
|
|
|
|
msg.Discover.Ns = &ns
|
|
|
|
|
}
|
|
|
|
|
if limit > 0 {
|
|
|
|
|
limit64 := int64(limit)
|
|
|
|
|
msg.Discover.Limit = &limit64
|
|
|
|
|
}
|
2018-04-19 22:29:52 +03:00
|
|
|
if cookie != nil {
|
|
|
|
|
msg.Discover.Cookie = cookie
|
|
|
|
|
}
|
2018-04-19 20:18:42 +03:00
|
|
|
return msg
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-28 14:41:28 -04:00
|
|
|
func pbToPeerInfo(p *pb.Message_PeerInfo) (peer.AddrInfo, error) {
|
2018-04-23 11:54:25 +03:00
|
|
|
if p == nil {
|
2019-05-28 14:41:28 -04:00
|
|
|
return peer.AddrInfo{}, errors.New("missing peer info")
|
2018-04-23 11:54:25 +03:00
|
|
|
}
|
|
|
|
|
|
2018-04-19 20:18:42 +03:00
|
|
|
id, err := peer.IDFromBytes(p.Id)
|
|
|
|
|
if err != nil {
|
2019-05-28 14:41:28 -04:00
|
|
|
return peer.AddrInfo{}, err
|
2018-04-19 20:18:42 +03:00
|
|
|
}
|
|
|
|
|
addrs := make([]ma.Multiaddr, 0, len(p.Addrs))
|
|
|
|
|
for _, bs := range p.Addrs {
|
|
|
|
|
addr, err := ma.NewMultiaddrBytes(bs)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorf("Error parsing multiaddr: %s", err.Error())
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
addrs = append(addrs, addr)
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-28 14:41:28 -04:00
|
|
|
return peer.AddrInfo{ID: id, Addrs: addrs}, nil
|
2018-04-19 20:18:42 +03:00
|
|
|
}
|
2018-04-23 11:54:25 +03:00
|
|
|
|
2019-01-18 15:31:50 +02:00
|
|
|
func newRegisterResponse(ttl int) *pb.Message_RegisterResponse {
|
|
|
|
|
ttl64 := int64(ttl)
|
2018-04-23 11:54:25 +03:00
|
|
|
r := new(pb.Message_RegisterResponse)
|
|
|
|
|
r.Status = pb.Message_OK.Enum()
|
2019-01-18 15:31:50 +02:00
|
|
|
r.Ttl = &ttl64
|
2018-04-23 11:54:25 +03:00
|
|
|
return r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newRegisterResponseError(status pb.Message_ResponseStatus, text string) *pb.Message_RegisterResponse {
|
|
|
|
|
r := new(pb.Message_RegisterResponse)
|
|
|
|
|
r.Status = status.Enum()
|
|
|
|
|
r.StatusText = &text
|
|
|
|
|
return r
|
|
|
|
|
}
|
|
|
|
|
|
2018-04-26 14:06:58 +03:00
|
|
|
func newDiscoverResponse(regs []db.RegistrationRecord, cookie []byte) *pb.Message_DiscoverResponse {
|
2018-04-23 11:54:25 +03:00
|
|
|
r := new(pb.Message_DiscoverResponse)
|
|
|
|
|
r.Status = pb.Message_OK.Enum()
|
|
|
|
|
|
|
|
|
|
rregs := make([]*pb.Message_Register, len(regs))
|
|
|
|
|
for i, reg := range regs {
|
|
|
|
|
rreg := new(pb.Message_Register)
|
|
|
|
|
rns := reg.Ns
|
|
|
|
|
rreg.Ns = &rns
|
|
|
|
|
rreg.Peer = new(pb.Message_PeerInfo)
|
2018-04-23 13:25:18 +03:00
|
|
|
rreg.Peer.Id = []byte(reg.Id)
|
2018-04-23 11:54:25 +03:00
|
|
|
rreg.Peer.Addrs = reg.Addrs
|
|
|
|
|
rttl := int64(reg.Ttl)
|
|
|
|
|
rreg.Ttl = &rttl
|
|
|
|
|
rregs[i] = rreg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
r.Registrations = rregs
|
|
|
|
|
r.Cookie = cookie
|
|
|
|
|
|
|
|
|
|
return r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newDiscoverResponseError(status pb.Message_ResponseStatus, text string) *pb.Message_DiscoverResponse {
|
|
|
|
|
r := new(pb.Message_DiscoverResponse)
|
|
|
|
|
r.Status = status.Enum()
|
|
|
|
|
r.StatusText = &text
|
|
|
|
|
return r
|
|
|
|
|
}
|