Safe Haskell | None |
---|---|
Language | Haskell2010 |
Ouroboros.Network.ConnectionHandler
Contents
Description
Implementation of ConnectionHandler
While connection manager responsibility is to keep track of resources:
sockets and threads running connection and their state changes (including
changes imposed by ConnectionHandler
, e.g. weather a uni- or duplex- data
flow was negotiated), the responsibility of ConnectionHandler
is to:
- run handshake protocol on the underlying bearer
- start mux
ConnectionHandler
is run on each inbound or outbound connection and returns
Handle
. Upon successful handshake negotiation it returns all the
necessary information to run mini-protocols. Note that it is not responsible
for running them: that's what a server does or p2p-governor by means of
PeerStateActions
.
Synopsis
- data Handle (muxMode :: Mode) initiatorCtx responderCtx versionData bytes (m :: Type -> Type) a b = Handle {
- hMux :: !(Mux muxMode m)
- hMuxBundle :: !(OuroborosBundle muxMode initiatorCtx responderCtx bytes m a b)
- hControlMessage :: !(TemperatureBundle (StrictTVar m ControlMessage))
- hVersionData :: !versionData
- type HandleWithExpandedCtx (muxMode :: Mode) peerAddr versionData bytes (m :: Type -> Type) a b = Handle muxMode (ExpandedInitiatorContext peerAddr m) (ResponderContext peerAddr) versionData bytes m a b
- type HandleWithMinimalCtx (muxMode :: Mode) peerAddr versionData bytes (m :: Type -> Type) a b = Handle muxMode (MinimalInitiatorContext peerAddr) (ResponderContext peerAddr) versionData bytes m a b
- data HandlerError versionNumber
- = HandleHandshakeClientError !(HandshakeException versionNumber)
- | HandleHandshakeServerError !(HandshakeException versionNumber)
- | HandlerError !SomeException
- classifyHandlerError :: HandlerError versionNumber -> HandlerErrorType
- data MkMuxConnectionHandler (muxMode :: Mode) socket initiatorCtx responderCtx peerAddr versionNumber versionData bytes (m :: Type -> Type) a b where
- MuxInitiatorConnectionHandler :: forall socket initiatorCtx responderCtx peerAddr versionNumber versionData bytes (m :: Type -> Type) a b. MkMuxConnectionHandler 'InitiatorMode socket initiatorCtx responderCtx peerAddr versionNumber versionData bytes m a b
- MuxResponderConnectionHandler :: forall (m :: Type -> Type) peerAddr socket initiatorCtx responderCtx versionNumber versionData bytes a b. (StrictTVar m (StrictMaybe ResponderCounters) -> Tracer m (WithBearer (ConnectionId peerAddr) Trace)) -> MkMuxConnectionHandler 'ResponderMode socket initiatorCtx responderCtx peerAddr versionNumber versionData bytes m a b
- MuxInitiatorResponderConnectionHandler :: forall versionData (m :: Type -> Type) peerAddr socket initiatorCtx responderCtx versionNumber bytes a b. (versionData -> DataFlow) -> (StrictTVar m (StrictMaybe ResponderCounters) -> Tracer m (WithBearer (ConnectionId peerAddr) Trace)) -> MkMuxConnectionHandler 'InitiatorResponderMode socket initiatorCtx responderCtx peerAddr versionNumber versionData bytes m a b
- type MuxConnectionHandler (muxMode :: Mode) socket initiatorCtx responderCtx peerAddr versionNumber versionData bytes (m :: Type -> Type) a b = ConnectionHandler muxMode (ConnectionHandlerTrace versionNumber versionData) socket peerAddr (Handle muxMode initiatorCtx responderCtx versionData bytes m a b) (HandlerError versionNumber) versionNumber versionData m
- makeConnectionHandler :: forall initiatorCtx responderCtx peerAddr (muxMode :: Mode) socket versionNumber versionData (m :: Type -> Type) a b. (Alternative (STM m), MonadAsync m, MonadDelay m, MonadFork m, MonadLabelledSTM m, MonadThrow (STM m), MonadTimer m, MonadMask m, Ord versionNumber, Show peerAddr, Typeable peerAddr) => TracersWithBearer (ConnectionId peerAddr) m -> ForkPolicy peerAddr -> HandshakeArguments (ConnectionId peerAddr) versionNumber versionData m -> Versions versionNumber versionData (OuroborosBundle muxMode initiatorCtx responderCtx ByteString m a b) -> (ThreadId m, RethrowPolicy) -> MkMuxConnectionHandler muxMode socket initiatorCtx responderCtx peerAddr versionNumber versionData ByteString m a b -> MuxConnectionHandler muxMode socket initiatorCtx responderCtx peerAddr versionNumber versionData ByteString m a b
- type MuxConnectionManager (muxMode :: Mode) socket initiatorCtx responderCtx peerAddr versionData versionNumber bytes (m :: Type -> Type) a b = ConnectionManager muxMode socket peerAddr (Handle muxMode initiatorCtx responderCtx versionData bytes m a b) (HandlerError versionNumber) m
- type ConnectionManagerWithExpandedCtx (muxMode :: Mode) socket peerAddr versionData versionNumber bytes (m :: Type -> Type) a b = ConnectionManager muxMode socket peerAddr (HandleWithExpandedCtx muxMode peerAddr versionData bytes m a b) (HandlerError versionNumber) m
- data ConnectionHandlerTrace versionNumber versionData
- = TrHandshakeSuccess versionNumber versionData
- | TrHandshakeQuery (Map versionNumber (Either Text versionData))
- | TrHandshakeClientError (HandshakeException versionNumber)
- | TrHandshakeServerError (HandshakeException versionNumber)
- | TrConnectionHandlerError ErrorContext SomeException ErrorCommand
Documentation
data Handle (muxMode :: Mode) initiatorCtx responderCtx versionData bytes (m :: Type -> Type) a b Source #
States of the connection handler thread.
MuxRunning
- successful Handshake, mux startedHandleHandshakeClientError
- the connection handler thread was running client side
of the handshake negotiation, which failed with
a
HandshakeException
HandleHandshakeServerError
- the connection handler thread was running server side of the
handshake protocol, which fail with
HandshakeException
HandlerError
- the multiplexer thrown
MuxError
.
Constructors
Handle | |
Fields
|
type HandleWithExpandedCtx (muxMode :: Mode) peerAddr versionData bytes (m :: Type -> Type) a b = Handle muxMode (ExpandedInitiatorContext peerAddr m) (ResponderContext peerAddr) versionData bytes m a b Source #
Handle
used by `node-to-node` P2P connections.
type HandleWithMinimalCtx (muxMode :: Mode) peerAddr versionData bytes (m :: Type -> Type) a b = Handle muxMode (MinimalInitiatorContext peerAddr) (ResponderContext peerAddr) versionData bytes m a b Source #
Handle
used by:
- `node-to-node` non P2P mode;
- `node-to-client` connections.
data HandlerError versionNumber Source #
A connection handler error.
It is returned either when creating the Handle
or raised by the connection
handler.
Constructors
HandleHandshakeClientError !(HandshakeException versionNumber) | A handshake exception when creating |
HandleHandshakeServerError !(HandshakeException versionNumber) | A handshake exception when creating |
HandlerError !SomeException | A connection handler exception (e.g. might be a mini-protocol error, io exception, etc). |
Instances
(Typeable versionNumber, Show versionNumber) => Exception (HandlerError versionNumber) Source # | |
Defined in Ouroboros.Network.ConnectionHandler Methods toException :: HandlerError versionNumber -> SomeException # fromException :: SomeException -> Maybe (HandlerError versionNumber) # displayException :: HandlerError versionNumber -> String # backtraceDesired :: HandlerError versionNumber -> Bool # | |
Show versionNumber => Show (HandlerError versionNumber) Source # | |
Defined in Ouroboros.Network.ConnectionHandler Methods showsPrec :: Int -> HandlerError versionNumber -> ShowS # show :: HandlerError versionNumber -> String # showList :: [HandlerError versionNumber] -> ShowS # |
classifyHandlerError :: HandlerError versionNumber -> HandlerErrorType Source #
data MkMuxConnectionHandler (muxMode :: Mode) socket initiatorCtx responderCtx peerAddr versionNumber versionData bytes (m :: Type -> Type) a b where Source #
Constructors
MuxInitiatorConnectionHandler :: forall socket initiatorCtx responderCtx peerAddr versionNumber versionData bytes (m :: Type -> Type) a b. MkMuxConnectionHandler 'InitiatorMode socket initiatorCtx responderCtx peerAddr versionNumber versionData bytes m a b | |
MuxResponderConnectionHandler :: forall (m :: Type -> Type) peerAddr socket initiatorCtx responderCtx versionNumber versionData bytes a b. (StrictTVar m (StrictMaybe ResponderCounters) -> Tracer m (WithBearer (ConnectionId peerAddr) Trace)) -> MkMuxConnectionHandler 'ResponderMode socket initiatorCtx responderCtx peerAddr versionNumber versionData bytes m a b | |
MuxInitiatorResponderConnectionHandler :: forall versionData (m :: Type -> Type) peerAddr socket initiatorCtx responderCtx versionNumber bytes a b. (versionData -> DataFlow) -> (StrictTVar m (StrictMaybe ResponderCounters) -> Tracer m (WithBearer (ConnectionId peerAddr) Trace)) -> MkMuxConnectionHandler 'InitiatorResponderMode socket initiatorCtx responderCtx peerAddr versionNumber versionData bytes m a b |
type MuxConnectionHandler (muxMode :: Mode) socket initiatorCtx responderCtx peerAddr versionNumber versionData bytes (m :: Type -> Type) a b = ConnectionHandler muxMode (ConnectionHandlerTrace versionNumber versionData) socket peerAddr (Handle muxMode initiatorCtx responderCtx versionData bytes m a b) (HandlerError versionNumber) versionNumber versionData m Source #
Type of ConnectionHandler
implemented in this module.
makeConnectionHandler Source #
Arguments
:: forall initiatorCtx responderCtx peerAddr (muxMode :: Mode) socket versionNumber versionData (m :: Type -> Type) a b. (Alternative (STM m), MonadAsync m, MonadDelay m, MonadFork m, MonadLabelledSTM m, MonadThrow (STM m), MonadTimer m, MonadMask m, Ord versionNumber, Show peerAddr, Typeable peerAddr) | |
=> TracersWithBearer (ConnectionId peerAddr) m | |
-> ForkPolicy peerAddr | |
-> HandshakeArguments (ConnectionId peerAddr) versionNumber versionData m | |
-> Versions versionNumber versionData (OuroborosBundle muxMode initiatorCtx responderCtx ByteString m a b) | |
-> (ThreadId m, RethrowPolicy) |
|
-> MkMuxConnectionHandler muxMode socket initiatorCtx responderCtx peerAddr versionNumber versionData ByteString m a b | |
-> MuxConnectionHandler muxMode socket initiatorCtx responderCtx peerAddr versionNumber versionData ByteString m a b |
To be used as makeConnectionHandler
field of ConnectionManagerArguments
.
Note: We need to pass MiniProtocolBundle
what forces us to have two
different ConnectionManager
s: one for `node-to-client` and another for
`node-to-node` connections. But this is ok, as these resources are
independent.
When a server is running, the inbound governor creates a tracer which is passed here,
and the connection handler appends it to the muxer tracer for
inbound and (negotiated) outbound duplex connections. This tracer
efficiently informs the IG loop of miniprotocol activity.
type MuxConnectionManager (muxMode :: Mode) socket initiatorCtx responderCtx peerAddr versionData versionNumber bytes (m :: Type -> Type) a b = ConnectionManager muxMode socket peerAddr (Handle muxMode initiatorCtx responderCtx versionData bytes m a b) (HandlerError versionNumber) m Source #
Type alias for ConnectionManager
using Handle
.
type ConnectionManagerWithExpandedCtx (muxMode :: Mode) socket peerAddr versionData versionNumber bytes (m :: Type -> Type) a b = ConnectionManager muxMode socket peerAddr (HandleWithExpandedCtx muxMode peerAddr versionData bytes m a b) (HandlerError versionNumber) m Source #
Type alias for ConnectionManager
which is using expanded context.
tracing
data ConnectionHandlerTrace versionNumber versionData Source #
ConnectionHandlerTrace
is embedded into
Trace
with
TrConnectionHandler
constructor.
It already includes ConnectionId
so we don't need to take care of it here.
TODO: when Handshake
will get its own tracer, independent of Mux
, it
should be embedded into ConnectionHandlerTrace
.
Constructors
TrHandshakeSuccess versionNumber versionData | |
TrHandshakeQuery (Map versionNumber (Either Text versionData)) | |
TrHandshakeClientError (HandshakeException versionNumber) | |
TrHandshakeServerError (HandshakeException versionNumber) | |
TrConnectionHandlerError ErrorContext SomeException ErrorCommand |
Instances
(Show versionNumber, Show versionData) => Show (ConnectionHandlerTrace versionNumber versionData) Source # | |
Defined in Ouroboros.Network.ConnectionHandler Methods showsPrec :: Int -> ConnectionHandlerTrace versionNumber versionData -> ShowS # show :: ConnectionHandlerTrace versionNumber versionData -> String # showList :: [ConnectionHandlerTrace versionNumber versionData] -> ShowS # |