TypeScriptでgRPCしたいがいろいろあってよくわからない

用語

  • grpc/grpc-node: Node.js向けの公式プロジェクト
  • grpc-tools: grpc/grpc-node が提供しているパッケージ
  • grpc_tools_node_protoc: grpc-toolsに含まれるコマンド
  • agreatfool/grpc_tools_node_protoc_ts: grpc_tools_node_protocで吐いたコードに .d.ts を付けるサードパーティのコマンド
  • improbable-eng/ts-protoc-gen: TypeScript向けのサードパーティprotocプラグイン

Node or ブラウザ

gRPCのサーバー側はどのツールもNodeを想定しているので特に問題ない。 gRPCのクライアント側はNodeで使うことを想定しているのものとブラウザで動かすことを想定しているものがあるので注意が必要

  • ブラウザ上で動作することとを想定しているもの
    • grpc/grpc-web
  • Node用のもの
    • grpc/grpc-node (grpc-toolsのgrpc_tools_node_protoc)
  • 両方に対応しているもの
    • improbable-eng/grpc-web
      • Transportを切り替えることで両方で使えるっぽい

JavaScript での gRPC

次の2パターンがある。

  • .protoをそのまま読み込む
  • .protoからコード生成したコードを読み込む

TypeScriptから使う場合は型定義を付けたいので後者のコード生成するやり方を選ぶのが良さそうだよね。

grpc or @grpc/grpc-js

  • grpcは開発終了間近
  • 今後は @grpc/grpc-js を使うのが良さそう
  • 両方ほとんど同じだけど @grpc/grpc-js を使う場合、protobufを生成する時に --grpc_out=grpc_js:... みたいなオプションが各ツールによって提供されているので適宜ドキュメントをチェックすべし

TypeScriptサポート

できるだけ公式か公式に近いものが良いなら以下の2つが良さそう。2つあるけど動作環境を考慮すると実質一択なのかな。

  • grpc/grpc-webのTypeScriptサポート(experimental)
  • agreatfool/grpc_tools_node_protoc_tsで公式のgrpc/grpc-node (grpc-tools) に対して .d.ts を付ける

まとめ

  • grpc-webやりたいならgrpc/grpc-web
  • そうでなければgrpc-tools+grpc_tools_node_protoc_tsが一番無難そう
  • 両対応したいならimprobable-eng/ts-protoc-genも選択肢に上がってきそう

おまけ