mirror of https://github.com/voidlizard/hbs2
so far so good
This commit is contained in:
parent
ef9271b808
commit
6c3ca86b05
|
@ -1,8 +1,14 @@
|
||||||
module HBS2.Net.PeerLocator where
|
module HBS2.Net.PeerLocator where
|
||||||
|
|
||||||
|
-- import HBS2.Prelude
|
||||||
import HBS2.Net.Proto
|
import HBS2.Net.Proto
|
||||||
|
|
||||||
class (IsPeer peer, Monad m) => PeerLocator l peer m where
|
class PeerLocator l where
|
||||||
knownPeers :: l -> m [Peer peer]
|
knownPeers :: (IsPeer peer, Monad m) => l -> m [Peer peer]
|
||||||
|
|
||||||
|
data AnyPeerLocator = forall a . PeerLocator a => AnyPeerLocator a
|
||||||
|
|
||||||
|
instance PeerLocator AnyPeerLocator where
|
||||||
|
knownPeers (AnyPeerLocator l) = knownPeers l
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,7 @@ newStaticPeerLocator seeds = do
|
||||||
tv <- liftIO $ newTVarIO (Set.fromList seeds)
|
tv <- liftIO $ newTVarIO (Set.fromList seeds)
|
||||||
pure $ StaticPeerLocator tv
|
pure $ StaticPeerLocator tv
|
||||||
|
|
||||||
instance (MonadIO m, IsPeer p)
|
instance PeerLocator (StaticPeerLocator p) where
|
||||||
=> PeerLocator (StaticPeerLocator p) p m where
|
|
||||||
|
|
||||||
knownPeers _ = pure mempty
|
knownPeers _ = pure mempty
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
module HBS2.Net.Proto.Actors.BlockInfo where
|
module HBS2.Net.Proto.Actors.BlockInfo where
|
||||||
|
|
||||||
import HBS2.Prelude
|
|
||||||
import HBS2.Hash
|
|
||||||
import HBS2.Net.Proto
|
|
||||||
import HBS2.Clock
|
|
||||||
import HBS2.Actors
|
import HBS2.Actors
|
||||||
|
import HBS2.Clock
|
||||||
|
import HBS2.Hash
|
||||||
|
import HBS2.Net.PeerLocator
|
||||||
|
import HBS2.Net.Proto
|
||||||
|
import HBS2.Prelude
|
||||||
|
|
||||||
import Data.Function
|
import Data.Function
|
||||||
import Data.Kind
|
import Data.Kind
|
||||||
|
@ -19,19 +20,19 @@ import Prettyprinter
|
||||||
data BlockInfoActor (m :: Type -> Type) =
|
data BlockInfoActor (m :: Type -> Type) =
|
||||||
BlockInfoActor
|
BlockInfoActor
|
||||||
{ tasks :: Pipeline m ()
|
{ tasks :: Pipeline m ()
|
||||||
|
, peers :: AnyPeerLocator
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
-- TODO: send block info request
|
-- TODO: send block info request
|
||||||
-- TODO: receive block info request
|
-- TODO: receive block info request
|
||||||
-- TODO: cache block info per peer
|
-- TODO: cache block info per peer
|
||||||
-- TODO: get block info per peer
|
-- TODO: get block info per peer
|
||||||
|
|
||||||
|
|
||||||
createBlockInfoActor :: MonadIO m => m (BlockInfoActor m )
|
createBlockInfoActor :: MonadIO m => AnyPeerLocator -> m (BlockInfoActor m )
|
||||||
createBlockInfoActor = do
|
createBlockInfoActor l = do
|
||||||
pip <- newPipeline 200 -- FIXME: to settings!
|
pip <- newPipeline 200 -- FIXME: to settings!
|
||||||
pure $ BlockInfoActor pip
|
pure $ BlockInfoActor pip l
|
||||||
|
|
||||||
runBlockInfoActor :: MonadIO m => BlockInfoActor m -> m ()
|
runBlockInfoActor :: MonadIO m => BlockInfoActor m -> m ()
|
||||||
runBlockInfoActor b = runPipeline (tasks b)
|
runBlockInfoActor b = runPipeline (tasks b)
|
||||||
|
@ -41,6 +42,7 @@ stopBlockInfoActor b = stopPipeline (tasks b)
|
||||||
|
|
||||||
requestBlockInfo :: forall peer h m . ( MonadIO m
|
requestBlockInfo :: forall peer h m . ( MonadIO m
|
||||||
, Pretty (Hash h)
|
, Pretty (Hash h)
|
||||||
|
, IsPeer peer
|
||||||
)
|
)
|
||||||
=> BlockInfoActor m
|
=> BlockInfoActor m
|
||||||
-> Maybe (Peer peer)
|
-> Maybe (Peer peer)
|
||||||
|
@ -50,7 +52,11 @@ requestBlockInfo :: forall peer h m . ( MonadIO m
|
||||||
requestBlockInfo b mp h = do
|
requestBlockInfo b mp h = do
|
||||||
addJob (tasks b) do
|
addJob (tasks b) do
|
||||||
-- peers <- getPeers
|
-- peers <- getPeers
|
||||||
|
--
|
||||||
-- TODO: get given peer or some other peers
|
-- TODO: get given peer or some other peers
|
||||||
|
somePeers <- knownPeers @_ @peer (peers b)
|
||||||
|
|
||||||
|
|
||||||
-- TODO: get cookie from cookie generator
|
-- TODO: get cookie from cookie generator
|
||||||
-- TODO: set waiting for request
|
-- TODO: set waiting for request
|
||||||
-- TODO: send block info request to messaging
|
-- TODO: send block info request to messaging
|
||||||
|
|
|
@ -2,26 +2,40 @@ module TestBlockInfoActor where
|
||||||
|
|
||||||
import HBS2.Hash
|
import HBS2.Hash
|
||||||
import HBS2.Clock
|
import HBS2.Clock
|
||||||
|
import HBS2.Net.Proto
|
||||||
import HBS2.Net.Proto.Actors.BlockInfo
|
import HBS2.Net.Proto.Actors.BlockInfo
|
||||||
|
import HBS2.Net.PeerLocator
|
||||||
|
import HBS2.Net.PeerLocator.Static
|
||||||
|
|
||||||
import Test.Tasty.HUnit
|
import Test.Tasty.HUnit
|
||||||
|
|
||||||
import Test.QuickCheck
|
import Test.QuickCheck
|
||||||
import Data.Word
|
import Data.Word
|
||||||
|
import Data.Hashable (Hashable)
|
||||||
import Data.ByteString (ByteString)
|
import Data.ByteString (ByteString)
|
||||||
import Data.ByteString qualified as B
|
import Data.ByteString qualified as B
|
||||||
import Control.Concurrent.Async
|
import Control.Concurrent.Async
|
||||||
|
|
||||||
|
data Fake
|
||||||
|
|
||||||
|
instance IsPeer Fake where
|
||||||
|
newtype instance Peer Fake = FakePeer Int
|
||||||
|
deriving stock (Eq,Ord,Show)
|
||||||
|
deriving newtype (Hashable,Num,Enum,Real,Integral)
|
||||||
|
|
||||||
testBlockInfoActor :: IO ()
|
testBlockInfoActor :: IO ()
|
||||||
testBlockInfoActor = do
|
testBlockInfoActor = do
|
||||||
|
|
||||||
a <- createBlockInfoActor
|
|
||||||
|
np <- newStaticPeerLocator @Fake [1..10]
|
||||||
|
|
||||||
|
a <- createBlockInfoActor (AnyPeerLocator np)
|
||||||
actor <- async $ runBlockInfoActor a
|
actor <- async $ runBlockInfoActor a
|
||||||
|
|
||||||
let obj = shrink [0x00 .. 0xFF] :: [[Word8]]
|
let obj = shrink [0x00 .. 0xFF] :: [[Word8]]
|
||||||
|
|
||||||
forConcurrently_ obj $ \x -> do
|
forConcurrently_ obj $ \x -> do
|
||||||
requestBlockInfo a Nothing (hashObject (B.pack x) :: Hash HbSync)
|
requestBlockInfo @Fake a Nothing (hashObject (B.pack x) :: Hash HbSync)
|
||||||
|
|
||||||
pause ( 1 :: Timeout 'Seconds)
|
pause ( 1 :: Timeout 'Seconds)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue