summaryrefslogtreecommitdiff
path: root/src/Network/DHT/Kademlia.hs
blob: d5418bebe3a2530ddf32f1d7dcfe047c106d70f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
-- TODO move to Network.DHT.Kademlia
{-# LANGUAGE OverloadedStrings #-}
module Network.DHT.Kademlia
       (
       ) where

import Data.ByteString
import Network
import Remote.KRPC



-- | Global unique identifier of the node. Size of the identifier
-- should(!) be equal to the size of DHT keys. This limitation arises
-- from the design of Kademlia: we should estimate distance between
-- keys and NodeId in routing algorithms.
--
type NodeID = ByteString

type NodeAddr = ByteString
type InfoHash = ByteString
type Token    = ByteString

-- | Used to check out if a node is alive or not. This has a tow-fold effect:
--
--     * If(!) caller get response it should update the bucket
--     corresponding to the callee.
--
--     * Callee of the ping should update the bucket corresponding
--     to the caller as well.
--
ping :: Method NodeID NodeID
ping = method "ping" ["id"] ["id"]

type PeerContact = ()
data NodeContact = NodeContact {
    peerContact :: PeerContact
  , nodeID :: NodeID
  }

-- | Used to lookup peer ID from node ID.
--
find_node :: Method (NodeID, NodeID) (NodeID, NodeContact)
find_node = method "find_node" ["id", "target"] ["id", "nodes"]

-- |
announce_peer :: Method (NodeID, InfoHash, PortNumber, Token) NodeID
announce_peer = undefined

genNodeID :: IO NodeID
genNodeID = undefined

{-
type InfoHash = Int
type Token = Int

ping :: Method NodeId NodeId
ping = method "ping" ["id"] ["id"]

get_peers :: Method (NodeId :*: InfoHash) (NodeId, Token, NodeAddr :|: NodeAddr)
get_peers = method "get_peers"
  ("id", "target")
  ("id", "token", view ("values" :|: "nodes"))




-}