checkLimit method
Check whether a request with estimatedTokens can proceed.
Returns Duration.zero if the request can proceed immediately, or a positive duration indicating how long to wait.
Implementation
Duration checkLimit({int estimatedTokens = 0}) {
final now = DateTime.now();
final windowStart = now.subtract(const Duration(minutes: 1));
// Prune old entries outside the sliding window.
_requestTimestamps.removeWhere((t) => t.isBefore(windowStart));
_tokenRecords.removeWhere((r) => r.timestamp.isBefore(windowStart));
// Check request rate.
if (_requestTimestamps.length >= maxRequestsPerMinute) {
final oldest = _requestTimestamps.first;
final waitUntil = oldest.add(const Duration(minutes: 1));
final delay = waitUntil.difference(now);
if (delay > Duration.zero) return delay;
}
// Check token rate.
if (estimatedTokens > 0) {
final tokensInWindow = _tokenRecords.fold<int>(
0,
(sum, r) => sum + r.tokens,
);
if (tokensInWindow + estimatedTokens > maxTokensPerMinute) {
final oldest = _tokenRecords.first;
final waitUntil = oldest.timestamp.add(const Duration(minutes: 1));
final delay = waitUntil.difference(now);
if (delay > Duration.zero) return delay;
}
}
return Duration.zero;
}