gRPCで利用するprotocで生成したTypeScriptのコードにfromObjectを使えるようにする

by

@wapa5pow

いま業務でやっているプロジェクトでは、grpc-webを利用してブラウザからgRPCでサーバに接続しています。
サーバから帰ってくるオブジェクトでフィールドの値を取得したいときにobject.getXXXみたいに取得せねばらなずNuxtでbindingするとき面倒なのでtoObjectというメソッドでJSONにしてobject.XXXでアクセスできるようにすることが多いです。

さてここでfromObjectJSONから戻してgRPCのサーバにリクエストしようと思うのですがfromObjectはいくら探してもありません。grpc-node側とgrpc-web側ともにTypeScriptのコードを生成しているコードをみても生成していません。メソッド自体がないのです。
これはprotocの問題でIssueもたてられていますが4年前にたてられたものなので進捗がありません。

https://github.com/protocolbuffers/protobuf/issues/1591

いろいろ調べているとたった3行なおしてprotocを自分でコンパイルし、その他TypeScriptに必要なnpmも修正すればfromObjectは簡単に生成できることがわかりました。
それを実際にできるようにしたのが以下のレポジトリです。

https://github.com/wapa5pow/protoc-node

バージョン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がない問題を解決できて非常に晴れやかな気持ちです。