@@ -6,7 +6,9 @@ import type { ClearableSignal } from 'any-signal'
6
6
7
7
export const DEFAULT_TIMEOUT_MULTIPLIER = 1.2
8
8
export 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
10
12
11
13
export interface AdaptiveTimeoutSignal extends ClearableSignal {
12
14
start : number
@@ -20,6 +22,7 @@ export interface AdaptiveTimeoutInit {
20
22
timeoutMultiplier ?: number
21
23
failureMultiplier ?: number
22
24
minTimeout ?: number
25
+ maxTimeout ?: number
23
26
}
24
27
25
28
export interface GetTimeoutSignalOptions {
@@ -35,14 +38,17 @@ export class AdaptiveTimeout {
35
38
private readonly timeoutMultiplier : number
36
39
private readonly failureMultiplier : number
37
40
private readonly minTimeout : number
41
+ private readonly maxTimeout : number
38
42
39
43
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 )
43
48
this . failureMultiplier = init . failureMultiplier ?? DEFAULT_FAILURE_MULTIPLIER
44
49
this . timeoutMultiplier = init . timeoutMultiplier ?? DEFAULT_TIMEOUT_MULTIPLIER
45
50
this . minTimeout = init . minTimeout ?? DEFAULT_MIN_TIMEOUT
51
+ this . maxTimeout = init . maxTimeout ?? DEFAULT_MAX_TIMEOUT
46
52
47
53
if ( init . metricName != null ) {
48
54
this . metric = init . metrics ?. registerMetricGroup ( init . metricName )
@@ -52,10 +58,16 @@ export class AdaptiveTimeout {
52
58
getTimeoutSignal ( options : GetTimeoutSignalOptions = { } ) : AdaptiveTimeoutSignal {
53
59
// calculate timeout for individual peers based on moving average of
54
60
// 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
+
59
71
const sendTimeout = AbortSignal . timeout ( timeout )
60
72
const timeoutSignal = anySignal ( [ options . signal , sendTimeout ] ) as AdaptiveTimeoutSignal
61
73
setMaxListeners ( Infinity , timeoutSignal , sendTimeout )
0 commit comments