fixed stale state after logout and replayed or lost share intents
This commit is contained in:
@@ -3,8 +3,10 @@ import 'dart:convert';
|
||||
|
||||
import 'package:localstore/localstore.dart';
|
||||
|
||||
import '../model/account_data.dart';
|
||||
import 'api_response.dart';
|
||||
import 'errors/parse_exception.dart';
|
||||
import 'errors/stale_session_exception.dart';
|
||||
|
||||
abstract class RequestCache<T extends ApiResponse?> {
|
||||
static const int cacheNothing = 0;
|
||||
@@ -48,6 +50,7 @@ abstract class RequestCache<T extends ApiResponse?> {
|
||||
static void ignore(Exception e) {}
|
||||
|
||||
Future<void> start(String document) async {
|
||||
final epoch = AccountData().sessionEpoch;
|
||||
try {
|
||||
final tableData = await Localstore.instance
|
||||
.collection(collection)
|
||||
@@ -67,6 +70,12 @@ abstract class RequestCache<T extends ApiResponse?> {
|
||||
|
||||
try {
|
||||
final newValue = await onLoad();
|
||||
// The collection is shared, so a late response of a signed-out
|
||||
// account would otherwise be cached for the next one.
|
||||
if (!AccountData().isCurrentSession(epoch)) {
|
||||
onError(const StaleSessionException());
|
||||
return;
|
||||
}
|
||||
onUpdate?.call(newValue);
|
||||
onNetworkData?.call(newValue);
|
||||
unawaited(
|
||||
@@ -141,8 +150,10 @@ Future<T> resolveFromCache<T extends ApiResponse?>(
|
||||
onError?.call(e);
|
||||
});
|
||||
await cache.ready;
|
||||
if (latest != null) return latest as T;
|
||||
final err = capturedError;
|
||||
// `latest` may still hold the cache hit read before the sign-out.
|
||||
if (err is StaleSessionException) throw err;
|
||||
if (latest != null) return latest as T;
|
||||
if (err != null) throw err;
|
||||
throw ParseException(
|
||||
technicalDetails: operationName != null
|
||||
|
||||
Reference in New Issue
Block a user