{-# LANGUAGE DeriveGeneric #-}
module Network.Legion.Runtime.PeerMessage (
PeerMessage(..),
PeerMessagePayload(..),
MessageId,
JoinNextResponse(..),
newSequence,
nextMessageId,
) where
import Control.Monad.IO.Class (MonadIO)
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.Index (SearchTag, IndexRecord)
import Network.Legion.KeySet (KeySet)
import Network.Legion.PartitionKey (PartitionKey)
import Network.Legion.PartitionState (PartitionPowerState)
import Network.Legion.UUID (getUUID)
data PeerMessage e o s = PeerMessage {
source :: Peer,
messageId :: MessageId,
payload :: PeerMessagePayload e o s
}
deriving (Generic, Show)
instance (Binary e, Binary o, Binary s) => Binary (PeerMessage e o s)
data PeerMessagePayload e o s
= PartitionMerge PartitionKey (PartitionPowerState e o s)
| ForwardRequest PartitionKey e
| ForwardResponse MessageId o
| ClusterMerge ClusterPowerState
| Search SearchTag
| SearchResponse SearchTag (Maybe IndexRecord)
| JoinNext KeySet
| JoinNextResponse MessageId (JoinNextResponse e o s)
deriving (Generic, Show)
instance (Binary e, Binary o, Binary s) => Binary (PeerMessagePayload e o s)
data MessageId = M UUID Word64 deriving (Generic, Show, Eq, Ord)
instance Binary MessageId
data JoinNextResponse e o s
= Joined PartitionKey (PartitionPowerState e o s)
| JoinFinished
deriving (Show, Generic)
instance (Binary e, Binary s) => Binary (JoinNextResponse e o s)
newSequence :: (MonadIO io) => io MessageId
newSequence = do
sid <- getUUID
return (M sid 0)
nextMessageId :: MessageId -> MessageId
nextMessageId (M sequenceId ord) = M sequenceId (ord + 1)