mirror of
https://github.com/Dvorinka/excalidraw-full.git
synced 2026-06-03 22:02:57 +00:00
44 lines
754 B
Go
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
|
|
}
|