summaryrefslogtreecommitdiff
path: root/src/Network/BitTorrent/DHT/ContactInfo.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Network/BitTorrent/DHT/ContactInfo.hs')
-rw-r--r--src/Network/BitTorrent/DHT/ContactInfo.hs29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/Network/BitTorrent/DHT/ContactInfo.hs b/src/Network/BitTorrent/DHT/ContactInfo.hs
index 979dbb62..823982d4 100644
--- a/src/Network/BitTorrent/DHT/ContactInfo.hs
+++ b/src/Network/BitTorrent/DHT/ContactInfo.hs
@@ -1,6 +1,6 @@
1module Network.BitTorrent.DHT.ContactInfo 1module Network.BitTorrent.DHT.ContactInfo
2 ( PeerStore 2 ( PeerStore
3 , Network.BitTorrent.DHT.ContactInfo.lookup 3 , Network.BitTorrent.DHT.ContactInfo.freshPeers
4 , Network.BitTorrent.DHT.ContactInfo.insertPeer 4 , Network.BitTorrent.DHT.ContactInfo.insertPeer
5 , knownSwarms 5 , knownSwarms
6 ) where 6 ) where
@@ -124,8 +124,8 @@ data SwarmData ip = SwarmData
124knownSwarms :: PeerStore ip -> [ (InfoHash, Int, Maybe ByteString) ] 124knownSwarms :: PeerStore ip -> [ (InfoHash, Int, Maybe ByteString) ]
125knownSwarms (PeerStore m) = L.map (\(ih,SwarmData q n) -> (ih,PSQ.size q,n)) $ HM.toList m 125knownSwarms (PeerStore m) = L.map (\(ih,SwarmData q n) -> (ih,PSQ.size q,n)) $ HM.toList m
126 126
127swarmSinglton :: Ord ip => PeerAddr ip -> SwarmData ip 127swarmSingleton :: Ord ip => PeerAddr ip -> SwarmData ip
128swarmSinglton a = SwarmData 128swarmSingleton a = SwarmData
129 { peers = PSQ.singleton a 0 129 { peers = PSQ.singleton a 0
130 , name = Nothing } 130 , name = Nothing }
131 131
@@ -157,8 +157,27 @@ instance Serialize (PeerStore a) where
157 put = undefined 157 put = undefined
158 158
159-- | Used in 'get_peers' DHT queries. 159-- | Used in 'get_peers' DHT queries.
160lookup :: Ord a => InfoHash -> PeerStore a -> [PeerAddr a] 160-- lookup :: Ord a => InfoHash -> PeerStore a -> [PeerAddr a]
161lookup ih (PeerStore m) = maybe [] (PSQ.keys . peers) $ HM.lookup ih m 161-- lookup ih (PeerStore m) = maybe [] (PSQ.keys . peers) $ HM.lookup ih m
162
163batchSize = 64
164
165-- | Used in 'get_peers' DHT queries.
166freshPeers :: Ord a => InfoHash -> Timestamp -> PeerStore a -> ([PeerAddr a], PeerStore a)
167freshPeers ih tm (PeerStore m) = (ps, PeerStore m')
168 where
169 swarm = fromMaybe (SwarmData PSQ.empty Nothing) $ HM.lookup ih m
170 ps0 = take batchSize $ unfoldr (incomp minView) (peers swarm)
171 peers' = case reverse ps0 of
172 (_,psq):_ -> psq
173 _ -> peers swarm
174 ps = L.map (key . fst) ps0
175 m' = HM.insert ih swarm { peers = L.foldl' (\q p -> PSQ.insert p tm q) peers' ps } m
176
177incomp :: (x -> Maybe (r,x)) -> x -> Maybe ((r,x),x)
178incomp f x = do
179 (result,x') <- f x
180 pure $ ( (result,x'), x' )
162 181
163-- | Used in 'announce_peer' DHT queries. 182-- | Used in 'announce_peer' DHT queries.
164insertPeer :: Ord a => InfoHash -> Maybe ByteString -> PeerAddr a -> PeerStore a -> PeerStore a 183insertPeer :: Ord a => InfoHash -> Maybe ByteString -> PeerAddr a -> PeerStore a -> PeerStore a