warp-grpc: A minimal gRPC server on top of Warp.

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]

Please see the README on Github at https://github.com/githubuser/warp-grpc#readme

[Skip to Readme]


Change log ChangeLog.md
Dependencies base (>=4.7 && <5), binary, bytestring, case-insensitive, http-types, http2-grpc-types (>=0.2), proto-lens, proto-lens-protoc, wai, warp (>=3.2.24 && <3.3), warp-grpc, warp-tls [details]
License BSD-3-Clause
Copyright 2017 Lucas DiCioccio
Author Lucas DiCioccio
Maintainer lucas@dicioccio.fr
Category Networking
Home page https://github.com/lucasdicioccio/warp-grpc#readme
Bug tracker https://github.com/lucasdicioccio/warp-grpc/issues
Source repo head: git clone https://github.com/lucasdicioccio/warp-grpc
Uploaded by LucasDiCioccio at 2018-09-03T05:58:19Z



Maintainer's Corner

For package maintainers and hackage trustees

Readme for warp-grpc-

[back to package description]


A gRPC server implementation on top of Warp's HTTP2 handler. The lib also contains a demo sever using the awesome grpcb.in Proto. The current release is an advanced technical demo, expect a few breaking changes.



In addition to a working Haskell dev environment, you need to:

Adding .proto files to a Haskell package

In order to run gRPC:

A single protoc invocation may be enough for both Proto and GRPC outputs:

protoc  "--plugin=protoc-gen-haskell-protolens=${protolens}" \
    --haskell-protolens_out=./gen \
    -I "${protodir1} \
    -I "${protodir2} \
    ${first.proto} \

A reliable way to list the module names is the following bash invocation:

find gen -name "*.hs" | sed -e 's/gen\///' | sed -e 's/\.hs$//' | tr '/' '.'

Unlike proto-lens, this project does not yet provide a modified Setup.hs. As a result, we cannot automate these steps from within Cabal/Stack. Hence, you'll have to automate these steps outside your Haskell toolchain.

Build a certificate

In shell,

openssl genrsa -out key.pem 2048
openssl req -new -key key.pem -out certificate.csr
openssl x509 -req -in certificate.csr -signkey key.pem -out certificate.pem

Build and run the example binary

Note that you'll need a patched Warp using https://github.com/yesodweb/wai/pull/711 .


The library implements gRPC using a WAI middleware for a set of gRPC endpoints. Endpoint handlers differ depending of the streaming/unary-ty of individual RPCs. Bidirectional streams will be supported next.

There is little specification around the expected allowed observable states in gRPC, hence the types this library presents make conservative choices: unary RPCs expect an input before providing an output. Client stream allows to return an output only when the client has stopped streaming. Server streams wait for an input before starting to iterate sending outputs.

Next steps