@ledgerhq/live-promise 0.0.3 → 0.0.4-next.1
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +12 -0
- package/LICENSE.txt +21 -0
- package/lib/promise.d.ts +1 -0
- package/lib/promise.d.ts.map +1 -1
- package/lib/promise.js +5 -1
- package/lib/promise.js.map +1 -1
- package/lib/promise.test.js +68 -18
- package/lib/promise.test.js.map +1 -1
- package/lib-es/promise.d.ts +1 -0
- package/lib-es/promise.d.ts.map +1 -1
- package/lib-es/promise.js +5 -1
- package/lib-es/promise.js.map +1 -1
- package/lib-es/promise.test.js +69 -19
- package/lib-es/promise.test.js.map +1 -1
- package/package.json +4 -4
- package/src/promise.test.ts +68 -18
- package/src/promise.ts +5 -1
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @ledgerhq/live-promise
|
|
2
2
|
|
|
3
|
+
## 0.0.4-next.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#6731](https://github.com/LedgerHQ/ledger-live/pull/6731) [`5552ca0`](https://github.com/LedgerHQ/ledger-live/commit/5552ca0542d5734b845ed23dae2f02c6d1b8ba2d) Thanks [@live-github-bot](https://github.com/apps/live-github-bot)! - Fix error should be thrown instead of returned in retry mechanism
|
|
8
|
+
|
|
9
|
+
## 0.0.4-next.0
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [#6566](https://github.com/LedgerHQ/ledger-live/pull/6566) [`cfb97f7`](https://github.com/LedgerHQ/ledger-live/commit/cfb97f7d5c81824815522e8699b7469047b1513a) Thanks [@cgrellard-ledger](https://github.com/cgrellard-ledger)! - Prevent unnecessary http retries when 422
|
|
14
|
+
|
|
3
15
|
## 0.0.3
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2017-present Ledger https://www.ledger.com/
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
package/lib/promise.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ declare const defaults: {
|
|
|
4
4
|
interval: number;
|
|
5
5
|
intervalMultiplicator: number;
|
|
6
6
|
context: string;
|
|
7
|
+
retryCondition: (_: any) => boolean;
|
|
7
8
|
};
|
|
8
9
|
export declare function retry<A>(f: () => Promise<A>, options?: Partial<typeof defaults>): Promise<A>;
|
|
9
10
|
type Job<R, A extends Array<any>> = (...args: A) => Promise<R>;
|
package/lib/promise.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,KAAK,OAAQ,MAAM,KAAG,QAAQ,IAAI,CAAwC,CAAC;AACxF,QAAA,MAAM,QAAQ
|
|
1
|
+
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,KAAK,OAAQ,MAAM,KAAG,QAAQ,IAAI,CAAwC,CAAC;AACxF,QAAA,MAAM,QAAQ;;;;;;CAMb,CAAC;AACF,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,QAAQ,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAwB5F;AACD,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAC/D,eAAO,MAAM,WAAW,yEAEW,MAAM,cAUxC,CAAC;AACF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOlF;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAC1C,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,EAAE,CAAC,CAwBd"}
|
package/lib/promise.js
CHANGED
|
@@ -18,9 +18,10 @@ const defaults = {
|
|
|
18
18
|
interval: 300,
|
|
19
19
|
intervalMultiplicator: 1.5,
|
|
20
20
|
context: "",
|
|
21
|
+
retryCondition: _ => true,
|
|
21
22
|
};
|
|
22
23
|
function retry(f, options) {
|
|
23
|
-
const { maxRetry, interval, intervalMultiplicator, context } = Object.assign(Object.assign({}, defaults), options);
|
|
24
|
+
const { maxRetry, interval, intervalMultiplicator, context, retryCondition } = Object.assign(Object.assign({}, defaults), options);
|
|
24
25
|
function rec(remainingTry, i) {
|
|
25
26
|
const result = f();
|
|
26
27
|
if (remainingTry <= 0) {
|
|
@@ -28,6 +29,9 @@ function retry(f, options) {
|
|
|
28
29
|
}
|
|
29
30
|
// In case of failure, wait the interval, retry the action
|
|
30
31
|
return result.catch(e => {
|
|
32
|
+
if (!retryCondition(e)) {
|
|
33
|
+
throw e;
|
|
34
|
+
}
|
|
31
35
|
(0, logs_1.log)("promise-retry", context + " failed. " + remainingTry + " retry remain. " + String(e));
|
|
32
36
|
return (0, exports.delay)(i).then(() => rec(remainingTry - 1, i * intervalMultiplicator));
|
|
33
37
|
});
|
package/lib/promise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAAqC;AAC9B,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAA3E,QAAA,KAAK,SAAsE;AACxF,MAAM,QAAQ,GAAG;IACf,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,GAAG;IACb,qBAAqB,EAAE,GAAG;IAC1B,OAAO,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"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"}
|
package/lib/promise.test.js
CHANGED
|
@@ -10,22 +10,72 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const promise_1 = require("./promise");
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
2, 3, 4, 5, 6, 7, 8,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
2, 3, 4, 5, 6, 7, 8,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
2, 3, 4, 5, 6, 7, 8,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
0,
|
|
29
|
-
|
|
30
|
-
|
|
13
|
+
describe("promise", () => {
|
|
14
|
+
test("promiseAllBatched", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
const promisifyIdPlusOne = (a) => Promise.resolve(a + 1);
|
|
16
|
+
const p = (0, promise_1.promiseAllBatched)(5, [], promisifyIdPlusOne);
|
|
17
|
+
expect(typeof p.then).toBe("function");
|
|
18
|
+
expect(yield p).toEqual([]);
|
|
19
|
+
expect(yield (0, promise_1.promiseAllBatched)(5, [1, 2, 3, 4, 5, 6, 7, 8], promisifyIdPlusOne)).toEqual([
|
|
20
|
+
2, 3, 4, 5, 6, 7, 8, 9,
|
|
21
|
+
]);
|
|
22
|
+
expect(yield (0, promise_1.promiseAllBatched)(1, [1, 2, 3, 4, 5, 6, 7, 8], promisifyIdPlusOne)).toEqual([
|
|
23
|
+
2, 3, 4, 5, 6, 7, 8, 9,
|
|
24
|
+
]);
|
|
25
|
+
expect(yield (0, promise_1.promiseAllBatched)(10, [1, 2, 3, 4, 5, 6, 7, 8], promisifyIdPlusOne)).toEqual([
|
|
26
|
+
2, 3, 4, 5, 6, 7, 8, 9,
|
|
27
|
+
]);
|
|
28
|
+
expect(yield (0, promise_1.promiseAllBatched)(2, Array(6).fill(0), (_, i) => Promise.resolve(i))).toEqual([
|
|
29
|
+
0, 1, 2, 3, 4, 5,
|
|
30
|
+
]);
|
|
31
|
+
}));
|
|
32
|
+
describe("promise retries", () => {
|
|
33
|
+
test("should retry by default", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
34
|
+
let numberOfExecutions = 0;
|
|
35
|
+
const testFunction = () => Promise.reject(numberOfExecutions++);
|
|
36
|
+
try {
|
|
37
|
+
yield (0, promise_1.retry)(() => testFunction(), {
|
|
38
|
+
maxRetry: 5,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
expect(e).toBe(5);
|
|
43
|
+
}
|
|
44
|
+
expect(numberOfExecutions).toBe(6);
|
|
45
|
+
}));
|
|
46
|
+
test("should retry when retryCondition is passed", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
47
|
+
let numberOfExecutions = 0;
|
|
48
|
+
const testFunction = () => Promise.reject(numberOfExecutions++);
|
|
49
|
+
try {
|
|
50
|
+
yield (0, promise_1.retry)(() => testFunction(), {
|
|
51
|
+
maxRetry: 5,
|
|
52
|
+
retryCondition: _ => {
|
|
53
|
+
return true;
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
expect(e).toBe(5);
|
|
59
|
+
}
|
|
60
|
+
expect(numberOfExecutions).toBe(6);
|
|
61
|
+
}));
|
|
62
|
+
test("should not retry when retryCondition returns false", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
63
|
+
let numberOfExecutions = 0;
|
|
64
|
+
const testFunction = () => Promise.reject(numberOfExecutions++);
|
|
65
|
+
try {
|
|
66
|
+
yield (0, promise_1.retry)(() => testFunction(), {
|
|
67
|
+
maxRetry: 5,
|
|
68
|
+
retryCondition: e => {
|
|
69
|
+
expect(e).toBe(0);
|
|
70
|
+
return false;
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
expect(e).toBe(0);
|
|
76
|
+
}
|
|
77
|
+
expect(numberOfExecutions).toBe(1);
|
|
78
|
+
}));
|
|
79
|
+
});
|
|
80
|
+
});
|
|
31
81
|
//# sourceMappingURL=promise.test.js.map
|
package/lib/promise.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.test.js","sourceRoot":"","sources":["../src/promise.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"promise.test.js","sourceRoot":"","sources":["../src/promise.test.ts"],"names":[],"mappings":"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"}
|
package/lib-es/promise.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ declare const defaults: {
|
|
|
4
4
|
interval: number;
|
|
5
5
|
intervalMultiplicator: number;
|
|
6
6
|
context: string;
|
|
7
|
+
retryCondition: (_: any) => boolean;
|
|
7
8
|
};
|
|
8
9
|
export declare function retry<A>(f: () => Promise<A>, options?: Partial<typeof defaults>): Promise<A>;
|
|
9
10
|
type Job<R, A extends Array<any>> = (...args: A) => Promise<R>;
|
package/lib-es/promise.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,KAAK,OAAQ,MAAM,KAAG,QAAQ,IAAI,CAAwC,CAAC;AACxF,QAAA,MAAM,QAAQ
|
|
1
|
+
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,KAAK,OAAQ,MAAM,KAAG,QAAQ,IAAI,CAAwC,CAAC;AACxF,QAAA,MAAM,QAAQ;;;;;;CAMb,CAAC;AACF,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,QAAQ,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAwB5F;AACD,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAC/D,eAAO,MAAM,WAAW,yEAEW,MAAM,cAUxC,CAAC;AACF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOlF;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAC1C,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,EAAE,CAAC,CAwBd"}
|
package/lib-es/promise.js
CHANGED
|
@@ -14,9 +14,10 @@ const defaults = {
|
|
|
14
14
|
interval: 300,
|
|
15
15
|
intervalMultiplicator: 1.5,
|
|
16
16
|
context: "",
|
|
17
|
+
retryCondition: _ => true,
|
|
17
18
|
};
|
|
18
19
|
export function retry(f, options) {
|
|
19
|
-
const { maxRetry, interval, intervalMultiplicator, context } = Object.assign(Object.assign({}, defaults), options);
|
|
20
|
+
const { maxRetry, interval, intervalMultiplicator, context, retryCondition } = Object.assign(Object.assign({}, defaults), options);
|
|
20
21
|
function rec(remainingTry, i) {
|
|
21
22
|
const result = f();
|
|
22
23
|
if (remainingTry <= 0) {
|
|
@@ -24,6 +25,9 @@ export function retry(f, options) {
|
|
|
24
25
|
}
|
|
25
26
|
// In case of failure, wait the interval, retry the action
|
|
26
27
|
return result.catch(e => {
|
|
28
|
+
if (!retryCondition(e)) {
|
|
29
|
+
throw e;
|
|
30
|
+
}
|
|
27
31
|
log("promise-retry", context + " failed. " + remainingTry + " retry remain. " + String(e));
|
|
28
32
|
return delay(i).then(() => rec(remainingTry - 1, i * intervalMultiplicator));
|
|
29
33
|
});
|
package/lib-es/promise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACxF,MAAM,QAAQ,GAAG;IACf,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,GAAG;IACb,qBAAqB,EAAE,GAAG;IAC1B,OAAO,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACxF,MAAM,QAAQ,GAAG;IACf,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,GAAG;IACb,qBAAqB,EAAE,GAAG;IAC1B,OAAO,EAAE,EAAE;IACX,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI;CAC1B,CAAC;AACF,MAAM,UAAU,KAAK,CAAI,CAAmB,EAAE,OAAkC;IAC9E,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,qBAAqB,EAAE,OAAO,EAAE,cAAc,EAAE,mCACvE,QAAQ,GACR,OAAO,CACX,CAAC;IAEF,SAAS,GAAG,CAAC,YAAoB,EAAE,CAAS;QAC1C,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC;QAEnB,IAAI,YAAY,IAAI,CAAC,EAAE;YACrB,OAAO,MAAM,CAAC;SACf;QAED,0DAA0D;QAC1D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACtB,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;gBACtB,MAAM,CAAC,CAAC;aACT;YACD,GAAG,CAAC,eAAe,EAAE,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,iBAAiB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3F,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,GAAc,EACd,kBAA0C,GAAG,EAAE,CAAC,EAAE,EACvC,EAAE;IACb,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QACjB,MAAM,EAAE,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/B,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;AACJ,CAAC,CAAC;AACF,MAAM,UAAU,kBAAkB,CAAI,EAAU,EAAE,EAAoB;IACpE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QACnB,MAAM,SAAS,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QAChD,IAAI,SAAS,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAgB,iBAAiB,CACrC,KAAa,EACb,KAAe,EACf,EAAyC;;QAEzC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI;YACJ,KAAK;SACN,CAAC,CAAC,CAAC;QAEJ,SAAe,IAAI;;gBACjB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO;gBAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC5B,IAAI,KAAK,EAAE;oBACT,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;oBAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;iBACrC;gBACD,MAAM,IAAI,EAAE,CAAC,CAAC,oDAAoD;YACpE,CAAC;SAAA;QAED,mDAAmD;QACnD,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;aACjC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;aACrB,GAAG,CAAC,IAAI,CAAC,CACb,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;CAAA"}
|
package/lib-es/promise.test.js
CHANGED
|
@@ -7,23 +7,73 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { promiseAllBatched } from "./promise";
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
2, 3, 4, 5, 6, 7, 8,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
2, 3, 4, 5, 6, 7, 8,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
2, 3, 4, 5, 6, 7, 8,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
10
|
+
import { promiseAllBatched, retry } from "./promise";
|
|
11
|
+
describe("promise", () => {
|
|
12
|
+
test("promiseAllBatched", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
13
|
+
const promisifyIdPlusOne = (a) => Promise.resolve(a + 1);
|
|
14
|
+
const p = promiseAllBatched(5, [], promisifyIdPlusOne);
|
|
15
|
+
expect(typeof p.then).toBe("function");
|
|
16
|
+
expect(yield p).toEqual([]);
|
|
17
|
+
expect(yield promiseAllBatched(5, [1, 2, 3, 4, 5, 6, 7, 8], promisifyIdPlusOne)).toEqual([
|
|
18
|
+
2, 3, 4, 5, 6, 7, 8, 9,
|
|
19
|
+
]);
|
|
20
|
+
expect(yield promiseAllBatched(1, [1, 2, 3, 4, 5, 6, 7, 8], promisifyIdPlusOne)).toEqual([
|
|
21
|
+
2, 3, 4, 5, 6, 7, 8, 9,
|
|
22
|
+
]);
|
|
23
|
+
expect(yield promiseAllBatched(10, [1, 2, 3, 4, 5, 6, 7, 8], promisifyIdPlusOne)).toEqual([
|
|
24
|
+
2, 3, 4, 5, 6, 7, 8, 9,
|
|
25
|
+
]);
|
|
26
|
+
expect(yield promiseAllBatched(2, Array(6).fill(0), (_, i) => Promise.resolve(i))).toEqual([
|
|
27
|
+
0, 1, 2, 3, 4, 5,
|
|
28
|
+
]);
|
|
29
|
+
}));
|
|
30
|
+
describe("promise retries", () => {
|
|
31
|
+
test("should retry by default", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
32
|
+
let numberOfExecutions = 0;
|
|
33
|
+
const testFunction = () => Promise.reject(numberOfExecutions++);
|
|
34
|
+
try {
|
|
35
|
+
yield retry(() => testFunction(), {
|
|
36
|
+
maxRetry: 5,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
expect(e).toBe(5);
|
|
41
|
+
}
|
|
42
|
+
expect(numberOfExecutions).toBe(6);
|
|
43
|
+
}));
|
|
44
|
+
test("should retry when retryCondition is passed", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
45
|
+
let numberOfExecutions = 0;
|
|
46
|
+
const testFunction = () => Promise.reject(numberOfExecutions++);
|
|
47
|
+
try {
|
|
48
|
+
yield retry(() => testFunction(), {
|
|
49
|
+
maxRetry: 5,
|
|
50
|
+
retryCondition: _ => {
|
|
51
|
+
return true;
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
expect(e).toBe(5);
|
|
57
|
+
}
|
|
58
|
+
expect(numberOfExecutions).toBe(6);
|
|
59
|
+
}));
|
|
60
|
+
test("should not retry when retryCondition returns false", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
61
|
+
let numberOfExecutions = 0;
|
|
62
|
+
const testFunction = () => Promise.reject(numberOfExecutions++);
|
|
63
|
+
try {
|
|
64
|
+
yield retry(() => testFunction(), {
|
|
65
|
+
maxRetry: 5,
|
|
66
|
+
retryCondition: e => {
|
|
67
|
+
expect(e).toBe(0);
|
|
68
|
+
return false;
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
expect(e).toBe(0);
|
|
74
|
+
}
|
|
75
|
+
expect(numberOfExecutions).toBe(1);
|
|
76
|
+
}));
|
|
77
|
+
});
|
|
78
|
+
});
|
|
29
79
|
//# sourceMappingURL=promise.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.test.js","sourceRoot":"","sources":["../src/promise.test.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"promise.test.js","sourceRoot":"","sources":["../src/promise.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/live-promise",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4-next.1",
|
|
4
4
|
"description": "Ledger Live Promise utilities",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger"
|
|
@@ -24,9 +24,9 @@
|
|
|
24
24
|
"@ledgerhq/logs": "^6.12.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@types/jest": "^29.
|
|
28
|
-
"jest": "^
|
|
29
|
-
"ts-jest": "^
|
|
27
|
+
"@types/jest": "^29.5.10",
|
|
28
|
+
"jest": "^29.7.0",
|
|
29
|
+
"ts-jest": "^29.1.1"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"clean": "rimraf lib lib-es",
|
package/src/promise.test.ts
CHANGED
|
@@ -1,20 +1,70 @@
|
|
|
1
|
-
import { promiseAllBatched } from "./promise";
|
|
2
|
-
test("promiseAllBatched", async () => {
|
|
3
|
-
const promisifyIdPlusOne = (a: number) => Promise.resolve(a + 1);
|
|
1
|
+
import { promiseAllBatched, retry } from "./promise";
|
|
4
2
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
2, 3, 4, 5, 6, 7, 8,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
2, 3, 4, 5, 6, 7, 8,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
3
|
+
describe("promise", () => {
|
|
4
|
+
test("promiseAllBatched", async () => {
|
|
5
|
+
const promisifyIdPlusOne = (a: number) => Promise.resolve(a + 1);
|
|
6
|
+
|
|
7
|
+
const p = promiseAllBatched(5, [], promisifyIdPlusOne);
|
|
8
|
+
expect(typeof p.then).toBe("function");
|
|
9
|
+
expect(await p).toEqual([]);
|
|
10
|
+
expect(await promiseAllBatched(5, [1, 2, 3, 4, 5, 6, 7, 8], promisifyIdPlusOne)).toEqual([
|
|
11
|
+
2, 3, 4, 5, 6, 7, 8, 9,
|
|
12
|
+
]);
|
|
13
|
+
expect(await promiseAllBatched(1, [1, 2, 3, 4, 5, 6, 7, 8], promisifyIdPlusOne)).toEqual([
|
|
14
|
+
2, 3, 4, 5, 6, 7, 8, 9,
|
|
15
|
+
]);
|
|
16
|
+
expect(await promiseAllBatched(10, [1, 2, 3, 4, 5, 6, 7, 8], promisifyIdPlusOne)).toEqual([
|
|
17
|
+
2, 3, 4, 5, 6, 7, 8, 9,
|
|
18
|
+
]);
|
|
19
|
+
expect(await promiseAllBatched(2, Array(6).fill(0), (_, i) => Promise.resolve(i))).toEqual([
|
|
20
|
+
0, 1, 2, 3, 4, 5,
|
|
21
|
+
]);
|
|
22
|
+
});
|
|
23
|
+
describe("promise retries", () => {
|
|
24
|
+
test("should retry by default", async () => {
|
|
25
|
+
let numberOfExecutions = 0;
|
|
26
|
+
const testFunction = () => Promise.reject(numberOfExecutions++);
|
|
27
|
+
try {
|
|
28
|
+
await retry(() => testFunction(), {
|
|
29
|
+
maxRetry: 5,
|
|
30
|
+
});
|
|
31
|
+
} catch (e) {
|
|
32
|
+
expect(e).toBe(5);
|
|
33
|
+
}
|
|
34
|
+
expect(numberOfExecutions).toBe(6);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test("should retry when retryCondition is passed", async () => {
|
|
38
|
+
let numberOfExecutions = 0;
|
|
39
|
+
const testFunction = () => Promise.reject(numberOfExecutions++);
|
|
40
|
+
try {
|
|
41
|
+
await retry(() => testFunction(), {
|
|
42
|
+
maxRetry: 5,
|
|
43
|
+
retryCondition: _ => {
|
|
44
|
+
return true;
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
} catch (e) {
|
|
48
|
+
expect(e).toBe(5);
|
|
49
|
+
}
|
|
50
|
+
expect(numberOfExecutions).toBe(6);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("should not retry when retryCondition returns false", async () => {
|
|
54
|
+
let numberOfExecutions = 0;
|
|
55
|
+
const testFunction = () => Promise.reject(numberOfExecutions++);
|
|
56
|
+
try {
|
|
57
|
+
await retry(() => testFunction(), {
|
|
58
|
+
maxRetry: 5,
|
|
59
|
+
retryCondition: e => {
|
|
60
|
+
expect(e).toBe(0);
|
|
61
|
+
return false;
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
} catch (e) {
|
|
65
|
+
expect(e).toBe(0);
|
|
66
|
+
}
|
|
67
|
+
expect(numberOfExecutions).toBe(1);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
20
70
|
});
|
package/src/promise.ts
CHANGED
|
@@ -5,9 +5,10 @@ const defaults = {
|
|
|
5
5
|
interval: 300,
|
|
6
6
|
intervalMultiplicator: 1.5,
|
|
7
7
|
context: "",
|
|
8
|
+
retryCondition: _ => true,
|
|
8
9
|
};
|
|
9
10
|
export function retry<A>(f: () => Promise<A>, options?: Partial<typeof defaults>): Promise<A> {
|
|
10
|
-
const { maxRetry, interval, intervalMultiplicator, context } = {
|
|
11
|
+
const { maxRetry, interval, intervalMultiplicator, context, retryCondition } = {
|
|
11
12
|
...defaults,
|
|
12
13
|
...options,
|
|
13
14
|
};
|
|
@@ -21,6 +22,9 @@ export function retry<A>(f: () => Promise<A>, options?: Partial<typeof defaults>
|
|
|
21
22
|
|
|
22
23
|
// In case of failure, wait the interval, retry the action
|
|
23
24
|
return result.catch(e => {
|
|
25
|
+
if (!retryCondition(e)) {
|
|
26
|
+
throw e;
|
|
27
|
+
}
|
|
24
28
|
log("promise-retry", context + " failed. " + remainingTry + " retry remain. " + String(e));
|
|
25
29
|
return delay(i).then(() => rec(remainingTry - 1, i * intervalMultiplicator));
|
|
26
30
|
});
|