wangzhibo
2026-05-09 53418655c061ac26f66058253f39200aced1ab1d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
 
export class ExponentialRetryStrategy {
    // Minimum backoff time in milliseconds
    private minExponentialBackoff: number;
    // Maximum backoff time in milliseconds
    private maxExponentialBackoff: number;
    // Maximum backoff time in milliseconds
    private exponentialDeltaBackoff: number;
 
    constructor(
        minExponentialBackoff: number,
        maxExponentialBackoff: number,
        exponentialDeltaBackoff: number
    ) {
        this.minExponentialBackoff = minExponentialBackoff;
        this.maxExponentialBackoff = maxExponentialBackoff;
        this.exponentialDeltaBackoff = exponentialDeltaBackoff;
    }
 
    /**
     * Calculates the exponential delay based on the current retry attempt.
     *
     * @param {number} currentRetry - The current retry attempt number.
     * @returns {number} - The calculated exponential delay in milliseconds.
     *
     * The delay is calculated using the formula:
     * - If `currentRetry` is 0, it returns the minimum backoff time.
     * - Otherwise, it calculates the delay as the minimum of:
     *   - `(2^(currentRetry - 1)) * deltaBackoff`
     *   - `maxBackoff`
     *
     * This ensures that the delay increases exponentially with each retry attempt,
     * but does not exceed the maximum backoff time.
     */
    public calculateDelay(currentRetry: number): number {
        // Attempt 1
        if (currentRetry === 0) {
            return this.minExponentialBackoff;
        }
 
        // Attempt 2+
        const exponentialDelay = Math.min(
            Math.pow(2, currentRetry - 1) * this.exponentialDeltaBackoff,
            this.maxExponentialBackoff
        );
 
        return exponentialDelay;
    }
}