typescript-retry-decorator 2.5.1 → 2.5.3
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/AGENTS.md +121 -0
- package/dist/{example.d.ts.map → cjs/example.d.ts.map} +1 -1
- package/dist/cjs/example.js.map +1 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/{index.d.ts.map → cjs/index.d.ts.map} +1 -1
- package/dist/{index.js → cjs/index.js} +1 -1
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/retry.decorator.d.ts.map +1 -0
- package/dist/{retry.decorator.js → cjs/retry.decorator.js} +2 -2
- package/dist/cjs/retry.decorator.js.map +1 -0
- package/dist/cjs/retry.decorator.test.d.ts.map +1 -0
- package/dist/cjs/retry.decorator.test.js +332 -0
- package/dist/cjs/retry.decorator.test.js.map +1 -0
- package/dist/cjs/utils.d.ts +2 -0
- package/dist/cjs/utils.d.ts.map +1 -0
- package/dist/{utils.js → cjs/utils.js} +1 -1
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/example.js +180 -0
- package/dist/esm/example.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/retry.decorator.js +145 -0
- package/dist/esm/retry.decorator.js.map +1 -0
- package/dist/{retry.decorator.test.js → esm/retry.decorator.test.js} +41 -45
- package/dist/esm/retry.decorator.test.js.map +1 -0
- package/dist/esm/utils.js +3 -0
- package/dist/esm/utils.js.map +1 -0
- package/package.json +21 -12
- package/src/index.ts +1 -1
- package/src/retry.decorator.test.ts +22 -24
- package/src/retry.decorator.ts +1 -1
- package/src/utils.ts +2 -1
- package/ts5-decorator.md +73 -0
- package/tsconfig.cjs.json +9 -0
- package/tsconfig.esm.json +9 -0
- package/tsconfig.json +3 -11
- package/vitest.config.mts +12 -0
- package/dist/example.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js.map +0 -1
- package/dist/retry.decorator.d.ts.map +0 -1
- package/dist/retry.decorator.js.map +0 -1
- package/dist/retry.decorator.test.d.ts.map +0 -1
- package/dist/retry.decorator.test.js.map +0 -1
- package/dist/utils.d.ts +0 -2
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js.map +0 -1
- package/jest.config.js +0 -12
- /package/dist/{example.d.ts → cjs/example.d.ts} +0 -0
- /package/dist/{example.js → cjs/example.js} +0 -0
- /package/dist/{retry.decorator.d.ts → cjs/retry.decorator.d.ts} +0 -0
- /package/dist/{retry.decorator.test.d.ts → cjs/retry.decorator.test.d.ts} +0 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
This repository is `typescript-retry-decorator`: a small TypeScript library that provides a `@Retryable` decorator (supports both legacy `experimentalDecorators` and TS5 “standard decorators” runtime signature).
|
|
4
|
+
|
|
5
|
+
## Scope & Goals
|
|
6
|
+
|
|
7
|
+
- Keep changes small and focused; avoid refactors not required by the task.
|
|
8
|
+
- Preserve public API behavior (exports from `src/index.ts` → `dist/`).
|
|
9
|
+
- Prefer correctness + tests over cleverness.
|
|
10
|
+
- Maintain "0 dependency" philosophy for runtime code.
|
|
11
|
+
|
|
12
|
+
## Repo Layout
|
|
13
|
+
|
|
14
|
+
- `src/`: library source + tests
|
|
15
|
+
- `src/retry.decorator.ts`: main implementation
|
|
16
|
+
- `src/utils.ts`: helpers (e.g. `sleep`)
|
|
17
|
+
- `src/*.test.ts`: Vitest tests (e.g. `src/retry.decorator.test.ts`)
|
|
18
|
+
- `dist/`: TypeScript build output (generated) - contains `cjs` and `esm` folders.
|
|
19
|
+
- Config: `tsconfig.json` (base), `tsconfig.cjs.json`, `tsconfig.esm.json`, `.eslintrc.js`, `vitest.config.mts`.
|
|
20
|
+
|
|
21
|
+
## Package Manager
|
|
22
|
+
|
|
23
|
+
- Use `pnpm` only.
|
|
24
|
+
- Install deps: `pnpm install`
|
|
25
|
+
|
|
26
|
+
## Build / Lint / Test
|
|
27
|
+
|
|
28
|
+
### Build
|
|
29
|
+
|
|
30
|
+
- Build TypeScript (emits to `dist/cjs` and `dist/esm`): `pnpm build`
|
|
31
|
+
- Scripts: `pnpm run build:cjs` and `pnpm run build:esm`
|
|
32
|
+
|
|
33
|
+
### Lint
|
|
34
|
+
|
|
35
|
+
- Lint source: `pnpm lint`
|
|
36
|
+
- Script: `eslint --ext .ts src/`
|
|
37
|
+
|
|
38
|
+
### Test
|
|
39
|
+
|
|
40
|
+
- **Runner**: Vitest (replaced Jest)
|
|
41
|
+
- Run all tests: `pnpm test`
|
|
42
|
+
- Watch mode: `pnpm test:watch`
|
|
43
|
+
|
|
44
|
+
#### Run a single test file
|
|
45
|
+
|
|
46
|
+
- `pnpm test -- src/retry.decorator.test.ts`
|
|
47
|
+
|
|
48
|
+
#### Run a single test by name
|
|
49
|
+
|
|
50
|
+
- Substring/regex match by `-t`:
|
|
51
|
+
- `pnpm test -- -t "exceed max retry"`
|
|
52
|
+
- `pnpm test -- -t "standard decorators signature"`
|
|
53
|
+
|
|
54
|
+
#### Run a single test by file + name
|
|
55
|
+
|
|
56
|
+
- `pnpm test -- src/retry.decorator.test.ts -t "standard decorators signature works"`
|
|
57
|
+
|
|
58
|
+
## TypeScript & Build Configuration
|
|
59
|
+
|
|
60
|
+
- **Dual Build**: CommonJS (`dist/cjs`) and ESM (`dist/esm`).
|
|
61
|
+
- **Decorators**:
|
|
62
|
+
- Legacy `experimentalDecorators: true` enabled.
|
|
63
|
+
- Supports TS5 standard decorators (stage 3) via runtime detection.
|
|
64
|
+
- **Strictness**: `noImplicitAny`, `strictNullChecks` are enabled.
|
|
65
|
+
|
|
66
|
+
## Code Style (Enforced by ESLint)
|
|
67
|
+
|
|
68
|
+
See `.eslintrc.js` for rules.
|
|
69
|
+
|
|
70
|
+
### Formatting & Syntax
|
|
71
|
+
- **Indentation**: 2 spaces.
|
|
72
|
+
- **Quotes**: Single quotes (`'`), template strings allowed.
|
|
73
|
+
- **Semicolons**: Required (`always`).
|
|
74
|
+
- **Trailing Spaces**: Disallowed.
|
|
75
|
+
- **Async**: Always use `async/await` over raw promises where possible.
|
|
76
|
+
- **Functions**:
|
|
77
|
+
- Prefer arrow functions for callbacks.
|
|
78
|
+
- Prefer named functions for top-level exports if hoisting is beneficial (though `const` exports are common here).
|
|
79
|
+
|
|
80
|
+
### Imports
|
|
81
|
+
- Prefer relative imports within `src/` (e.g., `import { sleep } from './utils';`).
|
|
82
|
+
- **NO** absolute imports or path aliases (keep it simple for library portability).
|
|
83
|
+
- Keep external and internal imports grouped separately.
|
|
84
|
+
|
|
85
|
+
### Naming Conventions
|
|
86
|
+
- **Classes/Types**: `PascalCase` (e.g., `RetryOptions`).
|
|
87
|
+
- **Functions/Vars**: `camelCase` (e.g., `applyBackoffStrategy`).
|
|
88
|
+
- **Files**: Dot-separated (e.g., `retry.decorator.ts`). Match existing patterns.
|
|
89
|
+
- **Tests**: `describe` blocks with clear subject names; `it` or `test` with behavioral descriptions.
|
|
90
|
+
|
|
91
|
+
## Error Handling & Logging
|
|
92
|
+
|
|
93
|
+
- **Errors**: Throw `Error` or custom subclasses.
|
|
94
|
+
- **Stack Traces**: Preserve stack traces when wrapping errors (e.g., `MaxAttemptsError`).
|
|
95
|
+
- **Logging**: Do NOT use `console.log` directly in library code. Use the provided `useConsoleLogger` option or a custom logger interface if strictly necessary.
|
|
96
|
+
|
|
97
|
+
## Decorator Compatibility
|
|
98
|
+
|
|
99
|
+
The `Retryable` decorator must support two distinct call signatures:
|
|
100
|
+
1. **Legacy**: `(target, propertyKey, descriptor)`
|
|
101
|
+
2. **Standard (TS5)**: `(value, context)`
|
|
102
|
+
|
|
103
|
+
**Critical**: When modifying the decorator, ensure `this` context is preserved using `fn.apply(this, args)` or `fn.call(this, ...args)`.
|
|
104
|
+
|
|
105
|
+
## Testing Guidance
|
|
106
|
+
|
|
107
|
+
- **Mocking**: Use `vi` (Vitest) for mocking, not `jest`.
|
|
108
|
+
- Example: `vi.fn()`, `vi.spyOn()`.
|
|
109
|
+
- **Timers**: Use fake timers for backoff testing to avoid slow tests.
|
|
110
|
+
- `vi.useFakeTimers()`, `vi.advanceTimersByTime(...)`.
|
|
111
|
+
- **Determinism**: Ensure tests do not rely on real wall-clock time if possible.
|
|
112
|
+
|
|
113
|
+
## Generated Artifacts
|
|
114
|
+
|
|
115
|
+
- Do NOT edit files in `dist/`.
|
|
116
|
+
- `dist/` structure is managed by the build scripts (`build:cjs`, `build:esm`).
|
|
117
|
+
|
|
118
|
+
## Cursor / Copilot Rules
|
|
119
|
+
|
|
120
|
+
- No specific rules files found (`.cursorrules`, `.github/copilot-instructions.md`).
|
|
121
|
+
- Follow the guidelines in this file as the source of truth.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"example.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../../src/example.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example.js","sourceRoot":"","sources":["../../src/example.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
|
|
@@ -14,5 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./retry.decorator"), exports);
|
|
17
|
+
__exportStar(require("./retry.decorator.js"), exports);
|
|
18
18
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.decorator.d.ts","sourceRoot":"","sources":["../../src/retry.decorator.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,uBAAuB,GAAG,CACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,UAAU,EAAE,uBAAuB,CAAC,GAAG,CAAC,KACrC,uBAAuB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AAEzC,MAAM,MAAM,uBAAuB,GAAG,CACpC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC9B,OAAO,EAAE,wBAAwB,KAC9B,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC;AAEtC,MAAM,MAAM,kBAAkB,GAAG,uBAAuB,GAAG,uBAAuB,CAAC;AAGnF,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AAExD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,kBAAkB,CAuGnE;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"}
|
|
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.ExponentialBackoffStrategy = exports.BackOffPolicy = exports.MaxAttemptsError = exports.Retryable = void 0;
|
|
13
|
-
const
|
|
13
|
+
const utils_js_1 = require("./utils.js");
|
|
14
14
|
/**
|
|
15
15
|
* Retry decorator (legacy + TypeScript 5 standard decorators).
|
|
16
16
|
*
|
|
@@ -71,7 +71,7 @@ function Retryable(options) {
|
|
|
71
71
|
throw e;
|
|
72
72
|
}
|
|
73
73
|
if (backOff) {
|
|
74
|
-
yield (0,
|
|
74
|
+
yield (0, utils_js_1.sleep)(applyBackoffStrategy(backOff));
|
|
75
75
|
if (options.exponentialOption && options.backOffPolicy === BackOffPolicy.ExponentialBackOffPolicy) {
|
|
76
76
|
backOff = Math.min(backOff * options.exponentialOption.multiplier, options.exponentialOption.maxInterval);
|
|
77
77
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.decorator.js","sourceRoot":"","sources":["../../src/retry.decorator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.decorator.test.d.ts","sourceRoot":"","sources":["../../src/retry.decorator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
3
|
+
var useValue = arguments.length > 2;
|
|
4
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
5
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
6
|
+
}
|
|
7
|
+
return useValue ? value : void 0;
|
|
8
|
+
};
|
|
9
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
10
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
11
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
12
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
13
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
14
|
+
var _, done = false;
|
|
15
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
16
|
+
var context = {};
|
|
17
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
18
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
19
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
20
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
21
|
+
if (kind === "accessor") {
|
|
22
|
+
if (result === void 0) continue;
|
|
23
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
24
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
25
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
26
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
27
|
+
}
|
|
28
|
+
else if (_ = accept(result)) {
|
|
29
|
+
if (kind === "field") initializers.unshift(_);
|
|
30
|
+
else descriptor[key] = _;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
34
|
+
done = true;
|
|
35
|
+
};
|
|
36
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
37
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
38
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
39
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
40
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
41
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
42
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
const vitest_1 = require("vitest");
|
|
47
|
+
const retry_decorator_1 = require("./retry.decorator");
|
|
48
|
+
const utils_1 = require("./utils");
|
|
49
|
+
/**
|
|
50
|
+
* Legacy decorator mode toggle
|
|
51
|
+
*
|
|
52
|
+
* This test suite covers both call shapes:
|
|
53
|
+
* - Legacy/"experimental" decorators (target, propertyKey, descriptor)
|
|
54
|
+
* - TypeScript 5+ standard decorators (value, context)
|
|
55
|
+
*
|
|
56
|
+
* To compile/run these tests in legacy mode, enable these in tsconfig.json:
|
|
57
|
+
* "experimentalDecorators": true,
|
|
58
|
+
* "emitDecoratorMetadata": true
|
|
59
|
+
*
|
|
60
|
+
* To compile/run in TS5 standard decorators mode, disable/remove them.
|
|
61
|
+
*/
|
|
62
|
+
vitest_1.vi.mock('./utils', () => ({
|
|
63
|
+
sleep: vitest_1.vi.fn(),
|
|
64
|
+
}));
|
|
65
|
+
// CustomError for testing.
|
|
66
|
+
class CustomError extends Error {
|
|
67
|
+
constructor(message) {
|
|
68
|
+
// Call the parent class constructor with the provided message
|
|
69
|
+
super(message);
|
|
70
|
+
// Set the prototype and name properties
|
|
71
|
+
Object.setPrototypeOf(this, CustomError.prototype);
|
|
72
|
+
this.name = 'CustomError';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
let TestClass = (() => {
|
|
76
|
+
var _a;
|
|
77
|
+
let _instanceExtraInitializers = [];
|
|
78
|
+
let _testMethodWithoutBackOff_decorators;
|
|
79
|
+
let _testMethodWithException_decorators;
|
|
80
|
+
let _testDoRetry_decorators;
|
|
81
|
+
let _fixedBackOffRetry_decorators;
|
|
82
|
+
let _exponentialBackOffRetry_decorators;
|
|
83
|
+
let _exponentialBackOffWithJitterRetry_decorators;
|
|
84
|
+
let _noLog_decorators;
|
|
85
|
+
let _useOriginalError_decorators;
|
|
86
|
+
return _a = class TestClass {
|
|
87
|
+
constructor() {
|
|
88
|
+
this.count = __runInitializers(this, _instanceExtraInitializers);
|
|
89
|
+
this.count = 0;
|
|
90
|
+
}
|
|
91
|
+
testMethodWithoutBackOff() {
|
|
92
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
93
|
+
console.log(`test method is called for ${++this.count} time`);
|
|
94
|
+
yield this.called();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
testMethodWithException() {
|
|
98
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
99
|
+
console.log(`test method is called for ${++this.count} time`);
|
|
100
|
+
yield this.called();
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
testDoRetry() {
|
|
104
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
105
|
+
console.info(`Calling doRetry for the ${++this.count} time at ${new Date().toLocaleTimeString()}`);
|
|
106
|
+
yield this.called();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
fixedBackOffRetry() {
|
|
110
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
+
console.info(`Calling fixedBackOffRetry 1s for the ${++this.count} time at ${new Date().toLocaleTimeString()}`);
|
|
112
|
+
yield this.called();
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
exponentialBackOffRetry() {
|
|
116
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
117
|
+
console.info(`Calling ExponentialBackOffRetry backOff 1s, multiplier=3 for the ${++this.count} time at ${new Date().toLocaleTimeString()}`);
|
|
118
|
+
yield this.called();
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
exponentialBackOffWithJitterRetry() {
|
|
122
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
+
console.info(`Calling ExponentialBackOffRetry backOff 1s, multiplier=2 for the ${++this.count} time at ${new Date().toLocaleTimeString()}`);
|
|
124
|
+
yield this.called();
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
noLog() {
|
|
128
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
129
|
+
console.log(`test method is called for ${++this.count} time`);
|
|
130
|
+
yield this.called();
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
useOriginalError() {
|
|
134
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
135
|
+
yield this.called();
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
called() {
|
|
139
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
140
|
+
return 'from real implementation';
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
(() => {
|
|
145
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
146
|
+
_testMethodWithoutBackOff_decorators = [(0, retry_decorator_1.Retryable)({ maxAttempts: 2 })];
|
|
147
|
+
_testMethodWithException_decorators = [(0, retry_decorator_1.Retryable)({ maxAttempts: 3, value: [SyntaxError, ReferenceError, CustomError] })];
|
|
148
|
+
_testDoRetry_decorators = [(0, retry_decorator_1.Retryable)({
|
|
149
|
+
maxAttempts: 3,
|
|
150
|
+
doRetry: (e) => {
|
|
151
|
+
return e.message === 'Error: 429';
|
|
152
|
+
},
|
|
153
|
+
})];
|
|
154
|
+
_fixedBackOffRetry_decorators = [(0, retry_decorator_1.Retryable)({
|
|
155
|
+
maxAttempts: 3,
|
|
156
|
+
backOffPolicy: retry_decorator_1.BackOffPolicy.FixedBackOffPolicy,
|
|
157
|
+
backOff: 1000,
|
|
158
|
+
})];
|
|
159
|
+
_exponentialBackOffRetry_decorators = [(0, retry_decorator_1.Retryable)({
|
|
160
|
+
maxAttempts: 3,
|
|
161
|
+
backOffPolicy: retry_decorator_1.BackOffPolicy.ExponentialBackOffPolicy,
|
|
162
|
+
exponentialOption: { maxInterval: 4000, multiplier: 3 },
|
|
163
|
+
})];
|
|
164
|
+
_exponentialBackOffWithJitterRetry_decorators = [(0, retry_decorator_1.Retryable)({
|
|
165
|
+
maxAttempts: 3,
|
|
166
|
+
backOffPolicy: retry_decorator_1.BackOffPolicy.ExponentialBackOffPolicy,
|
|
167
|
+
exponentialOption: { maxInterval: 4000, multiplier: 2, backoffStrategy: retry_decorator_1.ExponentialBackoffStrategy.FullJitter },
|
|
168
|
+
})];
|
|
169
|
+
_noLog_decorators = [(0, retry_decorator_1.Retryable)({ maxAttempts: 2, useConsoleLogger: false })];
|
|
170
|
+
_useOriginalError_decorators = [(0, retry_decorator_1.Retryable)({ maxAttempts: 2, useOriginalError: true })];
|
|
171
|
+
__esDecorate(_a, null, _testMethodWithoutBackOff_decorators, { kind: "method", name: "testMethodWithoutBackOff", static: false, private: false, access: { has: obj => "testMethodWithoutBackOff" in obj, get: obj => obj.testMethodWithoutBackOff }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
172
|
+
__esDecorate(_a, null, _testMethodWithException_decorators, { kind: "method", name: "testMethodWithException", static: false, private: false, access: { has: obj => "testMethodWithException" in obj, get: obj => obj.testMethodWithException }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
173
|
+
__esDecorate(_a, null, _testDoRetry_decorators, { kind: "method", name: "testDoRetry", static: false, private: false, access: { has: obj => "testDoRetry" in obj, get: obj => obj.testDoRetry }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
174
|
+
__esDecorate(_a, null, _fixedBackOffRetry_decorators, { kind: "method", name: "fixedBackOffRetry", static: false, private: false, access: { has: obj => "fixedBackOffRetry" in obj, get: obj => obj.fixedBackOffRetry }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
175
|
+
__esDecorate(_a, null, _exponentialBackOffRetry_decorators, { kind: "method", name: "exponentialBackOffRetry", static: false, private: false, access: { has: obj => "exponentialBackOffRetry" in obj, get: obj => obj.exponentialBackOffRetry }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
176
|
+
__esDecorate(_a, null, _exponentialBackOffWithJitterRetry_decorators, { kind: "method", name: "exponentialBackOffWithJitterRetry", static: false, private: false, access: { has: obj => "exponentialBackOffWithJitterRetry" in obj, get: obj => obj.exponentialBackOffWithJitterRetry }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
177
|
+
__esDecorate(_a, null, _noLog_decorators, { kind: "method", name: "noLog", static: false, private: false, access: { has: obj => "noLog" in obj, get: obj => obj.noLog }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
178
|
+
__esDecorate(_a, null, _useOriginalError_decorators, { kind: "method", name: "useOriginalError", static: false, private: false, access: { has: obj => "useOriginalError" in obj, get: obj => obj.useOriginalError }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
179
|
+
if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
180
|
+
})(),
|
|
181
|
+
_a;
|
|
182
|
+
})();
|
|
183
|
+
(0, vitest_1.describe)('Capture original error data Test', () => {
|
|
184
|
+
(0, vitest_1.test)('exceed max retry', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
185
|
+
const testClass = new TestClass();
|
|
186
|
+
const originalStackTrace = 'foo';
|
|
187
|
+
const errorMsg = 'rejected';
|
|
188
|
+
const unexpectedError = new Error(errorMsg);
|
|
189
|
+
unexpectedError.stack = originalStackTrace;
|
|
190
|
+
const calledSpy = vitest_1.vi.spyOn(testClass, 'called');
|
|
191
|
+
calledSpy.mockRejectedValue(unexpectedError);
|
|
192
|
+
try {
|
|
193
|
+
yield testClass.testMethodWithoutBackOff();
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
(0, vitest_1.expect)(e.stack).toEqual(originalStackTrace);
|
|
197
|
+
}
|
|
198
|
+
}));
|
|
199
|
+
});
|
|
200
|
+
(0, vitest_1.describe)('Retry Test', () => {
|
|
201
|
+
let testClass;
|
|
202
|
+
(0, vitest_1.beforeEach)(() => {
|
|
203
|
+
vitest_1.vi.clearAllMocks();
|
|
204
|
+
testClass = new TestClass();
|
|
205
|
+
});
|
|
206
|
+
(0, vitest_1.test)('normal retry without backoff', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
207
|
+
const calledSpy = vitest_1.vi.spyOn(testClass, 'called');
|
|
208
|
+
calledSpy.mockRejectedValueOnce(new Error('rejected'));
|
|
209
|
+
calledSpy.mockResolvedValueOnce('fulfilled');
|
|
210
|
+
yield testClass.testMethodWithoutBackOff();
|
|
211
|
+
(0, vitest_1.expect)(calledSpy).toHaveBeenCalledTimes(2);
|
|
212
|
+
(0, vitest_1.expect)(utils_1.sleep).toHaveBeenCalledTimes(0);
|
|
213
|
+
}));
|
|
214
|
+
(0, vitest_1.test)('exceed max retry', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
215
|
+
const calledSpy = vitest_1.vi.spyOn(testClass, 'called');
|
|
216
|
+
const errorMsg = 'rejected';
|
|
217
|
+
calledSpy.mockRejectedValue(new Error(errorMsg));
|
|
218
|
+
try {
|
|
219
|
+
yield testClass.testMethodWithoutBackOff();
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
(0, vitest_1.expect)(e).toBeInstanceOf(retry_decorator_1.MaxAttemptsError);
|
|
223
|
+
(0, vitest_1.expect)(e.message.includes(errorMsg));
|
|
224
|
+
}
|
|
225
|
+
(0, vitest_1.expect)(calledSpy).toHaveBeenCalledTimes(3);
|
|
226
|
+
}));
|
|
227
|
+
(0, vitest_1.test)('retry with specific error', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
228
|
+
const calledSpy = vitest_1.vi.spyOn(testClass, 'called');
|
|
229
|
+
calledSpy.mockImplementationOnce(() => { throw new CustomError('I failed!'); });
|
|
230
|
+
yield testClass.testMethodWithException();
|
|
231
|
+
(0, vitest_1.expect)(calledSpy).toHaveBeenCalledTimes(2);
|
|
232
|
+
}));
|
|
233
|
+
(0, vitest_1.test)('retry with specific error not match', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
234
|
+
const calledSpy = vitest_1.vi.spyOn(testClass, 'called');
|
|
235
|
+
calledSpy.mockImplementationOnce(() => { throw new Error('I failed!'); });
|
|
236
|
+
try {
|
|
237
|
+
yield testClass.testMethodWithException();
|
|
238
|
+
}
|
|
239
|
+
catch (_a) {
|
|
240
|
+
// ignore
|
|
241
|
+
}
|
|
242
|
+
(0, vitest_1.expect)(calledSpy).toHaveBeenCalledTimes(1);
|
|
243
|
+
}));
|
|
244
|
+
(0, vitest_1.test)('do retry when high order function retry true', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
245
|
+
const calledSpy = vitest_1.vi.spyOn(testClass, 'called');
|
|
246
|
+
calledSpy.mockImplementationOnce(() => { throw new Error('Error: 429'); });
|
|
247
|
+
yield testClass.testDoRetry();
|
|
248
|
+
(0, vitest_1.expect)(calledSpy).toHaveBeenCalledTimes(2);
|
|
249
|
+
}));
|
|
250
|
+
(0, vitest_1.test)('do NOT retry when high order function retry false', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
251
|
+
const calledSpy = vitest_1.vi.spyOn(testClass, 'called');
|
|
252
|
+
calledSpy.mockImplementationOnce(() => { throw new Error('Error: 500'); });
|
|
253
|
+
try {
|
|
254
|
+
yield testClass.testDoRetry();
|
|
255
|
+
}
|
|
256
|
+
catch (_b) {
|
|
257
|
+
// ignore
|
|
258
|
+
}
|
|
259
|
+
(0, vitest_1.expect)(calledSpy).toHaveBeenCalledTimes(1);
|
|
260
|
+
}));
|
|
261
|
+
(0, vitest_1.test)('fix backOff policy', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
262
|
+
const calledSpy = vitest_1.vi.spyOn(testClass, 'called');
|
|
263
|
+
calledSpy.mockImplementation(() => { throw new Error('Error: 500'); });
|
|
264
|
+
try {
|
|
265
|
+
yield testClass.fixedBackOffRetry();
|
|
266
|
+
}
|
|
267
|
+
catch (_c) {
|
|
268
|
+
// ignore
|
|
269
|
+
}
|
|
270
|
+
(0, vitest_1.expect)(calledSpy).toHaveBeenCalledTimes(4);
|
|
271
|
+
}));
|
|
272
|
+
(0, vitest_1.test)('exponential backOff policy', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
273
|
+
const calledSpy = vitest_1.vi.spyOn(testClass, 'called');
|
|
274
|
+
calledSpy.mockImplementation(() => { throw new Error(); });
|
|
275
|
+
try {
|
|
276
|
+
yield testClass.exponentialBackOffRetry();
|
|
277
|
+
}
|
|
278
|
+
catch (_d) {
|
|
279
|
+
// ignore
|
|
280
|
+
}
|
|
281
|
+
(0, vitest_1.expect)(calledSpy).toHaveBeenCalledTimes(4);
|
|
282
|
+
}), 60000);
|
|
283
|
+
(0, vitest_1.test)('exponential backOff policy with jitter', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
284
|
+
const calledSpy = vitest_1.vi.spyOn(testClass, 'called');
|
|
285
|
+
calledSpy.mockImplementation(() => { throw new Error(); });
|
|
286
|
+
try {
|
|
287
|
+
yield testClass.exponentialBackOffWithJitterRetry();
|
|
288
|
+
}
|
|
289
|
+
catch (_e) {
|
|
290
|
+
// ignore
|
|
291
|
+
}
|
|
292
|
+
(0, vitest_1.expect)(calledSpy).toHaveBeenCalledTimes(4);
|
|
293
|
+
}), 60000);
|
|
294
|
+
(0, vitest_1.test)('no log', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
295
|
+
const calledSpy = vitest_1.vi.spyOn(testClass, 'called');
|
|
296
|
+
const errorSpy = vitest_1.vi.spyOn(console, 'error');
|
|
297
|
+
calledSpy.mockRejectedValueOnce(new Error('rejected'));
|
|
298
|
+
calledSpy.mockResolvedValueOnce('fulfilled');
|
|
299
|
+
yield testClass.testMethodWithoutBackOff();
|
|
300
|
+
(0, vitest_1.expect)(calledSpy).toHaveBeenCalledTimes(2);
|
|
301
|
+
(0, vitest_1.expect)(errorSpy).not.toHaveBeenCalled();
|
|
302
|
+
}));
|
|
303
|
+
(0, vitest_1.test)('throw original error', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
304
|
+
const calledSpy = vitest_1.vi.spyOn(testClass, 'called');
|
|
305
|
+
calledSpy.mockImplementation(() => { throw new CustomError(); });
|
|
306
|
+
try {
|
|
307
|
+
yield testClass.useOriginalError();
|
|
308
|
+
}
|
|
309
|
+
catch (e) {
|
|
310
|
+
(0, vitest_1.expect)(e).toBeInstanceOf(CustomError);
|
|
311
|
+
}
|
|
312
|
+
}), 60000);
|
|
313
|
+
(0, vitest_1.test)('standard decorators signature works (value, context)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
314
|
+
const fn = vitest_1.vi.fn();
|
|
315
|
+
fn.mockRejectedValueOnce(new Error('rejected'));
|
|
316
|
+
fn.mockResolvedValueOnce('fulfilled');
|
|
317
|
+
const wrapped = (0, retry_decorator_1.Retryable)({ maxAttempts: 2 })(fn, { kind: 'method', name: 'myMethod' });
|
|
318
|
+
yield (0, vitest_1.expect)(wrapped()).resolves.toEqual('fulfilled');
|
|
319
|
+
(0, vitest_1.expect)(fn).toHaveBeenCalledTimes(2);
|
|
320
|
+
(0, vitest_1.expect)(utils_1.sleep).toHaveBeenCalledTimes(0);
|
|
321
|
+
}));
|
|
322
|
+
(0, vitest_1.test)('standard decorators signature fails with MaxAttemptsError message', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
323
|
+
const errorMsg = 'rejected';
|
|
324
|
+
const fn = vitest_1.vi.fn(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
325
|
+
throw new Error(errorMsg);
|
|
326
|
+
}));
|
|
327
|
+
const wrapped = (0, retry_decorator_1.Retryable)({ maxAttempts: 2 })(fn, { kind: 'method', name: 'myMethod' });
|
|
328
|
+
yield (0, vitest_1.expect)(wrapped()).rejects.toThrow('Failed for \'myMethod\' for 2 times.');
|
|
329
|
+
(0, vitest_1.expect)(fn).toHaveBeenCalledTimes(3);
|
|
330
|
+
}));
|
|
331
|
+
});
|
|
332
|
+
//# sourceMappingURL=retry.decorator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.decorator.test.js","sourceRoot":"","sources":["../../src/retry.decorator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,KAAK,QAAS,MAAM,KAAG,QAAQ,IAAI,CACG,CAAC"}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.sleep = void 0;
|
|
4
4
|
// wrap the native setTimeout with Promise so it can be used with `await`.
|
|
5
|
-
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
5
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
6
6
|
exports.sleep = sleep;
|
|
7
7
|
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;AAAA,0EAA0E;AACnE,MAAM,KAAK,GAAG,CAAC,EAAW,EAAiB,EAAE,CAClD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AADvC,QAAA,KAAK,SACkC"}
|