@ledgerhq/live-network 1.1.0-next.0
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/.eslintrc.js +57 -0
- package/.turbo/turbo-build.log +4 -0
- package/CHANGELOG.md +7 -0
- package/jest.config.js +6 -0
- package/lib/cache.d.ts +21 -0
- package/lib/cache.d.ts.map +1 -0
- package/lib/cache.js +65 -0
- package/lib/cache.js.map +1 -0
- package/lib/network.d.ts +20 -0
- package/lib/network.d.ts.map +1 -0
- package/lib/network.js +159 -0
- package/lib/network.js.map +1 -0
- package/lib/network.test.d.ts +2 -0
- package/lib/network.test.d.ts.map +1 -0
- package/lib/network.test.js +120 -0
- package/lib/network.test.js.map +1 -0
- package/lib-es/cache.d.ts +21 -0
- package/lib-es/cache.d.ts.map +1 -0
- package/lib-es/cache.js +58 -0
- package/lib-es/cache.js.map +1 -0
- package/lib-es/network.d.ts +20 -0
- package/lib-es/network.d.ts.map +1 -0
- package/lib-es/network.js +150 -0
- package/lib-es/network.js.map +1 -0
- package/lib-es/network.test.d.ts +2 -0
- package/lib-es/network.test.d.ts.map +1 -0
- package/lib-es/network.test.js +95 -0
- package/lib-es/network.test.js.map +1 -0
- package/package.json +85 -0
- package/src/cache.ts +78 -0
- package/src/network.test.ts +114 -0
- package/src/network.ts +204 -0
- package/tsconfig.json +14 -0
package/.eslintrc.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
parser: "@typescript-eslint/parser",
|
|
3
|
+
env: {
|
|
4
|
+
browser: true,
|
|
5
|
+
es6: true,
|
|
6
|
+
node: true,
|
|
7
|
+
jest: true,
|
|
8
|
+
},
|
|
9
|
+
extends: [
|
|
10
|
+
"eslint:recommended",
|
|
11
|
+
"plugin:@typescript-eslint/eslint-recommended",
|
|
12
|
+
"plugin:@typescript-eslint/recommended",
|
|
13
|
+
"prettier",
|
|
14
|
+
],
|
|
15
|
+
globals: {
|
|
16
|
+
Atomics: "readonly",
|
|
17
|
+
SharedArrayBuffer: "readonly",
|
|
18
|
+
},
|
|
19
|
+
plugins: ["@typescript-eslint", "prettier"],
|
|
20
|
+
rules: {
|
|
21
|
+
"no-console": ["error", { allow: ["warn", "error"] }],
|
|
22
|
+
"linebreak-style": ["error", "unix"],
|
|
23
|
+
semi: ["error", "always"],
|
|
24
|
+
"no-unused-vars": "off",
|
|
25
|
+
"import/prefer-default-export": 0,
|
|
26
|
+
"no-plusplus": 0,
|
|
27
|
+
"no-underscore-dangle": 0,
|
|
28
|
+
"prefer-template": 0,
|
|
29
|
+
"no-await-in-loop": 0,
|
|
30
|
+
"no-restricted-syntax": 0,
|
|
31
|
+
"consistent-return": 0,
|
|
32
|
+
"no-lonely-if": 0,
|
|
33
|
+
"no-use-before-define": 0,
|
|
34
|
+
"no-nested-ternary": 0,
|
|
35
|
+
"import/no-cycle": 0,
|
|
36
|
+
"no-multi-assign": 0,
|
|
37
|
+
"guard-for-in": 0,
|
|
38
|
+
"no-continue": 0,
|
|
39
|
+
"lines-between-class-members": 0,
|
|
40
|
+
"prefer-destructuring": 0,
|
|
41
|
+
"prettier/prettier": "error",
|
|
42
|
+
"@typescript-eslint/no-use-before-define": "off",
|
|
43
|
+
"@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
|
|
44
|
+
"@typescript-eslint/no-empty-function": "off",
|
|
45
|
+
"@typescript-eslint/no-namespace": ["error", { allowDeclarations: true }],
|
|
46
|
+
"@typescript-eslint/no-explicit-any": 0,
|
|
47
|
+
"@typescript-eslint/ban-types": [
|
|
48
|
+
"error",
|
|
49
|
+
{
|
|
50
|
+
extendDefaults: true,
|
|
51
|
+
types: {
|
|
52
|
+
"{}": false,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
};
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# @ledgerhq/live-network
|
|
2
|
+
|
|
3
|
+
## 1.1.0-next.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#3515](https://github.com/LedgerHQ/ledger-live/pull/3515) [`ce675302c7`](https://github.com/LedgerHQ/ledger-live/commit/ce675302c78311571e1087cfa35ee67580263796) Thanks [@chabroA](https://github.com/chabroA)! - Create live-network package to host network and cache logics
|
package/jest.config.js
ADDED
package/lib/cache.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import LRU from "lru-cache";
|
|
2
|
+
export type CacheRes<A extends Array<any>, T> = {
|
|
3
|
+
(...args: A): Promise<T>;
|
|
4
|
+
force: (...args: A) => Promise<T>;
|
|
5
|
+
hydrate: (key: string, value: T) => void;
|
|
6
|
+
clear: (key: string) => void;
|
|
7
|
+
reset: () => void;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Creates an LRU cache function that wraps the given async function `f`.
|
|
11
|
+
* By default it will have a lifespan of 300 seconds and a change in the key
|
|
12
|
+
* will invalidate its value.
|
|
13
|
+
*
|
|
14
|
+
* @param {(...args: A) => Promise<T>} f - The async function to be cached.
|
|
15
|
+
* @param {(...args: A) => string} [keyExtractor] - A function that extracts a cache key from the arguments passed to `f`.
|
|
16
|
+
* @param {LRU.Options<string, any>} [lruOpts] - Options for the internal LRU cache.
|
|
17
|
+
*
|
|
18
|
+
* @returns {CacheRes<A, T>} A cached version of the async function `f`.
|
|
19
|
+
*/
|
|
20
|
+
export declare const makeLRUCache: <A extends any[], T>(f: (...args: A) => Promise<T>, keyExtractor?: (...args: A) => string, lruOpts?: LRU.Options<string, any>) => CacheRes<A, T>;
|
|
21
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,WAAW,CAAC;AAE5B,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI;IAC9C,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACzC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,qFAEO,MAAM,YAC3B,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,mBAqDlC,CAAC"}
|
package/lib/cache.js
ADDED
|
@@ -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
|
+
exports.makeLRUCache = void 0;
|
|
7
|
+
const lru_cache_1 = __importDefault(require("lru-cache"));
|
|
8
|
+
/**
|
|
9
|
+
* Creates an LRU cache function that wraps the given async function `f`.
|
|
10
|
+
* By default it will have a lifespan of 300 seconds and a change in the key
|
|
11
|
+
* will invalidate its value.
|
|
12
|
+
*
|
|
13
|
+
* @param {(...args: A) => Promise<T>} f - The async function to be cached.
|
|
14
|
+
* @param {(...args: A) => string} [keyExtractor] - A function that extracts a cache key from the arguments passed to `f`.
|
|
15
|
+
* @param {LRU.Options<string, any>} [lruOpts] - Options for the internal LRU cache.
|
|
16
|
+
*
|
|
17
|
+
* @returns {CacheRes<A, T>} A cached version of the async function `f`.
|
|
18
|
+
*/
|
|
19
|
+
const makeLRUCache = (f, keyExtractor = () => "", lruOpts = {
|
|
20
|
+
max: 100,
|
|
21
|
+
ttl: 5 * 60 * 1000,
|
|
22
|
+
}) => {
|
|
23
|
+
// LRU-Cache is written in JS and do not enforce in its code the type checking.
|
|
24
|
+
// Regarding its [documentation](https://github.com/isaacs/node-lru-cache/#ttl), `max` or `ttlAutopurge` must be set.
|
|
25
|
+
// As the code in live use sometimes `max` property with `ttl`, we check it's defined in `lruOpts` to add or not `ttlAutopurge`.
|
|
26
|
+
// eslint-disable-next-line
|
|
27
|
+
// @ts-ignore: TS-2339
|
|
28
|
+
lruOpts = lruOpts.max
|
|
29
|
+
? lruOpts
|
|
30
|
+
: Object.assign(Object.assign({}, lruOpts), { ttlAutopurge: true });
|
|
31
|
+
const cache = new lru_cache_1.default(lruOpts);
|
|
32
|
+
const result = (...args) => {
|
|
33
|
+
const key = keyExtractor(...args);
|
|
34
|
+
let promise = cache.get(key);
|
|
35
|
+
if (promise)
|
|
36
|
+
return promise;
|
|
37
|
+
promise = f(...args).catch((e) => {
|
|
38
|
+
cache.delete(key);
|
|
39
|
+
throw e;
|
|
40
|
+
});
|
|
41
|
+
cache.set(key, promise);
|
|
42
|
+
return promise;
|
|
43
|
+
};
|
|
44
|
+
result.force = (...args) => {
|
|
45
|
+
const key = keyExtractor(...args);
|
|
46
|
+
const promise = f(...args).catch((e) => {
|
|
47
|
+
cache.delete(key);
|
|
48
|
+
throw e;
|
|
49
|
+
});
|
|
50
|
+
cache.set(key, promise);
|
|
51
|
+
return promise;
|
|
52
|
+
};
|
|
53
|
+
result.hydrate = (key, value) => {
|
|
54
|
+
cache.set(key, Promise.resolve(value));
|
|
55
|
+
};
|
|
56
|
+
result.clear = (key) => {
|
|
57
|
+
cache.delete(key);
|
|
58
|
+
};
|
|
59
|
+
result.reset = () => {
|
|
60
|
+
cache.clear();
|
|
61
|
+
};
|
|
62
|
+
return result;
|
|
63
|
+
};
|
|
64
|
+
exports.makeLRUCache = makeLRUCache;
|
|
65
|
+
//# sourceMappingURL=cache.js.map
|
package/lib/cache.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA4B;AAU5B;;;;;;;;;;GAUG;AACI,MAAM,YAAY,GAAG,CAC1B,CAA6B,EAC7B,eAAuC,GAAG,EAAE,CAAC,EAAE,EAC/C,UAAoC;IAClC,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;CACnB,EACe,EAAE;IAClB,+EAA+E;IAC/E,qHAAqH;IACrH,gIAAgI;IAChI,2BAA2B;IAC3B,sBAAsB;IACtB,OAAO,GAAG,OAAO,CAAC,GAAG;QACnB,CAAC,CAAC,OAAO;QACT,CAAC,iCACM,OAAO,KACV,YAAY,EAAE,IAAI,GACnB,CAAC;IACN,MAAM,KAAK,GAAG,IAAI,mBAAG,CAAC,OAAO,CAAC,CAAC;IAE/B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAO,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;QAClC,IAAI,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,IAAO,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACrC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,CAAC,OAAO,GAAG,CAAC,GAAW,EAAE,KAAQ,EAAE,EAAE;QACzC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE;QAC7B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE;QAClB,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAxDW,QAAA,YAAY,gBAwDvB"}
|
package/lib/network.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AxiosError, AxiosRequestConfig } from "axios";
|
|
2
|
+
import { AxiosPromise, AxiosResponse } from "axios";
|
|
3
|
+
type Metadata = {
|
|
4
|
+
startTime: number;
|
|
5
|
+
};
|
|
6
|
+
type ExtendedXHRConfig = AxiosRequestConfig & {
|
|
7
|
+
metadata?: Metadata;
|
|
8
|
+
};
|
|
9
|
+
export declare const requestInterceptor: (request: AxiosRequestConfig) => ExtendedXHRConfig;
|
|
10
|
+
type InterceptedResponse = {
|
|
11
|
+
config: ExtendedXHRConfig;
|
|
12
|
+
} & AxiosResponse<any>;
|
|
13
|
+
export declare const responseInterceptor: (response: InterceptedResponse) => InterceptedResponse;
|
|
14
|
+
type InterceptedError = {
|
|
15
|
+
response?: InterceptedResponse;
|
|
16
|
+
} & AxiosError<any>;
|
|
17
|
+
export declare const errorInterceptor: (error: InterceptedError) => InterceptedError;
|
|
18
|
+
declare const implementation: <T = any>(arg: AxiosRequestConfig) => AxiosPromise<T>;
|
|
19
|
+
export default implementation;
|
|
20
|
+
//# sourceMappingURL=network.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAU,MAAM,OAAO,CAAC;AACpE,OAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3D,KAAK,QAAQ,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AACtC,KAAK,iBAAiB,GAAG,kBAAkB,GAAG;IAAE,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEtE,eAAO,MAAM,kBAAkB,YACpB,kBAAkB,KAC1B,iBAeF,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,MAAM,EAAE,iBAAiB,CAAC;CAC3B,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;AAEvB,eAAO,MAAM,mBAAmB,aACpB,mBAAmB,KAC5B,mBAiBF,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;AAEpB,eAAO,MAAM,gBAAgB,UAAW,gBAAgB,KAAG,gBA2C1D,CAAC;AAmEF,QAAA,MAAM,cAAc,iBAAkB,kBAAkB,oBAiBvD,CAAC;AAiBF,eAAe,cAAc,CAAC"}
|
package/lib/network.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
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
|
+
exports.errorInterceptor = exports.responseInterceptor = exports.requestInterceptor = void 0;
|
|
7
|
+
const errors_1 = require("@ledgerhq/errors");
|
|
8
|
+
const live_env_1 = require("@ledgerhq/live-env");
|
|
9
|
+
const live_promise_1 = require("@ledgerhq/live-promise");
|
|
10
|
+
const logs_1 = require("@ledgerhq/logs");
|
|
11
|
+
const axios_1 = __importDefault(require("axios"));
|
|
12
|
+
const invariant_1 = __importDefault(require("invariant"));
|
|
13
|
+
const requestInterceptor = (request) => {
|
|
14
|
+
if (!(0, live_env_1.getEnv)("ENABLE_NETWORK_LOGS")) {
|
|
15
|
+
return request;
|
|
16
|
+
}
|
|
17
|
+
const { baseURL, url, method = "", data } = request;
|
|
18
|
+
(0, logs_1.log)("network", `${method} ${baseURL || ""}${url}`, { data });
|
|
19
|
+
const req = request;
|
|
20
|
+
req.metadata = {
|
|
21
|
+
startTime: Date.now(),
|
|
22
|
+
};
|
|
23
|
+
return req;
|
|
24
|
+
};
|
|
25
|
+
exports.requestInterceptor = requestInterceptor;
|
|
26
|
+
const responseInterceptor = (response) => {
|
|
27
|
+
if (!(0, live_env_1.getEnv)("ENABLE_NETWORK_LOGS")) {
|
|
28
|
+
return response;
|
|
29
|
+
}
|
|
30
|
+
const { baseURL, url, method = "", metadata } = response.config;
|
|
31
|
+
const { startTime = 0 } = metadata || {};
|
|
32
|
+
(0, logs_1.log)("network-success", `${response.status} ${method} ${baseURL || ""}${url} (${(Date.now() - startTime).toFixed(0)}ms)`, { data: response.data });
|
|
33
|
+
return response;
|
|
34
|
+
};
|
|
35
|
+
exports.responseInterceptor = responseInterceptor;
|
|
36
|
+
const errorInterceptor = (error) => {
|
|
37
|
+
var _a;
|
|
38
|
+
const config = (_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.config;
|
|
39
|
+
if (!config)
|
|
40
|
+
throw error;
|
|
41
|
+
const { baseURL, url, method = "", metadata } = config;
|
|
42
|
+
const { startTime = 0 } = metadata || {};
|
|
43
|
+
const duration = `${(Date.now() - startTime).toFixed(0)}ms`;
|
|
44
|
+
let errorToThrow;
|
|
45
|
+
if (error.response) {
|
|
46
|
+
// The request was made and the server responded with a status code
|
|
47
|
+
// that falls out of the range of 2xx
|
|
48
|
+
const { data, status } = error.response;
|
|
49
|
+
let msg;
|
|
50
|
+
try {
|
|
51
|
+
if (data && typeof data === "string") {
|
|
52
|
+
msg = extractErrorMessage(data);
|
|
53
|
+
}
|
|
54
|
+
else if (data && typeof data === "object") {
|
|
55
|
+
msg = getErrorMessage(data);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
(0, logs_1.log)("warn", "can't parse server result " + String(e));
|
|
60
|
+
}
|
|
61
|
+
if (msg) {
|
|
62
|
+
errorToThrow = makeError(msg, status, url, method);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
errorToThrow = makeError(`API HTTP ${status}`, status, url, method);
|
|
66
|
+
}
|
|
67
|
+
(0, logs_1.log)("network-error", `${status} ${method} ${baseURL || ""}${url} (${duration}): ${errorToThrow.message}`, (0, live_env_1.getEnv)("DEBUG_HTTP_RESPONSE") ? { data: data } : {});
|
|
68
|
+
throw errorToThrow;
|
|
69
|
+
}
|
|
70
|
+
else if (error.request) {
|
|
71
|
+
(0, logs_1.log)("network-down", `DOWN ${method} ${baseURL || ""}${url} (${duration})`);
|
|
72
|
+
throw new errors_1.NetworkDown();
|
|
73
|
+
}
|
|
74
|
+
throw error;
|
|
75
|
+
};
|
|
76
|
+
exports.errorInterceptor = errorInterceptor;
|
|
77
|
+
axios_1.default.interceptors.request.use(exports.requestInterceptor);
|
|
78
|
+
axios_1.default.interceptors.response.use(exports.responseInterceptor, exports.errorInterceptor);
|
|
79
|
+
// not react native
|
|
80
|
+
if (!(typeof navigator !== "undefined" && navigator.product === "ReactNative")) {
|
|
81
|
+
// the keepAlive is necessary when we make a lot of request in in parallel, especially for bitcoin sync. Otherwise, it may raise "connect ETIMEDOUT" error
|
|
82
|
+
// refer to https://stackoverflow.com/questions/63064393/getting-axios-error-connect-etimedout-when-making-high-volume-of-calls
|
|
83
|
+
// eslint-disable-next-line global-require,@typescript-eslint/no-var-requires
|
|
84
|
+
const https = require("https");
|
|
85
|
+
axios_1.default.defaults.httpsAgent = new https.Agent({ keepAlive: true });
|
|
86
|
+
}
|
|
87
|
+
const makeError = (msg, status, url, method) => {
|
|
88
|
+
const obj = {
|
|
89
|
+
status,
|
|
90
|
+
url,
|
|
91
|
+
method,
|
|
92
|
+
};
|
|
93
|
+
return (status || "").toString().startsWith("4")
|
|
94
|
+
? new errors_1.LedgerAPI4xx(msg, obj)
|
|
95
|
+
: new errors_1.LedgerAPI5xx(msg, obj);
|
|
96
|
+
};
|
|
97
|
+
const getErrorMessage = (data) => {
|
|
98
|
+
if (!data)
|
|
99
|
+
return "";
|
|
100
|
+
if (typeof data === "string")
|
|
101
|
+
return data;
|
|
102
|
+
if (data.errors) {
|
|
103
|
+
return getErrorMessage(data.errors[0]);
|
|
104
|
+
}
|
|
105
|
+
return data.message || data.error_message || data.error || data.msg;
|
|
106
|
+
};
|
|
107
|
+
const extractErrorMessage = (raw) => {
|
|
108
|
+
let data = JSON.parse(raw);
|
|
109
|
+
if (data && Array.isArray(data))
|
|
110
|
+
data = data[0];
|
|
111
|
+
let msg = getErrorMessage(data);
|
|
112
|
+
if (typeof msg === "string") {
|
|
113
|
+
const m = msg.match(/^JsDefined\((.*)\)$/);
|
|
114
|
+
const innerPart = m ? m[1] : msg;
|
|
115
|
+
const r = JSON.parse(innerPart);
|
|
116
|
+
let message = r.message;
|
|
117
|
+
if (typeof message === "object") {
|
|
118
|
+
message = message.message;
|
|
119
|
+
}
|
|
120
|
+
if (typeof message === "string") {
|
|
121
|
+
msg = message;
|
|
122
|
+
}
|
|
123
|
+
return msg ? String(msg) : undefined;
|
|
124
|
+
}
|
|
125
|
+
return;
|
|
126
|
+
};
|
|
127
|
+
const implementation = (arg) => {
|
|
128
|
+
(0, invariant_1.default)(typeof arg === "object", "network takes an object as parameter");
|
|
129
|
+
let promise;
|
|
130
|
+
if (arg.method === "GET") {
|
|
131
|
+
if (!("timeout" in arg)) {
|
|
132
|
+
arg.timeout = (0, live_env_1.getEnv)("GET_CALLS_TIMEOUT");
|
|
133
|
+
}
|
|
134
|
+
promise = (0, live_promise_1.retry)(() => (0, axios_1.default)(arg), {
|
|
135
|
+
maxRetry: (0, live_env_1.getEnv)("GET_CALLS_RETRY"),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
promise = (0, axios_1.default)(arg);
|
|
140
|
+
}
|
|
141
|
+
return promise;
|
|
142
|
+
};
|
|
143
|
+
// attach the env "LEDGER_CLIENT_VERSION" to set the header globally for axios
|
|
144
|
+
function setAxiosLedgerClientVersionHeader(value) {
|
|
145
|
+
if (value) {
|
|
146
|
+
axios_1.default.defaults.headers.common["X-Ledger-Client-Version"] = value;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
delete axios_1.default.defaults.headers.common["X-Ledger-Client-Version"];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
setAxiosLedgerClientVersionHeader((0, live_env_1.getEnv)("LEDGER_CLIENT_VERSION"));
|
|
153
|
+
live_env_1.changes.subscribe((e) => {
|
|
154
|
+
if (e.name === "LEDGER_CLIENT_VERSION") {
|
|
155
|
+
setAxiosLedgerClientVersionHeader(e.value);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
exports.default = implementation;
|
|
159
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.test.d.ts","sourceRoot":"","sources":["../src/network.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const live_env_1 = require("@ledgerhq/live-env");
|
|
27
|
+
const network_1 = require("./network");
|
|
28
|
+
const logs = __importStar(require("@ledgerhq/logs"));
|
|
29
|
+
describe("network", () => {
|
|
30
|
+
const DEFAULT_ENABLE_NETWORK_LOGS = (0, live_env_1.getEnv)("ENABLE_NETWORK_LOGS");
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
// restore the spy created with spyOn
|
|
33
|
+
jest.restoreAllMocks();
|
|
34
|
+
// Restore DEFAULT_ENABLE_NETWORK_LOGS
|
|
35
|
+
(0, live_env_1.setEnv)("ENABLE_NETWORK_LOGS", DEFAULT_ENABLE_NETWORK_LOGS);
|
|
36
|
+
});
|
|
37
|
+
describe("requestInterceptor", () => {
|
|
38
|
+
test("should return provided request when ENABLE_NETWORK_LOGS is false", () => {
|
|
39
|
+
const request = {
|
|
40
|
+
baseURL: "baseURL",
|
|
41
|
+
url: "url",
|
|
42
|
+
data: "data",
|
|
43
|
+
};
|
|
44
|
+
const req = (0, network_1.requestInterceptor)(request);
|
|
45
|
+
expect(req).toEqual(request);
|
|
46
|
+
});
|
|
47
|
+
test("should return provided request with metadata when ENABLE_NETWORK_LOGS is true", () => {
|
|
48
|
+
(0, live_env_1.setEnv)("ENABLE_NETWORK_LOGS", true);
|
|
49
|
+
const request = {
|
|
50
|
+
baseURL: "baseURL",
|
|
51
|
+
url: "url",
|
|
52
|
+
data: "data",
|
|
53
|
+
};
|
|
54
|
+
const req = (0, network_1.requestInterceptor)(request);
|
|
55
|
+
expect(req).toEqual(Object.assign(Object.assign({}, request), { metadata: { startTime: expect.any(Number) } }));
|
|
56
|
+
});
|
|
57
|
+
test("should call log when ENABLE_NETWORK_LOGS is true", () => {
|
|
58
|
+
const spy = jest.spyOn(logs, "log");
|
|
59
|
+
(0, live_env_1.setEnv)("ENABLE_NETWORK_LOGS", true);
|
|
60
|
+
const request = {
|
|
61
|
+
baseURL: "baseURL",
|
|
62
|
+
url: "url",
|
|
63
|
+
data: "data",
|
|
64
|
+
};
|
|
65
|
+
(0, network_1.requestInterceptor)(request);
|
|
66
|
+
expect(spy).toHaveBeenCalledTimes(1);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("responseInterceptor", () => {
|
|
70
|
+
test("should return provided response when ENABLE_NETWORK_LOGS is false", () => {
|
|
71
|
+
const response = {
|
|
72
|
+
config: {
|
|
73
|
+
baseURL: "baseURL",
|
|
74
|
+
url: "url",
|
|
75
|
+
data: "data",
|
|
76
|
+
},
|
|
77
|
+
data: "data",
|
|
78
|
+
status: 200,
|
|
79
|
+
statusText: "OK",
|
|
80
|
+
headers: {},
|
|
81
|
+
};
|
|
82
|
+
const res = (0, network_1.responseInterceptor)(response);
|
|
83
|
+
expect(res).toEqual(response);
|
|
84
|
+
});
|
|
85
|
+
test("should return provided response when ENABLE_NETWORK_LOGS is true", () => {
|
|
86
|
+
(0, live_env_1.setEnv)("ENABLE_NETWORK_LOGS", true);
|
|
87
|
+
const response = {
|
|
88
|
+
config: {
|
|
89
|
+
baseURL: "baseURL",
|
|
90
|
+
url: "url",
|
|
91
|
+
data: "data",
|
|
92
|
+
},
|
|
93
|
+
data: "data",
|
|
94
|
+
status: 200,
|
|
95
|
+
statusText: "OK",
|
|
96
|
+
headers: {},
|
|
97
|
+
};
|
|
98
|
+
const res = (0, network_1.responseInterceptor)(response);
|
|
99
|
+
expect(res).toEqual(response);
|
|
100
|
+
});
|
|
101
|
+
test("should call log when ENABLE_NETWORK_LOGS is true", () => {
|
|
102
|
+
const spy = jest.spyOn(logs, "log");
|
|
103
|
+
(0, live_env_1.setEnv)("ENABLE_NETWORK_LOGS", true);
|
|
104
|
+
const response = {
|
|
105
|
+
config: {
|
|
106
|
+
baseURL: "baseURL",
|
|
107
|
+
url: "url",
|
|
108
|
+
data: "data",
|
|
109
|
+
},
|
|
110
|
+
data: "data",
|
|
111
|
+
status: 200,
|
|
112
|
+
statusText: "OK",
|
|
113
|
+
headers: {},
|
|
114
|
+
};
|
|
115
|
+
(0, network_1.responseInterceptor)(response);
|
|
116
|
+
expect(spy).toHaveBeenCalledTimes(1);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=network.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.test.js","sourceRoot":"","sources":["../src/network.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import LRU from "lru-cache";
|
|
2
|
+
export type CacheRes<A extends Array<any>, T> = {
|
|
3
|
+
(...args: A): Promise<T>;
|
|
4
|
+
force: (...args: A) => Promise<T>;
|
|
5
|
+
hydrate: (key: string, value: T) => void;
|
|
6
|
+
clear: (key: string) => void;
|
|
7
|
+
reset: () => void;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Creates an LRU cache function that wraps the given async function `f`.
|
|
11
|
+
* By default it will have a lifespan of 300 seconds and a change in the key
|
|
12
|
+
* will invalidate its value.
|
|
13
|
+
*
|
|
14
|
+
* @param {(...args: A) => Promise<T>} f - The async function to be cached.
|
|
15
|
+
* @param {(...args: A) => string} [keyExtractor] - A function that extracts a cache key from the arguments passed to `f`.
|
|
16
|
+
* @param {LRU.Options<string, any>} [lruOpts] - Options for the internal LRU cache.
|
|
17
|
+
*
|
|
18
|
+
* @returns {CacheRes<A, T>} A cached version of the async function `f`.
|
|
19
|
+
*/
|
|
20
|
+
export declare const makeLRUCache: <A extends any[], T>(f: (...args: A) => Promise<T>, keyExtractor?: (...args: A) => string, lruOpts?: LRU.Options<string, any>) => CacheRes<A, T>;
|
|
21
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,WAAW,CAAC;AAE5B,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI;IAC9C,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACzC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,qFAEO,MAAM,YAC3B,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,mBAqDlC,CAAC"}
|
package/lib-es/cache.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import LRU from "lru-cache";
|
|
2
|
+
/**
|
|
3
|
+
* Creates an LRU cache function that wraps the given async function `f`.
|
|
4
|
+
* By default it will have a lifespan of 300 seconds and a change in the key
|
|
5
|
+
* will invalidate its value.
|
|
6
|
+
*
|
|
7
|
+
* @param {(...args: A) => Promise<T>} f - The async function to be cached.
|
|
8
|
+
* @param {(...args: A) => string} [keyExtractor] - A function that extracts a cache key from the arguments passed to `f`.
|
|
9
|
+
* @param {LRU.Options<string, any>} [lruOpts] - Options for the internal LRU cache.
|
|
10
|
+
*
|
|
11
|
+
* @returns {CacheRes<A, T>} A cached version of the async function `f`.
|
|
12
|
+
*/
|
|
13
|
+
export const makeLRUCache = (f, keyExtractor = () => "", lruOpts = {
|
|
14
|
+
max: 100,
|
|
15
|
+
ttl: 5 * 60 * 1000,
|
|
16
|
+
}) => {
|
|
17
|
+
// LRU-Cache is written in JS and do not enforce in its code the type checking.
|
|
18
|
+
// Regarding its [documentation](https://github.com/isaacs/node-lru-cache/#ttl), `max` or `ttlAutopurge` must be set.
|
|
19
|
+
// As the code in live use sometimes `max` property with `ttl`, we check it's defined in `lruOpts` to add or not `ttlAutopurge`.
|
|
20
|
+
// eslint-disable-next-line
|
|
21
|
+
// @ts-ignore: TS-2339
|
|
22
|
+
lruOpts = lruOpts.max
|
|
23
|
+
? lruOpts
|
|
24
|
+
: Object.assign(Object.assign({}, lruOpts), { ttlAutopurge: true });
|
|
25
|
+
const cache = new LRU(lruOpts);
|
|
26
|
+
const result = (...args) => {
|
|
27
|
+
const key = keyExtractor(...args);
|
|
28
|
+
let promise = cache.get(key);
|
|
29
|
+
if (promise)
|
|
30
|
+
return promise;
|
|
31
|
+
promise = f(...args).catch((e) => {
|
|
32
|
+
cache.delete(key);
|
|
33
|
+
throw e;
|
|
34
|
+
});
|
|
35
|
+
cache.set(key, promise);
|
|
36
|
+
return promise;
|
|
37
|
+
};
|
|
38
|
+
result.force = (...args) => {
|
|
39
|
+
const key = keyExtractor(...args);
|
|
40
|
+
const promise = f(...args).catch((e) => {
|
|
41
|
+
cache.delete(key);
|
|
42
|
+
throw e;
|
|
43
|
+
});
|
|
44
|
+
cache.set(key, promise);
|
|
45
|
+
return promise;
|
|
46
|
+
};
|
|
47
|
+
result.hydrate = (key, value) => {
|
|
48
|
+
cache.set(key, Promise.resolve(value));
|
|
49
|
+
};
|
|
50
|
+
result.clear = (key) => {
|
|
51
|
+
cache.delete(key);
|
|
52
|
+
};
|
|
53
|
+
result.reset = () => {
|
|
54
|
+
cache.clear();
|
|
55
|
+
};
|
|
56
|
+
return result;
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,WAAW,CAAC;AAU5B;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,CAA6B,EAC7B,eAAuC,GAAG,EAAE,CAAC,EAAE,EAC/C,UAAoC;IAClC,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;CACnB,EACe,EAAE;IAClB,+EAA+E;IAC/E,qHAAqH;IACrH,gIAAgI;IAChI,2BAA2B;IAC3B,sBAAsB;IACtB,OAAO,GAAG,OAAO,CAAC,GAAG;QACnB,CAAC,CAAC,OAAO;QACT,CAAC,iCACM,OAAO,KACV,YAAY,EAAE,IAAI,GACnB,CAAC;IACN,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAE/B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAO,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;QAClC,IAAI,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,IAAO,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACrC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,CAAC,OAAO,GAAG,CAAC,GAAW,EAAE,KAAQ,EAAE,EAAE;QACzC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE;QAC7B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE;QAClB,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AxiosError, AxiosRequestConfig } from "axios";
|
|
2
|
+
import { AxiosPromise, AxiosResponse } from "axios";
|
|
3
|
+
type Metadata = {
|
|
4
|
+
startTime: number;
|
|
5
|
+
};
|
|
6
|
+
type ExtendedXHRConfig = AxiosRequestConfig & {
|
|
7
|
+
metadata?: Metadata;
|
|
8
|
+
};
|
|
9
|
+
export declare const requestInterceptor: (request: AxiosRequestConfig) => ExtendedXHRConfig;
|
|
10
|
+
type InterceptedResponse = {
|
|
11
|
+
config: ExtendedXHRConfig;
|
|
12
|
+
} & AxiosResponse<any>;
|
|
13
|
+
export declare const responseInterceptor: (response: InterceptedResponse) => InterceptedResponse;
|
|
14
|
+
type InterceptedError = {
|
|
15
|
+
response?: InterceptedResponse;
|
|
16
|
+
} & AxiosError<any>;
|
|
17
|
+
export declare const errorInterceptor: (error: InterceptedError) => InterceptedError;
|
|
18
|
+
declare const implementation: <T = any>(arg: AxiosRequestConfig) => AxiosPromise<T>;
|
|
19
|
+
export default implementation;
|
|
20
|
+
//# sourceMappingURL=network.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAU,MAAM,OAAO,CAAC;AACpE,OAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3D,KAAK,QAAQ,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AACtC,KAAK,iBAAiB,GAAG,kBAAkB,GAAG;IAAE,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEtE,eAAO,MAAM,kBAAkB,YACpB,kBAAkB,KAC1B,iBAeF,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,MAAM,EAAE,iBAAiB,CAAC;CAC3B,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;AAEvB,eAAO,MAAM,mBAAmB,aACpB,mBAAmB,KAC5B,mBAiBF,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;AAEpB,eAAO,MAAM,gBAAgB,UAAW,gBAAgB,KAAG,gBA2C1D,CAAC;AAmEF,QAAA,MAAM,cAAc,iBAAkB,kBAAkB,oBAiBvD,CAAC;AAiBF,eAAe,cAAc,CAAC"}
|