module Periodic.Node ( Nid (..) , NodeEnv , NodeT , SessionT , SessionEnv , SessionEnv1 , NodeEnvList , runNodeT , sessionGen , defaultSessionHandler ) where import Metro.IOHashMap (IOHashMap) import qualified Metro.Node as M (NodeEnv1, NodeT, runNodeT1) import qualified Metro.Session as M (SessionEnv, SessionEnv1, SessionT, getSessionId) import Periodic.Types (Msgid (..), Nid (..), Packet, msgidLength) import System.Entropy (getEntropy) import System.Log.Logger (errorM) import UnliftIO (MonadIO, liftIO) type NodeEnv u rpkt = M.NodeEnv1 u Nid Msgid (Packet rpkt) type NodeT u rpkt = M.NodeT u Nid Msgid (Packet rpkt) type SessionT u rpkt = M.SessionT u Nid Msgid (Packet rpkt) type SessionEnv u rpkt = M.SessionEnv u Nid Msgid (Packet rpkt) type SessionEnv1 u rpkt = M.SessionEnv1 u Nid Msgid (Packet rpkt) sessionGen :: IO Msgid sessionGen = Msgid <$> getEntropy msgidLength type NodeEnvList u rpkt tp = IOHashMap Nid (NodeEnv u rpkt tp) runNodeT :: Monad m => NodeEnv u rpkt tp -> NodeT u rpkt tp m a -> m a runNodeT = M.runNodeT1 defaultSessionHandler :: MonadIO m => SessionT u rpkt tp m () defaultSessionHandler = do pid <- M.getSessionId liftIO $ errorM "Periodic.Node" $ "Session [" ++ show pid ++ "] not found."