go-dht/node/node.go
node/node.goRaw
1package node
2
3import (
4 "go-dht/config"
5 "go-dht/kademlia"
6 "net"
7 "net/http"
8 "net/rpc"
9
10 log "github.com/sirupsen/logrus"
11)
12
13type Node struct {
14 port string
15 kademlia *kademlia.Kademlia
16}
17
18func NewNode() (Node, error) {
19 id, err := kademlia.NewID()
20 if err != nil {
21 return Node{}, err
22 }
23
24 var n Node
25 n.kademlia = kademlia.NewKademliaTable(id)
26 return n, nil
27}
28
29func LoadNode(idStr string) (Node, error) {
30 id, err := kademlia.IDFromString(idStr)
31 if err != nil {
32 return Node{}, err
33 }
34 var n Node
35 n.kademlia = kademlia.NewKademliaTable(id)
36 return n, nil
37}
38
39func (n Node) ID() kademlia.ID {
40 return n.kademlia.ID
41}
42
43func (n *Node) Start() error {
44 err := rpc.Register(n)
45 if err != nil {
46 return err
47 }
48 rpc.HandleHTTP()
49 listener, err := net.Listen("tcp", ":"+config.C.Port)
50 if err != nil {
51 return err
52 }
53 err = http.Serve(listener, nil)
54 if err != nil {
55 return err
56 }
57 // TODO ping config.C.KnownNodes
58 return nil
59}
60
61// Exposed RPC calls: Ping, Store, FindNode, FindValue
62
63func (n *Node) Ping(ln kademlia.ListedNode, thisLn *kademlia.ListedNode) error {
64 log.Info("[rpc] PING from ", ln.ID)
65 n.kademlia.Update(ln)
66 *thisLn = kademlia.ListedNode{
67 ID: n.ID(),
68 Addr: config.C.Addr,
69 Port: config.C.Port,
70 }
71 // TODO perform PONG call to the requester (maybe ping&pong can be unified)
72 return nil
73}
74
75func (n *Node) Pong(ln kademlia.ListedNode, ack *bool) error {
76 log.Info("[rpc] PONG")
77 n.kademlia.Update(ln)
78 return nil
79}
80
81func (n *Node) Store(data []byte, ack *bool) error {
82 log.Info("[rpc] STORE")
83
84 return nil
85}
86
87func (n *Node) FindNode() {
88 log.Info("[rpc] FIND_NODE")
89
90}
91
92func (n *Node) FindValue() {
93 log.Info("[rpc] FIND_VALUE")
94
95}