Open3

TCAのisowordsではaccessTokenをどこで保持してどのように利用しているのか

yimajoyimajo

はじめに

AccessTokenというグローバルに使いたい値で、かつ変更が必要、さらに主にAPIに使われるような値をどのようにしてisowordsでは扱ってるのかを調べた。

利用箇所

APIClientLive

他にaccessTokenを取り出している箇所を探す。

accessToken: currentPlayer?.player.accessToken,というコードがあるのがわかる。

https://github.com/pointfreeco/isowords/blob/isowords-deploy-v122/Sources/ApiClientLive/Live.swift#L49

currentPlayerとはUserDefaultsに保存したユーザ情報を取得している様子。

https://github.com/pointfreeco/isowords/blob/isowords-deploy-v122/Sources/ApiClientLive/Live.swift#L35-L44

  • CurrentPlayerEnvelope型をUserDefaultsにあるDataから変換

これはつまり、

  • APIClientの副作用を組み立てるlive()メソッドの中で別の副作用であるUserDefaults取り出しを行なっている
    • Reducerで別途UserDefaults取り出し用のActionを実行しているわけではない
    • UserDefaultsは直にアクセスしていてラッパーがあるわけではない
      • UserDefautls保存のユニットテストなどは考えていない
  • さらに上記のコードではdidSetでcurrentPlayerを上書きした際にUserDefaultsに保存し直している
    • static func live()の中はStatic領域(言い換えるとヒープ領域?)なのか

疑問点

currentPlayerは最新を取得できるか?

上書きされた後にcurrentPlayerにアクセスしたら最新になってるか?

yimajoyimajo

AccessTokenの更新

ログアウトした際にcurrentPlayerをnilにする

https://github.com/pointfreeco/isowords/blob/isowords-deploy-v122/Sources/ApiClientLive/Live.swift#L76

プレイヤーのrefresh時にcurrentPlayerを上書きしている

https://github.com/pointfreeco/isowords/blob/isowords-deploy-v122/Sources/ApiClientLive/Live.swift#L87

つまり

  • 前提
    • Static領域でUserDefaults直結のcurrentPlayerを作っている
  • Static領域のcurrentPlayerを上書き
    • currentPlayer自体は当然変更される
      • -> 疑問点の解決: 常にcurrentPlayerは最新を取得できる!
    • UserDefaultsも上書きされる
yimajoyimajo

live関数での利用箇所

APIClientのlive関数で初期値としてdefaultAccessTokenを利用できるようにしている

https://github.com/pointfreeco/isowords/blob/isowords-deploy-v122/Sources/ApiClientLive/Live.swift#L14

しかし、実際のアプリ利用では初期値としてセットしていない。sha256のパラメータのみセットしている。

https://github.com/pointfreeco/isowords/blob/isowords-deploy-v122/App/iOS/App.swift#L117-L119

初期値として代入可能にしてるがそれを利用している箇所は見つからなかった。さらにそもそもdefaultAccessTokenを使ってないような気がする。

PR出して修正された
https://github.com/pointfreeco/isowords/pull/111