Tokyo Course Grained

適当に生きてます

grpc-web on appengine standard environment (できませんでした)

作りかけです。 github.com

いまpodcast用の再放送ツール作ってて、これ を grpc 対応させようとした。 ReactJSのフロントがあってRestのAPIで叩くのだけど、grpc対応させたら RESTなAPIをわざわざ作んなくていいしコードをだいぶ減らせる。 grpcは標準ではブラウザのjsから叩けないしなー って思ってたら現状ongoingらしくて draft がでている。それと、毎日早く欲しい!ってコメントが書かれる issue

現状ドラフトを実装したのは以下のリポジトリ

github.com

このサンプルがなぜか typescript で jsからどうやって叩くのよって思ったら同じことやってるサイトを見つけた。

grpc-web-clientをjsで試してみた - daisuzu's notes (ほんと助かります)

ブラウザから叩くやってみたんだけど、最後appengineで動かすのはハマって現状できなさそうだなと言う結論になった。

  1. appengine の contextが取得できない

grpcのサービスの関数はこんなインターフェイスになってて

func (s *rssService) GetRss(ctx context.Context, rssQuery *library.GetRssRequest) (*library.Rss, error) {

appengineからgcpの各サービス(datastoreとかログとかすべて)を叩くにはこのcontextが必要なのだが grpcのcontextを使うと runtime errorになる。

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x3856d9]

goroutine 10 [running]:
panic(0x6e7380, 0x820cfa080)
        /Users/iwag/Devel/go_appengine/goroot-1.6/src/runtime/panic.go:481 +0x3e6
google.golang.org/appengine/internal.logf(0x0, 0x0, 0x0, 0x8001e0, 0xa, 0x820f54070, 0x1, 0x1)
        /Users/iwag/Devel/go/src/google.golang.org/appengine/internal/api_classic.go:145 +0xe9
google.golang.org/appengine/internal.Logf(0x8820d4e6d0, 0x820f22300, 0x0, 0x8001e0, 0xa, 0x820f54070, 0x1, 0x1)
        /Users/iwag/Devel/go/src/google.golang.org/appengine/internal/api_common.go:82 +0x151
google.golang.org/appengine/log.Debugf(0x8820d4e6d0, 0x820f22300, 0x8001e0, 0xa, 0x820f54070, 0x1, 0x1)
        /Users/iwag/Devel/go/src/google.golang.org/appengine/log/api.go:19 +0x66
main13960.RssClient.GetRss(0x8820d4e6d0, 0x820f22300, 0x820f4e040, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        rss.go:58 +0x15c
main13960.(*RssClient).GetRss(0xbf6148, 0x8820d4e6d0, 0x820f22300, 0x820f4e040, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        <autogenerated>:3 +0x11d
main13960.(*rssService).PutRss(0xbf6148, 0x8820d4e6d0, 0x820f22300, 0x820f54000, 0x820da0c00, 0x0, 0x0)
        server.go:298 +0x2a2

app engineが期待しているcontextが違うんだろうなーという感じで、contextの型としてはあってるのだが。ちょっと解決法が見えない感じ。 grpc-web まだongoingだし今日はここまでって感じ。appengine standardじゃないところで動かすのを検討中(flexibleだと動くのだろうか…)。