dehydrate method

Map<String, dynamic> dehydrate({
  1. bool shouldDehydrate(
    1. QueryCacheEntry entry
    )?,
  2. dynamic serialize(
    1. dynamic data,
    2. List key
    )?,
})

Serializes only this scope's cache — never another request's state.

Implementation

Map<String, dynamic> dehydrate({
  bool Function(QueryCacheEntry<dynamic> entry)? shouldDehydrate,
  dynamic Function(dynamic data, List<dynamic> key)? serialize,
}) {
  _assertAlive();
  final queries = <Map<String, dynamic>>[];

  for (final entry in _cache.values) {
    if (entry.isExpired) continue;
    if (shouldDehydrate != null && !shouldDehydrate(entry)) continue;

    final dynamic serializedData;
    if (serialize != null) {
      serializedData = serialize(entry.data, entry.key);
    } else {
      serializedData = entry.data;
    }

    try {
      jsonEncode(serializedData);
    } catch (e) {
      throw ArgumentError(
        'Data for query key "${BloomData.normalizeKey(entry.key)}" is not JSON-encodable: $e. '
        'Provide a custom `serialize` function to dehydrate() to convert domain objects.',
      );
    }

    queries.add({
      'key': entry.key,
      'data': serializedData,
      'updatedAt': entry.updatedAt.toIso8601String(),
      'staleTimeMs': entry.staleTime.inMilliseconds,
      'cacheTimeMs': entry.cacheTime.inMilliseconds,
      'isStale': entry.isStale,
    });
  }

  return {'queries': queries};
}