gRPC
grpc-web

WebブラウザからgRPCの双方向通信は可能なのか調べた

最近WebブラウザからgRPCを呼び出せるようになったようです。
gRPC-Webが正式リリース。WebブラウザからgRPCを直接呼び出し可能に

Unary RPCでの呼び出しはできるようですが、双方向通信は対応してるのか調べてみました。

どうやらgrpc-webというと、2種類あるようで

前者は上記記事で紹介されているもので、後者は名前が同じでやりたいことは同じでも実現方法が異なっているものです。
やりたことはWebブラウザからの双方向通信ができるかなので、どちらも調べてみました。

ちなみにこの2つのプロダクトの違いは下記に記載してあるので、興味がある方は読んでみてください。
https://github.com/improbable-eng/grpc-web/issues/199

自分の解釈により、間違えている可能性もあるのでその場合はご指摘お願いします。

結論

結論から言うと、どちらもgRPCの双方向通信は対応していません。

未対応理由

どちらも同じ理由なのですが、ブラウザネイティブからストリーム通信ができないためです。
https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-WEB.md

Bidi-streaming, with flow-control

・Pending on whatwg fetch/streams to be finalized and implemented in modern browsers
・gRPC-Web client will support the native gRPC protocol with modern browsers

whatwg/streamsというブラウザネイティブのAPIがあるのですが
それがモダンブラウザで実装されない限り双方向通信は出来ないようです。

調査

grpc/grpc-web

このリポジトリでの双方向通信の議論はこちらで行われていました。
https://github.com/grpc/grpc/issues/8682
https://github.com/grpc/grpc-web/issues/24

内容としては上記結論の内容です。
WebSocketで対応する案が出ていたようですが、どうやらやってない様子?

improbable-eng/grpc-web

どうやらWebSocketでは双方向通信をサポートしているようです。
https://github.com/improbable-eng/grpc-web/issues/94

が、純粋な意味でのgRPCでの双方向通信はサポートされていないので、結論としては「対応していない」としました。