-- 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
  , Arguments (..)
  , Applications (..)
  , 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.IP (IP)
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.Socket qualified as Socket

import Ouroboros.Network.Mux (OuroborosApplicationWithMinimalCtx,
           OuroborosBundleWithExpandedCtx)

import Ouroboros.Network.BlockFetch
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.Churn qualified as Governor
import Ouroboros.Network.PeerSelection.Governor.Types
import Ouroboros.Network.PeerSelection.LedgerPeers (LedgerPeerSnapshot,
           LedgerPeersConsensusInterface (..), LedgerPeersKind, NumberOfPeers,
           TraceLedgerPeers, UseLedgerPeers)
import Ouroboros.Network.PeerSelection.PeerAdvertise
import Ouroboros.Network.PeerSelection.PeerMetric (PeerMetrics)
import Ouroboros.Network.PeerSelection.PeerSharing (PeerSharing (..))
import Ouroboros.Network.PeerSelection.PeerStateActions (PeerConnectionHandle,
           PeerSelectionActionsTrace)
import Ouroboros.Network.PeerSelection.PublicRootPeers (PublicRootPeers)
import Ouroboros.Network.PeerSelection.RelayAccessPoint (RelayAccessPoint)
import Ouroboros.Network.PeerSelection.RootPeersDNS (PeerActionsDNS)
import Ouroboros.Network.PeerSelection.RootPeersDNS.DNSActions
import Ouroboros.Network.PeerSelection.RootPeersDNS.DNSSemaphore
import Ouroboros.Network.PeerSelection.RootPeersDNS.LocalRootPeers
           (TraceLocalRootPeers)
import Ouroboros.Network.PeerSelection.RootPeersDNS.PublicRootPeers
           (TracePublicRootPeers)
import Ouroboros.Network.PeerSelection.State.LocalRootPeers qualified as LocalRootPeers
import Ouroboros.Network.PeerSelection.Types (PublicExtraPeersAPI)

-- | 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

-- | Common DiffusionTracers interface between P2P and NonP2P
--
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 Governor.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)

      --
      -- 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
  }

-- | Common DiffusionArguments interface between P2P and NonP2P
--
data Arguments extraState extraDebugState extraFlags extraPeers
               extraAPI extraChurnArgs extraCounters exception
               resolver resolverError
               m ntnFd ntnAddr ntcFd ntcAddr = Arguments {
      -- | an @IPv4@ socket ready to accept connections or an @IPv4@ addresses
      --
      forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> Maybe (Either ntnFd ntnAddr)
daIPv4Address              :: Maybe (Either ntnFd ntnAddr)

      -- | an @IPv6@ socket ready to accept connections or an @IPv6@ addresses
      --
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> Maybe (Either ntnFd ntnAddr)
daIPv6Address              :: Maybe (Either ntnFd ntnAddr)

      -- | an @AF_UNIX@ socket ready to accept connections or an @AF_UNIX@
      -- socket path
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> Maybe (Either ntcFd ntcAddr)
daLocalAddress             :: Maybe (Either ntcFd ntcAddr)

      -- | parameters for limiting number of accepted connections
      --
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> AcceptedConnectionsLimit
daAcceptedConnectionsLimit :: AcceptedConnectionsLimit

      -- | run in initiator only mode
      --
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> DiffusionMode
daMode                     :: DiffusionMode

      -- | public peer selection state
      --
      -- It is created outside of diffusion, since it is needed to create some
      -- apps (e.g. peer sharing).
      --
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> StrictTVar m (PublicPeerSelectionState ntnAddr)
daPublicPeerSelectionVar   :: StrictTVar m (PublicPeerSelectionState ntnAddr)

      -- | selection targets for the peer governor
      --
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> PeerSelectionTargets
daPeerSelectionTargets   :: PeerSelectionTargets
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> STM m (Config extraFlags RelayAccessPoint)
daReadLocalRootPeers     :: STM m (LocalRootPeers.Config extraFlags RelayAccessPoint)
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> STM m (Map RelayAccessPoint PeerAdvertise)
daReadPublicRootPeers    :: 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 extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> STM m (Maybe LedgerPeerSnapshot)
daReadLedgerPeerSnapshot :: STM m (Maybe LedgerPeerSnapshot)

    -- | Peer's own PeerSharing value.
    --
    -- This value comes from the node's configuration file and is static.
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> PeerSharing
daOwnPeerSharing         :: PeerSharing
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> STM m UseLedgerPeers
daReadUseLedgerPeers     :: 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 extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> DiffTime
daProtocolIdleTimeout    :: 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 extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> DiffTime
daTimeWaitTimeout        :: 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 extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> DiffTime
daDeadlineChurnInterval  :: 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 extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> DiffTime
daBulkChurnInterval      :: DiffTime

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

      -- | Extra Counters empty value
      --
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> 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 ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> PublicExtraPeersAPI extraPeers ntnAddr
daExtraPeersAPI          :: PublicExtraPeersAPI extraPeers ntnAddr

    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> forall (muxMode :: Mode) responderCtx ntnVersionData 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 ntnVersionData 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 ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> forall (muxMode :: Mode) responderCtx ntnVersionData bytes a b.
   PeerSelectionState
     extraState
     extraFlags
     extraPeers
     ntnAddr
     (PeerConnectionHandle
        muxMode responderCtx ntnAddr ntnVersionData bytes m a b)
   -> extraCounters
daPeerSelectionStateToExtraCounters
        :: forall muxMode responderCtx ntnVersionData 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 ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> 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 ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> Maybe
     (PeerActionsDNS ntnAddr resolver resolverError m
      -> DNSSemaphore m
      -> (Map ntnAddr PeerAdvertise -> extraPeers)
      -> (NumberOfPeers
          -> LedgerPeersKind -> m (Maybe (Set ntnAddr, DiffTime)))
      -> LedgerPeersKind
      -> 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
                   -> 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 ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> PeerChurnArgs
     m
     extraChurnArgs
     extraDebugState
     extraFlags
     extraPeers
     extraAPI
     extraCounters
     ntnAddr
-> m Void
daPeerChurnGovernor
        :: Governor.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 ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> extraChurnArgs
daExtraChurnArgs :: extraChurnArgs

      -- | A fork policy for node-to-node mini-protocol threads spawn by mux.
      --
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> ForkPolicy ntnAddr
daMuxForkPolicy :: Mx.ForkPolicy ntnAddr

    -- | A fork policy for node-to-client mini-protocols threads spawn by mux.
    --
    , forall extraState extraDebugState extraFlags extraPeers extraAPI
       extraChurnArgs extraCounters exception resolver resolverError
       (m :: * -> *) ntnFd ntnAddr ntcFd ntcAddr.
Arguments
  extraState
  extraDebugState
  extraFlags
  extraPeers
  extraAPI
  extraChurnArgs
  extraCounters
  exception
  resolver
  resolverError
  m
  ntnFd
  ntnAddr
  ntcFd
  ntcAddr
-> ForkPolicy ntcAddr
daLocalMuxForkPolicy :: Mx.ForkPolicy ntcAddr

  }


-- | Versioned mini-protocol bundles run on a negotiated connection.
--
data Applications ntnAddr ntnVersion ntnVersionData
                  ntcAddr ntcVersion ntcVersionData
                  extraAPI m a =
  Applications {
      -- | NodeToNode initiator applications for initiator only mode.
      --
      -- TODO: we should accept one or the other, but not both:
      -- 'daApplicationInitiatorMode', 'daApplicationInitiatorResponderMode'.
      --
      -- Even in non-p2p mode we use p2p apps.
      forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData extraAPI (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  extraAPI
  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 extraAPI (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  extraAPI
  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 extraAPI (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  extraAPI
  m
  a
-> Versions
     ntcVersion
     ntcVersionData
     (OuroborosApplicationWithMinimalCtx
        'ResponderMode ntcAddr ByteString m Void ())
daLocalResponderApplication
        :: Versions ntcVersion
                    ntcVersionData
                     (OuroborosApplicationWithMinimalCtx
                      Mx.ResponderMode ntcAddr
                      ByteString m Void ())

      -- | Interface used to get peers from the current ledger.
      --
      -- TODO: it should be in 'InterfaceExtra'
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData extraAPI (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  extraAPI
  m
  a
-> LedgerPeersConsensusInterface extraAPI m
daLedgerPeersCtx :: LedgerPeersConsensusInterface extraAPI m

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

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

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

      -- | 'PeerMetrics' used by peer selection policy (see
      -- 'simplePeerSelectionPolicy')
      --
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData extraAPI (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  extraAPI
  m
  a
-> PeerMetrics m ntnAddr
daPeerMetrics         :: PeerMetrics m ntnAddr

      -- | Used by churn-governor
      --
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData extraAPI (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  extraAPI
  m
  a
-> STM m FetchMode
daBlockFetchMode      :: STM m FetchMode

      -- | Used for peer sharing protocol
      --
    , forall ntnAddr ntnVersion ntnVersionData ntcAddr ntcVersion
       ntcVersionData extraAPI (m :: * -> *) a.
Applications
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcAddr
  ntcVersion
  ntcVersionData
  extraAPI
  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 ntnVersion ntnVersionData
                ntcFd ntcAddr ntcVersion ntcVersionData
                resolver resolverError
                extraState extraFlags extraPeers extraAPI
                m =
    Interfaces {
        -- | node-to-node snocket
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> Snocket m ntnFd ntnAddr
diNtnSnocket
          :: Snocket m ntnFd ntnAddr,

        -- | node-to-node 'Mx.MakeBearer' callback
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> MakeBearer m ntnFd
diNtnBearer
          :: Mx.MakeBearer m ntnFd,

        -- | node-to-node socket configuration
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> ntnFd -> Maybe ntnAddr -> m ()
diNtnConfigureSocket
          :: ntnFd -> Maybe ntnAddr -> m (),

        -- | node-to-node systemd socket configuration
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> ntnFd -> ntnAddr -> m ()
diNtnConfigureSystemdSocket
          :: ntnFd -> ntnAddr -> m (),

        -- | node-to-node handshake configuration
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> HandshakeArguments
     (ConnectionId ntnAddr) ntnVersion ntnVersionData m
diNtnHandshakeArguments
          :: HandshakeArguments (ConnectionId ntnAddr) ntnVersion ntnVersionData m,

        -- | node-to-node address type
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> ntnAddr -> Maybe AddressType
diNtnAddressType
          :: ntnAddr -> Maybe AddressType,

        -- | node-to-node data flow used by connection manager to classify
        -- negotiated connections
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> ntnVersionData -> DataFlow
diNtnDataFlow
          :: ntnVersionData -> DataFlow,

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

        -- | node-to-node peer address
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> IP -> PortNumber -> ntnAddr
diNtnToPeerAddr
          :: IP -> Socket.PortNumber -> ntnAddr,

        -- | node-to-client snocket
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> Snocket m ntcFd ntcAddr
diNtcSnocket
          :: Snocket m ntcFd ntcAddr,

        -- | node-to-client 'Mx.MakeBearer' callback
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> MakeBearer m ntcFd
diNtcBearer
          :: Mx.MakeBearer m ntcFd,

        -- | node-to-client handshake configuration
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> HandshakeArguments
     (ConnectionId ntcAddr) ntcVersion ntcVersionData m
diNtcHandshakeArguments
          :: HandshakeArguments (ConnectionId ntcAddr) ntcVersion ntcVersionData m,

        -- | node-to-client file descriptor
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  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 ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> StdGen
diRng
          :: StdGen,

        -- | callback which is used to register @SIGUSR1@ signal handler.
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> 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))
   -> PeerMetrics m ntnAddr
   -> m ()
diInstallSigUSR1Handler
          :: 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))
          -> PeerMetrics m ntnAddr
          -> m (),

        -- | diffusion dns actions
        --
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> DNSLookupType -> DNSActions resolver resolverError m
diDnsActions
          :: DNSLookupType -> DNSActions resolver resolverError m,

        -- | Update `ntnVersionData` for initiator-only local roots.
        forall ntnFd ntnAddr ntnVersion ntnVersionData ntcFd ntcAddr
       ntcVersion ntcVersionData resolver resolverError extraState
       extraFlags extraPeers extraAPI (m :: * -> *).
Interfaces
  ntnFd
  ntnAddr
  ntnVersion
  ntnVersionData
  ntcFd
  ntcAddr
  ntcVersion
  ntcVersionData
  resolver
  resolverError
  extraState
  extraFlags
  extraPeers
  extraAPI
  m
-> ntnVersionData -> DiffusionMode -> ntnVersionData
diUpdateVersionData
          :: ntnVersionData -> DiffusionMode -> ntnVersionData,

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