module Network.Legion.Runtime.PeerMessage (
PeerMessage(..),
PeerMessagePayload(..),
MessageId,
newSequence,
next,
) where
import Control.Monad.Trans.Class (lift)
import Data.Binary (Binary)
import Data.UUID (UUID)
import Data.Word (Word64)
import GHC.Generics (Generic)
import Network.Legion.ClusterState (ClusterPowerState)
import Network.Legion.Distribution (Peer)
import Network.Legion.LIO (LIO)
import Network.Legion.PartitionKey (PartitionKey)
import Network.Legion.PartitionState (PartitionPowerState)
import Network.Legion.UUID (getUUID)
data PeerMessage i o s = PeerMessage {
source :: Peer,
messageId :: MessageId,
payload :: PeerMessagePayload i o s
}
deriving (Generic, Show)
instance (Binary i, Binary o, Binary s) => Binary (PeerMessage i o s)
data PeerMessagePayload i o s
= PartitionMerge PartitionKey (PartitionPowerState i s)
| ForwardRequest PartitionKey i
| ForwardResponse MessageId o
| ClusterMerge ClusterPowerState
deriving (Generic, Show)
instance (Binary i, Binary o, Binary s) => Binary (PeerMessagePayload i o s)
data MessageId = M UUID Word64 deriving (Generic, Show, Eq, Ord)
instance Binary MessageId
newSequence :: LIO MessageId
newSequence = lift $ do
sid <- getUUID
return (M sid 0)
next :: MessageId -> MessageId
next (M sequenceId ord) = M sequenceId (ord + 1)