From 2cd9a450fbf2b2dc67eba47de495e5851fe86c20 Mon Sep 17 00:00:00 2001 From: jld3103 Date: Sun, 23 Apr 2023 19:32:31 +0200 Subject: [PATCH] neon: Allow emitting empty cached values --- .../neon/lib/src/utils/request_manager.dart | 83 ++++++++++++------- 1 file changed, 53 insertions(+), 30 deletions(-) diff --git a/packages/neon/neon/lib/src/utils/request_manager.dart b/packages/neon/neon/lib/src/utils/request_manager.dart index 2dccced7..66f59fd7 100644 --- a/packages/neon/neon/lib/src/utils/request_manager.dart +++ b/packages/neon/neon/lib/src/utils/request_manager.dart @@ -14,6 +14,7 @@ class RequestManager { final Future Function() call, final T Function(R) unwrap, { final bool disableTimeout = false, + final bool emitEmptyCache = false, }) async => _wrap( clientID, @@ -24,6 +25,7 @@ class RequestManager { (final data) => json.encode(serializeNextcloud(data)), (final data) => deserializeNextcloud(json.decode(data)), disableTimeout, + emitEmptyCache, 0, ); @@ -34,6 +36,7 @@ class RequestManager { final Future Function() call, final T Function(WebDavMultistatus) unwrap, { final bool disableTimeout = false, + final bool emitEmptyCache = false, }) async => _wrap( 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 _emitCached( + final String key, + final BehaviorSubject> 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 timeout(