diff options
author | Sam Truzjan <pxqr.sta@gmail.com> | 2013-12-28 08:47:02 +0400 |
---|---|---|
committer | Sam Truzjan <pxqr.sta@gmail.com> | 2013-12-28 08:47:02 +0400 |
commit | f0df039183e7027a49eafe51de53340fc43723e3 (patch) | |
tree | 4dfeaa5b2dbe8a7b8474a79839bc7441b042a3bf /src/Network/BitTorrent/DHT/Routing.hs | |
parent | fe6cb6e8a5de55406ad3663cf5c0a0d73189a519 (diff) |
Add node sessions
Diffstat (limited to 'src/Network/BitTorrent/DHT/Routing.hs')
-rw-r--r-- | src/Network/BitTorrent/DHT/Routing.hs | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/Network/BitTorrent/DHT/Routing.hs b/src/Network/BitTorrent/DHT/Routing.hs index 5f00a924..fd2197f0 100644 --- a/src/Network/BitTorrent/DHT/Routing.hs +++ b/src/Network/BitTorrent/DHT/Routing.hs | |||
@@ -8,12 +8,14 @@ | |||
8 | {-# LANGUAGE RecordWildCards #-} | 8 | {-# LANGUAGE RecordWildCards #-} |
9 | {-# LANGUAGE TypeOperators #-} | 9 | {-# LANGUAGE TypeOperators #-} |
10 | {-# LANGUAGE DeriveGeneric #-} | 10 | {-# LANGUAGE DeriveGeneric #-} |
11 | {-# OPTIONS_GHC -fno-warn-orphans #-} | ||
11 | module Network.BitTorrent.DHT.Routing | 12 | module Network.BitTorrent.DHT.Routing |
12 | ( -- * Routing table | 13 | ( -- * Routing table |
13 | Table | 14 | Table |
14 | , BucketCount | 15 | , BucketCount |
15 | 16 | ||
16 | -- * Routing | 17 | -- * Routing |
18 | , Timestamp | ||
17 | , Routing | 19 | , Routing |
18 | , runRouting | 20 | , runRouting |
19 | 21 | ||
@@ -89,12 +91,11 @@ insert ping (k, v) = go 0 | |||
89 | -----------------------------------------------------------------------} | 91 | -----------------------------------------------------------------------} |
90 | 92 | ||
91 | type Timestamp = POSIXTime | 93 | type Timestamp = POSIXTime |
92 | type PingInterval = POSIXTime | ||
93 | 94 | ||
94 | data Routing ip result | 95 | data Routing ip result |
95 | = Full result | 96 | = Full result |
96 | | Done (Timestamp -> result) | 97 | | Done (Timestamp -> result) |
97 | | Refresh (NodeAddr ip) (([NodeInfo ip], Timestamp) -> Routing ip result) | 98 | | Refresh NodeId (([NodeInfo ip], Timestamp) -> Routing ip result) |
98 | | NeedPing (NodeAddr ip) (Maybe Timestamp -> Routing ip result) | 99 | | NeedPing (NodeAddr ip) (Maybe Timestamp -> Routing ip result) |
99 | 100 | ||
100 | instance Functor (Routing ip) where | 101 | instance Functor (Routing ip) where |
@@ -107,23 +108,24 @@ runRouting :: (Monad m, Eq ip) | |||
107 | => (NodeAddr ip -> m Bool) -- ^ ping_node | 108 | => (NodeAddr ip -> m Bool) -- ^ ping_node |
108 | -> (NodeId -> m [NodeInfo ip]) -- ^ find_nodes | 109 | -> (NodeId -> m [NodeInfo ip]) -- ^ find_nodes |
109 | -> m Timestamp -- ^ timestamper | 110 | -> m Timestamp -- ^ timestamper |
110 | -> Routing ip f | 111 | -> Routing ip f -- ^ action |
111 | -> m f -- ^ result | 112 | -> m f -- ^ result |
112 | runRouting ping_node find_nodes timestamp = go | 113 | runRouting ping_node find_nodes timestamper = go |
113 | where | 114 | where |
114 | go (Full r) = return r | 115 | go (Full r) = return r |
115 | go (Done f) = liftM f timestamp | 116 | go (Done f) = liftM f timestamper |
116 | go (NeedPing addr f) = do | 117 | go (NeedPing addr f) = do |
117 | pong <- ping_node addr | 118 | pong <- ping_node addr |
118 | if pong | 119 | if pong |
119 | then do | 120 | then do |
120 | time <- timestamp | 121 | time <- timestamper |
121 | go (f (Just time)) | 122 | go (f (Just time)) |
122 | else go (f Nothing) | 123 | else go (f Nothing) |
123 | 124 | ||
124 | go (Refresh nodes f) = do | 125 | go (Refresh nid f) = do |
125 | let nid = undefined | 126 | infos <- find_nodes nid |
126 | go (f undefined) | 127 | time <- timestamper |
128 | go (f (infos, time)) | ||
127 | 129 | ||
128 | {----------------------------------------------------------------------- | 130 | {----------------------------------------------------------------------- |
129 | Bucket | 131 | Bucket |
@@ -186,7 +188,7 @@ insertNode info bucket | |||
186 | -- update the all bucket if it is too outdated | 188 | -- update the all bucket if it is too outdated |
187 | | Just (NodeInfo {..} :-> lastSeen) <- lastChanged bucket | 189 | | Just (NodeInfo {..} :-> lastSeen) <- lastChanged bucket |
188 | , lastSeen > delta | 190 | , lastSeen > delta |
189 | = Refresh nodeAddr $ \ (infos, t) -> | 191 | = Refresh nodeId $ \ (infos, t) -> |
190 | insertNode info $ | 192 | insertNode info $ |
191 | L.foldr (\ x -> PSQ.insertWith max x t) bucket infos | 193 | L.foldr (\ x -> PSQ.insertWith max x t) bucket infos |
192 | 194 | ||