gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }