summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/dhtd.hs40
-rw-r--r--src/Network/DHT/Mainline.hs14
-rw-r--r--src/Network/DHT/Types.hs43
3 files changed, 54 insertions, 43 deletions
diff --git a/examples/dhtd.hs b/examples/dhtd.hs
index 68f91446..e4716d1a 100644
--- a/examples/dhtd.hs
+++ b/examples/dhtd.hs
@@ -10,6 +10,7 @@
10{-# LANGUAGE PartialTypeSignatures #-} 10{-# LANGUAGE PartialTypeSignatures #-}
11{-# LANGUAGE CPP #-} 11{-# LANGUAGE CPP #-}
12{-# LANGUAGE RankNTypes #-} 12{-# LANGUAGE RankNTypes #-}
13{-# LANGUAGE TypeFamilies #-}
13 14
14import Control.Arrow 15import Control.Arrow
15import Control.Monad 16import Control.Monad
@@ -223,6 +224,8 @@ ipType :: f dht ip -> DHT raw dht u ip ()
223ipType _ = return () 224ipType _ = return ()
224 225
225instance Kademlia Tox.Message where 226instance Kademlia Tox.Message where
227 data DHTData Tox.Message ip = ToxData
228 initializeDHTData = return ToxData
226instance Pretty (NodeId Tox.Message) where 229instance Pretty (NodeId Tox.Message) where
227instance Pretty (NodeInfo Tox.Message IPv4 ()) where 230instance Pretty (NodeInfo Tox.Message IPv4 ()) where
228instance Pretty (NodeInfo Tox.Message IPv4 Bool) where -- TODO 231instance Pretty (NodeInfo Tox.Message IPv4 Bool) where -- TODO
@@ -230,32 +233,32 @@ instance Read (NodeId KMessageOf) where
230 readsPrec d s = map (\(ih,s) -> (toNodeId (ih::InfoHash),s)) $ readsPrec d s 233 readsPrec d s = map (\(ih,s) -> (toNodeId (ih::InfoHash),s)) $ readsPrec d s
231instance Read (NodeId Tox.Message) where -- TODO 234instance Read (NodeId Tox.Message) where -- TODO
232instance Serialize (FindNode Tox.Message IPv4) where 235instance Serialize (FindNode Tox.Message IPv4) where
233 get = error "TODO get" 236 get = error "TODO get 1"
234 put = error "TODO put" 237 put = error "TODO put 2"
235instance Serialize (NodeFound Tox.Message IPv4) where 238instance Serialize (NodeFound Tox.Message IPv4) where
236 get = error "TODO get" 239 get = error "TODO get 3"
237 put = error "TODO put" 240 put = error "TODO put 4"
238instance Serialize (Ping Tox.Message) where 241instance Serialize (Ping Tox.Message) where
239 get = error "TODO get" 242 get = error "TODO get 5"
240 put = error "TODO put" 243 put = error "TODO put 6"
241instance Serialize (Query Tox.Message (FindNode Tox.Message IPv4)) where 244instance Serialize (Query Tox.Message (FindNode Tox.Message IPv4)) where
242 get = error "TODO get" 245 get = error "TODO get 7"
243 put = error "TODO put" 246 put = error "TODO put 8"
244instance Serialize (Query Tox.Message (Ping Tox.Message)) where -- TODO 247instance Serialize (Query Tox.Message (Ping Tox.Message)) where -- TODO
245 get = error "TODO get" 248 get = error "TODO get 9"
246 put = error "TODO put" 249 put = error "TODO put 10"
247instance Serialize (Response Tox.Message (NodeFound Tox.Message IPv4)) where 250instance Serialize (Response Tox.Message (NodeFound Tox.Message IPv4)) where
248 get = error "TODO get" 251 get = error "TODO get 11"
249 put = error "TODO put" 252 put = error "TODO put 12"
250instance Serialize (Response Tox.Message (Ping Tox.Message)) where -- TODO 253instance Serialize (Response Tox.Message (Ping Tox.Message)) where -- TODO
251 get = error "TODO get" 254 get = error "TODO get 13"
252 put = error "TODO put" 255 put = error "TODO put 14"
253instance KRPC Tox.Message (Query Tox.Message (FindNode Tox.Message IPv4)) 256instance KRPC Tox.Message (Query Tox.Message (FindNode Tox.Message IPv4))
254 (Response Tox.Message (NodeFound Tox.Message IPv4)) where 257 (Response Tox.Message (NodeFound Tox.Message IPv4)) where
255 method = error "TODO method" 258 method = error "TODO method 15"
256instance KRPC Tox.Message (Query Tox.Message (Ping Tox.Message )) 259instance KRPC Tox.Message (Query Tox.Message (Ping Tox.Message ))
257 (Response Tox.Message (Ping Tox.Message )) where 260 (Response Tox.Message (Ping Tox.Message )) where
258 method = error "TODO method" 261 method = error "TODO method 16"
259instance DataHandlers ByteString Tox.Message where 262instance DataHandlers ByteString Tox.Message where
260 263
261 264
@@ -490,6 +493,9 @@ main = do
490 ["-p",port] | not ("-" `isPrefixOf` port) -> return port 493 ["-p",port] | not ("-" `isPrefixOf` port) -> return port
491 ("-p":_) -> error "Port not specified! (-p PORT)" 494 ("-p":_) -> error "Port not specified! (-p PORT)"
492 _ -> defaultPort 495 _ -> defaultPort
496
497 tox_state <- godht (show (succ (read p::Int))) $ \a me0 -> ask
498
493 godht p $ \a me0 -> do 499 godht p $ \a me0 -> do
494 printTable 500 printTable
495 bs <- liftIO bootstrapNodes 501 bs <- liftIO bootstrapNodes
@@ -525,7 +531,7 @@ main = do
525 st <- ask 531 st <- ask
526 waitForSignal <- liftIO $ do 532 waitForSignal <- liftIO $ do
527 signalQuit <- newEmptyMVar 533 signalQuit <- newEmptyMVar
528 srv <- streamServer (withSession $ clientSession st (error "todo: tox state") signalQuit True) (SockAddrUnix "dht.sock") 534 srv <- streamServer (withSession $ clientSession st tox_state signalQuit True) (SockAddrUnix "dht.sock")
529 return $ liftIO $ do 535 return $ liftIO $ do
530 () <- takeMVar signalQuit 536 () <- takeMVar signalQuit
531 quitListening srv 537 quitListening srv
diff --git a/src/Network/DHT/Mainline.hs b/src/Network/DHT/Mainline.hs
index b756ff6a..6ef6d450 100644
--- a/src/Network/DHT/Mainline.hs
+++ b/src/Network/DHT/Mainline.hs
@@ -438,7 +438,7 @@ data Announced = Announced
438 deriving (Show, Eq, Typeable) 438 deriving (Show, Eq, Typeable)
439 439
440instance BEncode Announced where 440instance BEncode Announced where
441 toBEncode _ = toBEncode Ping 441 toBEncode _ = toBEncode ( Ping :: Ping KMessageOf )
442 fromBEncode _ = pure Announced 442 fromBEncode _ = pure Announced
443 443
444-- | \"q" = \"announce\" 444-- | \"q" = \"announce\"
@@ -536,23 +536,11 @@ checkToken sessionTokens addr questionableToken = do
536 536
537 537
538instance Kademlia KMessageOf where 538instance Kademlia KMessageOf where
539 data Ping KMessageOf = Ping
540 deriving (Show, Eq, Typeable)
541 newtype FindNode KMessageOf ip = FindNode (NodeId KMessageOf)
542 deriving (Show, Eq, Typeable)
543 newtype NodeFound KMessageOf ip = NodeFound [NodeInfo KMessageOf ip ()]
544 deriving (Show, Eq, Typeable)
545 data DHTData KMessageOf ip = TorrentData 539 data DHTData KMessageOf ip = TorrentData
546 { contactInfo :: !(TVar (PeerStore ip )) -- ^ published by other nodes; 540 { contactInfo :: !(TVar (PeerStore ip )) -- ^ published by other nodes;
547 , sessionTokens :: !(TVar SessionTokens ) -- ^ query session IDs. 541 , sessionTokens :: !(TVar SessionTokens ) -- ^ query session IDs.
548 } 542 }
549 543
550 pingMessage _ = Ping
551 pongMessage _ = Ping
552 findNodeMessage _ k = FindNode (toNodeId k)
553 findWho (FindNode nid) = nid
554 foundNodes (NodeFound ns) = ns
555 foundNodesMessage ns = NodeFound ns
556 544
557 dhtAdjustID _ fallback ip0 arrival 545 dhtAdjustID _ fallback ip0 arrival
558 = fromMaybe fallback $ do 546 = fromMaybe fallback $ do
diff --git a/src/Network/DHT/Types.hs b/src/Network/DHT/Types.hs
index 31ae5948..91d1fc22 100644
--- a/src/Network/DHT/Types.hs
+++ b/src/Network/DHT/Types.hs
@@ -44,22 +44,39 @@ data Response dht a = Response
44deriving instance (Eq (NodeId dht), Eq a ) => Eq (Response dht a) 44deriving instance (Eq (NodeId dht), Eq a ) => Eq (Response dht a)
45deriving instance (Show (NodeId dht), Show a ) => Show (Response dht a) 45deriving instance (Show (NodeId dht), Show a ) => Show (Response dht a)
46 46
47-- | The most basic query is a ping. Ping query is used to check if a
48-- quered node is still alive.
49data Ping ( dht :: * -> *) = Ping
50 deriving (Show, Eq, Typeable)
51-- | Find node is used to find the contact information for a node
52-- given its ID.
53newtype FindNode dht ip = FindNode (NodeId dht)
54 deriving (Typeable)
55newtype NodeFound dht ip = NodeFound [NodeInfo dht ip ()]
56 deriving (Typeable)
57
58deriving instance Eq (NodeId dht) => Eq (FindNode dht ip)
59deriving instance Eq (NodeId dht) => Eq (NodeFound dht ip)
60deriving instance Show (NodeId dht) => Show (FindNode dht ip)
61deriving instance ( Show (NodeId dht)
62 , Show ip
63 ) => Show (NodeFound dht ip)
64
65pingMessage :: Proxy dht -> Ping dht
66pingMessage _ = Ping
67pongMessage :: Proxy dht -> Ping dht
68pongMessage _ = Ping
69findNodeMessage :: TableKey dht k => Proxy dht -> k -> FindNode dht ip
70findNodeMessage _ k = FindNode (toNodeId k)
71foundNodesMessage :: [NodeInfo dht ip ()] -> NodeFound dht ip
72findWho (FindNode nid) = nid
73foundNodes :: NodeFound dht ip -> [NodeInfo dht ip ()]
74foundNodes (NodeFound ns) = ns
75findWho :: FindNode dht ip -> NodeId dht
76foundNodesMessage ns = NodeFound ns
47 77
48class Kademlia dht where 78class Kademlia dht where
49 -- | The most basic query is a ping. Ping query is used to check if a
50 -- quered node is still alive.
51 data Ping dht
52 -- | Find node is used to find the contact information for a node
53 -- given its ID.
54 data FindNode dht ip
55 data NodeFound dht ip
56 data DHTData dht ip 79 data DHTData dht ip
57 pingMessage :: Proxy dht -> Ping dht
58 pongMessage :: Proxy dht -> Ping dht
59 findNodeMessage :: TableKey dht k => Proxy dht -> k -> FindNode dht ip
60 foundNodesMessage :: [NodeInfo dht ip ()] -> NodeFound dht ip
61 foundNodes :: NodeFound dht ip -> [NodeInfo dht ip ()]
62 findWho :: FindNode dht ip -> NodeId dht
63 dhtAdjustID :: Address ip => Proxy dht -> NodeId dht -> SockAddr -> Event dht ip u -> NodeId dht 80 dhtAdjustID :: Address ip => Proxy dht -> NodeId dht -> SockAddr -> Event dht ip u -> NodeId dht
64 namePing :: Proxy dht -> QueryMethod dht 81 namePing :: Proxy dht -> QueryMethod dht
65 nameFindNodes :: Proxy dht -> QueryMethod dht 82 nameFindNodes :: Proxy dht -> QueryMethod dht