mirror of https://github.com/voidlizard/hbs2
wip
This commit is contained in:
parent
6c0aef1e25
commit
de97258fe1
|
@ -3,16 +3,18 @@
|
||||||
{-# Language AllowAmbiguousTypes #-}
|
{-# Language AllowAmbiguousTypes #-}
|
||||||
module HBS2.Actors.Peer where
|
module HBS2.Actors.Peer where
|
||||||
|
|
||||||
import HBS2.Prelude.Plated
|
|
||||||
import HBS2.Hash
|
|
||||||
import HBS2.Clock
|
|
||||||
import HBS2.Actors
|
import HBS2.Actors
|
||||||
import HBS2.Storage
|
import HBS2.Clock
|
||||||
import HBS2.Net.Proto
|
|
||||||
import HBS2.Net.Messaging
|
|
||||||
import HBS2.Net.Proto.Sessions
|
|
||||||
import HBS2.Defaults
|
import HBS2.Defaults
|
||||||
import HBS2.Events
|
import HBS2.Events
|
||||||
|
import HBS2.Hash
|
||||||
|
import HBS2.Net.Messaging
|
||||||
|
import HBS2.Net.PeerLocator
|
||||||
|
import HBS2.Net.PeerLocator.Static
|
||||||
|
import HBS2.Net.Proto
|
||||||
|
import HBS2.Net.Proto.Sessions
|
||||||
|
import HBS2.Prelude.Plated
|
||||||
|
import HBS2.Storage
|
||||||
|
|
||||||
import Control.Monad.Trans.Maybe
|
import Control.Monad.Trans.Maybe
|
||||||
import Codec.Serialise hiding (encode,decode)
|
import Codec.Serialise hiding (encode,decode)
|
||||||
|
@ -93,6 +95,7 @@ data PeerEnv e =
|
||||||
{ _envSelf :: Peer e
|
{ _envSelf :: Peer e
|
||||||
, _envFab :: Fabriq e
|
, _envFab :: Fabriq e
|
||||||
, _envStorage :: AnyStorage
|
, _envStorage :: AnyStorage
|
||||||
|
, _envPeerLocator :: AnyPeerLocator e
|
||||||
, _envDeferred :: Pipeline IO ()
|
, _envDeferred :: Pipeline IO ()
|
||||||
, _envSessions :: Cache SKey Dynamic
|
, _envSessions :: Cache SKey Dynamic
|
||||||
, _envEvents :: TVar (HashMap SKey [Dynamic])
|
, _envEvents :: TVar (HashMap SKey [Dynamic])
|
||||||
|
@ -264,14 +267,22 @@ instance ( HasProtocol e p
|
||||||
ev <- MaybeT $ pure $ fromDynamic @(EventHandler e p (PeerM e IO)) r
|
ev <- MaybeT $ pure $ fromDynamic @(EventHandler e p (PeerM e IO)) r
|
||||||
lift $ ev d
|
lift $ ev d
|
||||||
|
|
||||||
runPeerM :: (MonadIO m, Pretty (Peer e)) => AnyStorage -> Fabriq e -> Peer e -> PeerM e m a -> m ()
|
runPeerM :: forall e m . (MonadIO m, HasPeer e, Ord (Peer e), Pretty (Peer e))
|
||||||
|
=> AnyStorage
|
||||||
|
-> Fabriq e
|
||||||
|
-> Peer e
|
||||||
|
-> PeerM e m ()
|
||||||
|
-> m ()
|
||||||
|
|
||||||
runPeerM s bus p f = do
|
runPeerM s bus p f = do
|
||||||
|
|
||||||
env <- PeerEnv p bus s <$> newPipeline defProtoPipelineSize
|
pl <- AnyPeerLocator <$> newStaticPeerLocator @e mempty
|
||||||
<*> liftIO (Cache.newCache (Just defCookieTimeout))
|
|
||||||
<*> liftIO (newTVarIO mempty)
|
env <- PeerEnv p bus s pl <$> newPipeline defProtoPipelineSize
|
||||||
<*> liftIO (Cache.newCache (Just defCookieTimeout))
|
<*> liftIO (Cache.newCache (Just defCookieTimeout))
|
||||||
<*> liftIO (newTVarIO mempty)
|
<*> liftIO (newTVarIO mempty)
|
||||||
|
<*> liftIO (Cache.newCache (Just defCookieTimeout))
|
||||||
|
<*> liftIO (newTVarIO mempty)
|
||||||
|
|
||||||
let de = view envDeferred env
|
let de = view envDeferred env
|
||||||
as <- liftIO $ async $ runPipeline de
|
as <- liftIO $ async $ runPipeline de
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
module HBS2.Net.PeerLocator where
|
module HBS2.Net.PeerLocator where
|
||||||
|
|
||||||
-- import HBS2.Prelude
|
import HBS2.Prelude
|
||||||
import HBS2.Net.Proto.Types
|
import HBS2.Net.Proto.Types
|
||||||
|
|
||||||
class PeerLocator l where
|
class PeerLocator e l where
|
||||||
knownPeers :: (HasPeer p, Monad m) => l -> m [Peer p]
|
knownPeers :: forall m . (HasPeer e, MonadIO m) => l -> m [Peer e]
|
||||||
|
addPeers :: forall m . (HasPeer e, MonadIO m) => l -> [Peer e] -> m ()
|
||||||
|
|
||||||
data AnyPeerLocator = forall a . PeerLocator a => AnyPeerLocator a
|
data AnyPeerLocator e = forall a . PeerLocator e a => AnyPeerLocator a
|
||||||
|
|
||||||
instance PeerLocator AnyPeerLocator where
|
instance HasPeer e => PeerLocator e (AnyPeerLocator e) where
|
||||||
knownPeers (AnyPeerLocator l) = knownPeers l
|
knownPeers (AnyPeerLocator l) = knownPeers l
|
||||||
|
addPeers (AnyPeerLocator l) = addPeers l
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,12 +4,12 @@ import HBS2.Prelude
|
||||||
import HBS2.Net.Proto
|
import HBS2.Net.Proto
|
||||||
import HBS2.Net.PeerLocator
|
import HBS2.Net.PeerLocator
|
||||||
|
|
||||||
import Control.Concurrent.STM.TVar
|
import Control.Concurrent.STM
|
||||||
import Data.Set (Set)
|
import Data.Set (Set)
|
||||||
import Data.Set qualified as Set
|
import Data.Set qualified as Set
|
||||||
|
|
||||||
newtype StaticPeerLocator p =
|
newtype StaticPeerLocator e =
|
||||||
StaticPeerLocator (TVar (Set (Peer p)))
|
StaticPeerLocator (TVar (Set (Peer e)))
|
||||||
|
|
||||||
|
|
||||||
newStaticPeerLocator :: (Ord (Peer p), HasPeer p, MonadIO m) => [Peer p] -> m (StaticPeerLocator p)
|
newStaticPeerLocator :: (Ord (Peer p), HasPeer p, MonadIO m) => [Peer p] -> m (StaticPeerLocator p)
|
||||||
|
@ -17,7 +17,14 @@ newStaticPeerLocator seeds = do
|
||||||
tv <- liftIO $ newTVarIO (Set.fromList seeds)
|
tv <- liftIO $ newTVarIO (Set.fromList seeds)
|
||||||
pure $ StaticPeerLocator tv
|
pure $ StaticPeerLocator tv
|
||||||
|
|
||||||
instance PeerLocator (StaticPeerLocator p) where
|
instance Ord (Peer e) => PeerLocator e (StaticPeerLocator e) where
|
||||||
|
|
||||||
|
knownPeers (StaticPeerLocator peers) = do
|
||||||
|
ps <- liftIO $ readTVarIO peers
|
||||||
|
pure $ Set.toList ps
|
||||||
|
|
||||||
|
addPeers (StaticPeerLocator peers) new = do
|
||||||
|
liftIO $ atomically $ modifyTVar' peers (<> Set.fromList new)
|
||||||
|
|
||||||
|
|
||||||
knownPeers _ = pure mempty
|
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,8 @@ import HBS2.Net.Proto
|
||||||
import HBS2.Net.Proto.Sessions
|
import HBS2.Net.Proto.Sessions
|
||||||
import HBS2.Net.Proto.BlockChunks
|
import HBS2.Net.Proto.BlockChunks
|
||||||
import HBS2.Net.Proto.BlockInfo
|
import HBS2.Net.Proto.BlockInfo
|
||||||
|
import HBS2.Net.PeerLocator
|
||||||
|
import HBS2.Net.PeerLocator.Static
|
||||||
import HBS2.Prelude.Plated
|
import HBS2.Prelude.Plated
|
||||||
import HBS2.Storage
|
import HBS2.Storage
|
||||||
import HBS2.Storage.Simple
|
import HBS2.Storage.Simple
|
||||||
|
@ -318,6 +320,11 @@ main = do
|
||||||
runPeerM (AnyStorage s) fake p0 $ do
|
runPeerM (AnyStorage s) fake p0 $ do
|
||||||
adapter <- mkAdapter cw
|
adapter <- mkAdapter cw
|
||||||
env <- ask
|
env <- ask
|
||||||
|
|
||||||
|
npl <- newStaticPeerLocator ps
|
||||||
|
|
||||||
|
addPeers npl ps
|
||||||
|
|
||||||
as <- liftIO $ async $ withPeerM env blockDownloadLoop
|
as <- liftIO $ async $ withPeerM env blockDownloadLoop
|
||||||
|
|
||||||
runProto @Fake
|
runProto @Fake
|
||||||
|
|
Loading…
Reference in New Issue