{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}

module Ouroboros.Consensus.Node.ExitPolicy
  ( NodeToNodeInitiatorResult (..)
  , returnPolicy

    -- * Re-exports
  , ReturnPolicy
  ) where

import Control.DeepSeq (NFData)
import GHC.Generics
import qualified Ouroboros.Consensus.MiniProtocol.ChainSync.Client as CSClient
import Ouroboros.Network.ExitPolicy

-- | Result of any of the `node-to-node` mini-protocols.  We ignore all but
-- `chain-sync` results.
data NodeToNodeInitiatorResult
  = ChainSyncInitiatorResult !CSClient.ChainSyncClientResult
  | NoInitiatorResult
  deriving ((forall x.
 NodeToNodeInitiatorResult -> Rep NodeToNodeInitiatorResult x)
-> (forall x.
    Rep NodeToNodeInitiatorResult x -> NodeToNodeInitiatorResult)
-> Generic NodeToNodeInitiatorResult
forall x.
Rep NodeToNodeInitiatorResult x -> NodeToNodeInitiatorResult
forall x.
NodeToNodeInitiatorResult -> Rep NodeToNodeInitiatorResult x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
NodeToNodeInitiatorResult -> Rep NodeToNodeInitiatorResult x
from :: forall x.
NodeToNodeInitiatorResult -> Rep NodeToNodeInitiatorResult x
$cto :: forall x.
Rep NodeToNodeInitiatorResult x -> NodeToNodeInitiatorResult
to :: forall x.
Rep NodeToNodeInitiatorResult x -> NodeToNodeInitiatorResult
Generic, NodeToNodeInitiatorResult -> ()
(NodeToNodeInitiatorResult -> ())
-> NFData NodeToNodeInitiatorResult
forall a. (a -> ()) -> NFData a
$crnf :: NodeToNodeInitiatorResult -> ()
rnf :: NodeToNodeInitiatorResult -> ()
NFData)

returnPolicy :: ReturnPolicy NodeToNodeInitiatorResult
returnPolicy :: ReturnPolicy NodeToNodeInitiatorResult
returnPolicy NodeToNodeInitiatorResult
NoInitiatorResult = DiffTime -> RepromoteDelay
RepromoteDelay DiffTime
10
returnPolicy (ChainSyncInitiatorResult ChainSyncClientResult
result) = case ChainSyncClientResult
result of
  -- TODO: it would be nice to have additional context to predict when we will
  -- be ready to reconnect.
  CSClient.ForkTooDeep Point blk
_ Our (Tip blk)
_ourTip Their (Tip blk)
_theirTip -> DiffTime -> RepromoteDelay
RepromoteDelay DiffTime
120
  CSClient.NoMoreIntersection Our (Tip blk)
_ourTip Their (Tip blk)
_theirTip -> DiffTime -> RepromoteDelay
RepromoteDelay DiffTime
120
  CSClient.RolledBackPastIntersection
    Point blk
_
    Our (Tip blk)
_ourTip
    Their (Tip blk)
_theirTip -> DiffTime -> RepromoteDelay
RepromoteDelay DiffTime
180
  -- the outbound-governor asked for hot to warm demotion; it's up to the
  -- governor to decide to promote the peer to hot.
  ChainSyncClientResult
CSClient.AskedToTerminate -> DiffTime -> RepromoteDelay
RepromoteDelay DiffTime
10