pomerium/internal/retry/backoff.go
2024-06-12 16:31:42 -04:00

24 lines
542 B
Go

package retry
import (
"context"
"github.com/cenkalti/backoff/v4"
)
// WithBackoff retries the given function with an exponential backoff,
// stopping when the context is done or the function returns a terminal error.
func WithBackoff(ctx context.Context, fn func(context.Context) error) error {
b := backoff.NewExponentialBackOff()
b.MaxElapsedTime = 0
return backoff.Retry(
func() error {
err := fn(ctx)
if IsTerminalError(err) {
return backoff.Permanent(err)
}
return err
},
backoff.WithContext(b, ctx),
)
}