-
Notifications
You must be signed in to change notification settings - Fork 386
/
backoffs.ts
73 lines (64 loc) · 1.75 KB
/
backoffs.ts
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import { Job } from './job';
import { BackoffOptions } from '../interfaces/backoff-options';
interface BuiltInStrategies {
[index: string]: (delay: number) => BackoffFunction;
}
export interface Strategies {
[index: string]: BackoffFunction;
}
export type BackoffFunction = (
attemptsMade?: number,
err?: Error,
job?: Job,
) => number;
export class Backoffs {
static builtinStrategies: BuiltInStrategies = {
fixed: function (delay: number) {
return function (): number {
return delay;
};
},
exponential: function (delay: number) {
return function (attemptsMade: number): number {
return Math.round((Math.pow(2, attemptsMade) - 1) * delay);
};
},
};
static normalize(backoff: number | BackoffOptions): BackoffOptions {
if (Number.isFinite(<number>backoff)) {
return {
type: 'fixed',
delay: <number>backoff,
};
} else if (backoff) {
return <BackoffOptions>backoff;
}
}
static calculate(
backoff: BackoffOptions,
attemptsMade: number,
customStrategies: Strategies,
err: Error,
job: Job,
): number {
if (backoff) {
const strategy = lookupStrategy(backoff, customStrategies);
return strategy(attemptsMade, err, job);
}
}
}
function lookupStrategy(
backoff: BackoffOptions,
customStrategies: Strategies,
): BackoffFunction {
if (backoff.type in (customStrategies || {})) {
return customStrategies[backoff.type];
} else if (backoff.type in Backoffs.builtinStrategies) {
return Backoffs.builtinStrategies[backoff.type](backoff.delay);
} else {
throw new Error(
`Unknown backoff strategy ${backoff.type}.
If a custom backoff strategy is used, specify it when the queue is created.`,
);
}
}