@chainlink/external-adapter-framework 0.5.2 → 0.5.4
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/README.md +67 -0
- package/adapter/basic.d.ts +6 -10
- package/adapter/basic.js +7 -10
- package/adapter/basic.js.map +1 -1
- package/adapter/endpoint.d.ts +6 -6
- package/adapter/endpoint.js +0 -1
- package/adapter/endpoint.js.map +1 -1
- package/adapter/price.d.ts +8 -10
- package/adapter/price.js +5 -8
- package/adapter/price.js.map +1 -1
- package/adapter/types.d.ts +13 -19
- package/background-executor.js +4 -19
- package/background-executor.js.map +1 -1
- package/cache/index.d.ts +6 -6
- package/cache/redis.d.ts +3 -0
- package/cache/redis.js +12 -19
- package/cache/redis.js.map +1 -1
- package/config/index.d.ts +0 -1
- package/config/index.js +7 -13
- package/config/index.js.map +1 -1
- package/examples/bank-frick/accounts.d.ts +24 -17
- package/examples/bank-frick/accounts.js +9 -22
- package/examples/bank-frick/accounts.js.map +1 -1
- package/examples/bank-frick/index.d.ts +15 -1
- package/examples/bank-frick/index.js +1 -1
- package/examples/coingecko/src/crypto-utils.d.ts +1 -15
- package/examples/coingecko/src/crypto-utils.js.map +1 -1
- package/examples/coingecko/src/endpoint/coins.d.ts +3 -20
- package/examples/coingecko/src/endpoint/coins.js +2 -2
- package/examples/coingecko/src/endpoint/coins.js.map +1 -1
- package/examples/coingecko/src/endpoint/crypto-marketcap.d.ts +2 -2
- package/examples/coingecko/src/endpoint/crypto-marketcap.js.map +1 -1
- package/examples/coingecko/src/endpoint/crypto-volume.d.ts +2 -2
- package/examples/coingecko/src/endpoint/crypto-volume.js.map +1 -1
- package/examples/coingecko/src/endpoint/crypto.d.ts +1 -2
- package/examples/coingecko/src/endpoint/crypto.js.map +1 -1
- package/examples/coingecko/src/endpoint/dominance.d.ts +2 -2
- package/examples/coingecko/src/endpoint/dominance.js.map +1 -1
- package/examples/coingecko/src/endpoint/global-marketcap.d.ts +2 -2
- package/examples/coingecko/src/endpoint/global-marketcap.js.map +1 -1
- package/examples/coingecko/src/global-utils.d.ts +3 -18
- package/examples/coingecko/src/global-utils.js.map +1 -1
- package/examples/coingecko/src/index.js +1 -1
- package/examples/coingecko-old/batch-warming.d.ts +7 -0
- package/examples/coingecko-old/batch-warming.js +54 -0
- package/examples/coingecko-old/batch-warming.js.map +1 -0
- package/examples/coingecko-old/index.d.ts +2 -0
- package/examples/coingecko-old/index.js +12 -0
- package/examples/coingecko-old/index.js.map +1 -0
- package/examples/coingecko-old/rest.d.ts +12 -0
- package/examples/coingecko-old/rest.js +55 -0
- package/examples/coingecko-old/rest.js.map +1 -0
- package/examples/cryptocompare/src/endpoints/crypto.d.ts +2 -14
- package/examples/cryptocompare/src/endpoints/crypto.js.map +1 -1
- package/examples/cryptocompare/src/index.js +1 -1
- package/examples/genesis/index.js +1 -1
- package/examples/genesis/sseStream.d.ts +2 -13
- package/examples/genesis/sseStream.js.map +1 -1
- package/examples/ncfx/config/index.d.ts +12 -0
- package/examples/ncfx/config/index.js +16 -0
- package/examples/ncfx/config/index.js.map +1 -0
- package/examples/ncfx/index.d.ts +13 -0
- package/examples/ncfx/index.js +12 -0
- package/examples/ncfx/index.js.map +1 -0
- package/examples/ncfx/websocket.d.ts +47 -0
- package/examples/ncfx/websocket.js +74 -0
- package/examples/ncfx/websocket.js.map +1 -0
- package/metrics/util.d.ts +5 -5
- package/metrics/util.js.map +1 -1
- package/package.json +5 -3
- package/rate-limiting/background/fixed-frequency.d.ts +3 -2
- package/rate-limiting/background/fixed-frequency.js.map +1 -1
- package/rate-limiting/index.d.ts +4 -4
- package/rate-limiting/index.js +1 -1
- package/rate-limiting/index.js.map +1 -1
- package/rate-limiting/request/simple-counting.d.ts +3 -2
- package/rate-limiting/request/simple-counting.js.map +1 -1
- package/transports/batch-warming.d.ts +13 -31
- package/transports/batch-warming.js +4 -4
- package/transports/batch-warming.js.map +1 -1
- package/transports/index.d.ts +13 -50
- package/transports/index.js.map +1 -1
- package/transports/metrics.d.ts +2 -2
- package/transports/metrics.js +2 -2
- package/transports/metrics.js.map +1 -1
- package/transports/rest.d.ts +13 -30
- package/transports/rest.js +3 -1
- package/transports/rest.js.map +1 -1
- package/transports/routing.d.ts +12 -10
- package/transports/routing.js +3 -1
- package/transports/routing.js.map +1 -1
- package/transports/sse.d.ts +18 -39
- package/transports/sse.js +1 -6
- package/transports/sse.js.map +1 -1
- package/transports/websocket.d.ts +23 -39
- package/transports/websocket.js +4 -5
- package/transports/websocket.js.map +1 -1
- package/util/request.d.ts +10 -46
- package/validation/index.js +15 -16
- package/validation/index.js.map +1 -1
- package/validation/override-functions.d.ts +3 -0
- package/validation/override-functions.js +41 -0
- package/validation/override-functions.js.map +1 -0
|
@@ -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,55 @@
|
|
|
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
|
+
requestCoalescing: {
|
|
44
|
+
enabled: true,
|
|
45
|
+
entropyMax: 0,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
exports.restEndpoint = new adapter_1.AdapterEndpoint({
|
|
50
|
+
name: 'rest',
|
|
51
|
+
aliases: ['qwe'],
|
|
52
|
+
transport: restEndpointTransport,
|
|
53
|
+
inputParameters,
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=rest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../../src/examples/coingecko-old/rest.ts"],"names":[],"mappings":";;;AACA,2CAA+C;AAC/C,iDAAgD;AAIhD,MAAM,WAAW,GAAG,kCAAkC,CAAA;AAOtD,MAAM,eAAe,GAAoB;IACvC,MAAM,EAAE;QACN,WAAW,EACT,8IAA8I;QAChJ,QAAQ,EAAE,KAAK;KAChB;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,IAAI;KACf;IACD,KAAK,EAAE;QACL,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;QACzB,WAAW,EAAE,0CAA0C;QACvD,QAAQ,EAAE,IAAI;KACf;CACF,CAAA;AAaD,MAAM,qBAAqB,GAAG,IAAI,0BAAa,CAAC;IAC9C,cAAc,EAAE,CACd,GAAyC,EACA,EAAE;QAC3C,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,GAAG,EAAE,eAAe;YACpB,MAAM,EAAE,KAAK;YACb,MAAM,EAAE;gBACN,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI;gBACjC,aAAa,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK;aAC7C;SACF,CAAA;IACH,CAAC;IACD,aAAa,EAAE,CACb,GAAyC,EACzC,GAAwC,EACD,EAAE;QACzC,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,UAAU,EAAE,GAAG;YACf,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;SACvC,CAAA;IAC5C,CAAC;IACD,OAAO,EAAE;QACP,iBAAiB,EAAE;YACjB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,CAAC;SACd;KACF;CACF,CAAC,CAAA;AAEW,QAAA,YAAY,GAAG,IAAI,yBAAe,CAAC;IAC9C,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,CAAC,KAAK,CAAC;IAChB,SAAS,EAAE,qBAAqB;IAChC,eAAe;CAChB,CAAC,CAAA"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { PriceEndpoint } from '../../../../adapter';
|
|
2
|
-
import { SettingsMap } from '../../../../config';
|
|
3
2
|
import { WebSocketTransport } from '../../../../transports/websocket';
|
|
4
|
-
import { SingleNumberResultResponse } from '../../../../util';
|
|
5
3
|
interface AdapterRequestParams {
|
|
6
4
|
base: string;
|
|
7
5
|
quote: string;
|
|
@@ -25,16 +23,6 @@ export interface WSErrorType {
|
|
|
25
23
|
PARAMETER: string;
|
|
26
24
|
INFO: string;
|
|
27
25
|
}
|
|
28
|
-
declare
|
|
29
|
-
|
|
30
|
-
Params: AdapterRequestParams;
|
|
31
|
-
};
|
|
32
|
-
Response: SingleNumberResultResponse;
|
|
33
|
-
CustomSettings: SettingsMap;
|
|
34
|
-
Provider: {
|
|
35
|
-
WsMessage: Message;
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
|
-
export declare const transport: WebSocketTransport<CryptoEndpointTypes>;
|
|
39
|
-
export declare const endpoint: PriceEndpoint<CryptoEndpointTypes>;
|
|
26
|
+
export declare const transport: WebSocketTransport<AdapterRequestParams, Message, import("../../../../config").SettingsMap>;
|
|
27
|
+
export declare const endpoint: PriceEndpoint<AdapterRequestParams, import("../../../../transports").BackgroundStoredResultType, import("../../../../config").SettingsMap>;
|
|
40
28
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../../../../src/examples/cryptocompare/src/endpoints/crypto.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../../../../src/examples/cryptocompare/src/endpoints/crypto.ts"],"names":[],"mappings":";;;AACA,iDAAiG;AACjG,gEAAqE;AACrE,2CAA6D;AAC7D,sCAAmD;AA4BnD,MAAM,MAAM,GAAG,IAAA,iBAAU,EAAC,6BAA6B,CAAC,CAAA;AAE3C,QAAA,SAAS,GAAG,IAAI,8BAAkB,CAAC;IAC9C,GAAG,EAAE,CAAC,OAAuB,EAAE,EAAE,CAC/B,GAAG,gCAAuB,YAAY,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE;IACvE,QAAQ,EAAE;QACR,IAAI,CAAC,UAAqB;YACxB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,kBAAkB;gBAClB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE;oBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;oBAC1C,IAAI,MAAM,CAAC,OAAO,KAAK,iBAAiB,EAAE;wBACxC,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;wBAC1D,OAAO,EAAE,CAAA;qBACV;yBAAM;wBACL,MAAM,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAA;qBACjE;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,CAAC,OAAgB;YACtB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,6BAA6B,CAAC,CAAA;YACpD,IAAI,OAAO,CAAC,IAAI,KAAK,GAAG,EAAE;gBACxB,OAAO;oBACL,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;iBACxF,CAAA;aACF;YACD,IAAI,OAAO,CAAC,OAAO,KAAK,aAAa,EAAE;gBACrC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,sCAAsC,CAAC,CAAA;gBAC7D,OAAM;aACP;QACH,CAAC;KACF;IACD,QAAQ,EAAE;QACR,gBAAgB,EAAE,CAAC,MAA4B,EAAE,EAAE;YACjD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAA;QACrF,CAAC;QACD,kBAAkB,EAAE,CAAC,MAA4B,EAAE,EAAE;YACnD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAA;QACxF,CAAC;KACF;CACF,CAAC,CAAA;AAEW,QAAA,QAAQ,GAAG,IAAI,uBAAa,CAAC;IACxC,IAAI,EAAE,QAAQ;IACd,SAAS,EAAT,iBAAS;IACT,eAAe,EAAE,sCAA4B;CAC9C,CAAC,CAAA"}
|
|
@@ -5,7 +5,7 @@ const __1 = require("../../..");
|
|
|
5
5
|
const adapter_1 = require("../../../../src/adapter");
|
|
6
6
|
const endpoints_1 = require("./endpoints");
|
|
7
7
|
exports.adapter = new adapter_1.PriceAdapter({
|
|
8
|
-
name: '
|
|
8
|
+
name: 'cryptocompare',
|
|
9
9
|
defaultEndpoint: 'crypto',
|
|
10
10
|
endpoints: [endpoints_1.cryptoEndpoint],
|
|
11
11
|
});
|
|
@@ -5,7 +5,7 @@ const adapter_1 = require("../../adapter");
|
|
|
5
5
|
const sseStream_1 = require("./sseStream");
|
|
6
6
|
const config_1 = require("./config");
|
|
7
7
|
exports.adapter = new adapter_1.Adapter({
|
|
8
|
-
name: '
|
|
8
|
+
name: 'genesis',
|
|
9
9
|
defaultEndpoint: sseStream_1.sseEndpoint.name,
|
|
10
10
|
endpoints: [sseStream_1.sseEndpoint],
|
|
11
11
|
customSettings: config_1.customSettings,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AdapterEndpoint } from '../../adapter';
|
|
2
2
|
import { SSETransport } from '../../transports';
|
|
3
|
-
import { SingleNumberResultResponse } from '../../util';
|
|
4
3
|
import { InputParameters } from '../../validation';
|
|
5
4
|
import { SettingsMap } from '../../config';
|
|
6
5
|
interface AdapterRequestParams {
|
|
@@ -11,17 +10,7 @@ export declare const inputParameters: InputParameters;
|
|
|
11
10
|
declare type Price = number;
|
|
12
11
|
declare type Quantity = number;
|
|
13
12
|
export declare type Entry = ['BUY' | 'SELL' | '', Price, Quantity];
|
|
14
|
-
declare
|
|
15
|
-
Request: {
|
|
16
|
-
Params: AdapterRequestParams;
|
|
17
|
-
};
|
|
18
|
-
Response: SingleNumberResultResponse;
|
|
19
|
-
CustomSettings: SettingsMap;
|
|
20
|
-
Provider: {
|
|
21
|
-
RequestBody: never;
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
export declare const sseTransport: SSETransport<StreamEndpointTypes>;
|
|
13
|
+
export declare const sseTransport: SSETransport<AdapterRequestParams, undefined, SettingsMap>;
|
|
25
14
|
export declare const calculateQWAPprice: (entries: Entry[]) => number | undefined;
|
|
26
|
-
export declare const sseEndpoint: AdapterEndpoint<
|
|
15
|
+
export declare const sseEndpoint: AdapterEndpoint<AdapterRequestParams, import("../../transports").BackgroundStoredResultType, SettingsMap>;
|
|
27
16
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sseStream.js","sourceRoot":"","sources":["../../../../src/examples/genesis/sseStream.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA2B;AAC3B,2CAA+
|
|
1
|
+
{"version":3,"file":"sseStream.js","sourceRoot":"","sources":["../../../../src/examples/genesis/sseStream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const customSettings: {
|
|
2
|
+
readonly USERNAME: {
|
|
3
|
+
readonly description: "Username for the NCFX API";
|
|
4
|
+
readonly type: "string";
|
|
5
|
+
readonly required: true;
|
|
6
|
+
};
|
|
7
|
+
readonly PASSWORD: {
|
|
8
|
+
readonly description: "Password for the NCFX API";
|
|
9
|
+
readonly type: "string";
|
|
10
|
+
readonly required: true;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.customSettings = void 0;
|
|
4
|
+
exports.customSettings = {
|
|
5
|
+
USERNAME: {
|
|
6
|
+
description: 'Username for the NCFX API',
|
|
7
|
+
type: 'string',
|
|
8
|
+
required: true,
|
|
9
|
+
},
|
|
10
|
+
PASSWORD: {
|
|
11
|
+
description: 'Password for the NCFX API',
|
|
12
|
+
type: 'string',
|
|
13
|
+
required: true,
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/examples/ncfx/config/index.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG;IAC5B,QAAQ,EAAE;QACR,WAAW,EAAE,2BAA2B;QACxC,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACf;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,2BAA2B;QACxC,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACf;CACO,CAAA"}
|
|
@@ -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,12 @@
|
|
|
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
|
+
});
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/examples/ncfx/index.ts"],"names":[],"mappings":";;;AAAA,2CAAuC;AACvC,qCAAyC;AACzC,2CAA+C;AAElC,QAAA,OAAO,GAAG,IAAI,iBAAO,CAAC;IACjC,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,CAAC,6BAAiB,CAAC;IAC9B,cAAc,EAAd,uBAAc;CACf,CAAC,CAAA"}
|
|
@@ -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, import("../../transports").BackgroundStoredResultType, {
|
|
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,74 @@
|
|
|
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
|
+
});
|
|
74
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../../src/examples/ncfx/websocket.ts"],"names":[],"mappings":";;;AACA,2CAA+D;AAC/D,0DAA+D;AAC/D,qCAAuD;AAS1C,QAAA,eAAe,GAAoB;IAC9C,IAAI,EAAE;QACJ,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,qCAAqC;QAClD,QAAQ,EAAE,IAAI;KACf;IACD,KAAK,EAAE;QACL,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;QACzB,WAAW,EAAE,0CAA0C;QACvD,QAAQ,EAAE,IAAI;KACf;CACF,CAAA;AAiBD,MAAM,MAAM,GAAG,IAAA,iBAAU,EAAC,wBAAwB,CAAC,CAAA;AAEtC,QAAA,kBAAkB,GAAG,IAAI,8BAAkB,CAAC;IACvD,GAAG,EAAE,GAAG,EAAE,CAAC,uCAAuC;IAClD,QAAQ,EAAE;QACR,IAAI,CAAC,UAAqB,EAAE,OAA8C;YACxE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,kBAAkB;gBAClB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE;oBACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;oBAC1C,IAAI,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,mBAAmB,CAAC,EAAE;wBACnD,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;wBAC1D,OAAO,EAAE,CAAA;qBACV;yBAAM;wBACL,MAAM,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAA;qBACjE;gBACH,CAAC,CAAC,CAAA;gBACF,qBAAqB;gBACrB,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,SAAS,CAAC;oBACb,OAAO,EAAE,OAAO;oBAChB,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ;oBACxC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ;iBACzC,CAAC,CACH,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,CAAC,OAA0B;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBAC3B,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;gBACjD,OAAO,EAAE,CAAA;aACV;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACvB,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC/C,OAAO;oBACL,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;oBACvB,KAAK,EAAE,CAAC,CAAC,KAAK;iBACf,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;KACF;IACD,QAAQ,EAAE;QACR,gBAAgB,EAAE,CAAC,MAA4B,EAAE,EAAE,CAAC,CAAC;YACnD,OAAO,EAAE,WAAW;YACpB,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE;SACtC,CAAC;QACF,kBAAkB,EAAE,CAAC,MAA4B,EAAE,EAAE,CAAC,CAAC;YACrD,OAAO,EAAE,aAAa;YACtB,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE;SACtC,CAAC;KACH;CACF,CAAC,CAAA;AAEW,QAAA,iBAAiB,GAAG,IAAI,yBAAe,CAAC;IACnD,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE,0BAAkB;IAC7B,eAAe,EAAf,uBAAe;CAChB,CAAC,CAAA"}
|
package/metrics/util.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AdapterEndpoint } from '../adapter';
|
|
2
|
-
import { AdapterConfig } from '../config';
|
|
3
1
|
import { AdapterMetricsMeta, AdapterRequestData } from '../util';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
7
|
}, data: AdapterRequestData) => AdapterMetricsMeta;
|
package/metrics/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/metrics/util.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/metrics/util.ts"],"names":[],"mappings":";;;AAEA,oCAA0C;AAGnC,MAAM,cAAc,GAAG,CAC5B,EACE,eAAe,EACf,aAAa,GAId,EACD,IAAwB,EACJ,EAAE;IACtB,MAAM,MAAM,GAAG,IAAA,uBAAe,EAAC,EAAE,eAAe,EAAE,aAAa,EAAE,EAAE,IAAI,CAAC,CAAA;IACxE,OAAO,EAAE,MAAM,EAAE,CAAA;AACnB,CAAC,CAAA;AAZY,QAAA,cAAc,kBAY1B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chainlink/external-adapter-framework",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.4",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"dependencies": {
|
|
@@ -9,13 +9,14 @@
|
|
|
9
9
|
"eventsource": "2.0.2",
|
|
10
10
|
"fastify": "4.7.0",
|
|
11
11
|
"ioredis": "5.2.3",
|
|
12
|
+
"object-path": "0.11.8",
|
|
12
13
|
"pino": "8.6.1",
|
|
13
14
|
"prom-client": "13.2.0",
|
|
14
15
|
"ws": "8.9.0"
|
|
15
16
|
},
|
|
16
17
|
"scripts": {
|
|
17
18
|
"build": "tsc",
|
|
18
|
-
"dev": "
|
|
19
|
+
"dev": "DEBUG=true tsnd --respawn --transpile-only --project tsconfig.json './src/test.ts'",
|
|
19
20
|
"generate-docs": "typedoc src/**/*.ts",
|
|
20
21
|
"lint-fix": "eslint --max-warnings=0 --fix ./src && prettier --write ./src/**/*.ts ./*.{json,js,yaml}",
|
|
21
22
|
"lint": "eslint --max-warnings=0 ./src && prettier --check ./src/**/*.ts ./*.{json,js,yaml}",
|
|
@@ -31,6 +32,7 @@
|
|
|
31
32
|
"@types/eventsource": "1.1.9",
|
|
32
33
|
"@types/jest": "29.1.1",
|
|
33
34
|
"@types/node": "18.8.2",
|
|
35
|
+
"@types/object-path": "0.11.1",
|
|
34
36
|
"@types/sinonjs__fake-timers": "8.1.2",
|
|
35
37
|
"@types/supertest": "2.0.12",
|
|
36
38
|
"@types/ws": "8.5.3",
|
|
@@ -48,8 +50,8 @@
|
|
|
48
50
|
"pino-pretty": "9.1.0",
|
|
49
51
|
"prettier": "2.7.1",
|
|
50
52
|
"supertest": "6.3.0",
|
|
51
|
-
"ts-node": "10.9.1",
|
|
52
53
|
"ts-jest": "29.0.3",
|
|
54
|
+
"ts-node": "10.9.1",
|
|
53
55
|
"ts-node-dev": "2.0.0",
|
|
54
56
|
"typedoc": "0.23.15",
|
|
55
57
|
"typescript": "4.8.4"
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { AdapterRateLimitTier, BackgroundExecuteRateLimiter } from '..';
|
|
2
|
-
import { AdapterEndpoint
|
|
2
|
+
import { AdapterEndpoint } from '../../adapter';
|
|
3
|
+
import { SettingsMap } from '../../config';
|
|
3
4
|
export declare const DEFAULT_SHARED_MS_BETWEEN_REQUESTS = 5000;
|
|
4
5
|
export declare class FixedFrequencyRateLimiter implements BackgroundExecuteRateLimiter {
|
|
5
6
|
msBetweenRequestsMap: {
|
|
6
7
|
[endpointName: string]: number;
|
|
7
8
|
};
|
|
8
|
-
initialize<
|
|
9
|
+
initialize<Params, Result, CustomSettings extends SettingsMap>(endpoints: AdapterEndpoint<Params, Result, CustomSettings>[], limits?: AdapterRateLimitTier): this;
|
|
9
10
|
msUntilNextExecution(endpointName: string): number;
|
|
10
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixed-frequency.js","sourceRoot":"","sources":["../../../../src/rate-limiting/background/fixed-frequency.ts"],"names":[],"mappings":";;;AAAA,0BAA8F;
|
|
1
|
+
{"version":3,"file":"fixed-frequency.js","sourceRoot":"","sources":["../../../../src/rate-limiting/background/fixed-frequency.ts"],"names":[],"mappings":";;;AAAA,0BAA8F;AAG9F,qCAAuC;AAEvC,MAAM,MAAM,GAAG,IAAA,iBAAU,EAAC,2BAA2B,CAAC,CAAA;AACzC,QAAA,kCAAkC,GAAG,IAAI,CAAA;AAEtD,MAAa,yBAAyB;IAAtC;QACE,yBAAoB,GAEhB,EAAE,CAAA;IAqCR,CAAC;IAnCC,UAAU,CACR,SAA4D,EAC5D,MAA6B;QAE7B,kDAAkD;QAClD,IAAI,uBAAuB,GAAG,IAAI,GAAG,IAAA,yBAAqB,EAAC,MAAM,CAAC,CAAA;QAElE,0DAA0D;QAC1D,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE;YACxE,+BAA+B;YAC/B,uBAAuB,GAAG,0CAAkC,CAAA;SAC7D;QAED,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAA;QACzD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;YAChC,IAAI,QAAQ,CAAC,YAAY,EAAE,oBAAoB,IAAI,IAAI,EAAE;gBACvD,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAA;aACjF;YAED,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACtC,CAAC,uBAAuB,GAAG,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC,GAAG,GAAG,CAAA;YAE/E,MAAM,CAAC,KAAK,CACV,aAAa,QAAQ,CAAC,IAAI,MACxB,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAC7C,oBAAoB,CACrB,CAAA;SACF;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,oBAAoB,CAAC,YAAoB;QACvC,OAAO,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAA;IAChD,CAAC;CACF;AAxCD,8DAwCC"}
|
package/rate-limiting/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AdapterEndpoint
|
|
2
|
-
import { AdapterConfig } from '../config';
|
|
3
|
-
export * from './background/fixed-frequency';
|
|
1
|
+
import { AdapterEndpoint } from '../adapter';
|
|
2
|
+
import { AdapterConfig, SettingsMap } from '../config';
|
|
4
3
|
export * from './request/simple-counting';
|
|
4
|
+
export * from './background/fixed-frequency';
|
|
5
5
|
export interface AdapterRateLimitTier {
|
|
6
6
|
rateLimit1s?: number;
|
|
7
7
|
rateLimit1m?: number;
|
|
@@ -18,7 +18,7 @@ export interface RateLimiter {
|
|
|
18
18
|
* @param limits - settings for how much throughput to allow for the Adapter
|
|
19
19
|
* @param endpoints - list of adapter endpoints
|
|
20
20
|
*/
|
|
21
|
-
initialize<
|
|
21
|
+
initialize<Params, Result, CustomSettings extends SettingsMap>(endpoints: AdapterEndpoint<Params, Result, CustomSettings>[], limits: AdapterRateLimitTier): this;
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
24
|
* RequestRateLimiters perform checks agains imminent outbound requests for any transport.
|
package/rate-limiting/index.js
CHANGED
|
@@ -15,8 +15,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.buildRateLimitTiersFromConfig = exports.getRateLimitingTier = exports.consolidateTierLimits = void 0;
|
|
18
|
-
__exportStar(require("./background/fixed-frequency"), exports);
|
|
19
18
|
__exportStar(require("./request/simple-counting"), exports);
|
|
19
|
+
__exportStar(require("./background/fixed-frequency"), exports);
|
|
20
20
|
/**
|
|
21
21
|
* This method will convert all possible settings for a rate limit tier and
|
|
22
22
|
* convert them all to requests per second, returning the lowest one
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rate-limiting/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAGA,+DAA4C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rate-limiting/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAGA,4DAAyC;AACzC,+DAA4C;AA4C5C;;;;;;GAMG;AACI,MAAM,qBAAqB,GAAG,CAAC,MAA6B,EAAE,EAAE;IACrE,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;IAClE,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAA;IAC7D,MAAM,cAAc,GAAG,MAAM,EAAE,WAAW,IAAI,QAAQ,CAAA;IACtD,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,EAAE,cAAc,CAAC,CAAA;AAC/D,CAAC,CAAA;AALY,QAAA,qBAAqB,yBAKjC;AAED;;;;;;GAMG;AACI,MAAM,mBAAmB,GAAG,CACjC,MAAqB,EACrB,KAA4C,EACV,EAAE;IACpC,IACE,MAAM,CAAC,mBAAmB;QAC1B,MAAM,CAAC,0BAA0B;QACjC,MAAM,CAAC,0BAA0B,EACjC;QACA,OAAO,IAAA,qCAA6B,EAAC,MAAM,CAAC,CAAA;KAC7C;IACD,IAAI,CAAC,KAAK,EAAE;QACV,OAAM;KACP;IAED,2DAA2D;IAC3D,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;QACrC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;KACnE;IAED,8DAA8D;IAC9D,MAAM,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAA;IAC/C,IAAI,YAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE;QACxC,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;aACpB,IAAI,CAAC,IAAI,CAAC,CAAA;QAEb,MAAM,IAAI,KAAK,CACb,iCAAiC,YAAY,iCAAiC,gBAAgB,GAAG,CAClG,CAAA;KACF;IAED,IAAI,CAAC,YAAY,EAAE;QACjB,8CAA8C;QAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAC3C,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAA,6BAAqB,EAAC,EAAE,CAAC,GAAG,IAAA,6BAAqB,EAAC,EAAE,CAAC,CAClE,CAAA;QAED,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;KACtB;IAED,OAAO,KAAK,CAAC,YAAY,CAAC,CAAA;AAC5B,CAAC,CAAA;AA1CY,QAAA,mBAAmB,uBA0C/B;AAED,0EAA0E;AACnE,MAAM,6BAA6B,GAAG,CAC3C,MAAqB,EACa,EAAE;IACpC,MAAM,WAAW,GAAG,MAAM,CAAC,0BAA0B,CAAA;IACrD,IAAI,WAAW,CAAA;IACf,IAAI,MAAM,CAAC,0BAA0B,EAAE;QACrC,WAAW,GAAG,MAAM,CAAC,0BAA0B,CAAA;KAChD;SAAM,IAAI,MAAM,CAAC,mBAAmB,EAAE;QACrC,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAA;KACzC;IACD,OAAO;QACL,WAAW;QACX,WAAW;KACZ,CAAA;AACH,CAAC,CAAA;AAdY,QAAA,6BAA6B,iCAczC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AdapterRateLimitTier, RateLimiter } from '..';
|
|
2
|
-
import { AdapterEndpoint
|
|
2
|
+
import { AdapterEndpoint } from '../../adapter';
|
|
3
|
+
import { SettingsMap } from '../../config';
|
|
3
4
|
/**
|
|
4
5
|
* This rate limiter is the simplest stateful option.
|
|
5
6
|
* On startup, it'll compare the different thresholds for each tier, calculate them all
|
|
@@ -15,6 +16,6 @@ export declare class SimpleCountingRateLimiter implements RateLimiter {
|
|
|
15
16
|
requestsThisMinute: number;
|
|
16
17
|
perSecondLimit: number;
|
|
17
18
|
perMinuteLimit: number;
|
|
18
|
-
initialize<
|
|
19
|
+
initialize<Params, Result, CustomSettings extends SettingsMap>(endpoints: AdapterEndpoint<Params, Result, CustomSettings>[], limits?: AdapterRateLimitTier): this;
|
|
19
20
|
isUnderLimits(): boolean;
|
|
20
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple-counting.js","sourceRoot":"","sources":["../../../../src/rate-limiting/request/simple-counting.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"simple-counting.js","sourceRoot":"","sources":["../../../../src/rate-limiting/request/simple-counting.ts"],"names":[],"mappings":";;;AAGA,qCAAuC;AAEvC,MAAM,MAAM,GAAG,IAAA,iBAAU,EAAC,2BAA2B,CAAC,CAAA;AAEtD;;;;;;;GAOG;AACH,MAAa,yBAAyB;IAAtC;QACE,yBAAoB,GAAG,CAAC,CAAA;QACxB,uBAAkB,GAAG,CAAC,CAAA;QACtB,yBAAoB,GAAG,CAAC,CAAA;QACxB,uBAAkB,GAAG,CAAC,CAAA;IA4DxB,CAAC;IAxDC,UAAU,CACR,SAA4D,EAC5D,MAA6B;QAE7B,kDAAkD;QAClD,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAA;QAC3D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,QAAQ,EAAE,YAAY,CAAC,CAAA;QAC7E,IAAI,CAAC,cAAc,GAAG,MAAM,EAAE,WAAW,IAAI,QAAQ,CAAA;QACrD,MAAM,CAAC,KAAK,CACV,6CAA6C,IAAI,CAAC,cAAc,mBAAmB,IAAI,CAAC,cAAc,EAAE,CACzG,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,aAAa;QACX,qEAAqE;QACrE,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE;YACxE,OAAO,IAAI,CAAA;SACZ;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;QACpD,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAA;QAE3D,sFAAsF;QACtF,mFAAmF;QACnF,IAAI,qBAAqB,KAAK,IAAI,CAAC,oBAAoB,EAAE;YACvD,MAAM,CAAC,KAAK,CACV,8DAA8D,IAAI,CAAC,kBAAkB,GAAG,CACzF,CAAA;YACD,IAAI,CAAC,oBAAoB,GAAG,qBAAqB,CAAA;YACjD,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAA;SAC5B;QAED,IAAI,qBAAqB,KAAK,IAAI,CAAC,oBAAoB,EAAE;YACvD,MAAM,CAAC,KAAK,CACV,4DAA4D,IAAI,CAAC,kBAAkB,GAAG,CACvF,CAAA;YACD,IAAI,CAAC,oBAAoB,GAAG,qBAAqB,CAAA;YACjD,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAA;SAC5B;QAED,IACE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,cAAc;YAC7C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,cAAc,EAC7C;YACA,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;YACjD,IAAI,CAAC,kBAAkB,EAAE,CAAA;YACzB,IAAI,CAAC,kBAAkB,EAAE,CAAA;YACzB,OAAO,IAAI,CAAA;SACZ;aAAM;YACL,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAA;YAC5D,OAAO,KAAK,CAAA;SACb;IACH,CAAC;CACF;AAhED,8DAgEC"}
|
|
@@ -1,30 +1,11 @@
|
|
|
1
1
|
import { AxiosRequestConfig, AxiosResponse } from 'axios';
|
|
2
2
|
import { Cache } from '../cache';
|
|
3
|
-
import { AdapterConfig } from '../config';
|
|
3
|
+
import { AdapterConfig, SettingsMap } from '../config';
|
|
4
4
|
import { BackgroundExecuteRateLimiter } from '../rate-limiting';
|
|
5
5
|
import { SubscriptionSet } from '../util';
|
|
6
6
|
import { AdapterRequest, AdapterResponse, ProviderResult } from '../util/request';
|
|
7
|
-
import { Transport,
|
|
7
|
+
import { Transport, BackgroundStoredResultType } from './';
|
|
8
8
|
import { AdapterContext, AdapterDependencies } from '../adapter';
|
|
9
|
-
/**
|
|
10
|
-
* Helper struct type that will be used to pass types to the generic parameters of a Transport.
|
|
11
|
-
* Extends the common TransportGenerics, adding Provider specific types for this Batch endpoint.
|
|
12
|
-
*/
|
|
13
|
-
declare type BatchWarmingTransportGenerics = TransportGenerics & {
|
|
14
|
-
/**
|
|
15
|
-
* Type details for any provider specific interfaces.
|
|
16
|
-
*/
|
|
17
|
-
Provider: {
|
|
18
|
-
/**
|
|
19
|
-
* Structure of the body of the request that will be sent to the data provider.
|
|
20
|
-
*/
|
|
21
|
-
RequestBody: unknown;
|
|
22
|
-
/**
|
|
23
|
-
* Structure for the body of the response coming from the data provider.
|
|
24
|
-
*/
|
|
25
|
-
ResponseBody: unknown;
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
9
|
/**
|
|
29
10
|
* Transport implementation that takes incoming batches requests and keeps a warm cache of values.
|
|
30
11
|
* Within the setup function, adapter params are added to an set that also keeps track and expires values.
|
|
@@ -33,21 +14,22 @@ declare type BatchWarmingTransportGenerics = TransportGenerics & {
|
|
|
33
14
|
* The Data Provider response is, they are passed through the `parseResponse` function to create a [[CacheEntry]] list.
|
|
34
15
|
* Finally, the items in that [[CacheEntry]] list are set in the Cache so the Adapter can fetch values from there.
|
|
35
16
|
*
|
|
36
|
-
* @typeParam
|
|
17
|
+
* @typeParam AdapterParams - interface for the adapter request body
|
|
18
|
+
* @typeParam ProviderRequestBody - interface for the body of the request to the Data Provider
|
|
19
|
+
* @typeParam ProviderResponseBody - interface for the body of the Data Provider's response
|
|
37
20
|
*/
|
|
38
|
-
export declare class BatchWarmingTransport<
|
|
21
|
+
export declare class BatchWarmingTransport<AdapterParams, ProviderRequestBody, ProviderResponseBody, CustomSettings extends SettingsMap> implements Transport<AdapterParams, BackgroundStoredResultType, CustomSettings> {
|
|
39
22
|
private config;
|
|
40
|
-
cache: Cache<AdapterResponse<
|
|
23
|
+
cache: Cache<AdapterResponse<BackgroundStoredResultType>>;
|
|
41
24
|
rateLimiter: BackgroundExecuteRateLimiter;
|
|
42
|
-
subscriptionSet: SubscriptionSet<
|
|
25
|
+
subscriptionSet: SubscriptionSet<AdapterParams>;
|
|
43
26
|
WARMER_ACTIVE: boolean;
|
|
44
27
|
constructor(config: {
|
|
45
|
-
prepareRequest: (params:
|
|
46
|
-
parseResponse: (params:
|
|
28
|
+
prepareRequest: (params: AdapterParams[], config: AdapterConfig<CustomSettings>) => AxiosRequestConfig<ProviderRequestBody>;
|
|
29
|
+
parseResponse: (params: AdapterParams[], res: AxiosResponse<ProviderResponseBody>, config: AdapterConfig<CustomSettings>) => ProviderResult<AdapterParams>[];
|
|
47
30
|
});
|
|
48
|
-
initialize(dependencies: AdapterDependencies, _: AdapterConfig<
|
|
49
|
-
registerRequest(req: AdapterRequest<
|
|
50
|
-
backgroundExecute(context: AdapterContext<
|
|
31
|
+
initialize(dependencies: AdapterDependencies, _: AdapterConfig<CustomSettings>, endpointName: string): Promise<void>;
|
|
32
|
+
registerRequest(req: AdapterRequest<AdapterParams>, config: AdapterConfig<CustomSettings>): Promise<void>;
|
|
33
|
+
backgroundExecute(context: AdapterContext<CustomSettings>): Promise<number>;
|
|
51
34
|
private makeRequest;
|
|
52
35
|
}
|
|
53
|
-
export {};
|