package session import ( "sync" "time" ) // limiterBase and limiterCap bound the exponential backoff: 1s, 2s, 4s, ... // capped at 30s. const ( limiterBase = 1 * time.Second limiterCap = 30 * time.Second // maxShift keeps 1< maxShift { shift = maxShift } backoff := limiterBase * time.Duration(1< limiterCap { backoff = limiterCap } st.blockedUntil = time.Now().Add(backoff) return backoff } // Reset clears key's failure history after a successful login. func (l *Limiter) Reset(key string) { l.mu.Lock() delete(l.state, key) l.mu.Unlock() }