2023/08/19 TOGATTA SERVER LT #3 にて発表
apollo-kotlinにcontributeした話2023/08/19 TOGATTA SERVER LT
View Slide
自己紹介HN: マヤミト本名: 富山雄太GitHub: https://github.com/yt8492趣味: Kotlin, Twitter, 同人作品会津大卒AndroidエンジニアTwitter: yt8492
近況報告
薄い本を売ったり買ったりしてました
本題
OSSコントリビュートしてました
apollo-kotlinとは?● Kotlin向けGraphQLクライアントライブラリのデファクトスタンダード● GraphQLのサーバーとの通信やキャッシュ管理をいい感じにやってくれる● KMP対応● 機能ごとにモジュールが分けられている(コア、ランタイム、キャッシュなど)
元々あった実装● apollo-runtimeにはEngineのinterfaceが定義されている○ interfaceをimplementsすればカスタムのEngineを実装することができる● apollo-kotlinには元々デフォルトで使われるEngineが提供されている○ DefaultHttpEngine○ DefaultWebsocketEngine● DefaultEngineもKMP対応しているが、実装自体は分かれている○ class宣言はexpectでcommonモジュールで型の宣言だけしている○ 実装はactualでJVM, JS, Apple(iOS, MacOS)で分けられている■ JVMはOkHttp■ JSはKtor■ AppleはNSURLSession
common(expect)- DefaultHttpEngine- DefaultWebsocketEnginejvm(actual) apple(actual)js(actual)- OkHttp - Ktor - NSURLSession
元々あった実装● apollo-runtimeにはEngineのinterfaceが定義されている○ interfaceをimplementsすればカスタムのEngineを実装することができる● apollo-kotlinには元々デフォルトで使われるEngineが提供されている○ DefaultHttpEngine○ DefaultWebsocketEngine● DefaultEngineもKMP対応しているが、実装自体は分かれている○ class宣言はexpectでcommonモジュールで型の宣言だけしている○ 実装はactualでJVM, JS, Apple(iOS, MacOS)で分けられている■ JVMはOkHttp■ JSはKtor■ AppleはNSURLSession→ Ktorを使えばcommonに全部実装共通化できるんじゃね?
common- KtorHttpEngine- KtorWebsocketEngine
今回やったこと● Ktorを使ったKMP対応のApolloのEngineを実装した○ KtorHttpEngine○ KtorWebsocketEngine● ↑を含んだ新しいapollo-kotlinのモジュールを追加した○ apollo-engine-ktor
手順1. commonMainなKtorのEngineを実装する2. commonTestに実装したKtorのEngineのテストを書く3. JVM, JS, Appleでそれぞれ同じテストが通るか確認する
Q. 難しいんでしょう?
Q. 難しいんでしょう?A. 意外と簡単ですEngine自体はただApollo側で定義されたHTTP/WebsocketのリクエストをそれぞれのEngineの形式のものに変換して実行し、レスポンスをApolloのものに変換して返すだけ
HttpEngineのinterface
KtorHttpEngine
HttpEngineがリクエストを処理するまで1. ApolloClient.BuilderにHttpEngineが渡される2. HttpNetworkTransport.BuilderにHttpEngineが渡される3. ApolloClientのプロパティのNetworkInterceptorにHttpNetworkTransportが渡される4. リクエスト実行時にApolloClientが持つinterceptersが順番にリクエストを処理し、最後にNetworkInterceptorの処理が走るのでそのタイミングでHttpEngineが呼び出される
感想● デカいOSSに貢献できてうれち〜〜〜〜〜〜〜〜〜〜● プルリクのコメントで結構いろいろ教えてくれてやりやすかった● みんなもOSSコントリビュート、しよう!