Browse Source

neon: Allow emitting empty cached values

pull/279/head
jld3103 2 years ago
parent
commit
2cd9a450fb
No known key found for this signature in database
GPG Key ID: 9062417B9E8EB7B3
  1. 83
      packages/neon/neon/lib/src/utils/request_manager.dart

83
packages/neon/neon/lib/src/utils/request_manager.dart

@ -14,6 +14,7 @@ class RequestManager {
final Future<R> Function() call,
final T Function(R) unwrap, {
final bool disableTimeout = false,
final bool emitEmptyCache = false,
}) async =>
_wrap<T, R>(
clientID,
@ -24,6 +25,7 @@ class RequestManager {
(final data) => json.encode(serializeNextcloud<R>(data)),
(final data) => deserializeNextcloud<R>(json.decode(data)),
disableTimeout,
emitEmptyCache,
0,
);
@ -34,6 +36,7 @@ class RequestManager {
final Future<WebDavMultistatus> Function() call,
final T Function(WebDavMultistatus) unwrap, {
final bool disableTimeout = false,
final bool emitEmptyCache = false,
}) async =>
_wrap<T, WebDavMultistatus>(
clientID,
@ -44,6 +47,7 @@ class RequestManager {
(final data) => data.toXmlElement(namespaces: namespaces).toXmlString(),
(final data) => WebDavMultistatus.fromXmlElement(xml.XmlDocument.parse(data).rootElement),
disableTimeout,
emitEmptyCache,
0,
);
@ -56,6 +60,7 @@ class RequestManager {
final String Function(R) serialize,
final R Function(String) deserialize,
final bool disableTimeout,
final bool emitEmptyCache,
final int retries,
) async {
if (subject.valueOrNull?.data != null) {
@ -73,21 +78,14 @@ class RequestManager {
final key = '$clientID-$k';
if (cache != null && await cache!.has(key)) {
try {
subject.add(
Result(
unwrap(await compute(deserialize, (await cache!.get(key))!)),
null,
loading: true,
cached: true,
),
);
} catch (e, s) {
debugPrint(e.toString());
debugPrint(s.toString());
}
}
await _emitCached(
key,
subject,
unwrap,
deserialize,
emitEmptyCache,
true,
);
try {
final response = await (disableTimeout ? call() : timeout(call));
@ -107,28 +105,53 @@ class RequestManager {
serialize,
deserialize,
disableTimeout,
emitEmptyCache,
retries + 1,
);
return;
}
if (!(await _emitCached(
key,
subject,
unwrap,
deserialize,
emitEmptyCache,
false,
))) {
subject.add(Result.error(e));
}
}
}
Future<bool> _emitCached<T, R>(
final String key,
final BehaviorSubject<Result<T>> subject,
final T Function(R) unwrap,
final R Function(String) deserialize,
final bool emitEmptyCache,
final bool loading,
) async {
T? cached;
try {
if (cache != null && await cache!.has(key)) {
try {
subject.add(
Result(
unwrap(await compute(deserialize, (await cache!.get(key))!)),
null,
loading: false,
cached: true,
),
);
return;
} catch (e, s) {
debugPrint(e.toString());
debugPrint(s.toString());
}
cached = unwrap(await compute(deserialize, (await cache!.get(key))!));
}
subject.add(Result.error(e));
} catch (e, s) {
debugPrint(e.toString());
debugPrint(s.toString());
}
if (cached != null || emitEmptyCache) {
subject.add(
Result(
cached,
null,
loading: loading,
cached: true,
),
);
return true;
}
return false;
}
static Future<T> timeout<T>(

Loading…
Cancel
Save