resolve method

Future<DVPageData?> resolve(
  1. DVPageRequest request,
  2. DVPageDataResolver resolver,
  3. DVPageDataMode mode
)

The data for request by mode: resolved, kept, served stale, or not asked for at all.

Implementation

Future<DVPageData?> resolve(DVPageRequest request, DVPageDataResolver resolver, DVPageDataMode mode) async {
  if (mode == DVPageDataMode.defer) return null;
  if (mode == DVPageDataMode.await_) return resolver(request);

  final String key = _keyFor(request);
  final _Kept? have = await _read(key);
  if (have != null && _now().difference(have.at) <= ttl) return have.data;
  if (mode == DVPageDataMode.staleWhileRevalidate && have != null) {
    if (_refreshing.add(key)) {
      unawaited(Future<DVPageData?>.value(resolver(request)).then((DVPageData? data) async {
        await _write(key, data);
      }).whenComplete(() => _refreshing.remove(key)));
    }
    return have.data;
  }
  final DVPageData? data = await resolver(request);
  await _write(key, data);
  return data;
}