typescript-retry-decorator 2.3.0 → 2.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/retry.decorator.d.ts +5 -1
- package/dist/retry.decorator.d.ts.map +1 -1
- package/dist/retry.decorator.js +6 -3
- package/dist/retry.decorator.js.map +1 -1
- package/dist/retry.decorator.test.js +24 -12
- package/dist/retry.decorator.test.js.map +1 -1
- package/package.json +1 -1
- package/src/retry.decorator.test.ts +32 -16
- package/src/retry.decorator.ts +17 -4
- package/tsconfig.json +1 -0
|
@@ -7,6 +7,9 @@ export declare function Retryable(options: RetryOptions): DecoratorFunction;
|
|
|
7
7
|
export declare class MaxAttemptsError extends Error {
|
|
8
8
|
code: string;
|
|
9
9
|
}
|
|
10
|
+
interface ConstructableError {
|
|
11
|
+
new (...args: any[]): Error;
|
|
12
|
+
}
|
|
10
13
|
export interface RetryOptions {
|
|
11
14
|
backOffPolicy?: BackOffPolicy;
|
|
12
15
|
backOff?: number;
|
|
@@ -21,7 +24,7 @@ export interface RetryOptions {
|
|
|
21
24
|
backoffStrategy?: ExponentialBackoffStrategy;
|
|
22
25
|
};
|
|
23
26
|
maxAttempts: number;
|
|
24
|
-
value?:
|
|
27
|
+
value?: ConstructableError[];
|
|
25
28
|
useConsoleLogger?: boolean;
|
|
26
29
|
useOriginalError?: boolean;
|
|
27
30
|
}
|
|
@@ -44,4 +47,5 @@ export declare enum ExponentialBackoffStrategy {
|
|
|
44
47
|
EqualJitter = "EqualJitter"
|
|
45
48
|
}
|
|
46
49
|
export declare type DecoratorFunction = (target: Record<string, any>, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) => TypedPropertyDescriptor<any>;
|
|
50
|
+
export {};
|
|
47
51
|
//# sourceMappingURL=retry.decorator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.decorator.d.ts","sourceRoot":"","sources":["../src/retry.decorator.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"retry.decorator.d.ts","sourceRoot":"","sources":["../src/retry.decorator.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,iBAAiB,CAkGlE;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,IAAI,SAAS;CAMd;AAED,UAAU,kBAAkB;IAC1B,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB;;;WAGG;QACH,eAAe,CAAC,EAAE,0BAA0B,CAAC;KAC9C,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,oBAAY,aAAa;IACvB,kBAAkB,uBAAuB;IACzC,wBAAwB,6BAA6B;CACtD;AAED;;;GAGG;AACH,oBAAY,0BAA0B;IACpC;;OAEG;IACH,UAAU,eAAe;IACzB;;OAEG;IACH,WAAW,gBAAgB;CAC5B;AAED,oBAAY,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,uBAAuB,CAAC,GAAG,CAAC,KAAK,uBAAuB,CAAC,GAAG,CAAC,CAAC"}
|
package/dist/retry.decorator.js
CHANGED
|
@@ -68,9 +68,12 @@ function Retryable(options) {
|
|
|
68
68
|
if (!canRetry(e)) {
|
|
69
69
|
throw e;
|
|
70
70
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
if (backOff) {
|
|
72
|
+
yield (0, utils_1.sleep)(applyBackoffStrategy(backOff));
|
|
73
|
+
if (options.exponentialOption &&
|
|
74
|
+
options.backOffPolicy === BackOffPolicy.ExponentialBackOffPolicy) {
|
|
75
|
+
backOff = Math.min(backOff * options.exponentialOption.multiplier, options.exponentialOption.maxInterval);
|
|
76
|
+
}
|
|
74
77
|
}
|
|
75
78
|
return retryAsync.apply(this, [fn, args, maxAttempts, backOff]);
|
|
76
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.decorator.js","sourceRoot":"","sources":["../src/retry.decorator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAgC;AAEhC;;;;GAIG;AACH,SAAgB,SAAS,CAAC,OAAqB;IAC7C;;;;;;;;OAQG;IACH,OAAO,UAAS,MAA2B,EAAE,WAAmB,EAAE,UAAwC;QACxG,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC;QACpC,iDAAiD;QACjD,IAAI,OAAO,CAAC,aAAa,KAAK,aAAa,CAAC,wBAAwB,EAAE;YACpE,kCAAkC,EAAE,CAAC;SACtC;QACD,UAAU,CAAC,KAAK,GAAG,UAAe,GAAG,IAAW;;gBAC9C,IAAI;oBACF,OAAO,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;iBAC/F;gBAAC,OAAO,CAAC,EAAE;oBACV,IAAI,CAAC,YAAY,gBAAgB,EAAE;wBACjC,MAAM,SAAS,GAAG,eAAe,WAAW,SAAS,OAAO,CAAC,WAAW,SAAS,CAAC;wBAClF,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;qBACjF;oBACD,MAAM,CAAC,CAAC;iBACT;YACH,CAAC;SAAA,CAAC;QACF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;IAEF,SAAe,UAAU,CAAC,EAAa,EAAE,IAAW,EAAE,WAAmB,EAAE,OAAgB;;YACzF,IAAI;gBACF,OAAO,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;aACnC;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI,EAAE,WAAW,GAAG,CAAC,EAAE;oBACrB,CAAC,OAAO,OAAO,CAAC,gBAAgB,KAAK,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC,KAAI,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,OAAO,CAAA,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBACtH,IAAG,OAAO,CAAC,gBAAgB;wBAAE,MAAM,CAAC,CAAC;oBACrC,MAAM,wBAAwB,GAAG,IAAK,gBAAgB,CAAC,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,OAAO,CAAC,CAAC;oBACnE,0CAA0C;oBAC1C,IAAG,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,KAAK,EAAE;wBACX,wBAAwB,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;qBAC1C;oBAED,MAAM,wBAAwB,CAAC;iBAChC;gBACD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;oBAChB,MAAM,CAAC,CAAC;iBACT;gBACD,OAAO,
|
|
1
|
+
{"version":3,"file":"retry.decorator.js","sourceRoot":"","sources":["../src/retry.decorator.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,11 +19,25 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
19
19
|
};
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
21
|
const retry_decorator_1 = require("./retry.decorator");
|
|
22
|
+
const utils_1 = require("./utils");
|
|
23
|
+
jest.mock('./utils', () => ({
|
|
24
|
+
sleep: jest.fn()
|
|
25
|
+
}));
|
|
26
|
+
// CustomError for testing.
|
|
27
|
+
class CustomError extends Error {
|
|
28
|
+
constructor(message) {
|
|
29
|
+
// Call the parent class constructor with the provided message
|
|
30
|
+
super(message);
|
|
31
|
+
// Set the prototype and name properties
|
|
32
|
+
Object.setPrototypeOf(this, CustomError.prototype);
|
|
33
|
+
this.name = 'CustomError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
22
36
|
class TestClass {
|
|
23
37
|
constructor() {
|
|
24
38
|
this.count = 0;
|
|
25
39
|
}
|
|
26
|
-
|
|
40
|
+
testMethodWithoutBackOff() {
|
|
27
41
|
return __awaiter(this, void 0, void 0, function* () {
|
|
28
42
|
console.log(`test method is called for ${++this.count} time`);
|
|
29
43
|
yield this.called();
|
|
@@ -81,9 +95,9 @@ __decorate([
|
|
|
81
95
|
__metadata("design:type", Function),
|
|
82
96
|
__metadata("design:paramtypes", []),
|
|
83
97
|
__metadata("design:returntype", Promise)
|
|
84
|
-
], TestClass.prototype, "
|
|
98
|
+
], TestClass.prototype, "testMethodWithoutBackOff", null);
|
|
85
99
|
__decorate([
|
|
86
|
-
(0, retry_decorator_1.Retryable)({ maxAttempts:
|
|
100
|
+
(0, retry_decorator_1.Retryable)({ maxAttempts: 3, value: [SyntaxError, ReferenceError, CustomError] }),
|
|
87
101
|
__metadata("design:type", Function),
|
|
88
102
|
__metadata("design:paramtypes", []),
|
|
89
103
|
__metadata("design:returntype", Promise)
|
|
@@ -151,7 +165,7 @@ describe('Capture original error data Test', () => {
|
|
|
151
165
|
const calledSpy = jest.spyOn(testClass, 'called');
|
|
152
166
|
calledSpy.mockRejectedValue(unexpectedError);
|
|
153
167
|
try {
|
|
154
|
-
yield testClass.
|
|
168
|
+
yield testClass.testMethodWithoutBackOff();
|
|
155
169
|
}
|
|
156
170
|
catch (e) {
|
|
157
171
|
expect(e.stack).toEqual(originalStackTrace);
|
|
@@ -163,19 +177,20 @@ describe('Retry Test', () => {
|
|
|
163
177
|
beforeEach(() => {
|
|
164
178
|
testClass = new TestClass();
|
|
165
179
|
});
|
|
166
|
-
test('normal retry', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
180
|
+
test('normal retry without backoff', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
167
181
|
const calledSpy = jest.spyOn(testClass, 'called');
|
|
168
182
|
calledSpy.mockRejectedValueOnce(new Error('rejected'));
|
|
169
183
|
calledSpy.mockResolvedValueOnce('fulfilled');
|
|
170
|
-
yield testClass.
|
|
184
|
+
yield testClass.testMethodWithoutBackOff();
|
|
171
185
|
expect(calledSpy).toHaveBeenCalledTimes(2);
|
|
186
|
+
expect(utils_1.sleep).toHaveBeenCalledTimes(0);
|
|
172
187
|
}));
|
|
173
188
|
test('exceed max retry', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
174
189
|
const calledSpy = jest.spyOn(testClass, 'called');
|
|
175
190
|
const errorMsg = 'rejected';
|
|
176
191
|
calledSpy.mockRejectedValue(new Error(errorMsg));
|
|
177
192
|
try {
|
|
178
|
-
yield testClass.
|
|
193
|
+
yield testClass.testMethodWithoutBackOff();
|
|
179
194
|
}
|
|
180
195
|
catch (e) {
|
|
181
196
|
expect(e).toBeInstanceOf(retry_decorator_1.MaxAttemptsError);
|
|
@@ -185,7 +200,7 @@ describe('Retry Test', () => {
|
|
|
185
200
|
}));
|
|
186
201
|
test('retry with specific error', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
187
202
|
const calledSpy = jest.spyOn(testClass, 'called');
|
|
188
|
-
calledSpy.mockImplementationOnce(() => { throw new
|
|
203
|
+
calledSpy.mockImplementationOnce(() => { throw new CustomError('I failed!'); });
|
|
189
204
|
yield testClass.testMethodWithException();
|
|
190
205
|
expect(calledSpy).toHaveBeenCalledTimes(2);
|
|
191
206
|
}));
|
|
@@ -247,13 +262,10 @@ describe('Retry Test', () => {
|
|
|
247
262
|
const errorSpy = jest.spyOn(console, 'error');
|
|
248
263
|
calledSpy.mockRejectedValueOnce(new Error('rejected'));
|
|
249
264
|
calledSpy.mockResolvedValueOnce('fulfilled');
|
|
250
|
-
yield testClass.
|
|
265
|
+
yield testClass.testMethodWithoutBackOff();
|
|
251
266
|
expect(calledSpy).toHaveBeenCalledTimes(2);
|
|
252
267
|
expect(errorSpy).not.toHaveBeenCalled();
|
|
253
268
|
}));
|
|
254
|
-
// CustomError for testing.
|
|
255
|
-
class CustomError extends Error {
|
|
256
|
-
}
|
|
257
269
|
test('throw original error', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
258
270
|
jest.setTimeout(60000);
|
|
259
271
|
const calledSpy = jest.spyOn(testClass, 'called');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.decorator.test.js","sourceRoot":"","sources":["../src/retry.decorator.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"retry.decorator.test.js","sourceRoot":"","sources":["../src/retry.decorator.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,4 +1,21 @@
|
|
|
1
|
-
import {BackOffPolicy, ExponentialBackoffStrategy, MaxAttemptsError, Retryable} from './retry.decorator';
|
|
1
|
+
import { BackOffPolicy, ExponentialBackoffStrategy, MaxAttemptsError, Retryable } from './retry.decorator';
|
|
2
|
+
import { sleep } from './utils';
|
|
3
|
+
|
|
4
|
+
jest.mock('./utils', () => ({
|
|
5
|
+
sleep: jest.fn()
|
|
6
|
+
}));
|
|
7
|
+
|
|
8
|
+
// CustomError for testing.
|
|
9
|
+
class CustomError extends Error {
|
|
10
|
+
constructor(message?: string) {
|
|
11
|
+
// Call the parent class constructor with the provided message
|
|
12
|
+
super(message);
|
|
13
|
+
|
|
14
|
+
// Set the prototype and name properties
|
|
15
|
+
Object.setPrototypeOf(this, CustomError.prototype);
|
|
16
|
+
this.name = 'CustomError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
2
19
|
|
|
3
20
|
class TestClass {
|
|
4
21
|
count: number;
|
|
@@ -6,12 +23,12 @@ class TestClass {
|
|
|
6
23
|
this.count = 0;
|
|
7
24
|
}
|
|
8
25
|
@Retryable({ maxAttempts: 2 })
|
|
9
|
-
async
|
|
26
|
+
async testMethodWithoutBackOff(): Promise<void> {
|
|
10
27
|
console.log(`test method is called for ${++this.count} time`);
|
|
11
28
|
await this.called();
|
|
12
29
|
}
|
|
13
30
|
|
|
14
|
-
@Retryable({ maxAttempts:
|
|
31
|
+
@Retryable({ maxAttempts: 3, value: [SyntaxError, ReferenceError, CustomError] })
|
|
15
32
|
async testMethodWithException(): Promise<void> {
|
|
16
33
|
console.log(`test method is called for ${++this.count} time`);
|
|
17
34
|
await this.called();
|
|
@@ -88,7 +105,7 @@ describe('Capture original error data Test', () => {
|
|
|
88
105
|
|
|
89
106
|
calledSpy.mockRejectedValue(unexpectedError);
|
|
90
107
|
try {
|
|
91
|
-
await testClass.
|
|
108
|
+
await testClass.testMethodWithoutBackOff();
|
|
92
109
|
} catch (e) {
|
|
93
110
|
expect(e.stack).toEqual(originalStackTrace);
|
|
94
111
|
}
|
|
@@ -102,12 +119,13 @@ describe('Retry Test', () => {
|
|
|
102
119
|
testClass = new TestClass();
|
|
103
120
|
});
|
|
104
121
|
|
|
105
|
-
test('normal retry', async () => {
|
|
122
|
+
test('normal retry without backoff', async () => {
|
|
106
123
|
const calledSpy = jest.spyOn(testClass, 'called');
|
|
107
124
|
calledSpy.mockRejectedValueOnce(new Error('rejected'));
|
|
108
125
|
calledSpy.mockResolvedValueOnce('fulfilled');
|
|
109
|
-
await testClass.
|
|
126
|
+
await testClass.testMethodWithoutBackOff();
|
|
110
127
|
expect(calledSpy).toHaveBeenCalledTimes(2);
|
|
128
|
+
expect(sleep).toHaveBeenCalledTimes(0);
|
|
111
129
|
});
|
|
112
130
|
|
|
113
131
|
test('exceed max retry', async () => {
|
|
@@ -115,7 +133,7 @@ describe('Retry Test', () => {
|
|
|
115
133
|
const errorMsg = 'rejected';
|
|
116
134
|
calledSpy.mockRejectedValue(new Error(errorMsg));
|
|
117
135
|
try {
|
|
118
|
-
await testClass.
|
|
136
|
+
await testClass.testMethodWithoutBackOff();
|
|
119
137
|
} catch (e) {
|
|
120
138
|
expect(e).toBeInstanceOf(MaxAttemptsError);
|
|
121
139
|
expect(e.message.includes(errorMsg));
|
|
@@ -125,7 +143,7 @@ describe('Retry Test', () => {
|
|
|
125
143
|
|
|
126
144
|
test('retry with specific error', async () => {
|
|
127
145
|
const calledSpy = jest.spyOn(testClass, 'called');
|
|
128
|
-
calledSpy.mockImplementationOnce(() => { throw new
|
|
146
|
+
calledSpy.mockImplementationOnce(() => { throw new CustomError('I failed!'); });
|
|
129
147
|
await testClass.testMethodWithException();
|
|
130
148
|
expect(calledSpy).toHaveBeenCalledTimes(2);
|
|
131
149
|
});
|
|
@@ -135,7 +153,7 @@ describe('Retry Test', () => {
|
|
|
135
153
|
calledSpy.mockImplementationOnce(() => { throw new Error('I failed!'); });
|
|
136
154
|
try {
|
|
137
155
|
await testClass.testMethodWithException();
|
|
138
|
-
} catch (e) {}
|
|
156
|
+
} catch (e) { }
|
|
139
157
|
expect(calledSpy).toHaveBeenCalledTimes(1);
|
|
140
158
|
});
|
|
141
159
|
|
|
@@ -152,7 +170,7 @@ describe('Retry Test', () => {
|
|
|
152
170
|
calledSpy.mockImplementationOnce(() => { throw new Error('Error: 500'); });
|
|
153
171
|
try {
|
|
154
172
|
await testClass.testDoRetry();
|
|
155
|
-
} catch (e) {}
|
|
173
|
+
} catch (e) { }
|
|
156
174
|
expect(calledSpy).toHaveBeenCalledTimes(1);
|
|
157
175
|
});
|
|
158
176
|
|
|
@@ -161,7 +179,7 @@ describe('Retry Test', () => {
|
|
|
161
179
|
calledSpy.mockImplementation(() => { throw new Error('Error: 500'); });
|
|
162
180
|
try {
|
|
163
181
|
await testClass.fixedBackOffRetry();
|
|
164
|
-
} catch (e) {}
|
|
182
|
+
} catch (e) { }
|
|
165
183
|
expect(calledSpy).toHaveBeenCalledTimes(4);
|
|
166
184
|
});
|
|
167
185
|
|
|
@@ -171,7 +189,7 @@ describe('Retry Test', () => {
|
|
|
171
189
|
calledSpy.mockImplementation(() => { throw new Error(); });
|
|
172
190
|
try {
|
|
173
191
|
await testClass.exponentialBackOffRetry();
|
|
174
|
-
} catch (e) {}
|
|
192
|
+
} catch (e) { }
|
|
175
193
|
expect(calledSpy).toHaveBeenCalledTimes(4);
|
|
176
194
|
});
|
|
177
195
|
|
|
@@ -181,7 +199,7 @@ describe('Retry Test', () => {
|
|
|
181
199
|
calledSpy.mockImplementation(() => { throw new Error(); });
|
|
182
200
|
try {
|
|
183
201
|
await testClass.exponentialBackOffWithJitterRetry();
|
|
184
|
-
} catch (e) {}
|
|
202
|
+
} catch (e) { }
|
|
185
203
|
expect(calledSpy).toHaveBeenCalledTimes(4);
|
|
186
204
|
});
|
|
187
205
|
|
|
@@ -190,13 +208,11 @@ describe('Retry Test', () => {
|
|
|
190
208
|
const errorSpy = jest.spyOn(console, 'error');
|
|
191
209
|
calledSpy.mockRejectedValueOnce(new Error('rejected'));
|
|
192
210
|
calledSpy.mockResolvedValueOnce('fulfilled');
|
|
193
|
-
await testClass.
|
|
211
|
+
await testClass.testMethodWithoutBackOff();
|
|
194
212
|
expect(calledSpy).toHaveBeenCalledTimes(2);
|
|
195
213
|
expect(errorSpy).not.toHaveBeenCalled();
|
|
196
214
|
});
|
|
197
215
|
|
|
198
|
-
// CustomError for testing.
|
|
199
|
-
class CustomError extends Error { }
|
|
200
216
|
|
|
201
217
|
test('throw original error', async () => {
|
|
202
218
|
jest.setTimeout(60000);
|
package/src/retry.decorator.ts
CHANGED
|
@@ -53,9 +53,18 @@ export function Retryable(options: RetryOptions): DecoratorFunction {
|
|
|
53
53
|
if (!canRetry(e)) {
|
|
54
54
|
throw e;
|
|
55
55
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
if (backOff) {
|
|
57
|
+
await sleep(applyBackoffStrategy(backOff));
|
|
58
|
+
|
|
59
|
+
if (
|
|
60
|
+
options.exponentialOption &&
|
|
61
|
+
options.backOffPolicy === BackOffPolicy.ExponentialBackOffPolicy
|
|
62
|
+
) {
|
|
63
|
+
backOff = Math.min(
|
|
64
|
+
backOff * options.exponentialOption.multiplier,
|
|
65
|
+
options.exponentialOption.maxInterval
|
|
66
|
+
);
|
|
67
|
+
}
|
|
59
68
|
}
|
|
60
69
|
return retryAsync.apply(this, [fn, args, maxAttempts, backOff]);
|
|
61
70
|
}
|
|
@@ -105,6 +114,10 @@ export class MaxAttemptsError extends Error {
|
|
|
105
114
|
} */
|
|
106
115
|
}
|
|
107
116
|
|
|
117
|
+
interface ConstructableError {
|
|
118
|
+
new (...args: any[]): Error;
|
|
119
|
+
}
|
|
120
|
+
|
|
108
121
|
export interface RetryOptions {
|
|
109
122
|
backOffPolicy?: BackOffPolicy;
|
|
110
123
|
backOff?: number;
|
|
@@ -119,7 +132,7 @@ export interface RetryOptions {
|
|
|
119
132
|
backoffStrategy?: ExponentialBackoffStrategy;
|
|
120
133
|
};
|
|
121
134
|
maxAttempts: number;
|
|
122
|
-
value?:
|
|
135
|
+
value?: ConstructableError[];
|
|
123
136
|
useConsoleLogger?: boolean;
|
|
124
137
|
useOriginalError?: boolean;
|
|
125
138
|
}
|