Safe Haskell | None |
---|---|
Language | Haskell2010 |
A module adding support for gRPC over HTTP2.
Synopsis
- data RPC s (m :: Symbol) = RPC
- type Authority = ByteString
- newtype Timeout = Timeout Int
- open :: (Service s, HasMethod s m) => RPC s m -> Http2Client -> Authority -> HeaderList -> Timeout -> Compression -> RPCCall a -> IO (Either TooMuchConcurrency a)
- type RawReply a = Either ErrorCode (HeaderList, Maybe HeaderList, Either String a)
- singleRequest :: (Service s, HasMethod s m) => RPC s m -> Compression -> MethodInput s m -> RPCCall (RawReply (MethodOutput s m))
- streamReply :: (Service s, HasMethod s m, MethodStreamingType s m ~ ServerStreaming) => RPC s m -> Compression -> a -> MethodInput s m -> (a -> HeaderList -> MethodOutput s m -> IO a) -> RPCCall (a, HeaderList, HeaderList)
- streamRequest :: (Service s, HasMethod s m, MethodStreamingType s m ~ ClientStreaming) => RPC s m -> a -> (a -> IO (Compression, a, Either StreamDone (MethodInput s m))) -> RPCCall (a, RawReply (MethodOutput s m))
- data StreamDone = StreamDone
- data InvalidState = InvalidState String
- data StreamReplyDecodingError = StreamReplyDecodingError String
- data UnallowedPushPromiseReceived = UnallowedPushPromiseReceived
- data Compression
- gzip :: Compression
- uncompressed :: Compression
Building blocks.
type Authority = ByteString #
The HTTP2-Authority portion of an URL (e.g., "dicioccio.fr:7777").
:: (Service s, HasMethod s m) | |
=> RPC s m | A token carrying information specifying the RPC to call. |
-> Http2Client | A connected HTTP2 client. |
-> Authority | The HTTP2-Authority portion of the URL (e.g., "dicioccio.fr:7777"). |
-> HeaderList | A set of HTTP2 headers (e.g., for adding authentication headers). |
-> Timeout | Timeout in seconds. |
-> Compression | An indication of the compression that you will be using and accepting. Compression should be per message, however a bug in gRPC-Go (to be confirmed) seems to turn message compression mandatory if advertised in the HTTP2 headers, even though the specification states that compression per message is optional irrespectively of headers. |
-> RPCCall a | The actual RPC handler. |
-> IO (Either TooMuchConcurrency a) |
Main handler to perform gRPC calls to a service.
type RawReply a = Either ErrorCode (HeaderList, Maybe HeaderList, Either String a) Source #
A reply.
This reply object contains a lot of information because a single gRPC call returns a lot of data. A future version of the library will have a proper data structure with properly named-fields on the reply object.
For now, remember: - 1st item: initial HTTP2 response - 2nd item: second (trailers) HTTP2 response - 3rd item: proper gRPC answer
Helpers
singleRequest :: (Service s, HasMethod s m) => RPC s m -> Compression -> MethodInput s m -> RPCCall (RawReply (MethodOutput s m)) Source #
gRPC call for an unary request.
:: (Service s, HasMethod s m, MethodStreamingType s m ~ ServerStreaming) | |
=> RPC s m | The RPC to call. |
-> Compression | The compression to use. TODO: revisit compressions. |
-> a | An initial state. |
-> MethodInput s m | The input. |
-> (a -> HeaderList -> MethodOutput s m -> IO a) | A state-passing handler that is called with the message read. |
-> RPCCall (a, HeaderList, HeaderList) |
gRPC call for Server Streaming.
:: (Service s, HasMethod s m, MethodStreamingType s m ~ ClientStreaming) | |
=> RPC s m | RPC to call. |
-> a | An initial state. |
-> (a -> IO (Compression, a, Either StreamDone (MethodInput s m))) | A state-passing action to retrieve the next message to send to the server. |
-> RPCCall (a, RawReply (MethodOutput s m)) |
gRPC call for Client Streaming.
data StreamDone Source #
Errors.
data InvalidState Source #
Exception raised when a ServerStreaming RPC results in an invalid state machine.
Instances
Show InvalidState Source # | |
Defined in Network.GRPC.Client showsPrec :: Int -> InvalidState -> ShowS # show :: InvalidState -> String # showList :: [InvalidState] -> ShowS # | |
Exception InvalidState Source # | |
Defined in Network.GRPC.Client |
data StreamReplyDecodingError Source #
Exception raised when a ServerStreaming RPC results in a decoding error.
Instances
Show StreamReplyDecodingError Source # | |
Defined in Network.GRPC.Client showsPrec :: Int -> StreamReplyDecodingError -> ShowS # show :: StreamReplyDecodingError -> String # showList :: [StreamReplyDecodingError] -> ShowS # | |
Exception StreamReplyDecodingError Source # | |
data UnallowedPushPromiseReceived Source #
gRPC disables HTTP2 push-promises.
If a server attempts to send push-promises, this exception will be raised.
Instances
Compression of individual messages.
data Compression #
Opaque type for handling compression.
So far, only "pure" compression algorithms are supported.
TODO: suport IO-based compression implementations once we move from Builder
.
gzip :: Compression #
Use gzip as compression.
Do not compress.