useTTLSub function

void useTTLSub({
  1. required DAQCache cache,
  2. required List<String> cacheKeys,
  3. required Duration timeToLive,
  4. required VoidCallback onExpired,
  5. Duration checkInterval = const Duration(minutes: 1),
  6. String? logPrefix,
})

Add TTL (Time To Live) subscription to periodically check cache entries and trigger refetch when they expire

Implementation

void useTTLSub({
  required DAQCache cache,
  required List<String> cacheKeys,
  required Duration timeToLive,
  required VoidCallback onExpired,
  Duration checkInterval = const Duration(minutes: 1),
  String? logPrefix,
}) {
  useEffect(() {
    late Timer ttlTimer;

    // Function to check if any cache entries have expired
    void checkTTL() {
      final now = DateTime.now();
      bool hasExpiredEntries = false;

      for (final cacheKey in cacheKeys) {
        if (cache.hasKey(cacheKey)) {
          final cacheEntry = cache.getEntry(cacheKey);
          if (cacheEntry != null) {
            final timeSinceWrite = now.difference(cacheEntry.lastWriteTime);

            if (timeSinceWrite >= timeToLive) {
              hasExpiredEntries = true;

              final logMessage = logPrefix != null
                  ? 'TTL expired for $logPrefix cache key: $cacheKey'
                  : 'TTL expired for cache key: $cacheKey';

              DAQLogger.instance.query(logMessage);
              break;
            }
          }
        }
      }

      // Trigger refetch if any entries have expired
      if (hasExpiredEntries) {
        final logMessage = logPrefix != null
            ? 'Auto-refetching $logPrefix due to TTL expiration'
            : 'Auto-refetching due to TTL expiration';

        DAQLogger.instance.info(logMessage, 'DAQ TTL Sub');
        onExpired();
      }
    }

    // Start the periodic TTL check timer
    ttlTimer = Timer.periodic(checkInterval, (_) {
      checkTTL();
    });

    return ttlTimer.cancel;
  }, [cache, cacheKeys, timeToLive, checkInterval]);
}