mt_coff's log

メモとか雑に

gRPC-Webをちょっとだけ試した

タイトル通りではあるが、gRPC-Web を試したのでほんの覚書き程度に記録。

github.com

上記を見れば概ね把握できるはず。自分はサーバー側は Go で書いた。雑コードではあるが以下にリポジトリを貼っておく。

github.com

ハマったポイントなど

はじめは proto に Timestamp を記述していた。が、TypeScript 側で const hoge = new Timestamp() の用に書いていたが _pb_todo_pb__WEBPACK_IMPORTED_MODULE_1__.Timestamp is not a constructo のように怒られが発生した。 定義元を見るとコンストラクタは存在していたので Timestamp を使うのを諦める選択をした。 その後 Empty でも同様の問題が発生してしまったので

const empty: Empty = {
  toObject: () => ({}),
  serializeBinary: () => new Uint8Array()
};

の感じに定義することで必要なプロパティを満たし、使用することができた。

Empty も定義を見る限りではコンストラクタが存在していたのでなぜ?という感じだが生成されたコードをしっかり見ていない(もしくは JS/TS のクラスの仕様の理解が中途半端?)ので良くわからなかった。

必要なメソッドなどが自動生成されるのは非常に嬉しいと感じたものの、レスポンスは基本 200 で返ってきてエラーハンドリングはコールバック関数を用いる形だった(試してみて初めて知った)。

生成されたファイルが無限に ESlint に怒られるのでいじった気がする()

サーバー側は雑実装しかしてないのであまり感想はない。がプロキシとして使用している envoy については追々学習する必要があるなと感じた。

まとめ

proto の定義から自動でコードが生えてくるのは嬉しい。

ただし、そのへんに転がっているサンプルだと proto の中で Timestamp や Empty を使用している例がなかった(見つけられなかった)のでそれ周りでかなりハマった印象。

実家で作業してたこともあり、欠片も集中できなかったのはナイショ