From 8742a4139baba67007ad7b2912d1f673f5ce4940 Mon Sep 17 00:00:00 2001 From: Derrick Hammer Date: Sat, 6 Jan 2024 12:51:38 -0500 Subject: [PATCH] feat: implement AnnouncePeers --- protocol/signed/accounce_peers.go | 85 +++++++++++++++++++++++++++++++ protocol/signed/signed.go | 3 ++ 2 files changed, 88 insertions(+) create mode 100644 protocol/signed/accounce_peers.go diff --git a/protocol/signed/accounce_peers.go b/protocol/signed/accounce_peers.go new file mode 100644 index 0000000..6830687 --- /dev/null +++ b/protocol/signed/accounce_peers.go @@ -0,0 +1,85 @@ +package signed + +import ( + libs5_go "git.lumeweb.com/LumeWeb/libs5-go" + "git.lumeweb.com/LumeWeb/libs5-go/encoding" + "git.lumeweb.com/LumeWeb/libs5-go/net" + "git.lumeweb.com/LumeWeb/libs5-go/protocol" + "github.com/vmihailenco/msgpack/v5" + "net/url" +) + +var ( + _ protocol.IncomingMessageTyped = (*AnnouncePeers)(nil) +) + +type AnnouncePeers struct { + connected bool + peer *encoding.NodeId + connectionUris []*url.URL + protocol.IncomingMessageTypedImpl +} + +func NewAnnouncePeers() *AnnouncePeers { + return &AnnouncePeers{connected: false, peer: nil, connectionUris: nil} +} + +func (a *AnnouncePeers) DecodeMessage(dec *msgpack.Decoder) error { + peerId, err := dec.DecodeBytes() + + if err != nil { + return err + } + + a.peer = encoding.NewNodeId(peerId) + + connected, err := dec.DecodeBool() + + if err != nil { + return err + } + + a.connected = connected + connectionUriVal, err := dec.DecodeSlice() + + if err != nil { + return err + } + + a.connectionUris = make([]*url.URL, 0, len(connectionUriVal)) + connectionUris := interface{}(connectionUriVal).([]string) + + for _, connectionUri := range connectionUris { + uri, err := url.Parse(connectionUri) + if err != nil { + return err + } + a.connectionUris = append(a.connectionUris, uri) + } + + return nil +} + +func (a AnnouncePeers) HandleMessage(node *libs5_go.Node, peer *net.Peer, verifyId bool) error { + if len(a.connectionUris) > 0 { + firstUrl := a.connectionUris[0] + uri := new(url.URL) + *uri = *firstUrl + + if firstUrl.User != nil { + passwd, empty := firstUrl.User.Password() + if empty { + passwd = "" + } + + nodeId, err := a.peer.ToString() + if err != nil { + return err + } + + uri.User = url.UserPassword(nodeId, passwd) + } + } + + return nil +} diff --git a/protocol/signed/signed.go b/protocol/signed/signed.go index 438412c..382131c 100644 --- a/protocol/signed/signed.go +++ b/protocol/signed/signed.go @@ -29,6 +29,9 @@ func init() { RegisterMessageType(types.ProtocolMethodHandshakeDone, func() IncomingMessage { return NewHandshakeDone() }) + RegisterMessageType(types.ProtocolMethodAnnouncePeers, func() IncomingMessage { + return NewAnnouncePeers() + }) } func RegisterMessageType(messageType types.ProtocolMethod, factoryFunc func() IncomingMessage) {