easy-currencies 1.8.2 → 1.8.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.
@@ -22,16 +22,32 @@ const utils_1 = require("../parts/utils");
22
22
  */
23
23
  function fetchRates(client, provider, query) {
24
24
  return __awaiter(this, void 0, void 0, function* () {
25
- const [err, result] = (yield (0, utils_1._to)(client.get(formatUrl(provider, query))));
26
- // resolving error
27
- const error = provider.errorHandler(err ? err.response : result.data);
28
- // returning either the meaning of the error (if registered in provider's definition), or the error itself.
29
- if (error) {
30
- throw provider.errors[error]
31
- ? { handled: true, error: provider.errors[error] }
32
- : { handled: false, error };
25
+ var _a;
26
+ const maxRetries = 5;
27
+ let attempt = 0;
28
+ let delay = 1000; // initial delay in ms
29
+ while (true) {
30
+ const [err, result] = (yield (0, utils_1._to)(client.get(formatUrl(provider, query))));
31
+ if (((_a = err === null || err === void 0 ? void 0 : err.response) === null || _a === void 0 ? void 0 : _a.status) === 429) {
32
+ if (attempt >= maxRetries) {
33
+ throw { handled: false, error: "Too many 429 responses, giving up." };
34
+ }
35
+ const jitter = Math.random() * 1000; // jitter between 0 and 1000ms
36
+ yield (0, utils_1.sleep)(delay + jitter);
37
+ attempt++;
38
+ delay *= 2;
39
+ continue;
40
+ }
41
+ // resolving error
42
+ const error = provider.errorHandler(err ? err.response : result.data);
43
+ // returning either the meaning of the error (if registered in provider's definition), or the error itself.
44
+ if (error) {
45
+ throw provider.errors[error]
46
+ ? { handled: true, error: provider.errors[error] }
47
+ : { handled: false, error };
48
+ }
49
+ return result.data;
33
50
  }
34
- return result.data;
35
51
  });
36
52
  }
37
53
  exports.fetchRates = fetchRates;
@@ -54,4 +70,4 @@ function formatUrl(provider, query) {
54
70
  .replace("%TO%", query.TO)
55
71
  .replace("%KEY%", provider.key || "");
56
72
  }
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL3JlcXVlc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFFQSwwQ0FBb0M7QUFjcEM7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFzQixVQUFVLENBQzlCLE1BQXFCLEVBQ3JCLFFBQWtCLEVBQ2xCLEtBQVk7O1FBRVosTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBQSxXQUFHLEVBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FHdkUsQ0FBQztRQUVGLGtCQUFrQjtRQUNsQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRFLDJHQUEyRztRQUMzRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDMUIsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDbEQsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7Q0FBQTtBQXJCRCxnQ0FxQkM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxRQUFrQixFQUFFLEtBQVk7SUFDakQsd0JBQXdCO0lBQ3hCLGlFQUFpRTtJQUNqRSxxQ0FBcUM7SUFDckMsNkNBQTZDO0lBQzdDLElBQUk7SUFFSiwrREFBK0Q7SUFDL0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQ3ZELE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQztTQUM3QixPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDekIsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLENBQUMifQ==
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL3JlcXVlc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFFQSwwQ0FBMkM7QUFlM0M7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFzQixVQUFVLENBQzlCLE1BQXFCLEVBQ3JCLFFBQWtCLEVBQ2xCLEtBQVk7OztRQUVaLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsc0JBQXNCO1FBRXhDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFBLFdBQUcsRUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUd2RSxDQUFDO1lBRUYsSUFBSSxDQUFBLE1BQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLFFBQVEsMENBQUUsTUFBTSxNQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLG9DQUFvQyxFQUFFLENBQUM7Z0JBQ3hFLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLDhCQUE4QjtnQkFDbkUsTUFBTSxJQUFBLGFBQUssRUFBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQzVCLE9BQU8sRUFBRSxDQUFDO2dCQUNWLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ1gsU0FBUztZQUNYLENBQUM7WUFFRCxrQkFBa0I7WUFDbEIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV0RSwyR0FBMkc7WUFDM0csSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUMxQixDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUNsRCxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2hDLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7Q0FBQTtBQXRDRCxnQ0FzQ0M7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxRQUFrQixFQUFFLEtBQVk7SUFDakQsd0JBQXdCO0lBQ3hCLGlFQUFpRTtJQUNqRSxxQ0FBcUM7SUFDckMsNkNBQTZDO0lBQzdDLElBQUk7SUFFSiwrREFBK0Q7SUFDL0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQ3ZELE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQztTQUM3QixPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDekIsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLENBQUMifQ==
@@ -21,3 +21,10 @@ export declare function checkIfProvider(provider: Provider | any): provider is P
21
21
  * @returns A promise that resolves to a tuple containing the error (if any) and the resolved value (if any).
22
22
  */
23
23
  export declare function _to<T, U = Error>(promise: Promise<T>): Promise<[U | null, T | null]>;
24
+ /**
25
+ * Delays execution by the specified amount of time.
26
+ *
27
+ * @param ms - The number of milliseconds to wait.
28
+ * @returns A promise that resolves after the specified delay.
29
+ */
30
+ export declare function sleep(ms: number): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports._to = exports.checkIfProvider = exports.checkIfUserDefinedProvider = void 0;
3
+ exports.sleep = exports._to = exports.checkIfProvider = exports.checkIfUserDefinedProvider = void 0;
4
4
  /**
5
5
  * Utility for typechecking UserDefinedProvider objects
6
6
  *
@@ -39,4 +39,14 @@ function _to(promise) {
39
39
  .catch((err) => [err, null]);
40
40
  }
41
41
  exports._to = _to;
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFydHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUE7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQ3hDLG1CQUE4QztJQUU5QyxPQUFPLENBQ0osbUJBQTJDLENBQUMsSUFBSSxLQUFLLFNBQVM7UUFDL0QsZUFBZSxDQUFFLG1CQUEyQyxDQUFDLFFBQVEsQ0FBQyxDQUN2RSxDQUFDO0FBQ0osQ0FBQztBQVBELGdFQU9DO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixRQUF3QjtJQUV4QixPQUFPLENBQ0osUUFBcUIsQ0FBQyxRQUFRLEtBQUssU0FBUztRQUM1QyxRQUFxQixDQUFDLFlBQVksS0FBSyxTQUFTO1FBQ2hELFFBQXFCLENBQUMsTUFBTSxLQUFLLFNBQVM7UUFDMUMsUUFBcUIsQ0FBQyxPQUFPLEtBQUssU0FBUztRQUMzQyxRQUFxQixDQUFDLEdBQUcsS0FBSyxTQUFTLENBQ3pDLENBQUM7QUFDSixDQUFDO0FBVkQsMENBVUM7QUFHRDs7OztHQUlHO0FBQ0gsU0FBZ0IsR0FBRyxDQUNqQixPQUFtQjtJQUVuQixPQUFPLE9BQU87U0FDWCxJQUFJLENBQUMsQ0FBQyxJQUFPLEVBQWEsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzFDLEtBQUssQ0FBQyxDQUFDLEdBQU0sRUFBYSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBTkQsa0JBTUMifQ==
42
+ /**
43
+ * Delays execution by the specified amount of time.
44
+ *
45
+ * @param ms - The number of milliseconds to wait.
46
+ * @returns A promise that resolves after the specified delay.
47
+ */
48
+ function sleep(ms) {
49
+ return new Promise(resolve => setTimeout(resolve, ms));
50
+ }
51
+ exports.sleep = sleep;
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFydHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUE7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQ3hDLG1CQUE4QztJQUU5QyxPQUFPLENBQ0osbUJBQTJDLENBQUMsSUFBSSxLQUFLLFNBQVM7UUFDL0QsZUFBZSxDQUFFLG1CQUEyQyxDQUFDLFFBQVEsQ0FBQyxDQUN2RSxDQUFDO0FBQ0osQ0FBQztBQVBELGdFQU9DO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixRQUF3QjtJQUV4QixPQUFPLENBQ0osUUFBcUIsQ0FBQyxRQUFRLEtBQUssU0FBUztRQUM1QyxRQUFxQixDQUFDLFlBQVksS0FBSyxTQUFTO1FBQ2hELFFBQXFCLENBQUMsTUFBTSxLQUFLLFNBQVM7UUFDMUMsUUFBcUIsQ0FBQyxPQUFPLEtBQUssU0FBUztRQUMzQyxRQUFxQixDQUFDLEdBQUcsS0FBSyxTQUFTLENBQ3pDLENBQUM7QUFDSixDQUFDO0FBVkQsMENBVUM7QUFHRDs7OztHQUlHO0FBQ0gsU0FBZ0IsR0FBRyxDQUNqQixPQUFtQjtJQUVuQixPQUFPLE9BQU87U0FDWCxJQUFJLENBQUMsQ0FBQyxJQUFPLEVBQWEsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzFDLEtBQUssQ0FBQyxDQUFDLEdBQU0sRUFBYSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBTkQsa0JBTUM7QUFHRDs7Ozs7R0FLRztBQUNILFNBQWdCLEtBQUssQ0FBQyxFQUFVO0lBQzlCLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUZELHNCQUVDIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "easy-currencies",
3
- "version": "1.8.2",
3
+ "version": "1.8.3",
4
4
  "description": "A tool for easy conversion of currencies.",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -1,6 +1,6 @@
1
1
  import { AxiosError, AxiosInstance, AxiosResponse } from "axios";
2
2
  import { Provider } from "./providers";
3
- import { _to } from "../parts/utils"
3
+ import { _to, sleep } from "../parts/utils"
4
4
 
5
5
  /**
6
6
  * Query interface, used to interact with the requester.
@@ -14,6 +14,7 @@ export interface Query {
14
14
  multiple: boolean;
15
15
  }
16
16
 
17
+
17
18
  /**
18
19
  * The fetchRates function, used for fetching currency conversion rates.
19
20
  *
@@ -28,22 +29,39 @@ export async function fetchRates(
28
29
  provider: Provider,
29
30
  query: Query
30
31
  ): Promise<any> {
31
- const [err, result] = (await _to(client.get(formatUrl(provider, query)))) as [
32
- AxiosError,
33
- AxiosResponse
34
- ];
32
+ const maxRetries = 5;
33
+ let attempt = 0;
34
+ let delay = 1000; // initial delay in ms
35
35
 
36
- // resolving error
37
- const error = provider.errorHandler(err ? err.response : result.data);
36
+ while (true) {
37
+ const [err, result] = (await _to(client.get(formatUrl(provider, query)))) as [
38
+ AxiosError,
39
+ AxiosResponse
40
+ ];
38
41
 
39
- // returning either the meaning of the error (if registered in provider's definition), or the error itself.
40
- if (error) {
41
- throw provider.errors[error]
42
- ? { handled: true, error: provider.errors[error] }
43
- : { handled: false, error };
44
- }
42
+ if (err?.response?.status === 429) {
43
+ if (attempt >= maxRetries) {
44
+ throw { handled: false, error: "Too many 429 responses, giving up." };
45
+ }
46
+ const jitter = Math.random() * 1000; // jitter between 0 and 1000ms
47
+ await sleep(delay + jitter);
48
+ attempt++;
49
+ delay *= 2;
50
+ continue;
51
+ }
52
+
53
+ // resolving error
54
+ const error = provider.errorHandler(err ? err.response : result.data);
45
55
 
46
- return result.data;
56
+ // returning either the meaning of the error (if registered in provider's definition), or the error itself.
57
+ if (error) {
58
+ throw provider.errors[error]
59
+ ? { handled: true, error: provider.errors[error] }
60
+ : { handled: false, error };
61
+ }
62
+
63
+ return result.data;
64
+ }
47
65
  }
48
66
 
49
67
  /**
@@ -48,3 +48,14 @@ export function _to<T, U = Error>(
48
48
  .then((data: T): [null, T] => [null, data])
49
49
  .catch((err: U): [U, null] => [err, null]);
50
50
  }
51
+
52
+
53
+ /**
54
+ * Delays execution by the specified amount of time.
55
+ *
56
+ * @param ms - The number of milliseconds to wait.
57
+ * @returns A promise that resolves after the specified delay.
58
+ */
59
+ export function sleep(ms: number): Promise<void> {
60
+ return new Promise(resolve => setTimeout(resolve, ms));
61
+ }
package/tsconfig.json CHANGED
@@ -11,6 +11,7 @@
11
11
  },
12
12
  "exclude": [
13
13
  "node_modules",
14
- "dist"
14
+ "dist",
15
+ "test"
15
16
  ]
16
17
  }