query method

  1. @override
Future<NtpResponse> query({
  1. int samples = 1,
})
override

Queries the configured HTTP time endpoint and returns a full NtpResponse.

When samples > 1, performs multiple HTTP requests and selects the measurement with the lowest round-trip delay.

Implementation

@override
Future<NtpResponse> query({int samples = 1}) async {
  assert(samples >= 1, 'samples must be at least 1.');
  final uri = apiUrl != null ? Uri.parse(apiUrl!) : _defaultUri;

  ({int offsetMicros, int rttMicros})? bestSample;
  Object? lastError;
  StackTrace? lastStack;

  for (var i = 0; i < samples; i++) {
    try {
      final sample = await _querySingleWebSample(uri);
      if (bestSample == null || sample.rttMicros < bestSample.rttMicros) {
        bestSample = sample;
      }
    } catch (e, s) {
      lastError = e;
      lastStack = s;
      if (samples == 1) rethrow;
    }
  }

  if (bestSample == null) {
    Error.throwWithStackTrace(
      lastError ?? Exception('All $samples web time samples failed'),
      lastStack ?? StackTrace.current,
    );
  }

  final correctedTime = DateTime.now()
      .toUtc()
      .add(Duration(microseconds: bestSample.offsetMicros));

  return NtpResponse(
    dateTime: isUtc ? correctedTime : correctedTime.toLocal(),
    offset: Duration(microseconds: bestSample.offsetMicros),
    roundTripDelay: Duration(microseconds: bestSample.rttMicros),
    server: uri.toString(),
    stratum: 1,
    leapIndicator: 0,
    referenceId: 'WEB',
  );
}