github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/libkb/ratelimit.go (about) 1 // Copyright 2015 Keybase, Inc. All rights reserved. Use of 2 // this source code is governed by the included BSD license. 3 4 package libkb 5 6 import ( 7 "sync" 8 "time" 9 ) 10 11 type RateLimitCategory string 12 13 const ( 14 CheckTrackingRateLimit RateLimitCategory = "CheckTrackingRateLimit" 15 TestEventRateLimit RateLimitCategory = "TestEventRateLimit" 16 ) 17 18 type RateLimits struct { 19 Contextified 20 sync.Mutex 21 lastActionTimes map[RateLimitCategory]time.Time 22 } 23 24 func NewRateLimits(g *GlobalContext) *RateLimits { 25 return &RateLimits{ 26 lastActionTimes: make(map[RateLimitCategory]time.Time), 27 Contextified: NewContextified(g), 28 } 29 } 30 31 func (r *RateLimits) GetPermission(category RateLimitCategory, interval time.Duration) bool { 32 r.Lock() 33 defer r.Unlock() 34 now := time.Now() 35 last, exists := r.lastActionTimes[category] 36 if !exists { 37 r.G().Log.Debug("Rate limit %s checked for the first time.", category) 38 r.lastActionTimes[category] = now 39 return true 40 } 41 timeSince := now.Sub(last) 42 if timeSince >= interval { 43 r.G().Log.Debug("Rate limit %s passed.", category) 44 r.lastActionTimes[category] = now 45 return true 46 } 47 r.G().Log.Debug("Rate limit %s too recent.", category) 48 return false 49 }