arnaucube
arnaucube/go-dhtPublic Self-hosted repository
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}