-- Common things between P2P and NonP2P Diffusion modules
{-# LANGUAGE DataKinds          #-}
{-# LANGUAGE GADTs              #-}
{-# LANGUAGE KindSignatures     #-}
{-# LANGUAGE RankNTypes         #-}
{-# LANGUAGE StandaloneDeriving #-}

module Ouroboros.Network.Diffusion.Types
  ( DiffusionTracer (..)
  , Failure (..)
  , Tracers (..)
  , nullTracers
  , Configuration (..)
  , Applications (..)
  , Arguments (..)
  , Interfaces (..)
    -- * ForkPolicy
  , Mx.ForkPolicy
  , Mx.noBindForkPolicy
  , Mx.responderForkPolicy
    -- * NodeToClient type aliases
  , NodeToClientHandle
  , NodeToClientHandleError
  , NodeToClientConnectionHandler
  , NodeToClientConnectionManagerArguments
    -- * NodeToNode type aliases
  , NodeToNodeHandle
  , NodeToNodeConnectionManager
  , NodeToNodePeerConnectionHandle
  , NodeToNodePeerSelectionActions
    -- * Re-exports
  , AbstractTransitionTrace
  , IG.RemoteTransitionTrace
  ) where

import Control.Concurrent.Class.MonadSTM.Strict
import Control.Exception (Exception, SomeException)
import Control.Monad.Class.MonadTimer.SI
import Control.Tracer (Tracer, nullTracer)

import Data.ByteString.Lazy (ByteString)
import Data.List.NonEmpty (NonEmpty)
import Data.Map (Map)
import Data.Set (Set)
import Data.Typeable (Typeable)
import Data.Void (Void)
import System.Random (StdGen)

import Network.Mux qualified as Mx
import Network.Mux.Types (ReadBuffer)
import Network.Socket qualified as Socket

import Ouroboros.Network.Mux (OuroborosApplicationWithMinimalCtx,
           OuroborosBundleWithExpandedCtx)

import Ouroboros.Network.PeerSharing (PeerSharingRegistry (..))

import Ouroboros.Network.ConnectionHandler
import Ouroboros.Network.ConnectionManager.Core qualified as CM
import Ouroboros.Network.ConnectionManager.State qualified as CM
import Ouroboros.Network.ConnectionManager.Types
import Ouroboros.Network.Context
import Ouroboros.Network.ExitPolicy
import Ouroboros.Network.InboundGovernor qualified as IG
import Ouroboros.Network.Mux qualified as Mx
import Ouroboros.Network.Protocol.Handshake (HandshakeArguments, Versions)
import Ouroboros.Network.RethrowPolicy
import Ouroboros.Network.Server qualified as Server
import Ouroboros.Network.Snocket (FileDescriptor, Snocket)
import Ouroboros.Network.Socket (SystemdSocketTracer)

import Ouroboros.Network.NodeToClient qualified as NodeToClient
import Ouroboros.Network.NodeToNode (AcceptedConnectionsLimit, DiffusionMode)
import Ouroboros.Network.NodeToNode qualified as NodeToNode
import Ouroboros.Network.PeerSelection as PeerSelection
import Ouroboros.Network.PeerSelection.Governor.Types
import Ouroboros.Network.PeerSelection.RootPeersDNS
import Ouroboros.Network.PeerSelection.State.LocalRootPeers qualified as LocalRootPeers

-- | The 'DiffusionTracer' logs
--
-- * diffusion initialisation messages
-- * terminal errors thrown by diffusion
--
data DiffusionTracer ntnAddr ntcAddr
  = RunServer (NonEmpty ntnAddr)
  | RunLocalServer ntcAddr
  | UsingSystemdSocket ntcAddr
  -- Rename as 'CreateLocalSocket'
  | CreateSystemdSocketForSnocketPath ntcAddr
  | CreatedLocalSocket ntcAddr
  | ConfiguringLocalSocket ntcAddr FileDescriptor
  | ListeningLocalSocket ntcAddr FileDescriptor
  | LocalSocketUp  ntcAddr FileDescriptor
  -- Rename as 'CreateServerSocket'
  | CreatingServerSocket ntnAddr
  | ConfiguringServerSocket ntnAddr
  | ListeningServerSocket ntnAddr
  | ServerSocketUp ntnAddr
  -- Rename as 'UnsupportedLocalSocketType'
  | UnsupportedLocalSystemdSocket ntnAddr
  -- Remove (this is impossible case), there's no systemd on Windows
  | UnsupportedReadySocketCase
  | DiffusionErrored SomeException
  | SystemdSocketConfiguration SystemdSocketTracer
    deriving Int -> DiffusionTracer ntnAddr ntcAddr -> ShowS
[DiffusionTracer ntnAddr ntcAddr] -> ShowS
DiffusionTracer ntnAddr ntcAddr -> String
(Int -> DiffusionTracer ntnAddr ntcAddr -> ShowS)
-> (DiffusionTracer ntnAddr ntcAddr -> String)
-> ([DiffusionTracer ntnAddr ntcAddr] -> ShowS)
-> Show (DiffusionTracer ntnAddr ntcAddr)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall ntnAddr ntcAddr.
(Show ntcAddr, Show ntnAddr) =>
Int -> DiffusionTracer ntnAddr ntcAddr -> ShowS
forall ntnAddr ntcAddr.
(Show ntcAddr, Show ntnAddr) =>
[DiffusionTracer ntnAddr ntcAddr] -> ShowS
forall ntnAddr ntcAddr.
(Show ntcAddr, Show ntnAddr) =>
DiffusionTracer ntnAddr ntcAddr -> String
$cshowsPrec :: forall ntnAddr ntcAddr.
(Show ntcAddr, Show ntnAddr) =>
Int -> DiffusionTracer ntnAddr ntcAddr -> ShowS
showsPrec :: Int -> DiffusionTracer ntnAddr ntcAddr -> ShowS
$cshow :: forall ntnAddr ntcAddr.
(Show ntcAddr, Show ntnAddr) =>
DiffusionTracer ntnAddr ntcAddr -> String
show :: DiffusionTracer ntnAddr ntcAddr -> String
$cshowList :: forall ntnAddr ntcAddr.
(Show ntcAddr, Show ntnAddr) =>
[DiffusionTracer ntnAddr ntcAddr] -> ShowS
showList :: [DiffusionTracer ntnAddr ntcAddr] -> ShowS
Show

-- TODO: add a tracer for these misconfiguration
data Failure where
  UnsupportedReadySocket :: Failure
  UnexpectedIPv4Address  :: forall ntnAddr. (Show ntnAddr, Typeable ntnAddr) => ntnAddr -> Failure
  UnexpectedIPv6Address  :: forall ntnAddr. (Show ntnAddr, Typeable ntnAddr) => ntnAddr -> Failure
  NoSocket               :: Failure
  DiffusionError         :: SomeException -> Failure

deriving instance Show Failure
instance Exception Failure

-- | Diffusion Tracers
--
data Tracers ntnAddr ntnVersion ntnVersionData
             ntcAddr ntcVersion ntcVersionData
             resolverError extraState extraDebugState
             extraFlags extraPeers extraCounters m = Tracers {
      -- | Mux tracer
      forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (WithBearer (ConnectionId ntnAddr) Trace)
dtMuxTracer
        :: Tracer m (Mx.WithBearer (ConnectionId ntnAddr) Mx.Trace)

      -- | Handshake protocol tracer
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (HandshakeTr ntnAddr ntnVersion)
dtHandshakeTracer
        :: Tracer m (NodeToNode.HandshakeTr ntnAddr ntnVersion)

      --
      -- NodeToClient tracers
      --

      -- | Mux tracer for local clients
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (WithBearer (ConnectionId ntcAddr) Trace)
dtLocalMuxTracer
        :: Tracer m (Mx.WithBearer (ConnectionId ntcAddr) Mx.Trace)

      -- | Handshake protocol tracer for local clients
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (HandshakeTr ntcAddr ntcVersion)
dtLocalHandshakeTracer
        :: Tracer m (NodeToClient.HandshakeTr ntcAddr ntcVersion)

      -- | Diffusion initialisation tracer
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (DiffusionTracer ntnAddr ntcAddr)
dtDiffusionTracer
        :: Tracer m (DiffusionTracer ntnAddr ntcAddr)

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (TraceLocalRootPeers extraFlags ntnAddr resolverError)
dtTraceLocalRootPeersTracer
        :: Tracer m (TraceLocalRootPeers extraFlags ntnAddr resolverError)

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m TracePublicRootPeers
dtTracePublicRootPeersTracer
        :: Tracer m TracePublicRootPeers

      -- | Ledger Peers tracer
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m TraceLedgerPeers
dtTraceLedgerPeersTracer
        :: Tracer m TraceLedgerPeers

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer
     m
     (TracePeerSelection extraDebugState extraFlags extraPeers ntnAddr)
dtTracePeerSelectionTracer
        :: Tracer m (TracePeerSelection extraDebugState extraFlags extraPeers ntnAddr)

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer
     m (DebugPeerSelection extraState extraFlags extraPeers ntnAddr)
dtDebugPeerSelectionInitiatorTracer
        :: Tracer m (DebugPeerSelection extraState extraFlags extraPeers ntnAddr)

      -- TODO: can be unified with the previous one
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer
     m (DebugPeerSelection extraState extraFlags extraPeers ntnAddr)
dtDebugPeerSelectionInitiatorResponderTracer
        :: Tracer m (DebugPeerSelection extraState extraFlags extraPeers ntnAddr)

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (PeerSelectionCounters extraCounters)
dtTracePeerSelectionCounters
        :: Tracer m (PeerSelectionCounters extraCounters)

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m ChurnCounters
dtTraceChurnCounters
        :: Tracer m PeerSelection.ChurnCounters

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (PeerSelectionActionsTrace ntnAddr ntnVersion)
dtPeerSelectionActionsTracer
        :: Tracer m (PeerSelectionActionsTrace ntnAddr ntnVersion)

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer
     m
     (Trace ntnAddr (ConnectionHandlerTrace ntnVersion ntnVersionData))
dtConnectionManagerTracer
        :: Tracer m (CM.Trace
                      ntnAddr
                      (ConnectionHandlerTrace
                         ntnVersion
                         ntnVersionData))

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (AbstractTransitionTrace ConnStateId)
dtConnectionManagerTransitionTracer
        :: Tracer m (AbstractTransitionTrace CM.ConnStateId)

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (Trace ntnAddr)
dtServerTracer
        :: Tracer m (Server.Trace ntnAddr)

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (Trace ntnAddr)
dtInboundGovernorTracer
        :: Tracer m (IG.Trace ntnAddr)

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (RemoteTransitionTrace ntnAddr)
dtInboundGovernorTransitionTracer
        :: Tracer m (IG.RemoteTransitionTrace ntnAddr)

    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m DNSTrace
dtDnsTracer :: Tracer m DNSTrace

      --
      -- NodeToClient tracers
      --

      -- | Connection manager tracer for local clients
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer
     m
     (Trace ntcAddr (ConnectionHandlerTrace ntcVersion ntcVersionData))
dtLocalConnectionManagerTracer
        :: Tracer m (CM.Trace
                       ntcAddr
                       (ConnectionHandlerTrace
                          ntcVersion
                          ntcVersionData))

      -- | Server tracer for local clients
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (Trace ntcAddr)
dtLocalServerTracer
        :: Tracer m (Server.Trace ntcAddr)

      -- | Inbound protocol governor tracer for local clients
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData resolverError extraState extraDebugState extraFlags
       extraPeers extraCounters (m :: * -> *).
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
-> Tracer m (Trace ntcAddr)
dtLocalInboundGovernorTracer
        :: Tracer m (IG.Trace ntcAddr)
    }


nullTracers :: Applicative m
            => Tracers ntnAddr ntnVersion ntnVersionData
                       ntcAddr ntcVersion ntcVersionData
                       resolverError extraState extraDebugState
                       extraFlags extraPeers extraCounters m
nullTracers :: forall (m :: * -> *) ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData resolverError extraState extraDebugState
       extraFlags extraPeers extraCounters.
Applicative m =>
Tracers
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  resolverError
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraCounters
  m
nullTracers = Tracers {
    dtMuxTracer :: Tracer m (WithBearer (ConnectionId ntnAddr) Trace)
dtMuxTracer                                  = Tracer m (WithBearer (ConnectionId ntnAddr) Trace)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtHandshakeTracer :: Tracer m (HandshakeTr ntnAddr ntnVersion)
dtHandshakeTracer                            = Tracer m (HandshakeTr ntnAddr ntnVersion)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtLocalMuxTracer :: Tracer m (WithBearer (ConnectionId ntcAddr) Trace)
dtLocalMuxTracer                             = Tracer m (WithBearer (ConnectionId ntcAddr) Trace)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtLocalHandshakeTracer :: Tracer m (HandshakeTr ntcAddr ntcVersion)
dtLocalHandshakeTracer                       = Tracer m (HandshakeTr ntcAddr ntcVersion)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtDiffusionTracer :: Tracer m (DiffusionTracer ntnAddr ntcAddr)
dtDiffusionTracer                            = Tracer m (DiffusionTracer ntnAddr ntcAddr)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtTraceLocalRootPeersTracer :: Tracer m (TraceLocalRootPeers extraFlags ntnAddr resolverError)
dtTraceLocalRootPeersTracer                  = Tracer m (TraceLocalRootPeers extraFlags ntnAddr resolverError)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtTracePublicRootPeersTracer :: Tracer m TracePublicRootPeers
dtTracePublicRootPeersTracer                 = Tracer m TracePublicRootPeers
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtTraceLedgerPeersTracer :: Tracer m TraceLedgerPeers
dtTraceLedgerPeersTracer                     = Tracer m TraceLedgerPeers
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtTracePeerSelectionTracer :: Tracer
  m
  (TracePeerSelection extraDebugState extraFlags extraPeers ntnAddr)
dtTracePeerSelectionTracer                   = Tracer
  m
  (TracePeerSelection extraDebugState extraFlags extraPeers ntnAddr)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtTraceChurnCounters :: Tracer m ChurnCounters
dtTraceChurnCounters                         = Tracer m ChurnCounters
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtDebugPeerSelectionInitiatorTracer :: Tracer
  m (DebugPeerSelection extraState extraFlags extraPeers ntnAddr)
dtDebugPeerSelectionInitiatorTracer          = Tracer
  m (DebugPeerSelection extraState extraFlags extraPeers ntnAddr)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtDebugPeerSelectionInitiatorResponderTracer :: Tracer
  m (DebugPeerSelection extraState extraFlags extraPeers ntnAddr)
dtDebugPeerSelectionInitiatorResponderTracer = Tracer
  m (DebugPeerSelection extraState extraFlags extraPeers ntnAddr)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtTracePeerSelectionCounters :: Tracer m (PeerSelectionCounters extraCounters)
dtTracePeerSelectionCounters                 = Tracer m (PeerSelectionCounters extraCounters)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtPeerSelectionActionsTracer :: Tracer m (PeerSelectionActionsTrace ntnAddr ntnVersion)
dtPeerSelectionActionsTracer                 = Tracer m (PeerSelectionActionsTrace ntnAddr ntnVersion)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtConnectionManagerTracer :: Tracer
  m
  (Trace ntnAddr (ConnectionHandlerTrace ntnVersion ntnVersionData))
dtConnectionManagerTracer                    = Tracer
  m
  (Trace ntnAddr (ConnectionHandlerTrace ntnVersion ntnVersionData))
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtConnectionManagerTransitionTracer :: Tracer m (AbstractTransitionTrace ConnStateId)
dtConnectionManagerTransitionTracer          = Tracer m (AbstractTransitionTrace ConnStateId)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtServerTracer :: Tracer m (Trace ntnAddr)
dtServerTracer                               = Tracer m (Trace ntnAddr)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtInboundGovernorTracer :: Tracer m (Trace ntnAddr)
dtInboundGovernorTracer                      = Tracer m (Trace ntnAddr)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtInboundGovernorTransitionTracer :: Tracer m (RemoteTransitionTrace ntnAddr)
dtInboundGovernorTransitionTracer            = Tracer m (RemoteTransitionTrace ntnAddr)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtLocalConnectionManagerTracer :: Tracer
  m
  (Trace ntcAddr (ConnectionHandlerTrace ntcVersion ntcVersionData))
dtLocalConnectionManagerTracer               = Tracer
  m
  (Trace ntcAddr (ConnectionHandlerTrace ntcVersion ntcVersionData))
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtLocalServerTracer :: Tracer m (Trace ntcAddr)
dtLocalServerTracer                          = Tracer m (Trace ntcAddr)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtLocalInboundGovernorTracer :: Tracer m (Trace ntcAddr)
dtLocalInboundGovernorTracer                 = Tracer m (Trace ntcAddr)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  , dtDnsTracer :: Tracer m DNSTrace
dtDnsTracer                                  = Tracer m DNSTrace
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
  }

-- | Diffusion arguments which allow to instantiate a completely different
-- diffusion layer. These differ from
--
data Arguments extraState extraDebugState extraFlags extraPeers
               extraAPI extraChurnArgs extraCounters exception
               resolver resolverError m
               ntnFd ntnAddr ntnVersion ntnVersionData
               ntcAddr ntcVersion ntcVersionData =
  Arguments {

    -- | node-to-node data flow used by connection manager to classify
    -- negotiated connections
    --
    forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> ntnVersionData -> DataFlow
daNtnDataFlow
      :: ntnVersionData -> DataFlow

    -- | remote side peer sharing information used by peer selection governor
    -- to decide which peers are available for performing peer sharing
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> ntnVersionData -> PeerSharing
daNtnPeerSharing
      :: ntnVersionData -> PeerSharing

    -- | Update `ntnVersionData` for initiator-only local roots.
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> ntnVersionData -> DiffusionMode -> ntnVersionData
daUpdateVersionData
      :: ntnVersionData -> DiffusionMode -> ntnVersionData

    -- | node-to-node handshake configuration
    --
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> HandshakeArguments
     (ConnectionId ntnAddr) ntnVersion ntnVersionData m
daNtnHandshakeArguments
      :: HandshakeArguments (ConnectionId ntnAddr) ntnVersion ntnVersionData m

    -- | node-to-client handshake configuration
    --
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> HandshakeArguments
     (ConnectionId ntcAddr) ntcVersion ntcVersionData m
daNtcHandshakeArguments
      :: HandshakeArguments (ConnectionId ntcAddr) ntcVersion ntcVersionData m

    -- | Interface used to get peers from the current ledger.
    --
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> LedgerPeersConsensusInterface extraAPI m
daLedgerPeersCtx :: LedgerPeersConsensusInterface extraAPI m

    -- | Extra State empty value
    --
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> extraState
daEmptyExtraState        :: extraState

    -- | Extra Counters empty value
    --
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> extraCounters
daEmptyExtraCounters     :: extraCounters

    -- | Provide Public Extra Actions for extraPeers to be
    --
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> PublicExtraPeersAPI extraPeers ntnAddr
daExtraPeersAPI          :: PublicExtraPeersAPI extraPeers ntnAddr

    -- | callback which is used to register @SIGUSR1@ signal handler.
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> forall (mode :: Mode) x y.
   NodeToNodeConnectionManager
     mode ntnFd ntnAddr ntnVersionData ntnVersion m x y
   -> StrictTVar
        m
        (PeerSelectionState
           extraState
           extraFlags
           extraPeers
           ntnAddr
           (NodeToNodePeerConnectionHandle mode ntnAddr ntnVersionData m x y))
   -> m ()
daInstallSigUSR1Handler
      :: forall mode x y.
         NodeToNodeConnectionManager mode ntnFd
                                     ntnAddr ntnVersionData
                                     ntnVersion m x y
      -> StrictTVar m
           (PeerSelectionState extraState extraFlags extraPeers
                               ntnAddr
                               (NodeToNodePeerConnectionHandle
                                   mode ntnAddr
                                   ntnVersionData m x y))
      -> m ()

  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> forall (muxMode :: Mode) responderCtx bytes a b.
   PeerSelectionGovernorArgs
     extraState
     extraDebugState
     extraFlags
     extraPeers
     extraAPI
     extraCounters
     ntnAddr
     (PeerConnectionHandle
        muxMode responderCtx ntnAddr ntnVersionData bytes m a b)
     exception
     m
daPeerSelectionGovernorArgs
      :: forall muxMode responderCtx bytes a b .
         PeerSelectionGovernorArgs extraState extraDebugState extraFlags extraPeers
                                   extraAPI extraCounters
                                   ntnAddr (PeerConnectionHandle
                                              muxMode responderCtx ntnAddr
                                              ntnVersionData bytes m a b)
                                   exception m

    -- | Function that computes extraCounters from PeerSelectionState
    --
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> forall (muxMode :: Mode) responderCtx bytes a b.
   PeerSelectionState
     extraState
     extraFlags
     extraPeers
     ntnAddr
     (PeerConnectionHandle
        muxMode responderCtx ntnAddr ntnVersionData bytes m a b)
   -> extraCounters
daPeerSelectionStateToExtraCounters
      :: forall muxMode responderCtx bytes a b .
         PeerSelectionState extraState extraFlags extraPeers
                            ntnAddr (PeerConnectionHandle
                                       muxMode responderCtx ntnAddr
                                       ntnVersionData bytes m a b)
      -> extraCounters

    -- | Function that constructs a 'extraPeers' set from a map of dns
    -- lookup results.
    --
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> Map ntnAddr PeerAdvertise -> extraPeers
daToExtraPeers :: Map ntnAddr PeerAdvertise -> extraPeers

    -- | Request Public Root Peers.
    --
    -- If no custom public root peers is provided (i.e. Nothing) just the
    -- default one from
    -- 'Ouroboros.Network.PeerSelection.PeerSelectionActions.getPublicRootPeers'
    --
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> Maybe
     (PeerActionsDNS ntnAddr resolver resolverError m
      -> DNSSemaphore m
      -> (Map ntnAddr PeerAdvertise -> extraPeers)
      -> (NumberOfPeers
          -> LedgerPeersKind -> m (Maybe (Set ntnAddr, DiffTime)))
      -> LedgerPeersKind
      -> StdGen
      -> Int
      -> m (PublicRootPeers extraPeers ntnAddr, DiffTime))
daRequestPublicRootPeers
      :: Maybe (    PeerActionsDNS ntnAddr resolver resolverError m
                 -> DNSSemaphore m
                 -> (Map ntnAddr PeerAdvertise -> extraPeers)
                 -> ( (NumberOfPeers -> LedgerPeersKind -> m (Maybe (Set ntnAddr, DiffTime)))
                 -> LedgerPeersKind
                 -> StdGen
                 -> Int
                 -> m (PublicRootPeers extraPeers ntnAddr, DiffTime)))

    -- | Peer Churn Governor if no custom churn governor is required just
    -- use the default one from
    -- 'Ouroboros.Network.PeerSelection.Churn.peerChurnGovernor'
    --
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> PeerChurnArgs
     m
     extraChurnArgs
     extraDebugState
     extraFlags
     extraPeers
     extraAPI
     extraCounters
     ntnAddr
-> m Void
daPeerChurnGovernor
      :: PeerSelection.PeerChurnArgs
           m
           extraChurnArgs
           extraDebugState
           extraFlags
           extraPeers
           extraAPI
           extraCounters
           ntnAddr
      -> m Void

    -- | Provide extraChurnArgs to be passed to churn governor
    --
  , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntnVersion ntnVersionData ntcAddr
       ntcVersion ntcVersionData.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
-> extraChurnArgs
daExtraChurnArgs :: extraChurnArgs
  }

-- | Required Diffusion Arguments to run network layer
--
data Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr = Configuration {
      -- | an @IPv4@ socket ready to accept connections or an @IPv4@ addresses
      --
      forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> Maybe (Either ntnFd ntnAddr)
dcIPv4Address              :: Maybe (Either ntnFd ntnAddr)

      -- | an @IPv6@ socket ready to accept connections or an @IPv6@ addresses
      --
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> Maybe (Either ntnFd ntnAddr)
dcIPv6Address              :: Maybe (Either ntnFd ntnAddr)

      -- | an @AF_UNIX@ socket ready to accept connections or an @AF_UNIX@
      -- socket path or name of `named-pipe` on `Windows`.
      --
      -- __Windows Named Pipes__
      -- Names of named-pipes must follow
      -- https://learn.microsoft.com/en-us/windows/win32/ipc/pipe-names, in
      -- particular:
      --
      -- * It must be well formed, e.g. @\\.\pipe\PipeName@
      -- * The pipe name string specified by @PipeName@ can include any character
      --   other than a backslash, including numbers and special characters.
      -- * The entire pipe name string can be up to 256 characters long. Pipe
      --   names are not case-sensitive.
      --  * @PipeName@ has to include an app name to avoid clashes with other
      --    applications, e.g. @cardano-node-mainnet@.
      --  * @PipeName@ should be different for different parallel-installable
      --    instances, e.g. mainnet vs testnet.
      --  * default file permissions should be right: it will be accessible to
      --    the same user.
      --
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> Maybe (Either ntcFd ntcAddr)
dcLocalAddress             :: Maybe (Either ntcFd ntcAddr)

      -- | parameters for limiting number of accepted connections
      --
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> AcceptedConnectionsLimit
dcAcceptedConnectionsLimit :: AcceptedConnectionsLimit

      -- | run in initiator only mode
      --
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> DiffusionMode
dcMode                     :: DiffusionMode

      -- | public peer selection state
      --
      -- It is created outside of diffusion, since it is needed to create some
      -- apps (e.g. peer sharing).
      --
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> StrictTVar m (PublicPeerSelectionState ntnAddr)
dcPublicPeerSelectionVar   :: StrictTVar m (PublicPeerSelectionState ntnAddr)

      -- | selection targets for the peer governor
      --
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> PeerSelectionTargets
dcPeerSelectionTargets   :: PeerSelectionTargets
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> STM m (Config extraFlags RelayAccessPoint)
dcReadLocalRootPeers     :: STM m (LocalRootPeers.Config extraFlags RelayAccessPoint)
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> STM m (Map RelayAccessPoint PeerAdvertise)
dcReadPublicRootPeers    :: STM m (Map RelayAccessPoint PeerAdvertise)

    -- | Depending on configuration, node may provide us with
    -- a snapshot of big ledger peers taken at some slot on the chain.
    -- These peers may be selected by ledgerPeersThread when requested
    -- by the peer selection governor when the node is syncing up.
    -- This is especially useful for Genesis consensus mode.
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> STM m (Maybe LedgerPeerSnapshot)
dcReadLedgerPeerSnapshot :: STM m (Maybe LedgerPeerSnapshot)

    -- | Peer's own PeerSharing value.
    --
    -- This value comes from the node's configuration file and is static.
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> PeerSharing
dcOwnPeerSharing         :: PeerSharing
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> STM m UseLedgerPeers
dcReadUseLedgerPeers     :: STM m UseLedgerPeers

      -- | Timeout which starts once all responder protocols are idle. If the
      -- responders stay idle for duration of the timeout, the connection will
      -- be demoted, if it wasn't used by the p2p-governor it will be closed.
      --
      -- Applies to 'Unidirectional' as well as 'Duplex' /node-to-node/
      -- connections.
      --
      -- See 'serverProtocolIdleTimeout'.
      --
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr -> DiffTime
dcProtocolIdleTimeout    :: DiffTime

      -- | Time for which /node-to-node/ connections are kept in
      -- 'TerminatingState', it should correspond to the OS configured @TCP@
      -- @TIME_WAIT@ timeout.
      --
      -- This timeout will apply to after a connection has been closed, its
      -- purpose is to be resilient for delayed packets in the same way @TCP@
      -- is using @TIME_WAIT@.
      --
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr -> DiffTime
dcTimeWaitTimeout        :: DiffTime

      -- | Churn interval between churn events in deadline mode.  A small fuzz
      -- is added (max 10 minutes) so that not all nodes churn at the same time.
      --
      -- By default it is set to 3300 seconds.
      --
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr -> DiffTime
dcDeadlineChurnInterval  :: DiffTime

      -- | Churn interval between churn events in bulk sync mode.  A small fuzz
      -- is added (max 1 minute) so that not all nodes churn at the same time.
      --
      -- By default it is set to 300 seconds.
      --
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr -> DiffTime
dcBulkChurnInterval      :: DiffTime

      -- | A fork policy for node-to-node mini-protocol threads spawn by mux.
      --
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> ForkPolicy ntnAddr
dcMuxForkPolicy :: Mx.ForkPolicy ntnAddr

    -- | A fork policy for node-to-client mini-protocols threads spawn by mux.
    --
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr
-> ForkPolicy ntcAddr
dcLocalMuxForkPolicy :: Mx.ForkPolicy ntcAddr

    -- | Mux egress queue's poll interval
    , forall extraFlags (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Configuration extraFlags m ntnFd ntnAddr ntcFd ntcAddr -> DiffTime
dcEgressPollInterval :: DiffTime

  }


-- | Versioned mini-protocol bundles run on a negotiated connection.
--
data Applications ntnAddr ntnVersion ntnVersionData
                  ntcAddr ntcVersion ntcVersionData
                  m a =
  Applications {
      -- | NodeToNode initiator applications for initiator only mode.
      --
      -- TODO: we should accept one or the other, but not both:
      -- 'daApplicationInitiatorMode', 'daApplicationInitiatorResponderMode'.
      --
      forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  m
  a
-> Versions
     ntnVersion
     ntnVersionData
     (OuroborosBundleWithExpandedCtx
        'InitiatorMode ntnAddr ByteString m a Void)
daApplicationInitiatorMode
        :: Versions ntnVersion
                    ntnVersionData
                      (OuroborosBundleWithExpandedCtx
                      Mx.InitiatorMode ntnAddr
                      ByteString m a Void)

      -- | NodeToNode initiator & responder applications for bidirectional mode.
      --
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  m
  a
-> Versions
     ntnVersion
     ntnVersionData
     (OuroborosBundleWithExpandedCtx
        'InitiatorResponderMode ntnAddr ByteString m a ())
daApplicationInitiatorResponderMode
           -- Peer Sharing result computation callback
        :: Versions ntnVersion
                    ntnVersionData
                    (OuroborosBundleWithExpandedCtx
                      Mx.InitiatorResponderMode ntnAddr
                      ByteString m a ())

      -- | NodeToClient responder application (server role)
      --
      -- Because p2p mode does not infect local connections we we use non-p2p
      -- apps.
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  m
  a
-> Versions
     ntcVersion
     ntcVersionData
     (OuroborosApplicationWithMinimalCtx
        'ResponderMode ntcAddr ByteString m Void ())
daLocalResponderApplication
        :: Versions ntcVersion
                    ntcVersionData
                     (OuroborosApplicationWithMinimalCtx
                      Mx.ResponderMode ntcAddr
                      ByteString m Void ())

      -- | /node-to-node/ rethrow policy
      --
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  m
  a
-> RethrowPolicy
daRethrowPolicy       :: RethrowPolicy

      -- | /node-to-node/ return policy
      --
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  m
  a
-> ReturnPolicy a
daReturnPolicy        :: ReturnPolicy a

      -- | /node-to-client/ rethrow policy
      --
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  m
  a
-> RethrowPolicy
daLocalRethrowPolicy  :: RethrowPolicy

      -- | 'PeerSelectionPolicy' used by the outbound governor to pick peers to
      -- promote/demote ((see 'simplePeerSelectionPolicy').
      --
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  m
  a
-> PeerSelectionPolicy ntnAddr m
daPeerSelectionPolicy :: PeerSelectionPolicy ntnAddr m

      -- | Used for peer sharing protocol
      --
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  m
  a
-> PeerSharingRegistry ntnAddr m
daPeerSharingRegistry :: PeerSharingRegistry ntnAddr m
  }


--
-- Node-To-Client type aliases
--
-- Node-To-Client diffusion is only used in 'ResponderMode'.
--

type NodeToClientHandle ntcAddr versionData m =
    HandleWithMinimalCtx Mx.ResponderMode ntcAddr versionData ByteString m Void ()

type NodeToClientHandleError ntcVersion =
    HandleError Mx.ResponderMode ntcVersion

type NodeToClientConnectionHandler
      ntcFd ntcAddr ntcVersion ntcVersionData m =
    ConnectionHandler
      Mx.ResponderMode
      (ConnectionHandlerTrace ntcVersion ntcVersionData)
      ntcFd
      ntcAddr
      (NodeToClientHandle ntcAddr ntcVersionData m)
      (NodeToClientHandleError ntcVersion)
      ntcVersion
      ntcVersionData
      m

type NodeToClientConnectionManagerArguments
      ntcFd ntcAddr ntcVersion ntcVersionData m =
    CM.Arguments
      (ConnectionHandlerTrace ntcVersion ntcVersionData)
      ntcFd
      ntcAddr
      (NodeToClientHandle ntcAddr ntcVersionData m)
      (NodeToClientHandleError ntcVersion)
      ntcVersion
      ntcVersionData
      m


--
-- Node-To-Node type aliases
--
-- Node-To-Node diffusion runs in either 'InitiatorMode' or 'InitiatorResponderMode'.
--

type NodeToNodeHandle
       (mode :: Mx.Mode)
       ntnAddr ntnVersionData m a b =
    HandleWithExpandedCtx mode ntnAddr ntnVersionData ByteString m a b

type NodeToNodeConnectionManager
       (mode :: Mx.Mode)
       ntnFd ntnAddr ntnVersionData ntnVersion m a b =
    ConnectionManager
      mode
      ntnFd
      ntnAddr
      (NodeToNodeHandle mode ntnAddr ntnVersionData m a b)
      (HandleError mode ntnVersion)
      m

--
-- Governor type aliases
--

type NodeToNodePeerConnectionHandle (mode :: Mx.Mode) ntnAddr ntnVersionData m a b =
    PeerConnectionHandle
      mode
      (ResponderContext ntnAddr)
      ntnAddr
      ntnVersionData
      ByteString
      m a b

type NodeToNodePeerSelectionActions extraState extraFlags extraPeers extraAPI extraCounters
                                    (mode :: Mx.Mode) ntnAddr ntnVersionData m a b =
    PeerSelectionActions
      extraState extraFlags extraPeers extraAPI extraCounters
      ntnAddr
      (NodeToNodePeerConnectionHandle mode ntnAddr ntnVersionData m a b)
      m


data Interfaces ntnFd ntnAddr ntcFd ntcAddr
                resolver resolverError m =
    Interfaces {
        -- | node-to-node snocket
        --
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> Snocket m ntnFd ntnAddr
diNtnSnocket
          :: Snocket m ntnFd ntnAddr,

        -- | node-to-node 'Mx.MakeBearer' callback
        --
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> MakeBearer m ntnFd
diNtnBearer
          :: Mx.MakeBearer m ntnFd,

        -- | readbuffer
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> (Maybe (ReadBuffer m) -> m ()) -> m ()
diWithBuffer
          :: ((Maybe (ReadBuffer m) -> m ()) -> m ()),

        -- | node-to-node socket configuration
        --
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> ntnFd -> Maybe ntnAddr -> m ()
diNtnConfigureSocket
          :: ntnFd -> Maybe ntnAddr -> m (),

        -- | node-to-node systemd socket configuration
        --
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> ntnFd -> ntnAddr -> m ()
diNtnConfigureSystemdSocket
          :: ntnFd -> ntnAddr -> m (),

        -- | node-to-node address type
        --
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> ntnAddr -> Maybe AddressType
diNtnAddressType
          :: ntnAddr -> Maybe AddressType,

        -- | node-to-node peer address
        --
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> IP -> PortNumber -> ntnAddr
diNtnToPeerAddr
          :: IP -> Socket.PortNumber -> ntnAddr,

        -- | node-to-client snocket
        --
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> Snocket m ntcFd ntcAddr
diNtcSnocket
          :: Snocket m ntcFd ntcAddr,

        -- | node-to-client 'Mx.MakeBearer' callback
        --
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> MakeBearer m ntcFd
diNtcBearer
          :: Mx.MakeBearer m ntcFd,

        -- | node-to-client file descriptor
        --
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> ntcFd -> m FileDescriptor
diNtcGetFileDescriptor
          :: ntcFd -> m FileDescriptor,

        -- | diffusion pseudo random generator. It is split between various
        -- components that need randomness, e.g. inbound governor, peer
        -- selection, policies, etc.
        --
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> StdGen
diRng
          :: StdGen,

        -- | diffusion dns actions
        --
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> Tracer m DNSTrace
-> DNSLookupType
-> (IP -> PortNumber -> ntnAddr)
-> DNSActions ntnAddr resolver resolverError m
diDnsActions
          :: Tracer m DNSTrace
          -> DNSLookupType
          -> (IP -> Socket.PortNumber -> ntnAddr)
          -> DNSActions ntnAddr resolver resolverError m,

        -- | `ConnStateIdSupply` used by the connection-manager for this node.
        --
        -- This is exposed for testing, where we use a global
        -- `ConnStateIdSupply`.
        --
        forall ntnFd ntnAddr ntcFd ntcAddr resolver resolverError
       (m :: * -> *).
Interfaces ntnFd ntnAddr ntcFd ntcAddr resolver resolverError m
-> ConnStateIdSupply m
diConnStateIdSupply
          :: CM.ConnStateIdSupply m
      }