limiter.go (1773B)
1 package limiter 2 3 import ( 4 "context" 5 ) 6 7 // ----------------------------------------------------------------- 8 // Context 9 // ----------------------------------------------------------------- 10 11 // Context is the limit context. 12 type Context struct { 13 Limit int64 14 Remaining int64 15 Reset int64 16 Reached bool 17 } 18 19 // ----------------------------------------------------------------- 20 // Limiter 21 // ----------------------------------------------------------------- 22 23 // Limiter is the limiter instance. 24 type Limiter struct { 25 Store Store 26 Rate Rate 27 Options Options 28 } 29 30 // New returns an instance of Limiter. 31 func New(store Store, rate Rate, options ...Option) *Limiter { 32 opt := Options{ 33 IPv4Mask: DefaultIPv4Mask, 34 IPv6Mask: DefaultIPv6Mask, 35 TrustForwardHeader: false, 36 } 37 for _, o := range options { 38 o(&opt) 39 } 40 return &Limiter{ 41 Store: store, 42 Rate: rate, 43 Options: opt, 44 } 45 } 46 47 // Get returns the limit for given identifier. 48 func (limiter *Limiter) Get(ctx context.Context, key string) (Context, error) { 49 return limiter.Store.Get(ctx, key, limiter.Rate) 50 } 51 52 // Peek returns the limit for given identifier, without modification on current values. 53 func (limiter *Limiter) Peek(ctx context.Context, key string) (Context, error) { 54 return limiter.Store.Peek(ctx, key, limiter.Rate) 55 } 56 57 // Reset sets the limit for given identifier to zero. 58 func (limiter *Limiter) Reset(ctx context.Context, key string) (Context, error) { 59 return limiter.Store.Reset(ctx, key, limiter.Rate) 60 } 61 62 // Increment increments the limit by given count & gives back the new limit for given identifier 63 func (limiter *Limiter) Increment(ctx context.Context, key string, count int64) (Context, error) { 64 return limiter.Store.Increment(ctx, key, count, limiter.Rate) 65 }