Files
Excalidraw/workspace/rate_limiter.go
T

44 lines
754 B
Go

package workspace
import (
"sync"
"time"
)
type rateLimiter struct {
mu sync.Mutex
limit int
window time.Duration
attempts map[string][]time.Time
}
func newRateLimiter(limit int, window time.Duration) *rateLimiter {
return &rateLimiter{
limit: limit,
window: window,
attempts: make(map[string][]time.Time),
}
}
func (l *rateLimiter) allow(key string) bool {
l.mu.Lock()
defer l.mu.Unlock()
now := time.Now()
cutoff := now.Add(-l.window)
values := l.attempts[key]
kept := values[:0]
for _, value := range values {
if value.After(cutoff) {
kept = append(kept, value)
}
}
if len(kept) >= l.limit {
l.attempts[key] = kept
return false
}
kept = append(kept, now)
l.attempts[key] = kept
return true
}