@@ -6,7 +6,9 @@ import type { ClearableSignal } from 'any-signal'
66
77export const DEFAULT_TIMEOUT_MULTIPLIER = 1.2
88export const DEFAULT_FAILURE_MULTIPLIER = 2
9- export const DEFAULT_MIN_TIMEOUT = 5000
9+ export const DEFAULT_MIN_TIMEOUT = 5_000
10+ export const DEFAULT_MAX_TIMEOUT = 60_000
11+ export const DEFAULT_INTERVAL = 5_000
1012
1113export interface AdaptiveTimeoutSignal extends ClearableSignal {
1214 start : number
@@ -20,6 +22,7 @@ export interface AdaptiveTimeoutInit {
2022 timeoutMultiplier ?: number
2123 failureMultiplier ?: number
2224 minTimeout ?: number
25+ maxTimeout ?: number
2326}
2427
2528export interface GetTimeoutSignalOptions {
@@ -35,14 +38,17 @@ export class AdaptiveTimeout {
3538 private readonly timeoutMultiplier : number
3639 private readonly failureMultiplier : number
3740 private readonly minTimeout : number
41+ private readonly maxTimeout : number
3842
3943 constructor ( init : AdaptiveTimeoutInit = { } ) {
40- this . success = new MovingAverage ( init . interval ?? 5000 )
41- this . failure = new MovingAverage ( init . interval ?? 5000 )
42- this . next = new MovingAverage ( init . interval ?? 5000 )
44+ const interval = init . interval ?? DEFAULT_INTERVAL
45+ this . success = new MovingAverage ( interval )
46+ this . failure = new MovingAverage ( interval )
47+ this . next = new MovingAverage ( interval )
4348 this . failureMultiplier = init . failureMultiplier ?? DEFAULT_FAILURE_MULTIPLIER
4449 this . timeoutMultiplier = init . timeoutMultiplier ?? DEFAULT_TIMEOUT_MULTIPLIER
4550 this . minTimeout = init . minTimeout ?? DEFAULT_MIN_TIMEOUT
51+ this . maxTimeout = init . maxTimeout ?? DEFAULT_MAX_TIMEOUT
4652
4753 if ( init . metricName != null ) {
4854 this . metric = init . metrics ?. registerMetricGroup ( init . metricName )
@@ -52,10 +58,16 @@ export class AdaptiveTimeout {
5258 getTimeoutSignal ( options : GetTimeoutSignalOptions = { } ) : AdaptiveTimeoutSignal {
5359 // calculate timeout for individual peers based on moving average of
5460 // previous successful requests
55- const timeout = Math . max (
56- Math . round ( this . next . movingAverage * ( options . timeoutFactor ?? this . timeoutMultiplier ) ) ,
57- this . minTimeout
58- )
61+ let timeout = Math . round ( this . next . movingAverage * ( options . timeoutFactor ?? this . timeoutMultiplier ) )
62+
63+ if ( timeout < this . minTimeout ) {
64+ timeout = this . minTimeout
65+ }
66+
67+ if ( timeout > this . maxTimeout ) {
68+ timeout = this . maxTimeout
69+ }
70+
5971 const sendTimeout = AbortSignal . timeout ( timeout )
6072 const timeoutSignal = anySignal ( [ options . signal , sendTimeout ] ) as AdaptiveTimeoutSignal
6173 setMaxListeners ( Infinity , timeoutSignal , sendTimeout )
0 commit comments