gRPCで利用するprotocで生成したTypeScriptのコードにfromObjectを使えるようにする
いま業務でやっているプロジェクトでは、grpc-webを利用してブラウザからgRPCでサーバに接続しています。
サーバから帰ってくるオブジェクトでフィールドの値を取得したいときにobject.getXXX
みたいに取得せねばらなずNuxtでbindingするとき面倒なのでtoObject
というメソッドでJSON
にしてobject.XXX
でアクセスできるようにすることが多いです。
さてここでfromObject
でJSON
から戻してgRPCのサーバにリクエストしようと思うのですがfromObject
はいくら探してもありません。grpc-node側とgrpc-web側ともにTypeScriptのコードを生成しているコードをみても生成していません。メソッド自体がないのです。
これはprotocの問題でIssueもたてられていますが4年前にたてられたものなので進捗がありません。
いろいろ調べているとたった3行なおしてprotoc
を自分でコンパイルし、その他TypeScriptに必要なnpmも修正すればfromObject
は簡単に生成できることがわかりました。
それを実際にできるようにしたのが以下のレポジトリです。
バージョン3.19.4のprotoc
をコンパイルしてDocker imageで https://hub.docker.com/r/wapa5pow/protoc-node から使えるようにしました。
(とくにイメージサイズを小さくしようとはしていないので結構でかいです。)
以下のようにすればgrpc-web用のTypeScriptのコードがコンパイルできます。
docker run -v $(pwd)/:/workspace/: docker.io/wapa5pow/protoc-node:3.19.4 /bin/bash -c " \
mkdir -p ./${CLIENT_GENERATED_DIR} && \
rm -rf ./${CLIENT_GENERATED_DIR}/* && \
protoc \
--js_out=import_style=commonjs,binary:${CLIENT_GENERATED_DIR} \
--grpc-web_out=import_style=typescript,mode=grpcwebtext:${CLIENT_GENERATED_DIR} \
-I ./proto ./proto/*.proto"
これで長年のつらみだったfromObject
がない問題を解決できて非常に晴れやかな気持ちです。