@openstax/ts-utils 1.1.37 → 1.1.39

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.
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.lambdaParameterConfig = void 0;
7
7
  const node_fetch_1 = __importDefault(require("node-fetch"));
8
8
  const assertions_1 = require("../assertions");
9
+ const helpers_1 = require("../misc/helpers");
9
10
  const envConfig_1 = require("./envConfig");
10
11
  const _1 = require(".");
11
12
  const lambdaExtensionUrl = 'http://localhost:2773';
@@ -21,9 +22,9 @@ const lambdaParameterConfig = (parameterName) => async () => {
21
22
  lambdaExtensionReadyPromise = (0, node_fetch_1.default)(lambdaExtensionUrl);
22
23
  }
23
24
  await lambdaExtensionReadyPromise;
24
- const resp = await (0, node_fetch_1.default)(
25
+ const resp = await (0, helpers_1.retryWithDelay)(() => (0, node_fetch_1.default)(
25
26
  // Port 2773 is the default port for the extension
26
- `${lambdaExtensionUrl}/systemsmanager/parameters/get?name=${name}&withDecryption=true`, { headers: { 'X-Aws-Parameters-Secrets-Token': token } });
27
+ `${lambdaExtensionUrl}/systemsmanager/parameters/get?name=${name}&withDecryption=true`, { headers: { 'X-Aws-Parameters-Secrets-Token': token } }));
27
28
  if (resp.ok) {
28
29
  const response = await resp.json();
29
30
  const parameter = (0, assertions_1.assertDefined)(response.Parameter, `aws GetParameter response missing Parameter key for ${name}"`);
@@ -8,6 +8,13 @@ declare type FlowFnResult<F, A> = F extends FlowFn<A, infer R> ? R : never;
8
8
  declare type FlowResult<C, A> = C extends [infer F1, ...infer Cr] ? F1 extends AnyFlowFn ? Cr extends never[] ? FlowFnResult<F1, A> : FlowResult<Cr, FlowFnResult<F1, A>> : never : never;
9
9
  declare type FlowChainArg<C> = C extends [infer F1, ...infer _] ? F1 extends FlowFn<infer A, any> ? A : never : never;
10
10
  export declare const flow: <C extends AnyFlowFn[]>(...chain: C) => (param: FlowChainArg<C>) => FlowResult<C, FlowChainArg<C>>;
11
+ declare type RetryOptions = {
12
+ wait?: number;
13
+ splay?: number;
14
+ retries?: number;
15
+ n?: number;
16
+ };
17
+ export declare const retryWithDelay: <R>(fn: () => Promise<R>, options?: RetryOptions | undefined) => Promise<R>;
11
18
  export declare const fnIf: <T1, T2>(condition: boolean, trueValue: T1, falseValue: T2) => T1 | T2;
12
19
  export declare const mapFind: <I, R>(array: I[], mapper: (item: I) => R, predicate?: (result: R) => boolean) => R | undefined;
13
20
  export declare const once: <F extends (...args: any[]) => any>(fn: F) => F;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.tuple = exports.roundToPrecision = exports.memoize = exports.once = exports.mapFind = exports.fnIf = exports.flow = exports.coerceArray = exports.putKeyValue = exports.getKeyValueOr = exports.getKeyValue = void 0;
3
+ exports.tuple = exports.roundToPrecision = exports.memoize = exports.once = exports.mapFind = exports.fnIf = exports.retryWithDelay = exports.flow = exports.coerceArray = exports.putKeyValue = exports.getKeyValueOr = exports.getKeyValue = void 0;
4
4
  /*
5
5
  * there was a reason i made these instead of using lodash/fp but i forget what it was. i think maybe
6
6
  * these do more validation that the second function gets a compatible object.
@@ -33,6 +33,18 @@ const flow = (...chain) => (param) => {
33
33
  return result;
34
34
  };
35
35
  exports.flow = flow;
36
+ const retryWithDelay = (fn, options) => {
37
+ const { wait, splay, retries, n } = { wait: 100, splay: 0.5, retries: 2, n: 0, ...options };
38
+ if (n >= retries) {
39
+ return fn();
40
+ }
41
+ const timeout = (n + 1) * wait + (Math.random() * 2 - 1) * splay * wait;
42
+ const retry = () => new Promise((resolve, reject) => {
43
+ setTimeout(() => (0, exports.retryWithDelay)(fn, { ...options, n: n + 1 }).then(resolve, reject), timeout);
44
+ });
45
+ return fn().catch(retry);
46
+ };
47
+ exports.retryWithDelay = retryWithDelay;
36
48
  /*
37
49
  * a shameful helper to avoid needing to test code coverage of branches
38
50
  */