time-warp-1.1.1.2: Distributed systems execution emulation

Copyright(c) Serokell 2016
LicenseGPL-3 (see the file LICENSE)
MaintainerSerokell <hi@serokell.io>
Stabilityexperimental
PortabilityPOSIX, GHC
Safe HaskellNone
LanguageHaskell2010

Control.TimeWarp.Rpc.MonadTransfer

Contents

Description

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, add subscribe function which allows to listen for messages at specified port specified outbound connection sum of them.

Synopsis

Related datatypes

type Port = Word16 Source #

Port number.

type Host = ByteString Source #

Host address.

type NetworkAddress = (Host, Port) Source #

Full node address.

data Binding Source #

Specifies type of listen binding.

UPGRADE-NOTE: adding Loopback binding may be useful.

Constructors

AtPort Port

Listen at port

AtConnTo NetworkAddress

Listen at connection established earlier

localhost :: Host Source #

"127.0.0.1".

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.

Methods

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.

Instances

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.

Minimal complete definition

replyRaw, closeR, peerAddr

Methods

replyRaw :: Producer m ByteString -> m () Source #

Sends data to peer.

closeR :: m () Source #

Closes connection with peer.

peerAddr :: m Text Source #

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.

data ResponseContext s Source #

Keeps information about peer.

Constructors

ResponseContext 

Fields

newtype ResponseT s m a Source #

Default implementation of MonadResponse.

Constructors

ResponseT 

Instances

MonadDialog s p m => MonadDialog s p (ResponseT s0 m) Source # 
MonadState ss m => MonadState ss (ResponseT s m) Source # 

Methods

get :: ResponseT s m ss #

put :: ss -> ResponseT s m () #

state :: (ss -> (a, ss)) -> ResponseT s m a #

MonadReader r m => MonadReader r (ResponseT s m) Source # 

Methods

ask :: ResponseT s m r #

local :: (r -> r) -> ResponseT s m a -> ResponseT s m a #

reader :: (r -> a) -> ResponseT s m a #

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

Methods

lift :: Monad m => m a -> ResponseT s m a #

Monad m => Monad (ResponseT s m) Source # 

Methods

(>>=) :: ResponseT s m a -> (a -> ResponseT s m b) -> ResponseT s m b #

(>>) :: ResponseT s m a -> ResponseT s m b -> ResponseT s m b #

return :: a -> ResponseT s m a #

fail :: String -> ResponseT s m a #

Functor m => Functor (ResponseT s m) Source # 

Methods

fmap :: (a -> b) -> ResponseT s m a -> ResponseT s m b #

(<$) :: a -> ResponseT s m b -> ResponseT s m a #

Applicative m => Applicative (ResponseT s m) Source # 

Methods

pure :: a -> ResponseT s m a #

(<*>) :: ResponseT s m (a -> b) -> ResponseT s m a -> ResponseT s m b #

(*>) :: ResponseT s m a -> ResponseT s m b -> ResponseT s m b #

(<*) :: ResponseT s m a -> ResponseT s m b -> ResponseT s m a #

MonadIO m => MonadIO (ResponseT s m) Source # 

Methods

liftIO :: IO a -> ResponseT s m a #

MonadThrow m => MonadThrow (ResponseT s m) Source # 

Methods

throwM :: Exception e => e -> ResponseT s m a #

MonadCatch m => MonadCatch (ResponseT s m) Source # 

Methods

catch :: Exception e => ResponseT s m a -> (e -> ResponseT s m a) -> ResponseT s m a #

MonadMask m => MonadMask (ResponseT s m) Source # 

Methods

mask :: ((forall a. ResponseT s m a -> ResponseT s m a) -> ResponseT s m b) -> ResponseT s m b #

uninterruptibleMask :: ((forall a. ResponseT s m a -> ResponseT s m a) -> ResponseT s m b) -> ResponseT s m b #

CanLog m => CanLog (ResponseT s m) Source # 
(HasLoggerName m, Monad m) => HasLoggerName (ResponseT s m) Source # 
Monad m => WrappedM (ResponseT s m) Source # 

Associated Types

type UnwrappedM (ResponseT s m :: * -> *) :: * -> * #

Methods

_WrappedM :: (Profunctor p, Functor f) => p (UnwrappedM (ResponseT s m) a) (f (UnwrappedM (ResponseT s m) a)) -> p (ResponseT s m a) (f (ResponseT s m a)) #

packM :: ResponseT s m a -> UnwrappedM (ResponseT s m) a #

unpackM :: UnwrappedM (ResponseT s m) a -> ResponseT s m a #

MonadTimed m => MonadTimed (ResponseT s m) Source # 
type UnwrappedM (ResponseT s m) Source # 
type ThreadId (ResponseT s m) Source # 
type ThreadId (ResponseT s m) = ThreadId m

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 #

Maps entry of ResponseT. TODO: implement hoist instead, it should be enough.

hoistRespCond :: Monad m => (forall a. m a -> n a) -> ConduitM i o (ResponseT s m) r -> ConduitM i o (ResponseT s n) r Source #

Allows to modify entry of Conduit i o (ResponseT m) r.