Upgrade to Pro — share decks privately, control downloads, hide ads and more …

apollo-kotlinにcontributeした話

 apollo-kotlinにcontributeした話

2023/08/19 TOGATTA SERVER LT #3 にて発表

Yuta Tomiyama

August 19, 2023
Tweet

More Decks by Yuta Tomiyama

Other Decks in Programming

Transcript

  1. apollo-kotlinに
    contributeした話
    2023/08/19 TOGATTA SERVER LT

    View Slide

  2. 自己紹介
    HN: マヤミト
    本名: 富山雄太
    GitHub: https://github.com/yt8492
    趣味: Kotlin, Twitter, 同人作品
    会津大卒
    Androidエンジニア
    Twitter: yt8492

    View Slide

  3. 近況報告

    View Slide

  4. 薄い本を売ったり買ったりしてました

    View Slide

  5. 本題

    View Slide

  6. OSSコントリビュートしてました

    View Slide

  7. apollo-kotlinとは?
    ● Kotlin向けGraphQLクライアントライブラリのデファクトスタンダード
    ● GraphQLのサーバーとの通信やキャッシュ管理をいい感じにやってくれる
    ● KMP対応
    ● 機能ごとにモジュールが分けられている(コア、ランタイム、キャッシュなど)

    View Slide

  8. 元々あった実装
    ● 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

    View Slide

  9. common(expect)
    - DefaultHttpEngine
    - DefaultWebsocketEngine
    jvm(actual) apple(actual)
    js(actual)
    - OkHttp - Ktor - NSURLSession

    View Slide

  10. 元々あった実装
    ● 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に全部実装共通化できるんじゃね?

    View Slide

  11. common
    - KtorHttpEngine
    - KtorWebsocketEngine

    View Slide

  12. 今回やったこと
    ● Ktorを使ったKMP対応のApolloのEngineを実装した
    ○ KtorHttpEngine
    ○ KtorWebsocketEngine
    ● ↑を含んだ新しいapollo-kotlinのモジュールを追加した
    ○ apollo-engine-ktor

    View Slide

  13. 手順
    1. commonMainなKtorのEngineを実装する
    2. commonTestに実装したKtorのEngineのテストを書く
    3. JVM, JS, Appleでそれぞれ同じテストが通るか確認する

    View Slide

  14. Q. 難しいんでしょう?

    View Slide

  15. Q. 難しいんでしょう?
    A. 意外と簡単です
    Engine自体はただApollo側で定義されたHTTP/Websocketのリクエストをそれぞれ
    のEngineの形式のものに変換して実行し、レスポンスをApolloのものに変換して返す
    だけ

    View Slide

  16. HttpEngineのinterface

    View Slide

  17. KtorHttpEngine

    View Slide

  18. HttpEngineがリクエストを処理するまで
    1. ApolloClient.BuilderにHttpEngineが渡される
    2. HttpNetworkTransport.BuilderにHttpEngineが渡される
    3. ApolloClientのプロパティのNetworkInterceptorにHttpNetworkTransportが
    渡される
    4. リクエスト実行時にApolloClientが持つinterceptersが順番にリクエストを処理
    し、最後にNetworkInterceptorの処理が走るのでそのタイミングでHttpEngine
    が呼び出される

    View Slide

  19. 感想
    ● デカいOSSに貢献できてうれち〜〜〜〜〜〜〜〜〜〜
    ● プルリクのコメントで結構いろいろ教えてくれてやりやすかった
    ● みんなもOSSコントリビュート、しよう!

    View Slide