@chainlink/external-adapter-framework 0.0.10 → 0.0.12
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/.c8rc.json +3 -0
- package/.eslintignore +9 -0
- package/.eslintrc.js +96 -0
- package/.github/README.MD +17 -0
- package/.github/actions/setup/action.yaml +13 -0
- package/.github/workflows/main.yaml +39 -0
- package/.github/workflows/publish.yaml +20 -0
- package/.prettierignore +13 -0
- package/.yarnrc +0 -0
- package/README.md +103 -0
- package/dist/src/adapter.d.ts +135 -0
- package/dist/src/adapter.js +145 -0
- package/dist/src/background-executor.d.ts +11 -0
- package/{background-executor.js → dist/src/background-executor.js} +0 -0
- package/{cache → dist/src/cache}/factory.d.ts +0 -0
- package/dist/src/cache/factory.js +55 -0
- package/dist/src/cache/index.d.ts +94 -0
- package/dist/src/cache/index.js +173 -0
- package/{cache → dist/src/cache}/local.d.ts +0 -0
- package/{cache → dist/src/cache}/local.js +0 -0
- package/{cache → dist/src/cache}/metrics.d.ts +0 -0
- package/{cache → dist/src/cache}/metrics.js +0 -0
- package/{cache → dist/src/cache}/redis.d.ts +0 -0
- package/dist/src/cache/redis.js +100 -0
- package/dist/src/chainlink-external-adapter-framework-0.0.6.tgz +0 -0
- package/dist/src/config/index.d.ts +214 -0
- package/dist/src/config/index.js +380 -0
- package/{config → dist/src/config}/provider-limits.d.ts +0 -0
- package/{config → dist/src/config}/provider-limits.js +1 -1
- package/dist/src/examples/bank-frick/accounts.d.ts +39 -0
- package/dist/src/examples/bank-frick/accounts.js +192 -0
- package/dist/src/examples/bank-frick/config/index.d.ts +4 -0
- package/dist/src/examples/bank-frick/config/index.js +54 -0
- package/dist/src/examples/bank-frick/index.d.ts +2 -0
- package/dist/src/examples/bank-frick/index.js +15 -0
- package/dist/src/examples/bank-frick/util.d.ts +4 -0
- package/dist/src/examples/bank-frick/util.js +39 -0
- package/dist/src/examples/coingecko/batch-warming.d.ts +7 -0
- package/dist/src/examples/coingecko/batch-warming.js +53 -0
- package/dist/src/examples/coingecko/index.d.ts +2 -0
- package/dist/src/examples/coingecko/index.js +11 -0
- package/dist/src/examples/coingecko/rest.d.ts +12 -0
- package/dist/src/examples/coingecko/rest.js +51 -0
- package/{examples → dist/src/examples}/ncfx/config/index.d.ts +0 -0
- package/{examples → dist/src/examples}/ncfx/config/index.js +0 -0
- package/dist/src/examples/ncfx/index.d.ts +13 -0
- package/dist/src/examples/ncfx/index.js +11 -0
- package/dist/src/examples/ncfx/websocket.d.ts +47 -0
- package/dist/src/examples/ncfx/websocket.js +73 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.js +128 -0
- package/{metrics → dist/src/metrics}/constants.d.ts +0 -0
- package/{metrics → dist/src/metrics}/constants.js +0 -0
- package/{metrics → dist/src/metrics}/index.d.ts +0 -0
- package/dist/src/metrics/index.js +122 -0
- package/dist/src/metrics/util.d.ts +7 -0
- package/dist/src/metrics/util.js +9 -0
- package/{adapter.d.ts → dist/src/package/adapter.d.ts} +0 -0
- package/{adapter.js → dist/src/package/adapter.js} +0 -0
- package/{background-executor.d.ts → dist/src/package/background-executor.d.ts} +0 -0
- package/dist/src/package/background-executor.js +45 -0
- package/dist/src/package/cache/factory.d.ts +6 -0
- package/{cache → dist/src/package/cache}/factory.js +0 -0
- package/{cache → dist/src/package/cache}/index.d.ts +0 -0
- package/{cache → dist/src/package/cache}/index.js +0 -0
- package/dist/src/package/cache/local.d.ts +23 -0
- package/dist/src/package/cache/local.js +83 -0
- package/dist/src/package/cache/metrics.d.ts +27 -0
- package/dist/src/package/cache/metrics.js +120 -0
- package/dist/src/package/cache/redis.d.ts +16 -0
- package/{cache → dist/src/package/cache}/redis.js +0 -0
- package/{config → dist/src/package/config}/index.d.ts +0 -0
- package/{config → dist/src/package/config}/index.js +0 -0
- package/dist/src/package/config/provider-limits.d.ts +31 -0
- package/dist/src/package/config/provider-limits.js +76 -0
- package/{examples → dist/src/package/examples}/coingecko/batch-warming.d.ts +0 -0
- package/{examples → dist/src/package/examples}/coingecko/batch-warming.js +0 -0
- package/{examples → dist/src/package/examples}/coingecko/index.d.ts +0 -0
- package/{examples → dist/src/package/examples}/coingecko/index.js +0 -0
- package/{examples → dist/src/package/examples}/coingecko/rest.d.ts +0 -0
- package/{examples → dist/src/package/examples}/coingecko/rest.js +0 -0
- package/dist/src/package/examples/ncfx/config/index.d.ts +12 -0
- package/dist/src/package/examples/ncfx/config/index.js +15 -0
- package/{examples → dist/src/package/examples}/ncfx/index.d.ts +0 -0
- package/{examples → dist/src/package/examples}/ncfx/index.js +0 -0
- package/{examples → dist/src/package/examples}/ncfx/websocket.d.ts +0 -0
- package/{examples → dist/src/package/examples}/ncfx/websocket.js +0 -0
- package/{index.d.ts → dist/src/package/index.d.ts} +0 -0
- package/{index.js → dist/src/package/index.js} +0 -0
- package/dist/src/package/metrics/constants.d.ts +16 -0
- package/dist/src/package/metrics/constants.js +25 -0
- package/dist/src/package/metrics/index.d.ts +15 -0
- package/{metrics → dist/src/package/metrics}/index.js +0 -0
- package/{metrics → dist/src/package/metrics}/util.d.ts +0 -0
- package/{metrics → dist/src/package/metrics}/util.js +0 -0
- package/dist/src/package/package.json +72 -0
- package/{rate-limiting → dist/src/package/rate-limiting}/background/fixed-frequency.d.ts +0 -0
- package/{rate-limiting → dist/src/package/rate-limiting}/background/fixed-frequency.js +0 -0
- package/{rate-limiting → dist/src/package/rate-limiting}/index.d.ts +0 -0
- package/{rate-limiting → dist/src/package/rate-limiting}/index.js +0 -0
- package/{rate-limiting → dist/src/package/rate-limiting}/metrics.d.ts +0 -0
- package/{rate-limiting → dist/src/package/rate-limiting}/metrics.js +0 -0
- package/{rate-limiting → dist/src/package/rate-limiting}/request/simple-counting.d.ts +0 -0
- package/{rate-limiting → dist/src/package/rate-limiting}/request/simple-counting.js +0 -0
- package/{test.d.ts → dist/src/package/test.d.ts} +0 -0
- package/{test.js → dist/src/package/test.js} +0 -0
- package/{transports → dist/src/package/transports}/batch-warming.d.ts +0 -0
- package/{transports → dist/src/package/transports}/batch-warming.js +0 -0
- package/{transports → dist/src/package/transports}/index.d.ts +0 -0
- package/{transports → dist/src/package/transports}/index.js +0 -0
- package/{transports → dist/src/package/transports}/metrics.d.ts +0 -0
- package/{transports → dist/src/package/transports}/metrics.js +0 -0
- package/{transports → dist/src/package/transports}/rest.d.ts +0 -0
- package/{transports → dist/src/package/transports}/rest.js +0 -0
- package/{transports → dist/src/package/transports}/util.d.ts +0 -0
- package/{transports → dist/src/package/transports}/util.js +0 -0
- package/{transports → dist/src/package/transports}/websocket.d.ts +0 -0
- package/{transports → dist/src/package/transports}/websocket.js +0 -0
- package/{util → dist/src/package/util}/expiring-sorted-set.d.ts +0 -0
- package/{util → dist/src/package/util}/expiring-sorted-set.js +0 -0
- package/{util → dist/src/package/util}/index.d.ts +0 -0
- package/{util → dist/src/package/util}/index.js +0 -0
- package/{util → dist/src/package/util}/logger.d.ts +0 -0
- package/{util → dist/src/package/util}/logger.js +0 -0
- package/{util → dist/src/package/util}/request.d.ts +0 -0
- package/{util → dist/src/package/util}/request.js +0 -0
- package/{validation → dist/src/package/validation}/error.d.ts +0 -0
- package/{validation → dist/src/package/validation}/error.js +0 -0
- package/{validation → dist/src/package/validation}/index.d.ts +0 -0
- package/{validation → dist/src/package/validation}/index.js +0 -0
- package/{validation → dist/src/package/validation}/input-params.d.ts +0 -0
- package/{validation → dist/src/package/validation}/input-params.js +0 -0
- package/{validation → dist/src/package/validation}/override-functions.d.ts +0 -0
- package/{validation → dist/src/package/validation}/override-functions.js +0 -0
- package/{validation → dist/src/package/validation}/preset-tokens.json +0 -0
- package/{validation → dist/src/package/validation}/validator.d.ts +0 -0
- package/{validation → dist/src/package/validation}/validator.js +0 -0
- package/dist/src/package.json +72 -0
- package/dist/src/rate-limiting/background/fixed-frequency.d.ts +11 -0
- package/dist/src/rate-limiting/background/fixed-frequency.js +35 -0
- package/dist/src/rate-limiting/index.d.ts +55 -0
- package/dist/src/rate-limiting/index.js +63 -0
- package/dist/src/rate-limiting/metrics.d.ts +3 -0
- package/dist/src/rate-limiting/metrics.js +44 -0
- package/dist/src/rate-limiting/request/simple-counting.d.ts +21 -0
- package/dist/src/rate-limiting/request/simple-counting.js +62 -0
- package/dist/src/test.d.ts +1 -0
- package/dist/src/test.js +6 -0
- package/dist/src/transports/batch-warming.d.ts +35 -0
- package/dist/src/transports/batch-warming.js +101 -0
- package/dist/src/transports/index.d.ts +70 -0
- package/dist/src/transports/index.js +87 -0
- package/dist/src/transports/metrics.d.ts +22 -0
- package/dist/src/transports/metrics.js +105 -0
- package/dist/src/transports/rest.d.ts +44 -0
- package/dist/src/transports/rest.js +131 -0
- package/dist/src/transports/util.d.ts +8 -0
- package/dist/src/transports/util.js +85 -0
- package/dist/src/transports/websocket.d.ts +80 -0
- package/dist/src/transports/websocket.js +166 -0
- package/dist/src/util/expiring-sorted-set.d.ts +21 -0
- package/dist/src/util/expiring-sorted-set.js +47 -0
- package/dist/src/util/index.d.ts +12 -0
- package/dist/src/util/index.js +35 -0
- package/dist/src/util/logger.d.ts +42 -0
- package/dist/src/util/logger.js +62 -0
- package/dist/src/util/request.d.ts +57 -0
- package/dist/src/util/request.js +2 -0
- package/dist/src/util/subscription-set/expiring-sorted-set.d.ts +22 -0
- package/dist/src/util/subscription-set/expiring-sorted-set.js +47 -0
- package/dist/src/util/subscription-set/subscription-set.d.ts +18 -0
- package/dist/src/util/subscription-set/subscription-set.js +19 -0
- package/dist/src/util/test-payload-loader.d.ts +25 -0
- package/dist/src/util/test-payload-loader.js +83 -0
- package/dist/src/validation/error.d.ts +50 -0
- package/dist/src/validation/error.js +79 -0
- package/dist/src/validation/index.d.ts +5 -0
- package/dist/src/validation/index.js +91 -0
- package/dist/src/validation/input-params.d.ts +15 -0
- package/dist/src/validation/input-params.js +30 -0
- package/dist/src/validation/override-functions.d.ts +3 -0
- package/dist/src/validation/override-functions.js +40 -0
- package/dist/src/validation/preset-tokens.json +23 -0
- package/dist/src/validation/validator.d.ts +47 -0
- package/dist/src/validation/validator.js +303 -0
- package/docker-compose.yaml +35 -0
- package/env.sh +54 -0
- package/env2.sh +55 -0
- package/package.json +5 -3
- package/publish.sh +0 -0
- package/src/adapter.ts +263 -0
- package/src/background-executor.ts +52 -0
- package/src/cache/factory.ts +26 -0
- package/src/cache/index.ts +258 -0
- package/src/cache/local.ts +73 -0
- package/src/cache/metrics.ts +112 -0
- package/src/cache/redis.ts +93 -0
- package/src/config/index.ts +517 -0
- package/src/config/provider-limits.ts +130 -0
- package/src/examples/bank-frick/README.MD +10 -0
- package/src/examples/bank-frick/accounts.ts +246 -0
- package/src/examples/bank-frick/config/index.ts +53 -0
- package/src/examples/bank-frick/index.ts +13 -0
- package/src/examples/bank-frick/types.d.ts +38 -0
- package/src/examples/bank-frick/util.ts +55 -0
- package/src/examples/coingecko/batch-warming.ts +78 -0
- package/src/examples/coingecko/index.ts +9 -0
- package/src/examples/coingecko/rest.ts +77 -0
- package/src/examples/ncfx/config/index.ts +12 -0
- package/src/examples/ncfx/index.ts +9 -0
- package/src/examples/ncfx/websocket.ts +99 -0
- package/src/index.ts +149 -0
- package/src/metrics/constants.ts +23 -0
- package/src/metrics/index.ts +115 -0
- package/src/metrics/util.ts +18 -0
- package/src/rate-limiting/background/fixed-frequency.ts +45 -0
- package/src/rate-limiting/index.ts +100 -0
- package/src/rate-limiting/metrics.ts +18 -0
- package/src/rate-limiting/request/simple-counting.ts +76 -0
- package/src/test.ts +5 -0
- package/src/transports/batch-warming.ts +122 -0
- package/src/transports/index.ts +152 -0
- package/src/transports/metrics.ts +95 -0
- package/src/transports/rest.ts +164 -0
- package/src/transports/util.ts +63 -0
- package/src/transports/websocket.ts +245 -0
- package/src/util/index.ts +22 -0
- package/src/util/logger.ts +69 -0
- package/src/util/request.ts +117 -0
- package/src/util/subscription-set/expiring-sorted-set.ts +54 -0
- package/src/util/subscription-set/subscription-set.ts +35 -0
- package/src/util/test-payload-loader.ts +87 -0
- package/src/validation/error.ts +116 -0
- package/src/validation/index.ts +110 -0
- package/src/validation/input-params.ts +45 -0
- package/src/validation/override-functions.ts +44 -0
- package/src/validation/preset-tokens.json +23 -0
- package/src/validation/validator.ts +384 -0
- package/test/adapter.test.ts +27 -0
- package/test/background-executor.test.ts +108 -0
- package/test/cache/cache-key.test.ts +114 -0
- package/test/cache/helper.ts +100 -0
- package/test/cache/local.test.ts +54 -0
- package/test/cache/redis.test.ts +89 -0
- package/test/correlation.test.ts +114 -0
- package/test/index.test.ts +37 -0
- package/test/metrics/feed-id.test.ts +38 -0
- package/test/metrics/helper.ts +14 -0
- package/test/metrics/labels.test.ts +36 -0
- package/test/metrics/metrics.test.ts +267 -0
- package/test/metrics/redis-metrics.test.ts +113 -0
- package/test/metrics/warmer-metrics.test.ts +192 -0
- package/test/metrics/ws-metrics.test.ts +225 -0
- package/test/rate-limit-config.test.ts +242 -0
- package/test/smoke.test.ts +166 -0
- package/test/transports/batch.test.ts +465 -0
- package/test/transports/rest.test.ts +242 -0
- package/test/transports/websocket.test.ts +183 -0
- package/test/tsconfig.json +5 -0
- package/test/util.ts +77 -0
- package/test/validation.test.ts +178 -0
- package/test-payload-fail.json +3 -0
- package/test-payload.js +22 -0
- package/test-payload.json +7 -0
- package/test.sh +20 -0
- package/test2.sh +2 -0
- package/tsconfig.json +25 -0
- package/typedoc.json +6 -0
- package/webpack.config.js +23 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.adapter = void 0;
|
|
4
|
+
const adapter_1 = require("../../adapter");
|
|
5
|
+
const accounts_1 = require("./accounts");
|
|
6
|
+
const config_1 = require("./config");
|
|
7
|
+
exports.adapter = new adapter_1.Adapter({
|
|
8
|
+
name: 'bank-frick',
|
|
9
|
+
defaultEndpoint: 'accounts',
|
|
10
|
+
endpoints: [accounts_1.accountsRestEndpoint],
|
|
11
|
+
customSettings: config_1.customSettings,
|
|
12
|
+
envDefaultOverrides: {
|
|
13
|
+
API_ENDPOINT: 'https://olbsandbox.bankfrick.li/webapi/v2',
|
|
14
|
+
},
|
|
15
|
+
});
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { SigningAlgorithm } from './types';
|
|
2
|
+
import { customSettings } from './config';
|
|
3
|
+
import { AdapterConfig } from '../../config';
|
|
4
|
+
export declare const generateJWT: (config: AdapterConfig<typeof customSettings>, signingAlgorithm?: SigningAlgorithm) => Promise<string>;
|
|
@@ -0,0 +1,39 @@
|
|
|
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.generateJWT = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const axios_1 = __importDefault(require("axios"));
|
|
9
|
+
const util_1 = require("../../util");
|
|
10
|
+
const logger = (0, util_1.makeLogger)('BankFrickUtil');
|
|
11
|
+
// Used by all endpoints requiring authentication
|
|
12
|
+
const generateJWT = async (config, signingAlgorithm = 'rsa-sha512') => {
|
|
13
|
+
logger.info("Generating a new JWT because we don't have one in config.token");
|
|
14
|
+
const { API_KEY, PRIVATE_KEY, API_ENDPOINT } = config;
|
|
15
|
+
// All of these are required, so validation should have failed prior to this line
|
|
16
|
+
if (!API_KEY || !PRIVATE_KEY) {
|
|
17
|
+
throw new Error('API_KEY, PRIVATE_KEY, and PASSWORD all must be defined to get a new token\n' +
|
|
18
|
+
'Received: \n' +
|
|
19
|
+
`API_KEY: ${API_KEY}\n` +
|
|
20
|
+
`PRIVATE_KEY: ${PRIVATE_KEY}`);
|
|
21
|
+
}
|
|
22
|
+
const data = {
|
|
23
|
+
key: API_KEY,
|
|
24
|
+
};
|
|
25
|
+
const signature = crypto_1.default.sign(signingAlgorithm, Buffer.from(JSON.stringify(data)), PRIVATE_KEY);
|
|
26
|
+
const options = {
|
|
27
|
+
method: 'POST',
|
|
28
|
+
baseURL: API_ENDPOINT,
|
|
29
|
+
url: `authorize`,
|
|
30
|
+
headers: {
|
|
31
|
+
Signature: signature.toString('base64'),
|
|
32
|
+
algorithm: signingAlgorithm,
|
|
33
|
+
},
|
|
34
|
+
data,
|
|
35
|
+
};
|
|
36
|
+
const response = await axios_1.default.request(options);
|
|
37
|
+
return response.data.token;
|
|
38
|
+
};
|
|
39
|
+
exports.generateJWT = generateJWT;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.batchEndpoint = void 0;
|
|
4
|
+
const adapter_1 = require("../../adapter");
|
|
5
|
+
const batch_warming_1 = require("../../transports/batch-warming");
|
|
6
|
+
const DEFAULT_URL = 'https://pro-api.coingecko.com/api/v3';
|
|
7
|
+
const inputParameters = {
|
|
8
|
+
coinid: {
|
|
9
|
+
description: 'The CoinGecko id or array of ids of the coin(s) to query (Note: because of current limitations to use a dummy base will need to be supplied)',
|
|
10
|
+
required: false,
|
|
11
|
+
},
|
|
12
|
+
base: {
|
|
13
|
+
aliases: ['from', 'coin'],
|
|
14
|
+
description: 'The symbol or array of symbols of the currency to query',
|
|
15
|
+
required: true,
|
|
16
|
+
},
|
|
17
|
+
quote: {
|
|
18
|
+
aliases: ['to', 'market'],
|
|
19
|
+
description: 'The symbol of the currency to convert to',
|
|
20
|
+
required: true,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
const batchEndpointTransport = new batch_warming_1.BatchWarmingTransport({
|
|
24
|
+
prepareRequest: (params, context) => {
|
|
25
|
+
return {
|
|
26
|
+
baseURL: DEFAULT_URL,
|
|
27
|
+
url: '/simple/price',
|
|
28
|
+
method: 'GET',
|
|
29
|
+
params: {
|
|
30
|
+
ids: [...new Set(params.map((p) => p.base))].join(','),
|
|
31
|
+
vs_currencies: [...new Set(params.map((p) => p.quote))].join(','),
|
|
32
|
+
x_cg_pro_api_key: context.adapterConfig.API_KEY,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
parseResponse: (res) => {
|
|
37
|
+
const entries = [];
|
|
38
|
+
for (const [base, entry] of Object.entries(res.data)) {
|
|
39
|
+
for (const [quote, price] of Object.entries(entry)) {
|
|
40
|
+
entries.push({
|
|
41
|
+
params: { base, quote },
|
|
42
|
+
value: price,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return entries;
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
exports.batchEndpoint = new adapter_1.AdapterEndpoint({
|
|
50
|
+
name: 'batch',
|
|
51
|
+
transport: batchEndpointTransport,
|
|
52
|
+
inputParameters,
|
|
53
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.adapter = void 0;
|
|
4
|
+
const adapter_1 = require("../../adapter");
|
|
5
|
+
const batch_warming_1 = require("./batch-warming");
|
|
6
|
+
const rest_1 = require("./rest");
|
|
7
|
+
exports.adapter = new adapter_1.Adapter({
|
|
8
|
+
name: 'coingecko',
|
|
9
|
+
defaultEndpoint: 'batch',
|
|
10
|
+
endpoints: [rest_1.restEndpoint, batch_warming_1.batchEndpoint],
|
|
11
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AdapterEndpoint } from '../../adapter';
|
|
2
|
+
interface AdapterRequestParams {
|
|
3
|
+
base: string;
|
|
4
|
+
quote: string;
|
|
5
|
+
}
|
|
6
|
+
interface ProviderResponseBody {
|
|
7
|
+
[base: string]: {
|
|
8
|
+
[quote: string]: number;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare const restEndpoint: AdapterEndpoint<AdapterRequestParams, ProviderResponseBody, import("../../config").SettingsMap>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.restEndpoint = void 0;
|
|
4
|
+
const adapter_1 = require("../../adapter");
|
|
5
|
+
const transports_1 = require("../../transports");
|
|
6
|
+
const DEFAULT_URL = 'https://api.coingecko.com/api/v3';
|
|
7
|
+
const inputParameters = {
|
|
8
|
+
coinid: {
|
|
9
|
+
description: 'The CoinGecko id or array of ids of the coin(s) to query (Note: because of current limitations to use a dummy base will need to be supplied)',
|
|
10
|
+
required: false,
|
|
11
|
+
},
|
|
12
|
+
base: {
|
|
13
|
+
aliases: ['from', 'coin'],
|
|
14
|
+
description: 'The symbol or array of symbols of the currency to query',
|
|
15
|
+
required: true,
|
|
16
|
+
},
|
|
17
|
+
quote: {
|
|
18
|
+
aliases: ['to', 'market'],
|
|
19
|
+
description: 'The symbol of the currency to convert to',
|
|
20
|
+
required: true,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
const restEndpointTransport = new transports_1.RestTransport({
|
|
24
|
+
prepareRequest: (req) => {
|
|
25
|
+
return {
|
|
26
|
+
baseURL: DEFAULT_URL,
|
|
27
|
+
url: '/simple/price',
|
|
28
|
+
method: 'GET',
|
|
29
|
+
params: {
|
|
30
|
+
ids: req.requestContext.data.base,
|
|
31
|
+
vs_currencies: req.requestContext.data.quote,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
parseResponse: (req, res) => {
|
|
36
|
+
return {
|
|
37
|
+
data: res.data,
|
|
38
|
+
statusCode: 200,
|
|
39
|
+
result: res.data[req.requestContext.data.base]?.[req.requestContext.data.quote],
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
options: {
|
|
43
|
+
coalescing: true,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
exports.restEndpoint = new adapter_1.AdapterEndpoint({
|
|
47
|
+
name: 'rest',
|
|
48
|
+
aliases: ['qwe'],
|
|
49
|
+
transport: restEndpointTransport,
|
|
50
|
+
inputParameters,
|
|
51
|
+
});
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Adapter } from '../../adapter';
|
|
2
|
+
export declare const adapter: Adapter<{
|
|
3
|
+
readonly USERNAME: {
|
|
4
|
+
readonly description: "Username for the NCFX API";
|
|
5
|
+
readonly type: "string";
|
|
6
|
+
readonly required: true;
|
|
7
|
+
};
|
|
8
|
+
readonly PASSWORD: {
|
|
9
|
+
readonly description: "Password for the NCFX API";
|
|
10
|
+
readonly type: "string";
|
|
11
|
+
readonly required: true;
|
|
12
|
+
};
|
|
13
|
+
}>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.adapter = void 0;
|
|
4
|
+
const adapter_1 = require("../../adapter");
|
|
5
|
+
const config_1 = require("./config");
|
|
6
|
+
const websocket_1 = require("./websocket");
|
|
7
|
+
exports.adapter = new adapter_1.Adapter({
|
|
8
|
+
name: 'ncfx',
|
|
9
|
+
endpoints: [websocket_1.webSocketEndpoint],
|
|
10
|
+
customSettings: config_1.customSettings,
|
|
11
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { AdapterEndpoint } from '../../adapter';
|
|
2
|
+
import { WebSocketTransport } from '../../transports/websocket';
|
|
3
|
+
import { InputParameters } from '../../validation';
|
|
4
|
+
interface AdapterRequestParams {
|
|
5
|
+
base: string;
|
|
6
|
+
quote: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const inputParameters: InputParameters;
|
|
9
|
+
interface ProviderMessage {
|
|
10
|
+
timestamp: string;
|
|
11
|
+
currencyPair: string;
|
|
12
|
+
bid: number;
|
|
13
|
+
offer: number;
|
|
14
|
+
mid: number;
|
|
15
|
+
changes: [
|
|
16
|
+
{
|
|
17
|
+
period: string;
|
|
18
|
+
change: number;
|
|
19
|
+
percentage: number;
|
|
20
|
+
}
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
export declare const websocketTransport: WebSocketTransport<AdapterRequestParams, ProviderMessage[], {
|
|
24
|
+
readonly USERNAME: {
|
|
25
|
+
readonly description: "Username for the NCFX API";
|
|
26
|
+
readonly type: "string";
|
|
27
|
+
readonly required: true;
|
|
28
|
+
};
|
|
29
|
+
readonly PASSWORD: {
|
|
30
|
+
readonly description: "Password for the NCFX API";
|
|
31
|
+
readonly type: "string";
|
|
32
|
+
readonly required: true;
|
|
33
|
+
};
|
|
34
|
+
}>;
|
|
35
|
+
export declare const webSocketEndpoint: AdapterEndpoint<AdapterRequestParams, unknown, {
|
|
36
|
+
readonly USERNAME: {
|
|
37
|
+
readonly description: "Username for the NCFX API";
|
|
38
|
+
readonly type: "string";
|
|
39
|
+
readonly required: true;
|
|
40
|
+
};
|
|
41
|
+
readonly PASSWORD: {
|
|
42
|
+
readonly description: "Password for the NCFX API";
|
|
43
|
+
readonly type: "string";
|
|
44
|
+
readonly required: true;
|
|
45
|
+
};
|
|
46
|
+
}>;
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.webSocketEndpoint = exports.websocketTransport = exports.inputParameters = void 0;
|
|
4
|
+
const adapter_1 = require("../../adapter");
|
|
5
|
+
const websocket_1 = require("../../transports/websocket");
|
|
6
|
+
const util_1 = require("../../util");
|
|
7
|
+
exports.inputParameters = {
|
|
8
|
+
base: {
|
|
9
|
+
aliases: ['from', 'coin'],
|
|
10
|
+
description: 'The symbol of the currency to query',
|
|
11
|
+
required: true,
|
|
12
|
+
},
|
|
13
|
+
quote: {
|
|
14
|
+
aliases: ['to', 'market'],
|
|
15
|
+
description: 'The symbol of the currency to convert to',
|
|
16
|
+
required: true,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
const logger = (0, util_1.makeLogger)('NcfxWebSocketTransport');
|
|
20
|
+
exports.websocketTransport = new websocket_1.WebSocketTransport({
|
|
21
|
+
url: 'wss://feed.newchangefx.com/cryptodata',
|
|
22
|
+
handlers: {
|
|
23
|
+
open(connection, context) {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
// Set up listener
|
|
26
|
+
connection.on('message', (data) => {
|
|
27
|
+
const parsed = JSON.parse(data.toString());
|
|
28
|
+
if (parsed.Message?.startsWith('Logged in as user')) {
|
|
29
|
+
logger.info('Got logged in response, connection is ready');
|
|
30
|
+
resolve();
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
reject(new Error('Unexpected message after WS connection open'));
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
// Send login payload
|
|
37
|
+
connection.send(JSON.stringify({
|
|
38
|
+
request: 'login',
|
|
39
|
+
username: context.adapterConfig.USERNAME,
|
|
40
|
+
password: context.adapterConfig.PASSWORD,
|
|
41
|
+
}));
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
message(message) {
|
|
45
|
+
if (!Array.isArray(message)) {
|
|
46
|
+
logger.debug('WS message is not array, skipping');
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
return message.map((m) => {
|
|
50
|
+
const [base, quote] = m.currencyPair.split('/');
|
|
51
|
+
return {
|
|
52
|
+
params: { base, quote },
|
|
53
|
+
value: m.offer,
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
builders: {
|
|
59
|
+
subscribeMessage: (params) => ({
|
|
60
|
+
request: 'subscribe',
|
|
61
|
+
ccy: `${params.base}/${params.quote}`,
|
|
62
|
+
}),
|
|
63
|
+
unsubscribeMessage: (params) => ({
|
|
64
|
+
request: 'unsubscribe',
|
|
65
|
+
ccy: `${params.base}/${params.quote}`,
|
|
66
|
+
}),
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
exports.webSocketEndpoint = new adapter_1.AdapterEndpoint({
|
|
70
|
+
name: 'websocket',
|
|
71
|
+
transport: exports.websocketTransport,
|
|
72
|
+
inputParameters: exports.inputParameters,
|
|
73
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Server } from 'http';
|
|
2
|
+
import { Adapter, AdapterDependencies } from './adapter';
|
|
3
|
+
/**
|
|
4
|
+
* Main function for the framework.
|
|
5
|
+
* Initializes config and dependencies, uses those to initialize Transports, and starts listening for requests.
|
|
6
|
+
*
|
|
7
|
+
* @param adapter - an object describing an External Adapter
|
|
8
|
+
* @param dependencies - an optional object with adapter dependencies to inject
|
|
9
|
+
* @returns a Promise that resolves to the http.Server listening for connections
|
|
10
|
+
*/
|
|
11
|
+
export declare const expose: (adapter: Adapter, dependencies?: Partial<AdapterDependencies>) => Promise<Server | undefined>;
|
|
@@ -0,0 +1,128 @@
|
|
|
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.expose = void 0;
|
|
7
|
+
const fastify_1 = __importDefault(require("fastify"));
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const background_executor_1 = require("./background-executor");
|
|
10
|
+
const cache_1 = require("./cache");
|
|
11
|
+
const metrics_1 = require("./metrics");
|
|
12
|
+
const transports_1 = require("./transports");
|
|
13
|
+
const util_1 = require("./util");
|
|
14
|
+
const test_payload_loader_1 = require("./util/test-payload-loader");
|
|
15
|
+
const validation_1 = require("./validation");
|
|
16
|
+
const logger = (0, util_1.makeLogger)('Main');
|
|
17
|
+
const VERSION = process.env['npm_package_version'];
|
|
18
|
+
/**
|
|
19
|
+
* Main function for the framework.
|
|
20
|
+
* Initializes config and dependencies, uses those to initialize Transports, and starts listening for requests.
|
|
21
|
+
*
|
|
22
|
+
* @param adapter - an object describing an External Adapter
|
|
23
|
+
* @param dependencies - an optional object with adapter dependencies to inject
|
|
24
|
+
* @returns a Promise that resolves to the http.Server listening for connections
|
|
25
|
+
*/
|
|
26
|
+
const expose = async (adapter, dependencies) => {
|
|
27
|
+
// Initialize adapter (create dependencies, inject them, build endpoint map, etc.)
|
|
28
|
+
await adapter.initialize(dependencies);
|
|
29
|
+
let server = undefined;
|
|
30
|
+
if (adapter.config.METRICS_ENABLED && adapter.config.EXPERIMENTAL_METRICS_ENABLED) {
|
|
31
|
+
(0, metrics_1.setupMetricsServer)(adapter.name, adapter.config);
|
|
32
|
+
}
|
|
33
|
+
if (adapter.config.EA_MODE === 'reader' || adapter.config.EA_MODE === 'reader-writer') {
|
|
34
|
+
// Main REST API server to handle incoming requests
|
|
35
|
+
const app = await buildRestApi(adapter);
|
|
36
|
+
// Start listening for incoming requests
|
|
37
|
+
try {
|
|
38
|
+
await app.listen(adapter.config.EA_PORT, adapter.config.EA_HOST);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
logger.fatal(`There was an error when starting the EA server: ${err}`);
|
|
42
|
+
process.exit();
|
|
43
|
+
}
|
|
44
|
+
logger.info(`Listening on port ${app.server.address().port}`);
|
|
45
|
+
server = app.server;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
logger.info('REST API is disabled; this instance will not process incoming requests.');
|
|
49
|
+
}
|
|
50
|
+
if (adapter.config.EA_MODE === 'writer' || adapter.config.EA_MODE === 'reader-writer') {
|
|
51
|
+
// Start background loop that will take care of calling any async Transports
|
|
52
|
+
logger.info('Starting background execution loop');
|
|
53
|
+
(0, background_executor_1.callBackgroundExecutes)(adapter, server);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
logger.info('Background executor is disabled; this instance will not perform async background executes.');
|
|
57
|
+
}
|
|
58
|
+
return server;
|
|
59
|
+
};
|
|
60
|
+
exports.expose = expose;
|
|
61
|
+
async function buildRestApi(adapter) {
|
|
62
|
+
const { config } = adapter;
|
|
63
|
+
const app = (0, fastify_1.default)();
|
|
64
|
+
// Add healthcheck endpoint before middlewares to bypass them
|
|
65
|
+
app.get((0, path_1.join)(config.BASE_URL, 'health'), (req, res) => {
|
|
66
|
+
res.status(200).send({ message: 'OK', version: VERSION });
|
|
67
|
+
});
|
|
68
|
+
// Use global error handling
|
|
69
|
+
app.setErrorHandler(validation_1.errorCatchingMiddleware);
|
|
70
|
+
const transportHandler = await (0, transports_1.buildTransportHandler)(adapter);
|
|
71
|
+
app.register(async (router) => {
|
|
72
|
+
// Set up "middlewares" (hooks in fastify)
|
|
73
|
+
router.addHook('preHandler', (0, validation_1.validatorMiddleware)(adapter));
|
|
74
|
+
router.addHook('preHandler', (0, cache_1.buildCacheMiddleware)(adapter));
|
|
75
|
+
if (config['CORRELATION_ID_ENABLED']) {
|
|
76
|
+
router.addHook('onRequest', util_1.loggingContextMiddleware);
|
|
77
|
+
}
|
|
78
|
+
router.route({
|
|
79
|
+
url: config.BASE_URL,
|
|
80
|
+
method: 'POST',
|
|
81
|
+
handler: transportHandler,
|
|
82
|
+
});
|
|
83
|
+
if (config.METRICS_ENABLED && config.EXPERIMENTAL_METRICS_ENABLED) {
|
|
84
|
+
router.addHook('onResponse', metrics_1.buildMetricsMiddleware);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
// Add smoke endpoint after middleware which are needed for tests
|
|
88
|
+
buildSmokeEndpoint(app, config);
|
|
89
|
+
return app;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Adds the /smoke endpoint to the API for smoke testing the adapter
|
|
93
|
+
*
|
|
94
|
+
* @param app - the Fastify instance
|
|
95
|
+
* @param config - the initialized adapter config
|
|
96
|
+
*/
|
|
97
|
+
function buildSmokeEndpoint(app, config) {
|
|
98
|
+
const testPayload = (0, test_payload_loader_1.loadTestPayload)(config.SMOKE_TEST_PAYLOAD_FILE_NAME);
|
|
99
|
+
app.get((0, path_1.join)(config.BASE_URL, 'smoke'), async (_, res) => {
|
|
100
|
+
if (testPayload.isDefault) {
|
|
101
|
+
return res.status(200).send('OK');
|
|
102
|
+
}
|
|
103
|
+
const errors = [];
|
|
104
|
+
for (const index in testPayload.requests) {
|
|
105
|
+
try {
|
|
106
|
+
const request = { id: index, data: testPayload.requests[index] };
|
|
107
|
+
// Use Fastify's app inject to pass smoke requests internally
|
|
108
|
+
const response = await app.inject({
|
|
109
|
+
method: 'POST',
|
|
110
|
+
url: '/',
|
|
111
|
+
payload: request,
|
|
112
|
+
});
|
|
113
|
+
const parsedResponse = JSON.parse(response.body);
|
|
114
|
+
// Throw error if not 2xx status code
|
|
115
|
+
if (parsedResponse.statusCode < 200 || parsedResponse.statusCode > 299) {
|
|
116
|
+
throw Error('Smoke test request failed');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
errors.push(e);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (errors.length > 0) {
|
|
124
|
+
return res.status(500).send(errors);
|
|
125
|
+
}
|
|
126
|
+
return res.status(200).send('OK');
|
|
127
|
+
});
|
|
128
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,122 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.httpRequestDurationSeconds = exports.httpRequestsTotal = exports.buildMetricsMiddleware = exports.setupMetrics = exports.setupMetricsServer = void 0;
|
|
30
|
+
const client = __importStar(require("prom-client"));
|
|
31
|
+
const constants_1 = require("./constants");
|
|
32
|
+
const util_1 = require("../util");
|
|
33
|
+
const fastify_1 = __importDefault(require("fastify"));
|
|
34
|
+
const path_1 = require("path");
|
|
35
|
+
const error_1 = require("../validation/error");
|
|
36
|
+
const logger = (0, util_1.makeLogger)('Metrics');
|
|
37
|
+
function setupMetricsServer(name, config) {
|
|
38
|
+
const metricsApp = (0, fastify_1.default)({
|
|
39
|
+
logger: false,
|
|
40
|
+
});
|
|
41
|
+
const metricsPort = config.METRICS_PORT;
|
|
42
|
+
const endpoint = config.METRICS_USE_BASE_URL ? (0, path_1.join)(config.BASE_URL, 'metrics') : '/metrics';
|
|
43
|
+
const eaHost = config.EA_HOST;
|
|
44
|
+
(0, exports.setupMetrics)(name, config);
|
|
45
|
+
metricsApp.get(endpoint, async (_, res) => {
|
|
46
|
+
res.type('txt');
|
|
47
|
+
res.send(await client.register.metrics());
|
|
48
|
+
});
|
|
49
|
+
metricsApp.listen(metricsPort, eaHost, () => logger.info(`Monitoring listening on port ${metricsPort}!`));
|
|
50
|
+
}
|
|
51
|
+
exports.setupMetricsServer = setupMetricsServer;
|
|
52
|
+
const setupMetrics = (name, config) => {
|
|
53
|
+
client.collectDefaultMetrics();
|
|
54
|
+
client.register.setDefaultLabels({
|
|
55
|
+
app_name: config.METRICS_NAME || name || 'N/A',
|
|
56
|
+
app_version: config['npm_package_version'],
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
exports.setupMetrics = setupMetrics;
|
|
60
|
+
/**
|
|
61
|
+
* Builds metrics middleware that records end to end EA response times
|
|
62
|
+
* and count of requests
|
|
63
|
+
*
|
|
64
|
+
* @returns the cache middleware function
|
|
65
|
+
*/
|
|
66
|
+
const buildMetricsMiddleware = (req, res, done) => {
|
|
67
|
+
const feedId = req.requestContext.meta?.metrics?.feedId || 'N/A';
|
|
68
|
+
const labels = buildHttpRequestMetricsLabel(feedId, req.requestContext.meta?.error, req.requestContext.meta?.metrics?.cacheHit);
|
|
69
|
+
// Record number of requests sent to EA
|
|
70
|
+
exports.httpRequestsTotal.labels(labels).inc();
|
|
71
|
+
// Record response time of request through entire EA
|
|
72
|
+
exports.httpRequestDurationSeconds.observe(res.getResponseTime());
|
|
73
|
+
logger.debug(`Response time for ${feedId}: ${res.getResponseTime()}ms`);
|
|
74
|
+
done();
|
|
75
|
+
};
|
|
76
|
+
exports.buildMetricsMiddleware = buildMetricsMiddleware;
|
|
77
|
+
const buildHttpRequestMetricsLabel = (feedId, error, cacheHit) => {
|
|
78
|
+
const labels = {};
|
|
79
|
+
labels.method = 'POST';
|
|
80
|
+
labels.feed_id = feedId;
|
|
81
|
+
if (error instanceof error_1.AdapterError) {
|
|
82
|
+
// If error present and an instace of AdapterError, build label from error info
|
|
83
|
+
labels.type = error?.metricsLabel || constants_1.HttpRequestType.ADAPTER_ERROR;
|
|
84
|
+
labels.status_code = error?.statusCode;
|
|
85
|
+
labels.provider_status_code = error?.providerStatusCode;
|
|
86
|
+
}
|
|
87
|
+
else if (error instanceof Error) {
|
|
88
|
+
// If error present and not instance of generic Error, unexpected failure occurred
|
|
89
|
+
labels.type = constants_1.HttpRequestType.ADAPTER_ERROR;
|
|
90
|
+
labels.status_code = 500;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// If no error present, request went as expected
|
|
94
|
+
labels.status_code = 200;
|
|
95
|
+
if (cacheHit) {
|
|
96
|
+
labels.type = constants_1.HttpRequestType.CACHE_HIT;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
labels.type = constants_1.HttpRequestType.DATA_PROVIDER_HIT;
|
|
100
|
+
labels.provider_status_code = 200;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return labels;
|
|
104
|
+
};
|
|
105
|
+
exports.httpRequestsTotal = new client.Counter({
|
|
106
|
+
name: 'http_requests_total',
|
|
107
|
+
help: 'The number of http requests this external adapter has serviced for its entire uptime',
|
|
108
|
+
labelNames: [
|
|
109
|
+
'method',
|
|
110
|
+
'status_code',
|
|
111
|
+
'retry',
|
|
112
|
+
'type',
|
|
113
|
+
'is_cache_warming',
|
|
114
|
+
'feed_id',
|
|
115
|
+
'provider_status_code',
|
|
116
|
+
],
|
|
117
|
+
});
|
|
118
|
+
exports.httpRequestDurationSeconds = new client.Histogram({
|
|
119
|
+
name: 'http_request_duration_seconds',
|
|
120
|
+
help: 'A histogram bucket of the distribution of http request durations',
|
|
121
|
+
buckets: constants_1.requestDurationBuckets,
|
|
122
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AdapterMetricsMeta, AdapterRequestData } from '../util';
|
|
2
|
+
import { AdapterEndpoint } from '../adapter';
|
|
3
|
+
import { AdapterConfig, SettingsMap } from '../config';
|
|
4
|
+
export declare const getMetricsMeta: <Params, Result, CustomSettings extends SettingsMap>({ adapterEndpoint, adapterConfig, }: {
|
|
5
|
+
adapterEndpoint: AdapterEndpoint<Params, Result, CustomSettings>;
|
|
6
|
+
adapterConfig: AdapterConfig<CustomSettings>;
|
|
7
|
+
}, data: AdapterRequestData) => AdapterMetricsMeta;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMetricsMeta = void 0;
|
|
4
|
+
const cache_1 = require("../cache");
|
|
5
|
+
const getMetricsMeta = ({ adapterEndpoint, adapterConfig, }, data) => {
|
|
6
|
+
const feedId = (0, cache_1.calculateFeedId)({ adapterEndpoint, adapterConfig }, data);
|
|
7
|
+
return { feedId };
|
|
8
|
+
};
|
|
9
|
+
exports.getMetricsMeta = getMetricsMeta;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|