query method
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',
);
}