private int GetNextCallTime() { var nextCallTime = 0; if (RateLimits.Any()) { lock (_lock) { nextCallTime = RateLimits .Max(l => l.GetNextAllowedCallTime(CallTracker)); CallTracker.CallWillHappenIn(nextCallTime); CallTracker.TrimCallsForRateLimits(RateLimits); } } return(nextCallTime); }
internal override int GetNextAllowedCallTime(CallTracker callTracker) { var callHistory = callTracker.CallHistory .OrderByDescending(x => x) .Take(Amount) .ToList(); if (!callHistory.Any() || callHistory.Count < Amount) { return(0); } var earliestCallTime = callHistory.OrderBy(x => x).First(); var nextCallTime = earliestCallTime.Add(TimeSpan.FromMilliseconds(TimeFrame.TotalMilliseconds)); var untilNextCall = nextCallTime.Subtract(ReferenceTime.UtcNow); var milliseconds = untilNextCall.TotalMilliseconds < 0 ? 0 : untilNextCall.TotalMilliseconds; return((int)Math.Ceiling(milliseconds)); }
/// <summary> /// Gets the next allowed call time in milliseconds /// </summary> /// <returns></returns> internal abstract int GetNextAllowedCallTime(CallTracker callTracker);
public RateLimiter(params RateLimit[] rateLimits) { RateLimits = rateLimits.ToList(); CallTracker = new CallTracker(); }