Files
sing-box-extended/transport/call/common/jitter.go

41 lines
919 B
Go

package common
import (
"math/rand/v2"
"time"
)
const backoffJitterFloorDivisor = 4
func BackoffWithJitter(attempt int, initialDelay, maxDelay time.Duration) time.Duration {
if initialDelay <= 0 {
return 0
}
if maxDelay < initialDelay {
maxDelay = initialDelay
}
if attempt < 0 {
attempt = 0
}
ceiling := maxDelay
if shifted := initialDelay << uint(attempt); shifted > 0 && shifted < maxDelay {
ceiling = shifted
}
floor := ceiling / backoffJitterFloorDivisor
return floor + time.Duration(rand.Int64N(int64(ceiling-floor)+1))
}
func DurationInRange(minDuration, maxDuration time.Duration) time.Duration {
if maxDuration <= minDuration {
return minDuration
}
return minDuration + time.Duration(rand.Int64N(int64(maxDuration-minDuration)+1))
}
func IntInRange(minValue, maxValue int) int {
if maxValue <= minValue {
return minValue
}
return minValue + rand.IntN(maxValue-minValue+1)
}