From da96ba14b46460c268dd4780ab64eaad0562624b Mon Sep 17 00:00:00 2001 From: Nathan Hack Date: Thu, 6 Feb 2025 19:12:18 -0500 Subject: [PATCH 1/2] add ratelimiter --- rest/client/client.go | 4 ++++ rest/models/request.go | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/rest/client/client.go b/rest/client/client.go index 5e5c85ad..094f983a 100644 --- a/rest/client/client.go +++ b/rest/client/client.go @@ -76,6 +76,10 @@ func (c *Client) CallURL(ctx context.Context, method, uri string, response any, req.SetHeaderMultiValues(options.Headers) req.SetResult(response).SetError(&models.ErrorResponse{}) + if options.Limiter != nil { + options.Limiter.Take() + } + res, err := req.Execute(method, uri) if err != nil { return fmt.Errorf("failed to execute request: %w", err) diff --git a/rest/models/request.go b/rest/models/request.go index b26bb596..1a335dda 100644 --- a/rest/models/request.go +++ b/rest/models/request.go @@ -3,6 +3,7 @@ package models import ( "net/http" "net/url" + "time" ) // RequestOptions are used to configure client calls. @@ -18,6 +19,9 @@ type RequestOptions struct { // Trace enables request tracing Trace bool + + // Limiter used to rate limit requests + Limiter RateLimiter } // RequestOption changes the configuration of RequestOptions. @@ -85,3 +89,14 @@ func WithTrace(trace bool) RequestOption { o.Trace = trace } } + +type RateLimiter interface { + Take() time.Time +} + +// WithTrace enables or disables request tracing. +func WithRateLimiter(limiter RateLimiter) RequestOption { + return func(o *RequestOptions) { + o.Limiter = limiter + } +} From 3b9a3262745d99d89ed7510e797dbf74109d90ce Mon Sep 17 00:00:00 2001 From: Nathan Hack Date: Thu, 6 Feb 2025 19:16:56 -0500 Subject: [PATCH 2/2] update comment --- rest/models/request.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest/models/request.go b/rest/models/request.go index 1a335dda..e67ec9d1 100644 --- a/rest/models/request.go +++ b/rest/models/request.go @@ -94,7 +94,7 @@ type RateLimiter interface { Take() time.Time } -// WithTrace enables or disables request tracing. +// WithRateLimiter sets Ratelimiter to limit request rate. func WithRateLimiter(limiter RateLimiter) RequestOption { return func(o *RequestOptions) { o.Limiter = limiter