-
Notifications
You must be signed in to change notification settings - Fork 357
/
backoffs.ts
65 lines (58 loc) · 1.64 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
import { BackoffOptions, MinimalJob } from '../interfaces';
import { BackoffStrategy } from '../types';
export interface BuiltInStrategies {
[index: string]: (delay: number) => BackoffStrategy;
}
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 | undefined {
if (Number.isFinite(<number>backoff)) {
return {
type: 'fixed',
delay: <number>backoff,
};
} else if (backoff) {
return <BackoffOptions>backoff;
}
}
static calculate(
backoff: BackoffOptions,
attemptsMade: number,
err: Error,
job: MinimalJob,
customStrategy?: BackoffStrategy,
): Promise<number> | number | undefined {
if (backoff) {
const strategy = lookupStrategy(backoff, customStrategy);
return strategy(attemptsMade, backoff.type, err, job);
}
}
}
function lookupStrategy(
backoff: BackoffOptions,
customStrategy?: BackoffStrategy,
): BackoffStrategy {
if (backoff.type in Backoffs.builtinStrategies) {
return Backoffs.builtinStrategies[backoff.type](backoff.delay!);
} else if (customStrategy) {
return customStrategy;
} else {
throw new Error(
`Unknown backoff strategy ${backoff.type}.
If a custom backoff strategy is used, specify it when the queue is created.`,
);
}
}