MyNixOS website logo
Description

A minimal gRPC server on top of Warp.

warp-grpc

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.

Design

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.

Usage

Generate some proto-lens code from .proto files, ideally in a separate library. Import this library and the generated proto-lens code to implement handlers for the service stanzas defined in the .proto files (see Haddocks). Finally, serve warp over TLS`.

Example

Please refer to https://github.com/lucasdicioccio/warp-grpc-example for an example.

TODO(ldicioccio): migrate this example to the new monorepo.

Next steps

  • Helper to set metadatas (a.k.a., headers and trailers).
    • (API-breaking) some or all handlers will get an IO-step to return extra metadata
  • Helper to map request headerlists into client metadatas (probably in http2-grpc-types)

Limitations

  • Only supports "h2" with TLS (I'd argue it's a feature, not a bug. Don't @-me)
  • Some valid gRPC applications may not be expressible directly on top of warp because sending HTTP2 trailers (i.e., signalling the server's desire to stop sending messages) is correlated with closing the HTTP2 stream (i.e., stop accepting client messages). Hence it's not feasible to create a bidirectional stream that terminates on the server end while continuing to ingest client messages. This use case, however, seems like a corner case.
Metadata

Version

0.4.0.1

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows