diff options
-rw-r--r-- | examples/dhtd.hs | 40 | ||||
-rw-r--r-- | src/Network/DHT/Mainline.hs | 14 | ||||
-rw-r--r-- | src/Network/DHT/Types.hs | 43 |
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 | ||
14 | import Control.Arrow | 15 | import Control.Arrow |
15 | import Control.Monad | 16 | import Control.Monad |
@@ -223,6 +224,8 @@ ipType :: f dht ip -> DHT raw dht u ip () | |||
223 | ipType _ = return () | 224 | ipType _ = return () |
224 | 225 | ||
225 | instance Kademlia Tox.Message where | 226 | instance Kademlia Tox.Message where |
227 | data DHTData Tox.Message ip = ToxData | ||
228 | initializeDHTData = return ToxData | ||
226 | instance Pretty (NodeId Tox.Message) where | 229 | instance Pretty (NodeId Tox.Message) where |
227 | instance Pretty (NodeInfo Tox.Message IPv4 ()) where | 230 | instance Pretty (NodeInfo Tox.Message IPv4 ()) where |
228 | instance Pretty (NodeInfo Tox.Message IPv4 Bool) where -- TODO | 231 | instance 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 |
231 | instance Read (NodeId Tox.Message) where -- TODO | 234 | instance Read (NodeId Tox.Message) where -- TODO |
232 | instance Serialize (FindNode Tox.Message IPv4) where | 235 | instance 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" |
235 | instance Serialize (NodeFound Tox.Message IPv4) where | 238 | instance 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" |
238 | instance Serialize (Ping Tox.Message) where | 241 | instance 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" |
241 | instance Serialize (Query Tox.Message (FindNode Tox.Message IPv4)) where | 244 | instance 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" |
244 | instance Serialize (Query Tox.Message (Ping Tox.Message)) where -- TODO | 247 | instance 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" |
247 | instance Serialize (Response Tox.Message (NodeFound Tox.Message IPv4)) where | 250 | instance 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" |
250 | instance Serialize (Response Tox.Message (Ping Tox.Message)) where -- TODO | 253 | instance 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" |
253 | instance KRPC Tox.Message (Query Tox.Message (FindNode Tox.Message IPv4)) | 256 | instance 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" |
256 | instance KRPC Tox.Message (Query Tox.Message (Ping Tox.Message )) | 259 | instance 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" |
259 | instance DataHandlers ByteString Tox.Message where | 262 | instance 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 | ||
440 | instance BEncode Announced where | 440 | instance 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 | ||
538 | instance Kademlia KMessageOf where | 538 | instance 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 | |||
44 | deriving instance (Eq (NodeId dht), Eq a ) => Eq (Response dht a) | 44 | deriving instance (Eq (NodeId dht), Eq a ) => Eq (Response dht a) |
45 | deriving instance (Show (NodeId dht), Show a ) => Show (Response dht a) | 45 | deriving 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. | ||
49 | data 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. | ||
53 | newtype FindNode dht ip = FindNode (NodeId dht) | ||
54 | deriving (Typeable) | ||
55 | newtype NodeFound dht ip = NodeFound [NodeInfo dht ip ()] | ||
56 | deriving (Typeable) | ||
57 | |||
58 | deriving instance Eq (NodeId dht) => Eq (FindNode dht ip) | ||
59 | deriving instance Eq (NodeId dht) => Eq (NodeFound dht ip) | ||
60 | deriving instance Show (NodeId dht) => Show (FindNode dht ip) | ||
61 | deriving instance ( Show (NodeId dht) | ||
62 | , Show ip | ||
63 | ) => Show (NodeFound dht ip) | ||
64 | |||
65 | pingMessage :: Proxy dht -> Ping dht | ||
66 | pingMessage _ = Ping | ||
67 | pongMessage :: Proxy dht -> Ping dht | ||
68 | pongMessage _ = Ping | ||
69 | findNodeMessage :: TableKey dht k => Proxy dht -> k -> FindNode dht ip | ||
70 | findNodeMessage _ k = FindNode (toNodeId k) | ||
71 | foundNodesMessage :: [NodeInfo dht ip ()] -> NodeFound dht ip | ||
72 | findWho (FindNode nid) = nid | ||
73 | foundNodes :: NodeFound dht ip -> [NodeInfo dht ip ()] | ||
74 | foundNodes (NodeFound ns) = ns | ||
75 | findWho :: FindNode dht ip -> NodeId dht | ||
76 | foundNodesMessage ns = NodeFound ns | ||
47 | 77 | ||
48 | class Kademlia dht where | 78 | class 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 |