Safe Haskell | None |
---|---|
Language | Haskell2010 |
Ouroboros.Network.Socket
Description
Module exports interface for running a node over a socket over TCP / IP.
Synopsis
- data ConnectionTable (m :: Type -> Type) addr
- data ConnectionTableRef
- data ValencyCounter (m :: Type -> Type)
- data SomeResponderApplication addr bytes (m :: Type -> Type) b where
- SomeResponderApplication :: forall (muxMode :: Mode) addr bytes (m :: Type -> Type) a b. HasResponder muxMode ~ 'True => OuroborosApplicationWithMinimalCtx muxMode addr bytes m a b -> SomeResponderApplication addr bytes m b
- data ConnectionId addr = ConnectionId {
- localAddress :: !addr
- remoteAddress :: !addr
- data ConnectToArgs fd addr vNumber vData = ConnectToArgs {
- ctaHandshakeCodec :: Codec (Handshake vNumber Term) DeserialiseFailure IO ByteString
- ctaHandshakeTimeLimits :: ProtocolTimeLimits (Handshake vNumber Term)
- ctaVersionDataCodec :: VersionDataCodec Term vNumber vData
- ctaConnectTracers :: NetworkConnectTracers addr vNumber
- ctaHandshakeCallbacks :: HandshakeCallbacks vData
- connectToNode :: forall (muxMode :: Mode) vNumber vData fd addr a b. (Ord vNumber, Typeable vNumber, Show vNumber, HasInitiator muxMode ~ 'True) => Snocket IO fd addr -> MakeBearer IO fd -> ConnectToArgs fd addr vNumber vData -> (fd -> IO ()) -> Versions vNumber vData (OuroborosApplicationWithMinimalCtx muxMode addr ByteString IO a b) -> Maybe addr -> addr -> IO (Either SomeException (Either a b))
- connectToNodeWithMux :: forall (muxMode :: Mode) vNumber vData fd addr a b x. (Ord vNumber, Typeable vNumber, Show vNumber, HasInitiator muxMode ~ 'True) => Snocket IO fd addr -> MakeBearer IO fd -> ConnectToArgs fd addr vNumber vData -> (fd -> IO ()) -> Versions vNumber vData (OuroborosApplicationWithMinimalCtx muxMode addr ByteString IO a b) -> Maybe addr -> addr -> (ConnectionId addr -> vNumber -> vData -> OuroborosApplicationWithMinimalCtx muxMode addr ByteString IO a b -> Mux muxMode IO -> Async IO () -> IO x) -> IO x
- connectToNodeSocket :: forall (muxMode :: Mode) vNumber vData a b. (Ord vNumber, Typeable vNumber, Show vNumber, HasInitiator muxMode ~ 'True) => IOManager -> ConnectToArgs Socket SockAddr vNumber vData -> Versions vNumber vData (OuroborosApplicationWithMinimalCtx muxMode SockAddr ByteString IO a b) -> Socket -> IO (Either SomeException (Either a b))
- connectToNode' :: forall (muxMode :: Mode) vNumber vData fd addr a b. (Ord vNumber, Typeable vNumber, Show vNumber, HasInitiator muxMode ~ 'True) => Snocket IO fd addr -> MakeBearer IO fd -> ConnectToArgs fd addr vNumber vData -> Versions vNumber vData (OuroborosApplicationWithMinimalCtx muxMode addr ByteString IO a b) -> fd -> IO (Either SomeException (Either a b))
- connectToNodeWithMux' :: forall (muxMode :: Mode) vNumber vData fd addr a b x. (Ord vNumber, Typeable vNumber, Show vNumber, HasInitiator muxMode ~ 'True) => Snocket IO fd addr -> MakeBearer IO fd -> ConnectToArgs fd addr vNumber vData -> Versions vNumber vData (OuroborosApplicationWithMinimalCtx muxMode addr ByteString IO a b) -> fd -> (ConnectionId addr -> vNumber -> vData -> OuroborosApplicationWithMinimalCtx muxMode addr ByteString IO a b -> Mux muxMode IO -> Async IO () -> IO x) -> IO x
- configureSocket :: Socket -> Maybe SockAddr -> IO ()
- configureSystemdSocket :: Tracer IO SystemdSocketTracer -> Socket -> SockAddr -> IO ()
- data SystemdSocketTracer = SocketOptionNotSet SocketOption
- data NetworkConnectTracers addr vNumber = NetworkConnectTracers {
- nctMuxTracer :: Tracer IO (WithBearer (ConnectionId addr) Trace)
- nctHandshakeTracer :: Tracer IO (WithBearer (ConnectionId addr) (TraceSendRecv (Handshake vNumber Term)))
- nullNetworkConnectTracers :: NetworkConnectTracers addr vNumber
- debuggingNetworkConnectTracers :: (Show addr, Show vNumber) => NetworkConnectTracers addr vNumber
- data HandshakeCallbacks vData = HandshakeCallbacks {}
- newConnectionTable :: MonadSTM m => m (ConnectionTable m addr)
- refConnection :: (MonadSTM m, Ord addr) => ConnectionTable m addr -> addr -> ConnectionDirection -> ValencyCounter m -> m ConnectionTableRef
- addConnection :: forall (m :: Type -> Type) addr. (MonadSTM m, Ord addr) => ConnectionTable m addr -> addr -> addr -> ConnectionDirection -> Maybe (ValencyCounter m) -> STM m ()
- removeConnection :: (MonadSTM m, Ord addr) => ConnectionTable m addr -> addr -> addr -> ConnectionDirection -> m ()
- newValencyCounter :: forall (m :: Type -> Type) addr. MonadSTM m => ConnectionTable m addr -> Int -> STM m (ValencyCounter m)
- addValencyCounter :: forall (m :: Type -> Type). MonadSTM m => ValencyCounter m -> STM m ()
- remValencyCounter :: forall (m :: Type -> Type). MonadSTM m => ValencyCounter m -> STM m ()
- waitValencyCounter :: forall (m :: Type -> Type). MonadSTM m => ValencyCounter m -> STM m ()
- readValencyCounter :: forall (m :: Type -> Type). MonadSTM m => ValencyCounter m -> STM m Int
- sockAddrFamily :: SockAddr -> Family
- simpleMuxCallback :: forall (muxMode :: Mode) addr vNumber vData m a b. (Alternative (STM m), MonadAsync m, MonadSTM m, MonadThrow m, MonadThrow (STM m)) => ConnectionId addr -> vNumber -> vData -> OuroborosApplicationWithMinimalCtx muxMode addr ByteString m a b -> Mux muxMode m -> Async m () -> m (Either SomeException (Either a b))
High level socket interface
data ConnectionTable (m :: Type -> Type) addr Source #
data ConnectionTableRef Source #
Constructors
ConnectionTableCreate | No connection to peer exists, attempt to create one. |
ConnectionTableExist | A connection to the peer existed, either from another subscriber or the peer opened one towards us. |
ConnectionTableDuplicate | This subscriber already has counted a connection to this peer. It must try another target. |
Instances
Show ConnectionTableRef Source # | |
Defined in Ouroboros.Network.Server.ConnectionTable Methods showsPrec :: Int -> ConnectionTableRef -> ShowS # show :: ConnectionTableRef -> String # showList :: [ConnectionTableRef] -> ShowS # |
data ValencyCounter (m :: Type -> Type) Source #
ValencyCounter represents how many active connections we have towards a given peer. It starts out with a positive value representing a desired number of connections for a specific subscription worker. It can become negative, for example if a peer opens multiple connections to us. The vcId is unique per ConnectionTable and ensures that we won't count the same connection twice.
Instances
Eq (ValencyCounter m) Source # | |
Defined in Ouroboros.Network.Server.ConnectionTable Methods (==) :: ValencyCounter m -> ValencyCounter m -> Bool # (/=) :: ValencyCounter m -> ValencyCounter m -> Bool # | |
Ord (ValencyCounter m) Source # | |
Defined in Ouroboros.Network.Server.ConnectionTable Methods compare :: ValencyCounter m -> ValencyCounter m -> Ordering # (<) :: ValencyCounter m -> ValencyCounter m -> Bool # (<=) :: ValencyCounter m -> ValencyCounter m -> Bool # (>) :: ValencyCounter m -> ValencyCounter m -> Bool # (>=) :: ValencyCounter m -> ValencyCounter m -> Bool # max :: ValencyCounter m -> ValencyCounter m -> ValencyCounter m # min :: ValencyCounter m -> ValencyCounter m -> ValencyCounter m # |
data SomeResponderApplication addr bytes (m :: Type -> Type) b where Source #
Wrapper for OuroborosResponderApplication and OuroborosInitiatorAndResponderApplication.
Constructors
SomeResponderApplication :: forall (muxMode :: Mode) addr bytes (m :: Type -> Type) a b. HasResponder muxMode ~ 'True => OuroborosApplicationWithMinimalCtx muxMode addr bytes m a b -> SomeResponderApplication addr bytes m b |
data ConnectionId addr Source #
Connection is identified by local and remote address.
TODO: the type variable which this data type fills in is called peerid
. We
should renamed to connectionId
.
Constructors
ConnectionId | |
Fields
|
Instances
data ConnectToArgs fd addr vNumber vData Source #
Common arguments of various variants of connectToNode
.
Constructors
ConnectToArgs | |
Fields
|
Arguments
:: forall (muxMode :: Mode) vNumber vData fd addr a b. (Ord vNumber, Typeable vNumber, Show vNumber, HasInitiator muxMode ~ 'True) | |
=> Snocket IO fd addr | |
-> MakeBearer IO fd | |
-> ConnectToArgs fd addr vNumber vData | |
-> (fd -> IO ()) | configure socket |
-> Versions vNumber vData (OuroborosApplicationWithMinimalCtx muxMode addr ByteString IO a b) | |
-> Maybe addr | local address; the created socket will bind to it |
-> addr | remote address |
-> IO (Either SomeException (Either a b)) |
Connect to a remote node. It is using bracket to enclose the underlying socket acquisition. This implies that when the continuation exits the underlying bearer will get closed.
The connection will start with handshake protocol sending Versions
to the
remote peer. It must fit into
(~5k bytes).maxTransmissionUnit
Exceptions thrown by MuxApplication
are rethrown by connectToNode
.
Arguments
:: forall (muxMode :: Mode) vNumber vData fd addr a b x. (Ord vNumber, Typeable vNumber, Show vNumber, HasInitiator muxMode ~ 'True) | |
=> Snocket IO fd addr | |
-> MakeBearer IO fd | |
-> ConnectToArgs fd addr vNumber vData | |
-> (fd -> IO ()) | configure socket |
-> Versions vNumber vData (OuroborosApplicationWithMinimalCtx muxMode addr ByteString IO a b) | application to run over the connection ^ remote address |
-> Maybe addr | |
-> addr | |
-> (ConnectionId addr -> vNumber -> vData -> OuroborosApplicationWithMinimalCtx muxMode addr ByteString IO a b -> Mux muxMode IO -> Async IO () -> IO x) | callback which has access to ConnectionId, negotiated protocols, mux
handle created for that connection and an NOTE: when the callback returns or errors, the mux thread will be killed. |
-> IO x |
A version connectToNode
which allows one to control which mini-protocols
to execute on a given connection.
Arguments
:: forall (muxMode :: Mode) vNumber vData a b. (Ord vNumber, Typeable vNumber, Show vNumber, HasInitiator muxMode ~ 'True) | |
=> IOManager | |
-> ConnectToArgs Socket SockAddr vNumber vData | |
-> Versions vNumber vData (OuroborosApplicationWithMinimalCtx muxMode SockAddr ByteString IO a b) | application to run over the connection |
-> Socket | |
-> IO (Either SomeException (Either a b)) |
Arguments
:: forall (muxMode :: Mode) vNumber vData fd addr a b. (Ord vNumber, Typeable vNumber, Show vNumber, HasInitiator muxMode ~ 'True) | |
=> Snocket IO fd addr | |
-> MakeBearer IO fd | |
-> ConnectToArgs fd addr vNumber vData | a configured socket to use to connect to a remote service provider |
-> Versions vNumber vData (OuroborosApplicationWithMinimalCtx muxMode addr ByteString IO a b) | application to run over the connection |
-> fd | |
-> IO (Either SomeException (Either a b)) |
Connect to a remote node using an existing socket. It is up to to caller to ensure that the socket is closed in case of an exception.
The connection will start with handshake protocol sending Versions
to the
remote peer. It must fit into
(~5k bytes).maxTransmissionUnit
Exceptions thrown by
are rethrown by MuxApplication
.connectTo
connectToNodeWithMux' Source #
Arguments
:: forall (muxMode :: Mode) vNumber vData fd addr a b x. (Ord vNumber, Typeable vNumber, Show vNumber, HasInitiator muxMode ~ 'True) | |
=> Snocket IO fd addr | |
-> MakeBearer IO fd | |
-> ConnectToArgs fd addr vNumber vData | |
-> Versions vNumber vData (OuroborosApplicationWithMinimalCtx muxMode addr ByteString IO a b) | application to run over the connection ^ a configured socket to use to connect to a remote service provider |
-> fd | |
-> (ConnectionId addr -> vNumber -> vData -> OuroborosApplicationWithMinimalCtx muxMode addr ByteString IO a b -> Mux muxMode IO -> Async IO () -> IO x) | callback which has access to ConnectionId, negotiated protocols, mux
handle created for that connection and an NOTE: when the callback returns or errors, the mux thread will be killed. |
-> IO x |
Socket configuration
configureSystemdSocket :: Tracer IO SystemdSocketTracer -> Socket -> SockAddr -> IO () Source #
Configure sockets passed through systemd socket activation.
Currently ReuseAddr
and Linger
options are not configurable with
'systemd.socket', these options are set by this function. For other socket
options we only trace if they are not set.
data SystemdSocketTracer Source #
Constructors
SocketOptionNotSet SocketOption |
Instances
Show SystemdSocketTracer Source # | |
Defined in Ouroboros.Network.Socket Methods showsPrec :: Int -> SystemdSocketTracer -> ShowS # show :: SystemdSocketTracer -> String # showList :: [SystemdSocketTracer] -> ShowS # |
Traces
data NetworkConnectTracers addr vNumber Source #
Tracer used by connectToNode
(and derivatives, like
connectTo
or
'Ouroboros.Network.NodeToClient.connectTo).
Constructors
NetworkConnectTracers | |
Fields
|
nullNetworkConnectTracers :: NetworkConnectTracers addr vNumber Source #
debuggingNetworkConnectTracers :: (Show addr, Show vNumber) => NetworkConnectTracers addr vNumber Source #
Re-export of HandshakeCallbacks
data HandshakeCallbacks vData #
A record that holds handshake callbacks.
Constructors
HandshakeCallbacks | |
Re-export connection table functions
newConnectionTable :: MonadSTM m => m (ConnectionTable m addr) Source #
refConnection :: (MonadSTM m, Ord addr) => ConnectionTable m addr -> addr -> ConnectionDirection -> ValencyCounter m -> m ConnectionTableRef Source #
Arguments
:: forall (m :: Type -> Type) addr. (MonadSTM m, Ord addr) | |
=> ConnectionTable m addr | |
-> addr | |
-> addr | |
-> ConnectionDirection | |
-> Maybe (ValencyCounter m) | Optional ValencyCounter, used by subscription worker and set to Nothing when called by a local server. |
-> STM m () |
Insert a new connection into the ConnectionTable.
removeConnection :: (MonadSTM m, Ord addr) => ConnectionTable m addr -> addr -> addr -> ConnectionDirection -> m () Source #
Arguments
:: forall (m :: Type -> Type) addr. MonadSTM m | |
=> ConnectionTable m addr | |
-> Int | Desired valency, that is number of connections a subscription worker will attempt to maintain. |
-> STM m (ValencyCounter m) |
Create a new ValencyCounter
addValencyCounter :: forall (m :: Type -> Type). MonadSTM m => ValencyCounter m -> STM m () Source #
Add a connection.
remValencyCounter :: forall (m :: Type -> Type). MonadSTM m => ValencyCounter m -> STM m () Source #
Remove a connection.
waitValencyCounter :: forall (m :: Type -> Type). MonadSTM m => ValencyCounter m -> STM m () Source #
Wait until ValencyCounter becomes positive, used for detecting when we can create new connections.
readValencyCounter :: forall (m :: Type -> Type). MonadSTM m => ValencyCounter m -> STM m Int Source #
Returns current ValencyCounter value, represent the number of additional connections that can be created. May be negative.
Auxiliary functions
sockAddrFamily :: SockAddr -> Family Source #
simpleMuxCallback :: forall (muxMode :: Mode) addr vNumber vData m a b. (Alternative (STM m), MonadAsync m, MonadSTM m, MonadThrow m, MonadThrow (STM m)) => ConnectionId addr -> vNumber -> vData -> OuroborosApplicationWithMinimalCtx muxMode addr ByteString m a b -> Mux muxMode m -> Async m () -> m (Either SomeException (Either a b)) Source #
An internal mux callback which starts all mini-protocols and blocks until the first one terminates. It returns the result (or error) of the first terminated mini-protocol.