aboutsummaryrefslogtreecommitdiffstats
path: root/node_modules/exponential-backoff/src/delay/delay.base.ts
blob: bed90d67b5ffd24b353a4895a712c2e3910db865 (plain)
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
import { IDelay } from "./delay.interface";
import { IBackOffOptions } from "../options";
import { JitterFactory } from "../jitter/jitter.factory";

export abstract class Delay implements IDelay {
  protected attempt = 0;
  constructor(private options: IBackOffOptions) {}

  public apply() {
    return new Promise(resolve => setTimeout(resolve, this.jitteredDelay));
  }

  public setAttemptNumber(attempt: number) {
    this.attempt = attempt;
  }

  private get jitteredDelay() {
    const jitter = JitterFactory(this.options);
    return jitter(this.delay);
  }

  private get delay() {
    const constant = this.options.startingDelay;
    const base = this.options.timeMultiple;
    const power = this.numOfDelayedAttempts;
    const delay = constant * Math.pow(base, power);

    return Math.min(delay, this.options.maxDelay);
  }

  protected get numOfDelayedAttempts() {
    return this.attempt;
  }
}