feat: add local-first offline reads - #54
Conversation
✅ Deploy Preview for rdlabo-ionic-angular-library ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
| return defer(() => | ||
| from(plan.readLocal()).pipe( | ||
| catchError((localError: unknown) => { | ||
| errorHandler.handleError(localError); | ||
| return of(null); | ||
| }), | ||
| ), | ||
| ).pipe( | ||
| concatMap((local) => (local ? tryProjectLocal(local, plan, errorHandler) : of(null))), | ||
| take(1), | ||
| ); |
There was a problem hiding this comment.
🟡 ローカルキャッシュ読み取りが同期的に失敗するとGETリクエスト全体が失敗する
ローカル読み取りの失敗を受け止める処理が実行される前に、読み取り呼び出し自体が即座に失敗し得る形で書かれている(defer(() => from(plan.readLocal()).pipe(catchError(...))) at projects/kit/offline/src/lib/offline.interceptor.ts:113-119)ため、ネットワークが正常でも取得が丸ごとエラーになる。
Impact: ローカル保存領域の初期化不良などで読み取りが即座に失敗した場合、オンラインでも画面がデータを取得できずエラー表示になる。
同期throwがcatchErrorの外側で発生する仕組み
readLocal() は Promise を返す型だが、async でない実装(例: readLocal() { return this.db.query(...) } で this.db が未初期化)では同期的に例外を投げ得る。その場合、例外は defer のファクトリ内で発生するため、ファクトリが返す予定だった observable に付いている catchError は生成されず、エラーは resolveLocalAttempt からそのまま外側へ伝播し、readLocalFirst の selector がエラー終了して transport も解約される。
対照的に、network-first 側の OfflineRequestFallbackService.handle(projects/kit/offline/src/lib/offline.interceptor.ts:212-216)では catchError が defer の外側に置かれているため同期throwも捕捉され、ErrorHandler へ報告した上で元のHTTPエラーへフォールバックする。local-first だけ挙動が非対称になっている。
| return defer(() => | |
| from(plan.readLocal()).pipe( | |
| catchError((localError: unknown) => { | |
| errorHandler.handleError(localError); | |
| return of(null); | |
| }), | |
| ), | |
| ).pipe( | |
| concatMap((local) => (local ? tryProjectLocal(local, plan, errorHandler) : of(null))), | |
| take(1), | |
| ); | |
| return defer(() => from(plan.readLocal())) | |
| .pipe( | |
| catchError((localError: unknown) => { | |
| errorHandler.handleError(localError); | |
| return of(null); | |
| }), | |
| ) | |
| .pipe( | |
| concatMap((local) => (local ? tryProjectLocal(local, plan, errorHandler) : of(null))), | |
| take(1), | |
| ); |
Was this helpful? React with 👍 or 👎 to provide feedback.
Summary
Compatibility
Verification