call method

R call(
  1. List args
)

Implementation

R call(List<dynamic> args) {
  final key = _makeKey(args);
  final cached = _cache[key];
  final now = DateTime.now().millisecondsSinceEpoch;

  // Populate cache
  if (cached == null) {
    final value = _fn(args);
    _cache[key] = _CacheEntry(value: value, timestamp: now);
    return value;
  }

  // If stale and not already refreshing
  if (now - cached.timestamp > cacheLifetime.inMilliseconds &&
      !cached.refreshing) {
    cached.refreshing = true;

    // Schedule async refresh (non-blocking)
    final staleEntry = cached;
    Future.microtask(() {
      try {
        final newValue = _fn(args);
        if (_cache[key] == staleEntry) {
          _cache[key] = _CacheEntry(
            value: newValue,
            timestamp: DateTime.now().millisecondsSinceEpoch,
          );
        }
      } catch (_) {
        if (_cache[key] == staleEntry) {
          _cache.remove(key);
        }
      }
    });

    return cached.value;
  }

  return _cache[key]!.value;
}