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 }