{-# LANGUAGE DeriveGeneric #-}
module Network.Legion.Runtime.PeerMessage (
PeerMessage(..),
PeerMessagePayload(..),
MessageId,
newSequence,
nextMessageId,
) 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.Index (SearchTag, IndexRecord)
import Network.Legion.LIO (LIO)
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)
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
newSequence :: LIO MessageId
newSequence = lift $ do
sid <- getUUID
return (M sid 0)
nextMessageId :: MessageId -> MessageId
nextMessageId (M sequenceId ord) = M sequenceId (ord + 1)