check static method

Future<bool> check()

Returns true if online. Caches result for _recheckInterval.

Implementation

static Future<bool> check() async {
  // Return cached result if recent enough
  if (_lastCheckTime != null &&
      DateTime.now().difference(_lastCheckTime!) < _recheckInterval) {
    return _lastResult;
  }

  // Prevent concurrent checks
  if (_isChecking) {
    // Wait for ongoing check (max 6s)
    for (var i = 0; i < 60; i++) {
      await Future.delayed(const Duration(milliseconds: 100));
      if (!_isChecking) return _lastResult;
    }
    return _lastResult;
  }

  _isChecking = true;

  try {
    final result = await InternetAddress.lookup(
      'google.com',
    ).timeout(const Duration(seconds: 5));
    _lastResult = result.isNotEmpty && result.first.rawAddress.isNotEmpty;
  } on SocketException {
    _lastResult = false;
  } on TimeoutException {
    _lastResult = false;
  } catch (_) {
    _lastResult = false;
  } finally {
    _lastCheckTime = DateTime.now();
    _isChecking = false;
  }

  dPrint(
    '🌐 AdsConnectivity: ${_lastResult ? "Online ✅" : "Offline ❌"} '
    '(next check in ${_recheckInterval.inSeconds}s)',
  );

  return _lastResult;
}