packages feed

eventstore-0.1.0.0: Database/EventStore/Internal/Packages.hs

--------------------------------------------------------------------------------
-- |
-- Module : Database.EventStore.Internal.Packages
-- Copyright : (C) 2014 Yorick Laupa
-- License : (see the file LICENSE)
--
-- Maintainer : Yorick Laupa <yo.eight@gmail.com>
-- Stability : provisional
-- Portability : non-portable
--
--------------------------------------------------------------------------------
module Database.EventStore.Internal.Packages
    ( -- * Package Smart Contructors
      deleteStreamPackage
    , heartbeatPackage
    , heartbeatResponsePackage
    , writeEventsPackage
      -- * Cereal Put
    , putPackage
      -- * Decode
    , getWriteEventsCompleted
    ) where

--------------------------------------------------------------------------------
import qualified Data.ByteString as B

--------------------------------------------------------------------------------
import Data.ProtocolBuffers
import Data.Serialize.Get
import Data.Serialize.Put
import Data.UUID
import System.Random

--------------------------------------------------------------------------------
import Database.EventStore.Internal.Types

--------------------------------------------------------------------------------
-- Encode
--------------------------------------------------------------------------------
writeEventsPackage :: UUID -> Flag -> WriteEvents -> Package
writeEventsPackage uuid flag msg =
    Package
    { packageCmd         = WriteEventsCmd
    , packageFlag        = flag
    , packageCorrelation = uuid
    , packageData        = runPut $ encodeMessage msg
    }

--------------------------------------------------------------------------------
deleteStreamPackage :: UUID -> Flag -> DeleteStream -> Package
deleteStreamPackage uuid flag msg =
    Package
    { packageCmd         = DeleteStreamCmd
    , packageFlag        = flag
    , packageCorrelation = uuid
    , packageData        = runPut $ encodeMessage msg
    }

--------------------------------------------------------------------------------
heartbeatPackage :: IO Package
heartbeatPackage = do
    uuid <- randomIO
    let pack = Package
               { packageCmd         = HeartbeatRequest
               , packageFlag        = None
               , packageCorrelation = uuid
               , packageData        = B.empty
               }

    return pack

--------------------------------------------------------------------------------
heartbeatResponsePackage :: UUID -> Package
heartbeatResponsePackage uuid =
    Package
    { packageCmd         = HeartbeatResponse
    , packageFlag        = None
    , packageCorrelation = uuid
    , packageData        = B.empty
    }

--------------------------------------------------------------------------------
putPackage :: Package -> Put
putPackage pack =
    putWord32le length_prefix    >>
    putWord8 cmd_word8           >>
    putWord8 flag_word8          >>
    putLazyByteString corr_bytes >>
    putByteString pack_data
  where
    pack_data     = packageData pack
    length_prefix = fromIntegral (B.length pack_data + mandatorySize)
    cmd_word8     = cmdWord8 $ packageCmd pack
    flag_word8    = flagWord8 $ packageFlag pack
    corr_bytes    = toByteString $ packageCorrelation pack

--------------------------------------------------------------------------------
-- Decode
--------------------------------------------------------------------------------
getWriteEventsCompleted :: Get WriteEventsCompleted
getWriteEventsCompleted = decodeMessage

--------------------------------------------------------------------------------
mandatorySize :: Int
mandatorySize = 18