Copyright | (c) Serokell 2016 |
---|---|
License | GPL-3 (see the file LICENSE) |
Maintainer | Serokell <hi@serokell.io> |
Stability | experimental |
Portability | POSIX, GHC |
Safe Haskell | None |
Language | Haskell2010 |
This module defines monad, which serves for sending and receiving raw byte streams.
UPGRAGE-NOTE (TW-47):
We'd like to have another interface for listenRaw
function.
Currently it allows only single listener for given connection.
It makes difficult to define, for example, a listener for all outbound connections,
which is likely to have.
There is a proposal to have subscriptions-based interface:
listenRaw
is in some sense automatically applied when connection is created- At
Dialog
layer, addsubscribe
function which allows to listen for messages at specified port specified outbound connection sum of them.
- type Port = Word16
- type Host = ByteString
- type NetworkAddress = (Host, Port)
- data Binding
- localhost :: Host
- commLoggerName :: LoggerName
- commLog :: HasLoggerName m => m a -> m a
- class Monad m => MonadTransfer s m | m -> s where
- class Monad m => MonadResponse s m | m -> s where
- data ResponseContext s = ResponseContext {
- respSend :: forall m. (MonadIO m, MonadMask m, WithLogger m) => Source m ByteString -> m ()
- respClose :: IO ()
- respPeerAddr :: Text
- respUserState :: s
- newtype ResponseT s m a = ResponseT {
- getResponseT :: ReaderT (ResponseContext s) m a
- runResponseT :: ResponseT s m a -> ResponseContext s -> m a
- mapResponseT :: (m a -> n b) -> ResponseT s m a -> ResponseT s n b
- hoistRespCond :: Monad m => (forall a. m a -> n a) -> ConduitM i o (ResponseT s m) r -> ConduitM i o (ResponseT s n) r
Related datatypes
type Host = ByteString Source #
Host address.
type NetworkAddress = (Host, Port) Source #
Full node address.
Specifies type of listen
binding.
UPGRADE-NOTE: adding Loopback binding may be useful.
AtPort Port | Listen at port |
AtConnTo NetworkAddress | Listen at connection established earlier |
commLoggerName :: LoggerName Source #
Name of logger responsible for communication events - comm
.
TODO: Make non-hardcoded.
commLog :: HasLoggerName m => m a -> m a Source #
Appends commLoggerName
as suffix to current logger name.
MonadTransfer
class Monad m => MonadTransfer s m | m -> s where Source #
Allows to send/receive raw byte sequences.
sendRaw :: NetworkAddress -> Source m ByteString -> m () Source #
Sends raw data. When invoked several times for same address, this function is expected to use same connection kept under hood. Byte sequence, produced by given source, will be transmitted as a whole;
sendRaw :: (WrappedM m, MonadTransfer s (UnwrappedM m)) => NetworkAddress -> Source m ByteString -> m () Source #
Sends raw data. When invoked several times for same address, this function is expected to use same connection kept under hood. Byte sequence, produced by given source, will be transmitted as a whole;
listenRaw :: Binding -> Sink ByteString (ResponseT s m) () -> m (m ()) Source #
Listens at specified input or output connection. Returns server stopper, which blocks current thread until server is actually stopped. Calling this function in case there is defined listener already for this connection should lead to error.
listenRaw :: (WrappedM m, MonadTransfer s (UnwrappedM m)) => Binding -> Sink ByteString (ResponseT s m) () -> m (m ()) Source #
Listens at specified input or output connection. Returns server stopper, which blocks current thread until server is actually stopped. Calling this function in case there is defined listener already for this connection should lead to error.
close :: NetworkAddress -> m () Source #
Closes outbound connection to specified node, if exists.
To close inbound connections, use closeR
.
close :: (WrappedM m, MonadTransfer s (UnwrappedM m)) => NetworkAddress -> m () Source #
Closes outbound connection to specified node, if exists.
To close inbound connections, use closeR
.
userState :: NetworkAddress -> m s Source #
Gets state, attached to related socket. If such connection doesn't exist, it would be created.
userState :: (WrappedM m, MonadTransfer s (UnwrappedM m)) => NetworkAddress -> m s Source #
Gets state, attached to related socket. If such connection doesn't exist, it would be created.
MonadTransfer s m => MonadTransfer s (LoggerNameBox m) Source # | |
MonadTransfer s (Transfer s) Source # | |
MonadTransfer s m => MonadTransfer s (ResponseT s0 m) Source # | |
MonadTransfer s m => MonadTransfer s (Dialog p m) Source # | |
MonadTransfer s m => MonadTransfer s (ReaderT * r m) Source # | |
MonadResponse
class Monad m => MonadResponse s m | m -> s where Source #
Provides operations related to peer node. Peer is a node, which this node is currently communicating with.
replyRaw :: Producer m ByteString -> m () Source #
Sends data to peer.
Closes connection with peer.
Gets address of peer, for debugging purposes only.
userStateR :: m s Source #
Get state attached to socket.
userStateR :: (MonadTrans t, t n ~ m, MonadResponse s n) => t n s Source #
Get state attached to socket.
(MonadIO m, MonadMask m, WithLogger m) => MonadResponse s (ResponseT s m) Source # | |
MonadResponse s m => MonadResponse s (ReaderT * r m) Source # | |
data ResponseContext s Source #
Keeps information about peer.
ResponseContext | |
|
newtype ResponseT s m a Source #
Default implementation of MonadResponse
.
ResponseT | |
|
MonadDialog s p m => MonadDialog s p (ResponseT s0 m) Source # | |
MonadState ss m => MonadState ss (ResponseT s m) Source # | |
MonadReader r m => MonadReader r (ResponseT s m) Source # | |
(MonadIO m, MonadMask m, WithLogger m) => MonadResponse s (ResponseT s m) Source # | |
MonadTransfer s m => MonadTransfer s (ResponseT s0 m) Source # | |
MonadTrans (ResponseT s) Source # | |
Monad m => Monad (ResponseT s m) Source # | |
Functor m => Functor (ResponseT s m) Source # | |
Applicative m => Applicative (ResponseT s m) Source # | |
MonadIO m => MonadIO (ResponseT s m) Source # | |
MonadThrow m => MonadThrow (ResponseT s m) Source # | |
MonadCatch m => MonadCatch (ResponseT s m) Source # | |
MonadMask m => MonadMask (ResponseT s m) Source # | |
CanLog m => CanLog (ResponseT s m) Source # | |
(HasLoggerName m, Monad m) => HasLoggerName (ResponseT s m) Source # | |
Monad m => WrappedM (ResponseT s m) Source # | |
MonadTimed m => MonadTimed (ResponseT s m) Source # | |
type UnwrappedM (ResponseT s m) Source # | |
type ThreadId (ResponseT s m) Source # | |
runResponseT :: ResponseT s m a -> ResponseContext s -> m a Source #
Unwrappes ResponseT
.
mapResponseT :: (m a -> n b) -> ResponseT s m a -> ResponseT s n b Source #