http2-client-grpc- Implement gRPC-over-HTTP2 clients.

Safe HaskellNone




A module adding support for gRPC over HTTP2.


Building blocks.

data RPC s (m :: Symbol) #

A proxy type for giving static information about RPCs.



type Authority = ByteString #

The HTTP2-Authority portion of an URL (e.g., "").

newtype Timeout #

Timeout in seconds.


Timeout Int 

open Source #


:: (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., "").

-> 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. 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


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.

streamReply :: (Service s, HasMethod s m, MethodStreamingType s m ~ ServerStreaming) => RPC s m -> Compression -> MethodInput s m -> (HeaderList -> Either String (MethodOutput s m) -> IO ()) -> RPCCall (HeaderList, HeaderList) Source #

gRPC call for Server Streaming.

streamRequest :: (Service s, HasMethod s m, MethodStreamingType s m ~ ClientStreaming) => RPC s m -> IO (Compression, Either StreamDone (MethodInput s m)) -> RPCCall (RawReply (MethodOutput s m)) Source #

gRPC call for Client Streaming.

data StreamDone Source #




data InvalidState Source #

Exception raised when a ServerStreaming RPC results in an invalid state machine.


InvalidState String 

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.

uncompressed :: Compression #

Do not compress.