packages feed

natskell-1.0.0.1: internal/Policy/State/Types.hs

{-# LANGUAGE RankNTypes #-}

module State.Types
  ( TLSPublicKey
  , TLSPrivateKey
  , TLSCertData
  , TLSConfig (..)
  , defaultTLSConfig
  , ClientConfig (..)
  , ConnectError (..)
  , ConnectAttemptError (..)
  , ConnectFailure (..)
  , ServerError
  , serverErrorReason
  , serverErrorFromProtocol
  , ClientExitReason (..)
  , ClientStatus (..)
  ) where

import           Data.ByteString  (ByteString)
import           Lib.Logger.Types (LoggerConfig)
import           Types.Connect    (Connect)
import qualified Types.Err        as Err
import           Types.TLS

data ClientConfig = ClientConfig
                      { connectionAttempts   :: Int
                      , connectTimeoutMicros :: Int
                      , callbackConcurrency  :: Int
                      , messageLimit         :: Int
                      , connectConfig        :: Connect
                      , loggerConfig         :: LoggerConfig
                      , tlsConfig            :: Maybe TLSConfig
                      , exitAction           :: ClientExitReason -> IO ()
                      , connectOptions       :: [(String, Int)]
                      }

-- | Why an initial connection could not be established.
data ConnectError = ConnectNoServers
                  | ConnectAttemptsExhausted [ConnectAttemptError]
  deriving (Eq, Show)

-- | Failure from one server in the configured pool.
data ConnectAttemptError = ConnectAttemptError
                             { attemptedEndpoint :: (String, Int)
                             , attemptFailure    :: ConnectFailure
                             }
  deriving (Eq, Show)

-- | The stage at which a connection attempt failed.
data ConnectFailure = ConnectTransportFailure String
                    | ConnectTLSFailure String
                    | ConnectProtocolFailure String
                    | ConnectAuthenticationFailure String
                    | ConnectHandshakeTimeout
  deriving (Eq, Show)

-- | A server-reported protocol error.
--
-- Its wire representation is intentionally opaque so that new server error
-- categories do not force changes to the public type.
newtype ServerError = ServerError ByteString
  deriving (Eq, Show)

serverErrorReason :: ServerError -> ByteString
serverErrorReason (ServerError reason) = reason

serverErrorFromProtocol :: Err.Err -> ServerError
serverErrorFromProtocol = ServerError . Err.errReason

data ClientExitReason = ExitClosedByUser
                      | ExitRetriesExhausted (Maybe String)
                      | ExitServerError ServerError
                      | ExitInboundMessageTooLarge Int Int
                      | ExitResetRequested
  deriving (Eq, Show)

data ClientStatus = Running
                  | Closing ClientExitReason
                  | Closed ClientExitReason
  deriving (Eq, Show)