@aligent/microservice-util-lib 0.1.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.
Files changed (38) hide show
  1. package/README.md +36 -0
  2. package/dist/chunkBy/chunkBy.d.ts +11 -0
  3. package/dist/chunkBy/chunkBy.js +22 -0
  4. package/dist/chunkBy/chunkBy.js.map +1 -0
  5. package/dist/chunkBy/chunkBy.test.d.ts +1 -0
  6. package/dist/chunkBy/chunkBy.test.js +17 -0
  7. package/dist/chunkBy/chunkBy.test.js.map +1 -0
  8. package/dist/fetchSsmParams/fetchSsmParams.d.ts +12 -0
  9. package/dist/fetchSsmParams/fetchSsmParams.js +82 -0
  10. package/dist/fetchSsmParams/fetchSsmParams.js.map +1 -0
  11. package/dist/fetchSsmParams/fetchSsmParams.test.d.ts +1 -0
  12. package/dist/fetchSsmParams/fetchSsmParams.test.js +119 -0
  13. package/dist/fetchSsmParams/fetchSsmParams.test.js.map +1 -0
  14. package/dist/hasPropertiesDefined/hasPropertiesDefined.d.ts +24 -0
  15. package/dist/hasPropertiesDefined/hasPropertiesDefined.js +36 -0
  16. package/dist/hasPropertiesDefined/hasPropertiesDefined.js.map +1 -0
  17. package/dist/hasPropertiesDefined/hasPropertiesDefined.test.d.ts +1 -0
  18. package/dist/hasPropertiesDefined/hasPropertiesDefined.test.js +37 -0
  19. package/dist/hasPropertiesDefined/hasPropertiesDefined.test.js.map +1 -0
  20. package/dist/index.d.ts +7 -0
  21. package/dist/index.js +19 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/remap/remap.d.ts +147 -0
  24. package/dist/remap/remap.js +50 -0
  25. package/dist/remap/remap.js.map +1 -0
  26. package/dist/remap/remap.test.d.ts +1 -0
  27. package/dist/remap/remap.test.js +65 -0
  28. package/dist/remap/remap.test.js.map +1 -0
  29. package/dist/retryWrapper/retryWrapper.d.ts +40 -0
  30. package/dist/retryWrapper/retryWrapper.js +121 -0
  31. package/dist/retryWrapper/retryWrapper.js.map +1 -0
  32. package/dist/retryWrapper/retryWrapper.test.d.ts +1 -0
  33. package/dist/retryWrapper/retryWrapper.test.js +234 -0
  34. package/dist/retryWrapper/retryWrapper.test.js.map +1 -0
  35. package/dist/s3/s3.d.ts +47 -0
  36. package/dist/s3/s3.js +196 -0
  37. package/dist/s3/s3.js.map +1 -0
  38. package/package.json +44 -0
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var lodash_1 = __importDefault(require("lodash"));
7
+ /**
8
+ * Map one object's values to another structure
9
+ * @param object the object to map from
10
+ * @param map the keys for the mapping
11
+ * @returns the remapped object
12
+ *
13
+ * @example without a transformer function
14
+ * ```ts
15
+ * const map = [
16
+ * ['foo', 'baz'],
17
+ * ['bar', 'qux.0']
18
+ * ] as const;
19
+ * const obj = { foo: 'hi', bar: 7 }
20
+ * remap(obj, map); // { baz: 'hi', qux: [7] }
21
+ * ```
22
+ * @example with a transformer function
23
+ * ```ts
24
+ * const map = [
25
+ * ['foo', 'baz'],
26
+ * ['bar', 'qux.0', (x: number) => x + 1]
27
+ * ] as const;
28
+ * const obj = { foo: 'hi', bar: 7 }
29
+ * remap(obj, map); // { baz: 'hi', qux: [8] }
30
+ * ```
31
+ * @example with an empty initial key
32
+ * ```ts
33
+ * const map = [
34
+ * ['', 'baz', (x: { foo: number, bar: number }) => x.foo + x.bar]
35
+ * ]
36
+ * const obj = { foo: 3, bar: 7 }
37
+ * remap(obj, map); // { baz: 10 }
38
+ * ```
39
+ */
40
+ function remap(object, map) {
41
+ var out = {};
42
+ map.forEach(function (item) {
43
+ var parser = item[2] ? item[2] : function (val) { return val; };
44
+ var value = item[0] ? lodash_1.default.get(object, item[0]) : object;
45
+ return lodash_1.default.set(out, item[1], parser(value));
46
+ });
47
+ return out;
48
+ }
49
+ exports.default = remap;
50
+ //# sourceMappingURL=remap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remap.js","sourceRoot":"","sources":["../../src/remap/remap.ts"],"names":[],"mappings":";;;;;AAAA,kDAAuB;AAoKvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,SAAS,KAAK,CAGZ,MAAgB,EAAE,GAAa;IAC/B,IAAM,GAAG,GAAG,EAAE,CAAC;IACf,GAAG,CAAC,OAAO,CAAC,UAAA,IAAI;QACd,IAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAC,GAAQ,IAAK,OAAA,GAAG,EAAH,CAAG,CAAC;QACrD,IAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACxD,OAAO,gBAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAY,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,OAAO,GAAU,CAAC;AACpB,CAAC;AAID,kBAAe,KAAK,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var remap_1 = __importDefault(require("./remap"));
7
+ describe('remap', function () {
8
+ it('remaps an object with one value', function () {
9
+ var obj = { foo: 7 };
10
+ var map = [
11
+ ['foo', 'bar']
12
+ ];
13
+ var newObj = (0, remap_1.default)(obj, map);
14
+ expect(newObj).toEqual({ bar: 7 });
15
+ });
16
+ it('uses a remap function', function () {
17
+ var obj = { foo: 7 };
18
+ var map = [
19
+ ['foo', 'bar', function (val) { return val * 2; }]
20
+ ];
21
+ var newObj = (0, remap_1.default)(obj, map);
22
+ expect(newObj).toEqual({ bar: 14 });
23
+ });
24
+ it('remaps through multiple levels', function () {
25
+ var obj = { foo: {
26
+ bar: 5
27
+ } };
28
+ var map = [
29
+ ['foo.bar', 'baz']
30
+ ];
31
+ var newObj = (0, remap_1.default)(obj, map);
32
+ expect(newObj).toEqual({ baz: 5 });
33
+ });
34
+ it('Passes whole object to function when the source key is blank', function () {
35
+ var obj = { foo: 7, bar: 3 };
36
+ var fn = jest.fn(function (val) {
37
+ return val.foo + val.bar;
38
+ });
39
+ var map = [
40
+ ['', 'foo', fn]
41
+ ];
42
+ var newObj = (0, remap_1.default)(obj, map);
43
+ expect(newObj).toEqual({ foo: 10 });
44
+ expect(fn).toHaveBeenCalledWith(obj);
45
+ });
46
+ it('creates arrays when .# is used', function () {
47
+ var obj = { foo: 1, bar: 2, baz: 7 };
48
+ var map = [
49
+ ['foo', 'foo.0'],
50
+ ['bar', 'foo.1'],
51
+ ['baz', 'foo.2']
52
+ ];
53
+ var newObj = (0, remap_1.default)(obj, map);
54
+ expect(newObj).toEqual({ foo: [1, 2, 7] });
55
+ });
56
+ it('follows the logic in the example code in the docs', function () {
57
+ var map = [
58
+ ['foo', 'baz'],
59
+ ['bar', 'qux.0', function (x) { return x + 1; }]
60
+ ];
61
+ var obj = { foo: 'hi', bar: 7 };
62
+ expect((0, remap_1.default)(obj, map)).toEqual({ baz: 'hi', qux: [8] });
63
+ });
64
+ });
65
+ //# sourceMappingURL=remap.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remap.test.js","sourceRoot":"","sources":["../../src/remap/remap.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /** Configuration for the retryWrapper */
2
+ interface RetryConfig {
3
+ /**
4
+ * The number of retries to attempt after the first run
5
+ * @default 1
6
+ */
7
+ retries?: number;
8
+ /**
9
+ * The base delay between retries (in ms)
10
+ * @default 0
11
+ */
12
+ delay?: number;
13
+ /**
14
+ * The amount to increase the delay by each retry (in ms)
15
+ * @default 0
16
+ */
17
+ backoffAmount?: number;
18
+ /**
19
+ * A callback to run before each retry
20
+ * @param retries the number of retries so far (will start at 1)
21
+ * @param error the error from the last attempt
22
+ * @param config the configuration supplied to the retryWrapper
23
+ */
24
+ onRetry?: (retries: number, error: Error, config: RetryConfig) => void;
25
+ }
26
+ /**
27
+ * Retry an async function if it fails
28
+ * @param fn the function to be retried
29
+ * @param config the configuration for retries
30
+ * @example
31
+ * ```ts
32
+ * retryWrapper(someAsyncFunction, {
33
+ * retries: 3,
34
+ * onRetry: (_, error) => console.error(error)
35
+ * });
36
+ * ```
37
+ */
38
+ declare function retryWrapper<T>(fn: () => Promise<T>, config: RetryConfig): Promise<T>;
39
+ export { RetryConfig };
40
+ export default retryWrapper;
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ /**
51
+ * Retry an async function if it fails
52
+ * @param fn the function to be retried
53
+ * @param config the configuration for retries
54
+ * @param retryCount the number of retries so far
55
+ * @param error the error from teh last retry
56
+ */
57
+ function retryWrapperInternal(fn, config, retryCount, error) {
58
+ return __awaiter(this, void 0, void 0, function () {
59
+ var result, err_1;
60
+ return __generator(this, function (_a) {
61
+ switch (_a.label) {
62
+ case 0:
63
+ if (config.retries < 0) {
64
+ throw error;
65
+ }
66
+ if (error) {
67
+ if (config.onRetry) {
68
+ config.onRetry(retryCount, error, config);
69
+ }
70
+ }
71
+ _a.label = 1;
72
+ case 1:
73
+ _a.trys.push([1, 3, , 6]);
74
+ return [4 /*yield*/, fn()];
75
+ case 2:
76
+ result = _a.sent();
77
+ return [2 /*return*/, result];
78
+ case 3:
79
+ err_1 = _a.sent();
80
+ return [4 /*yield*/, (function () { return new Promise(function (res) { return setTimeout(res, config.delay); }); })()];
81
+ case 4:
82
+ _a.sent();
83
+ return [4 /*yield*/, retryWrapperInternal(fn, __assign(__assign({}, config), { retries: config.retries - 1, delay: config.delay + config.backoffAmount }), retryCount + 1, err_1)];
84
+ case 5: return [2 /*return*/, _a.sent()];
85
+ case 6: return [2 /*return*/];
86
+ }
87
+ });
88
+ });
89
+ }
90
+ /**
91
+ * Retry an async function if it fails
92
+ * @param fn the function to be retried
93
+ * @param config the configuration for retries
94
+ * @example
95
+ * ```ts
96
+ * retryWrapper(someAsyncFunction, {
97
+ * retries: 3,
98
+ * onRetry: (_, error) => console.error(error)
99
+ * });
100
+ * ```
101
+ */
102
+ function retryWrapper(fn, config) {
103
+ return __awaiter(this, void 0, void 0, function () {
104
+ var defaultConfig;
105
+ return __generator(this, function (_a) {
106
+ switch (_a.label) {
107
+ case 0:
108
+ defaultConfig = {
109
+ retries: 1,
110
+ delay: 0,
111
+ backoffAmount: 0,
112
+ onRetry: function () { return null; }
113
+ };
114
+ return [4 /*yield*/, retryWrapperInternal(fn, __assign(__assign({}, defaultConfig), config), 0)];
115
+ case 1: return [2 /*return*/, _a.sent()];
116
+ }
117
+ });
118
+ });
119
+ }
120
+ exports.default = retryWrapper;
121
+ //# sourceMappingURL=retryWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retryWrapper.js","sourceRoot":"","sources":["../../src/retryWrapper/retryWrapper.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA;;;;;;GAMG;AACH,SAAe,oBAAoB,CACjC,EAAoB,EACpB,MAA6B,EAC7B,UAAkB,EAClB,KAAa;;;;;;oBAEb,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE;wBACtB,MAAM,KAAK,CAAC;qBACb;oBACD,IAAI,KAAK,EAAE;wBACT,IAAI,MAAM,CAAC,OAAO,EAAE;4BAClB,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;yBAC3C;qBACF;;;;oBAEgB,qBAAM,EAAE,EAAE,EAAA;;oBAAnB,MAAM,GAAG,SAAU;oBACzB,sBAAO,MAAM,EAAC;;;oBAEd,qBAAM,CAAC,cAAM,OAAA,IAAI,OAAO,CAAC,UAAC,GAAG,IAAK,OAAA,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAA7B,CAA6B,CAAC,EAAnD,CAAmD,CAAC,EAAE,EAAA;;oBAAnE,SAAmE,CAAC;oBAC7D,qBAAM,oBAAoB,CAC/B,EAAE,wBAEG,MAAM,KACT,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC,EAC3B,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,aAAa,KAE5C,UAAU,GAAG,CAAC,EACd,KAAG,CACJ,EAAA;wBATD,sBAAO,SASN,EAAC;;;;;CAEL;AAED;;;;;;;;;;;GAWG;AACH,SAAe,YAAY,CACzB,EAAoB,EACpB,MAAmB;;;;;;oBAEb,aAAa,GAA0B;wBAC3C,OAAO,EAAE,CAAC;wBACV,KAAK,EAAE,CAAC;wBACR,aAAa,EAAE,CAAC;wBAChB,OAAO,EAAE,cAAM,OAAA,IAAI,EAAJ,CAAI;qBACpB,CAAC;oBACK,qBAAM,oBAAoB,CAC/B,EAAE,wBAEG,aAAa,GACb,MAAM,GAEX,CAAC,CACF,EAAA;wBAPD,sBAAO,SAON,EAAC;;;;CACH;AAGD,kBAAe,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ var retryWrapper_1 = __importDefault(require("./retryWrapper"));
43
+ describe('retryWrapper', function () {
44
+ it('returns function\'s result', function () { return __awaiter(void 0, void 0, void 0, function () {
45
+ var result;
46
+ return __generator(this, function (_a) {
47
+ switch (_a.label) {
48
+ case 0: return [4 /*yield*/, (0, retryWrapper_1.default)(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
49
+ return [2 /*return*/, 3];
50
+ }); }); }, {
51
+ retries: 1
52
+ })];
53
+ case 1:
54
+ result = _a.sent();
55
+ expect(result).toBe(3);
56
+ return [2 /*return*/];
57
+ }
58
+ });
59
+ }); });
60
+ it('retries the function the correct amount of times', function () { return __awaiter(void 0, void 0, void 0, function () {
61
+ var fn, _a;
62
+ return __generator(this, function (_b) {
63
+ switch (_b.label) {
64
+ case 0:
65
+ fn = jest.fn(function () { return __awaiter(void 0, void 0, void 0, function () {
66
+ return __generator(this, function (_a) {
67
+ throw new Error('Test Error');
68
+ });
69
+ }); });
70
+ _b.label = 1;
71
+ case 1:
72
+ _b.trys.push([1, 3, , 4]);
73
+ return [4 /*yield*/, (0, retryWrapper_1.default)(fn, { retries: 3 })];
74
+ case 2:
75
+ _b.sent();
76
+ return [3 /*break*/, 4];
77
+ case 3:
78
+ _a = _b.sent();
79
+ expect(fn).toHaveBeenCalledTimes(4);
80
+ return [3 /*break*/, 4];
81
+ case 4: return [2 /*return*/];
82
+ }
83
+ });
84
+ }); });
85
+ it('errors if the function returns an error every time', function () { return __awaiter(void 0, void 0, void 0, function () {
86
+ var fn, ex_1;
87
+ return __generator(this, function (_a) {
88
+ switch (_a.label) {
89
+ case 0:
90
+ fn = jest.fn(function () { return __awaiter(void 0, void 0, void 0, function () {
91
+ return __generator(this, function (_a) {
92
+ throw new Error('Test Error');
93
+ });
94
+ }); });
95
+ _a.label = 1;
96
+ case 1:
97
+ _a.trys.push([1, 3, , 4]);
98
+ return [4 /*yield*/, (0, retryWrapper_1.default)(fn, { retries: 3 })];
99
+ case 2:
100
+ _a.sent();
101
+ return [3 /*break*/, 4];
102
+ case 3:
103
+ ex_1 = _a.sent();
104
+ expect(ex_1).toBeTruthy();
105
+ return [3 /*break*/, 4];
106
+ case 4: return [2 /*return*/];
107
+ }
108
+ });
109
+ }); });
110
+ it('retries after error', function () { return __awaiter(void 0, void 0, void 0, function () {
111
+ var count, fn, _a;
112
+ return __generator(this, function (_b) {
113
+ switch (_b.label) {
114
+ case 0:
115
+ count = 0;
116
+ fn = jest.fn(function () { return __awaiter(void 0, void 0, void 0, function () {
117
+ return __generator(this, function (_a) {
118
+ if (count < 2) {
119
+ count++;
120
+ throw new Error('Test Error');
121
+ }
122
+ return [2 /*return*/, true];
123
+ });
124
+ }); });
125
+ _a = expect;
126
+ return [4 /*yield*/, (0, retryWrapper_1.default)(fn, { retries: 3 })];
127
+ case 1:
128
+ _a.apply(void 0, [_b.sent()]).toBe(true);
129
+ expect(fn).toHaveBeenCalledTimes(3);
130
+ return [2 /*return*/];
131
+ }
132
+ });
133
+ }); });
134
+ it('adds a delay between tries', function () { return __awaiter(void 0, void 0, void 0, function () {
135
+ var fn, retries, delay, startTime, _a, totalTime;
136
+ return __generator(this, function (_b) {
137
+ switch (_b.label) {
138
+ case 0:
139
+ fn = jest.fn(function () { return __awaiter(void 0, void 0, void 0, function () {
140
+ return __generator(this, function (_a) {
141
+ throw new Error('Test Error');
142
+ });
143
+ }); });
144
+ retries = 3;
145
+ delay = 300;
146
+ startTime = Date.now();
147
+ _b.label = 1;
148
+ case 1:
149
+ _b.trys.push([1, 3, , 4]);
150
+ return [4 /*yield*/, (0, retryWrapper_1.default)(fn, {
151
+ retries: retries,
152
+ delay: delay
153
+ })];
154
+ case 2:
155
+ _b.sent();
156
+ return [3 /*break*/, 4];
157
+ case 3:
158
+ _a = _b.sent();
159
+ return [3 /*break*/, 4];
160
+ case 4:
161
+ totalTime = Date.now() - startTime;
162
+ expect(totalTime).toBeGreaterThanOrEqual((retries + 1) * delay);
163
+ return [2 /*return*/];
164
+ }
165
+ });
166
+ }); });
167
+ it('calls the onRetry function when a retry happens', function () { return __awaiter(void 0, void 0, void 0, function () {
168
+ var onRetry, fn, _a;
169
+ return __generator(this, function (_b) {
170
+ switch (_b.label) {
171
+ case 0:
172
+ onRetry = jest.fn();
173
+ fn = jest.fn(function () { return __awaiter(void 0, void 0, void 0, function () {
174
+ return __generator(this, function (_a) {
175
+ throw new Error('Test Error');
176
+ });
177
+ }); });
178
+ _b.label = 1;
179
+ case 1:
180
+ _b.trys.push([1, 3, , 4]);
181
+ return [4 /*yield*/, (0, retryWrapper_1.default)(fn, {
182
+ retries: 1,
183
+ onRetry: onRetry
184
+ })];
185
+ case 2:
186
+ _b.sent();
187
+ return [3 /*break*/, 4];
188
+ case 3:
189
+ _a = _b.sent();
190
+ return [3 /*break*/, 4];
191
+ case 4:
192
+ expect(onRetry).toHaveBeenCalledTimes(1);
193
+ return [2 /*return*/];
194
+ }
195
+ });
196
+ }); });
197
+ it('accurately counts retries', function () { return __awaiter(void 0, void 0, void 0, function () {
198
+ var onRetry, err, fn, _a;
199
+ return __generator(this, function (_b) {
200
+ switch (_b.label) {
201
+ case 0:
202
+ onRetry = jest.fn();
203
+ err = new Error('Test Error');
204
+ fn = jest.fn(function () { return __awaiter(void 0, void 0, void 0, function () {
205
+ return __generator(this, function (_a) {
206
+ throw err;
207
+ });
208
+ }); });
209
+ _b.label = 1;
210
+ case 1:
211
+ _b.trys.push([1, 3, , 4]);
212
+ return [4 /*yield*/, (0, retryWrapper_1.default)(fn, {
213
+ retries: 3,
214
+ onRetry: onRetry
215
+ })];
216
+ case 2:
217
+ _b.sent();
218
+ return [3 /*break*/, 4];
219
+ case 3:
220
+ _a = _b.sent();
221
+ return [3 /*break*/, 4];
222
+ case 4:
223
+ expect(onRetry).toHaveBeenLastCalledWith(3, err, {
224
+ retries: 0,
225
+ onRetry: onRetry,
226
+ delay: 0,
227
+ backoffAmount: 0
228
+ });
229
+ return [2 /*return*/];
230
+ }
231
+ });
232
+ }); });
233
+ });
234
+ //# sourceMappingURL=retryWrapper.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retryWrapper.test.js","sourceRoot":"","sources":["../../src/retryWrapper/retryWrapper.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { S3 } from 'aws-sdk';
2
+ /** A data access object for an S3 bucket */
3
+ declare class S3Dao {
4
+ private s3;
5
+ private bucket;
6
+ /**
7
+ * @param bucket the location of the bucket that objects should be stored in
8
+ */
9
+ constructor(bucket: string);
10
+ /**
11
+ * Store data in an S3 bucket
12
+ * @param data the data to store
13
+ * @param name the name to call the object in S3 @default the hash of the data
14
+ * @returns an object which can be used to fetch the data
15
+ */
16
+ storeData<T>(data: T, name?: string): Promise<S3.GetObjectRequest>;
17
+ /**
18
+ * Store an array of object as individual chunks in S3
19
+ * @param data the data to store
20
+ * @param chunkSize the number of entries that should be in each chunk
21
+ * @returns an array of objects which can be used to fetch the chunks
22
+ */
23
+ storeChunked<T extends any[]>(data: T, chunkSize: number): Promise<S3.GetObjectRequest[]>;
24
+ /**
25
+ * Fetch an object from the S3 bucket
26
+ * @param objectDetails the object which describes the location of the object
27
+ * @returns the body of the object
28
+ */
29
+ fetchData<T>(objectDetails: S3.GetObjectRequest): Promise<T>;
30
+ /**
31
+ * Generator to fetch chunked data, chunk by chunk
32
+ * @param chunks the list of object chunks
33
+ */
34
+ fetchChunks<T>(chunks: S3.GetObjectRequest[]): AsyncGenerator<{
35
+ chunk: T;
36
+ s3Object: S3.GetObjectRequest;
37
+ }, {
38
+ chunk: T;
39
+ s3Object: S3.GetObjectRequest;
40
+ }, unknown>;
41
+ /**
42
+ * Delete an object from the S3 bucket
43
+ * @param objectDetails the object to delete
44
+ */
45
+ deleteData(objectDetails: S3.GetObjectRequest): Promise<import("aws-sdk/lib/request").PromiseResult<S3.DeleteObjectOutput, import("aws-sdk").AWSError>>;
46
+ }
47
+ export default S3Dao;