checkLimit method

Duration checkLimit({
  1. int estimatedTokens = 0,
})

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;
}