package custom_errors import ( "context" "math/rand" "time" ) func computeBackoffDelay(retryCounter int, baseDelayMs int, maxDelayMs int, maxJitterMs int) time.Duration { if retryCounter < 0 { retryCounter = 0 } delay := max(time.Duration(baseDelayMs)*time.Millisecond, 0) maxDelay := time.Duration(maxDelayMs) * time.Millisecond for i := 0; i < retryCounter; i++ { if maxDelayMs > 0 && delay >= maxDelay { delay = maxDelay break } if delay == 0 { break } delay *= 2 } if maxDelayMs > 0 && delay > maxDelay { delay = maxDelay } if maxJitterMs > 0 { jitter := time.Duration(rand.Intn(maxJitterMs+1)) * time.Millisecond delay += jitter } if delay < 0 { delay = 0 } return delay } func requeueWithBackoff(ctx context.Context, delay time.Duration, enqueue func()) { if delay <= 0 { enqueue() return } go func() { timer := time.NewTimer(delay) defer timer.Stop() select { case <-ctx.Done(): return case <-timer.C: enqueue() } }() }