@chainlink/external-adapter-framework 0.4.0 → 0.5.1
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/adapter/basic.d.ts +90 -0
- package/adapter/basic.js +325 -0
- package/adapter/basic.js.map +1 -0
- package/adapter/endpoint.d.ts +17 -0
- package/adapter/endpoint.js +20 -0
- package/adapter/endpoint.js.map +1 -0
- package/adapter/index.d.ts +4 -0
- package/adapter/index.js +21 -0
- package/adapter/index.js.map +1 -0
- package/adapter/price.d.ts +77 -0
- package/adapter/price.js +88 -0
- package/adapter/price.js.map +1 -0
- package/adapter/types.d.ts +124 -0
- package/adapter/types.js +3 -0
- package/adapter/types.js.map +1 -0
- package/background-executor.d.ts +9 -0
- package/background-executor.js +97 -0
- package/background-executor.js.map +1 -0
- package/cache/factory.d.ts +6 -0
- package/cache/factory.js +24 -0
- package/cache/factory.js.map +1 -0
- package/cache/index.d.ts +87 -0
- package/cache/index.js +133 -0
- package/cache/index.js.map +1 -0
- package/cache/local.d.ts +23 -0
- package/cache/local.js +84 -0
- package/cache/local.js.map +1 -0
- package/cache/metrics.d.ts +27 -0
- package/cache/metrics.js +121 -0
- package/cache/metrics.js.map +1 -0
- package/cache/redis.d.ts +16 -0
- package/cache/redis.js +101 -0
- package/cache/redis.js.map +1 -0
- package/config/index.d.ts +298 -0
- package/config/index.js +359 -0
- package/config/index.js.map +1 -0
- package/config/provider-limits.d.ts +27 -0
- package/config/provider-limits.js +75 -0
- package/config/provider-limits.js.map +1 -0
- package/examples/bank-frick/accounts.d.ts +45 -0
- package/examples/bank-frick/accounts.js +203 -0
- package/examples/bank-frick/accounts.js.map +1 -0
- package/examples/bank-frick/config/index.d.ts +17 -0
- package/examples/bank-frick/config/index.js +55 -0
- package/examples/bank-frick/config/index.js.map +1 -0
- package/examples/bank-frick/index.d.ts +2 -0
- package/examples/bank-frick/index.js +16 -0
- package/examples/bank-frick/index.js.map +1 -0
- package/examples/bank-frick/util.d.ts +4 -0
- package/examples/bank-frick/util.js +40 -0
- package/examples/bank-frick/util.js.map +1 -0
- package/examples/coingecko/src/config/index.d.ts +2 -0
- package/examples/coingecko/src/config/index.js +6 -0
- package/examples/coingecko/src/config/index.js.map +1 -0
- package/examples/coingecko/src/config/overrides.json +10825 -0
- package/examples/coingecko/src/crypto-utils.d.ts +62 -0
- package/examples/coingecko/src/crypto-utils.js +60 -0
- package/examples/coingecko/src/crypto-utils.js.map +1 -0
- package/examples/coingecko/src/endpoint/coins.d.ts +26 -0
- package/examples/coingecko/src/endpoint/coins.js +37 -0
- package/examples/coingecko/src/endpoint/coins.js.map +1 -0
- package/examples/coingecko/src/endpoint/crypto-marketcap.d.ts +3 -0
- package/examples/coingecko/src/endpoint/crypto-marketcap.js +30 -0
- package/examples/coingecko/src/endpoint/crypto-marketcap.js.map +1 -0
- package/examples/coingecko/src/endpoint/crypto-volume.d.ts +3 -0
- package/examples/coingecko/src/endpoint/crypto-volume.js +30 -0
- package/examples/coingecko/src/endpoint/crypto-volume.js.map +1 -0
- package/examples/coingecko/src/endpoint/crypto.d.ts +3 -0
- package/examples/coingecko/src/endpoint/crypto.js +28 -0
- package/examples/coingecko/src/endpoint/crypto.js.map +1 -0
- package/examples/coingecko/src/endpoint/dominance.d.ts +3 -0
- package/examples/coingecko/src/endpoint/dominance.js +28 -0
- package/examples/coingecko/src/endpoint/dominance.js.map +1 -0
- package/examples/coingecko/src/endpoint/global-marketcap.d.ts +3 -0
- package/examples/coingecko/src/endpoint/global-marketcap.js +28 -0
- package/examples/coingecko/src/endpoint/global-marketcap.js.map +1 -0
- package/examples/coingecko/src/endpoint/index.d.ts +6 -0
- package/examples/coingecko/src/endpoint/index.js +16 -0
- package/examples/coingecko/src/endpoint/index.js.map +1 -0
- package/examples/coingecko/src/global-utils.d.ts +42 -0
- package/examples/coingecko/src/global-utils.js +47 -0
- package/examples/coingecko/src/global-utils.js.map +1 -0
- package/examples/coingecko/src/index.d.ts +4 -0
- package/examples/coingecko/src/index.js +19 -0
- package/examples/coingecko/src/index.js.map +1 -0
- 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/config/index.d.ts +2 -0
- package/examples/cryptocompare/src/config/index.js +6 -0
- package/examples/cryptocompare/src/config/index.js.map +1 -0
- package/examples/cryptocompare/src/endpoints/crypto.d.ts +40 -0
- package/examples/cryptocompare/src/endpoints/crypto.js +54 -0
- package/examples/cryptocompare/src/endpoints/crypto.js.map +1 -0
- package/examples/cryptocompare/src/endpoints/index.d.ts +1 -0
- package/examples/cryptocompare/src/endpoints/index.js +6 -0
- package/examples/cryptocompare/src/endpoints/index.js.map +1 -0
- package/examples/cryptocompare/src/index.d.ts +4 -0
- package/examples/cryptocompare/src/index.js +14 -0
- package/examples/cryptocompare/src/index.js.map +1 -0
- package/examples/genesis/config/index.d.ts +7 -0
- package/examples/genesis/config/index.js +11 -0
- package/examples/genesis/config/index.js.map +1 -0
- package/examples/genesis/index.d.ts +2 -0
- package/examples/genesis/index.js +13 -0
- package/examples/genesis/index.js.map +1 -0
- package/examples/genesis/sseStream.d.ts +27 -0
- package/examples/genesis/sseStream.js +149 -0
- package/examples/genesis/sseStream.js.map +1 -0
- 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 +2 -0
- package/examples/ncfx/index.js +12 -0
- package/examples/ncfx/index.js.map +1 -0
- package/examples/ncfx/websocket.d.ts +37 -0
- package/examples/ncfx/websocket.js +74 -0
- package/examples/ncfx/websocket.js.map +1 -0
- package/index.d.ts +17 -0
- package/index.js +174 -0
- package/index.js.map +1 -0
- package/metrics/constants.d.ts +16 -0
- package/metrics/constants.js +26 -0
- package/metrics/constants.js.map +1 -0
- package/metrics/index.d.ts +19 -0
- package/metrics/index.js +139 -0
- package/metrics/index.js.map +1 -0
- package/metrics/util.d.ts +7 -0
- package/metrics/util.js +10 -0
- package/metrics/util.js.map +1 -0
- package/package.json +50 -42
- package/rate-limiting/background/fixed-frequency.d.ts +10 -0
- package/rate-limiting/background/fixed-frequency.js +36 -0
- package/rate-limiting/background/fixed-frequency.js.map +1 -0
- package/rate-limiting/index.d.ts +56 -0
- package/rate-limiting/index.js +86 -0
- package/rate-limiting/index.js.map +1 -0
- package/rate-limiting/metrics.d.ts +3 -0
- package/rate-limiting/metrics.js +45 -0
- package/rate-limiting/metrics.js.map +1 -0
- package/rate-limiting/request/simple-counting.d.ts +20 -0
- package/rate-limiting/request/simple-counting.js +63 -0
- package/rate-limiting/request/simple-counting.js.map +1 -0
- package/transports/batch-warming.d.ts +53 -0
- package/transports/batch-warming.js +136 -0
- package/transports/batch-warming.js.map +1 -0
- package/transports/index.d.ts +108 -0
- package/transports/index.js +56 -0
- package/transports/index.js.map +1 -0
- package/transports/inference-test.d.ts +0 -0
- package/transports/inference-test.js +202 -0
- package/transports/inference-test.js.map +1 -0
- package/transports/metrics.d.ts +25 -0
- package/transports/metrics.js +122 -0
- package/transports/metrics.js.map +1 -0
- package/transports/rest.d.ts +68 -0
- package/transports/rest.js +131 -0
- package/transports/rest.js.map +1 -0
- package/transports/routing.d.ts +21 -0
- package/transports/routing.js +50 -0
- package/transports/routing.js.map +1 -0
- package/transports/sse.d.ts +61 -0
- package/transports/sse.js +97 -0
- package/transports/sse.js.map +1 -0
- package/transports/util.d.ts +9 -0
- package/transports/util.js +87 -0
- package/transports/util.js.map +1 -0
- package/transports/websocket.d.ts +95 -0
- package/transports/websocket.js +164 -0
- package/transports/websocket.js.map +1 -0
- package/util/censor/censor-list.d.ts +9 -0
- package/util/censor/censor-list.js +13 -0
- package/util/censor/censor-list.js.map +1 -0
- package/util/index.d.ts +13 -0
- package/util/index.js +38 -0
- package/util/index.js.map +1 -0
- package/util/logger.d.ts +49 -0
- package/util/logger.js +123 -0
- package/util/logger.js.map +1 -0
- package/util/request.d.ts +138 -0
- package/util/request.js +3 -0
- package/util/request.js.map +1 -0
- package/util/subscription-set/expiring-sorted-set.d.ts +21 -0
- package/util/subscription-set/expiring-sorted-set.js +36 -0
- package/util/subscription-set/expiring-sorted-set.js.map +1 -0
- package/util/subscription-set/redis-sorted-set.d.ts +9 -0
- package/util/subscription-set/redis-sorted-set.js +29 -0
- package/util/subscription-set/redis-sorted-set.js.map +1 -0
- package/util/subscription-set/subscription-set.d.ts +19 -0
- package/util/subscription-set/subscription-set.js +28 -0
- package/util/subscription-set/subscription-set.js.map +1 -0
- package/util/test-payload-loader.d.ts +26 -0
- package/util/test-payload-loader.js +85 -0
- package/util/test-payload-loader.js.map +1 -0
- package/validation/error.d.ts +48 -0
- package/validation/error.js +78 -0
- package/validation/error.js.map +1 -0
- package/validation/index.d.ts +5 -0
- package/validation/index.js +102 -0
- package/validation/index.js.map +1 -0
- package/validation/input-params.d.ts +14 -0
- package/validation/input-params.js +3 -0
- package/validation/input-params.js.map +1 -0
- package/validation/input-validator.d.ts +16 -0
- package/validation/input-validator.js +123 -0
- package/validation/input-validator.js.map +1 -0
- package/README.md +0 -102
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/examples/coingecko-old/index.ts"],"names":[],"mappings":";;;AAAA,2CAAuC;AACvC,mDAA+C;AAC/C,iCAAqC;AAExB,QAAA,OAAO,GAAG,IAAI,iBAAO,CAAC;IACjC,IAAI,EAAE,WAAW;IACjB,eAAe,EAAE,OAAO;IACxB,SAAS,EAAE,CAAC,mBAAY,EAAE,6BAAa,CAAC;CACzC,CAAC,CAAA"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_WS_API_ENDPOINT = exports.DEFAULT_API_ENDPOINT = void 0;
|
|
4
|
+
exports.DEFAULT_API_ENDPOINT = 'https://min-api.cryptocompare.com';
|
|
5
|
+
exports.DEFAULT_WS_API_ENDPOINT = 'wss://streamer.cryptocompare.com/v2';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/examples/cryptocompare/src/config/index.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG,mCAAmC,CAAA;AAC1D,QAAA,uBAAuB,GAAG,qCAAqC,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { PriceEndpoint } from '../../../../adapter';
|
|
2
|
+
import { SettingsMap } from '../../../../config';
|
|
3
|
+
import { WebSocketTransport } from '../../../../transports/websocket';
|
|
4
|
+
import { SingleNumberResultResponse } from '../../../../util';
|
|
5
|
+
interface AdapterRequestParams {
|
|
6
|
+
base: string;
|
|
7
|
+
quote: string;
|
|
8
|
+
}
|
|
9
|
+
interface Message {
|
|
10
|
+
PRICE: number;
|
|
11
|
+
TYPE: string;
|
|
12
|
+
MARKET: string;
|
|
13
|
+
FLAGS: number;
|
|
14
|
+
FROMSYMBOL: string;
|
|
15
|
+
TOSYMBOL: string;
|
|
16
|
+
VOLUMEDAY: number;
|
|
17
|
+
VOLUME24HOUR: number;
|
|
18
|
+
VOLUMEDAYTO: number;
|
|
19
|
+
VOLUME24HOURTO: number;
|
|
20
|
+
MESSAGE?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface WSErrorType {
|
|
23
|
+
TYPE: string;
|
|
24
|
+
MESSAGE: string;
|
|
25
|
+
PARAMETER: string;
|
|
26
|
+
INFO: string;
|
|
27
|
+
}
|
|
28
|
+
declare type CryptoEndpointTypes = {
|
|
29
|
+
Request: {
|
|
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>;
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.endpoint = exports.transport = void 0;
|
|
4
|
+
const adapter_1 = require("../../../../adapter");
|
|
5
|
+
const websocket_1 = require("../../../../transports/websocket");
|
|
6
|
+
const util_1 = require("../../../../util");
|
|
7
|
+
const config_1 = require("../config");
|
|
8
|
+
const logger = (0, util_1.makeLogger)('CryptoCompareCryptoEndpoint');
|
|
9
|
+
exports.transport = new websocket_1.WebSocketTransport({
|
|
10
|
+
url: (context) => `${config_1.DEFAULT_WS_API_ENDPOINT}?api_key=${context.adapterConfig.API_KEY}`,
|
|
11
|
+
handlers: {
|
|
12
|
+
open(connection) {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
// Set up listener
|
|
15
|
+
connection.on('message', (data) => {
|
|
16
|
+
const parsed = JSON.parse(data.toString());
|
|
17
|
+
if (parsed.MESSAGE === 'STREAMERWELCOME') {
|
|
18
|
+
logger.info('Got logged in response, connection is ready');
|
|
19
|
+
resolve();
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
reject(new Error('Unexpected message after WS connection open'));
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
message(message) {
|
|
28
|
+
logger.trace(message, 'Got response from websocket');
|
|
29
|
+
if (message.TYPE === '5') {
|
|
30
|
+
return [
|
|
31
|
+
{ params: { base: message.FROMSYMBOL, quote: message.TOSYMBOL }, value: message.PRICE },
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
if (message.MESSAGE === 'INVALID_SUB') {
|
|
35
|
+
logger.error(message, 'asset not supported by data provider');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
builders: {
|
|
41
|
+
subscribeMessage: (params) => {
|
|
42
|
+
return { action: 'SubAdd', subs: [`5~CCCAGG~${`${params.base}~${params.quote}`}`] };
|
|
43
|
+
},
|
|
44
|
+
unsubscribeMessage: (params) => {
|
|
45
|
+
return { action: 'SubRemove', subs: [`5~CCCAGG~${`${params.base}~${params.quote}`}`] };
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
exports.endpoint = new adapter_1.PriceEndpoint({
|
|
50
|
+
name: 'crypto',
|
|
51
|
+
transport: exports.transport,
|
|
52
|
+
inputParameters: adapter_1.priceEndpointInputParameters,
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../../../../src/examples/cryptocompare/src/endpoints/crypto.ts"],"names":[],"mappings":";;;AACA,iDAAiF;AAEjF,gEAAqE;AACrE,2CAAyF;AACzF,sCAAmD;AAuCnD,MAAM,MAAM,GAAG,IAAA,iBAAU,EAAC,6BAA6B,CAAC,CAAA;AAE3C,QAAA,SAAS,GAAG,IAAI,8BAAkB,CAAsB;IACnE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,gCAAuB,YAAY,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE;IACvF,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { endpoint as cryptoEndpoint } from './crypto';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cryptoEndpoint = void 0;
|
|
4
|
+
var crypto_1 = require("./crypto");
|
|
5
|
+
Object.defineProperty(exports, "cryptoEndpoint", { enumerable: true, get: function () { return crypto_1.endpoint; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/examples/cryptocompare/src/endpoints/index.ts"],"names":[],"mappings":";;;AAAA,mCAAqD;AAA5C,wGAAA,QAAQ,OAAkB"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { PriceAdapter } from '../../../../src/adapter';
|
|
3
|
+
export declare const adapter: PriceAdapter<import("../../../config").SettingsMap>;
|
|
4
|
+
export declare const server: () => Promise<import("fastify/types/instance").FastifyInstance<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault> | undefined>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.server = exports.adapter = void 0;
|
|
4
|
+
const __1 = require("../../..");
|
|
5
|
+
const adapter_1 = require("../../../../src/adapter");
|
|
6
|
+
const endpoints_1 = require("./endpoints");
|
|
7
|
+
exports.adapter = new adapter_1.PriceAdapter({
|
|
8
|
+
name: 'CRYPTOCOMPARE',
|
|
9
|
+
defaultEndpoint: 'crypto',
|
|
10
|
+
endpoints: [endpoints_1.cryptoEndpoint],
|
|
11
|
+
});
|
|
12
|
+
const server = () => (0, __1.expose)(exports.adapter);
|
|
13
|
+
exports.server = server;
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/examples/cryptocompare/src/index.ts"],"names":[],"mappings":";;;AAAA,gCAAiC;AACjC,qDAAsD;AACtD,2CAA4C;AAE/B,QAAA,OAAO,GAAG,IAAI,sBAAY,CAAC;IACtC,IAAI,EAAE,eAAe;IACrB,eAAe,EAAE,QAAQ;IACzB,SAAS,EAAE,CAAC,0BAAc,CAAC;CAC5B,CAAC,CAAA;AAEK,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAA,UAAM,EAAC,eAAO,CAAC,CAAA;AAA9B,QAAA,MAAM,UAAwB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.customSettings = void 0;
|
|
4
|
+
exports.customSettings = {
|
|
5
|
+
API_SECRET: {
|
|
6
|
+
description: 'API secret',
|
|
7
|
+
type: 'string',
|
|
8
|
+
required: true,
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/examples/genesis/config/index.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG;IAC5B,UAAU,EAAE;QACV,WAAW,EAAE,YAAY;QACzB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACf;CACO,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.adapter = void 0;
|
|
4
|
+
const adapter_1 = require("../../adapter");
|
|
5
|
+
const sseStream_1 = require("./sseStream");
|
|
6
|
+
const config_1 = require("./config");
|
|
7
|
+
exports.adapter = new adapter_1.Adapter({
|
|
8
|
+
name: 'GENESIS',
|
|
9
|
+
defaultEndpoint: sseStream_1.sseEndpoint.name,
|
|
10
|
+
endpoints: [sseStream_1.sseEndpoint],
|
|
11
|
+
customSettings: config_1.customSettings,
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/examples/genesis/index.ts"],"names":[],"mappings":";;;AAAA,2CAAuC;AACvC,2CAAyC;AACzC,qCAAyC;AAE5B,QAAA,OAAO,GAAG,IAAI,iBAAO,CAAC;IACjC,IAAI,EAAE,SAAS;IACf,eAAe,EAAE,uBAAW,CAAC,IAAI;IACjC,SAAS,EAAE,CAAC,uBAAW,CAAC;IACxB,cAAc,EAAd,uBAAc;CACf,CAAC,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AdapterEndpoint } from '../../adapter';
|
|
2
|
+
import { SSETransport } from '../../transports';
|
|
3
|
+
import { SingleNumberResultResponse } from '../../util';
|
|
4
|
+
import { InputParameters } from '../../validation';
|
|
5
|
+
import { SettingsMap } from '../../config';
|
|
6
|
+
interface AdapterRequestParams {
|
|
7
|
+
base: string;
|
|
8
|
+
quote: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const inputParameters: InputParameters;
|
|
11
|
+
declare type Price = number;
|
|
12
|
+
declare type Quantity = number;
|
|
13
|
+
export declare type Entry = ['BUY' | 'SELL' | '', Price, Quantity];
|
|
14
|
+
declare type StreamEndpointTypes = {
|
|
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>;
|
|
25
|
+
export declare const calculateQWAPprice: (entries: Entry[]) => number | undefined;
|
|
26
|
+
export declare const sseEndpoint: AdapterEndpoint<StreamEndpointTypes>;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,149 @@
|
|
|
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.sseEndpoint = exports.calculateQWAPprice = exports.sseTransport = exports.inputParameters = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const adapter_1 = require("../../adapter");
|
|
9
|
+
const transports_1 = require("../../transports");
|
|
10
|
+
const util_1 = require("../../util");
|
|
11
|
+
const DEFAULT_ENDPOINT = 'https://api.genesistrading.com';
|
|
12
|
+
exports.inputParameters = {
|
|
13
|
+
base: {
|
|
14
|
+
aliases: ['from', 'coin'],
|
|
15
|
+
description: 'The symbol of the currency to query',
|
|
16
|
+
required: true,
|
|
17
|
+
},
|
|
18
|
+
quote: {
|
|
19
|
+
aliases: ['to', 'market'],
|
|
20
|
+
description: 'The symbol of the currency to convert to',
|
|
21
|
+
required: true,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
const logger = (0, util_1.makeLogger)('GenesisSSETransport');
|
|
25
|
+
exports.sseTransport = new transports_1.SSETransport({
|
|
26
|
+
prepareSSEConnectionConfig: (params, context) => {
|
|
27
|
+
const payload = 'null';
|
|
28
|
+
const url = prepareRequestUrl(context.adapterConfig, 'sseStream', payload);
|
|
29
|
+
logger.debug('SSE Connection URL: ', url);
|
|
30
|
+
return { url };
|
|
31
|
+
},
|
|
32
|
+
prepareKeepAliveRequest: (context) => {
|
|
33
|
+
const payload = 'null';
|
|
34
|
+
const url = prepareRequestUrl(context.adapterConfig, 'ping', payload);
|
|
35
|
+
const axiosRequestConfig = {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
url,
|
|
38
|
+
};
|
|
39
|
+
logger.debug('Keep Alive URL: ', url);
|
|
40
|
+
return axiosRequestConfig;
|
|
41
|
+
},
|
|
42
|
+
prepareSubscriptionRequest: (params, context) => {
|
|
43
|
+
const requestedSymbols = params.map((p) => {
|
|
44
|
+
return `${p.base.toUpperCase()}-${p.quote.toUpperCase()}`;
|
|
45
|
+
});
|
|
46
|
+
const payloadObj = {
|
|
47
|
+
Action: 'SUBSCRIBE',
|
|
48
|
+
Symbols: requestedSymbols,
|
|
49
|
+
};
|
|
50
|
+
const url = prepareRequestUrl(context.adapterConfig, 'marketDataRequest', JSON.stringify(payloadObj));
|
|
51
|
+
logger.debug('Subscribe URL: ', url);
|
|
52
|
+
const axiosConfig = {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
url,
|
|
55
|
+
};
|
|
56
|
+
return axiosConfig;
|
|
57
|
+
},
|
|
58
|
+
prepareUnsubscriptionRequest: (params, context) => {
|
|
59
|
+
const requestedSymbols = params.map((p) => {
|
|
60
|
+
return `${p.base.toUpperCase()}-${p.quote.toUpperCase()}`;
|
|
61
|
+
});
|
|
62
|
+
const payloadObj = {
|
|
63
|
+
Action: 'UNSUBSCRIBE',
|
|
64
|
+
Symbols: requestedSymbols,
|
|
65
|
+
};
|
|
66
|
+
const url = prepareRequestUrl(context.adapterConfig, 'marketDataRequest', JSON.stringify(payloadObj));
|
|
67
|
+
logger.debug('Unsubscribe URL: ', url);
|
|
68
|
+
const axiosConfig = {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
url,
|
|
71
|
+
};
|
|
72
|
+
return axiosConfig;
|
|
73
|
+
},
|
|
74
|
+
eventListeners: [
|
|
75
|
+
{
|
|
76
|
+
type: 'L2Update',
|
|
77
|
+
parseResponse: (evt) => {
|
|
78
|
+
let providerData = {};
|
|
79
|
+
try {
|
|
80
|
+
// To parse, add the formatting to interperate as a JSON array.
|
|
81
|
+
providerData = JSON.parse(evt.data);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
logger.error(error, `Error parsing JSON from data provider`);
|
|
85
|
+
}
|
|
86
|
+
const entries = providerData.Changes.map((e) => e.Entry);
|
|
87
|
+
const value = (0, exports.calculateQWAPprice)(entries);
|
|
88
|
+
if (value) {
|
|
89
|
+
const [base, quote] = providerData.Symbol.split('-');
|
|
90
|
+
return [
|
|
91
|
+
{
|
|
92
|
+
params: { base, quote },
|
|
93
|
+
value,
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
return [];
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
});
|
|
102
|
+
const calculateQWAPprice = (entries) => {
|
|
103
|
+
const meanPriceByQuantity = {};
|
|
104
|
+
// Group orders by quantity
|
|
105
|
+
let totalQuantity = 0;
|
|
106
|
+
entries.forEach((e) => {
|
|
107
|
+
if (e[2] === 0) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (!meanPriceByQuantity[e[2].toString()]) {
|
|
111
|
+
meanPriceByQuantity[e[2].toString()] = [e[1], NaN];
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const meanPrice = (e[1] + meanPriceByQuantity[e[2].toString()][0]) / 2;
|
|
115
|
+
meanPriceByQuantity[e[2].toString()] = [meanPrice, meanPrice * e[2]];
|
|
116
|
+
totalQuantity += e[2];
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
if (Object.keys(meanPriceByQuantity).length === 0) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const priceTimesQuantitySum = Object.values(meanPriceByQuantity).reduce((e1, e2) => [
|
|
123
|
+
NaN,
|
|
124
|
+
e1[1] + e2[1],
|
|
125
|
+
])[1];
|
|
126
|
+
// Return a sum of all the products divided by the total quantity
|
|
127
|
+
return priceTimesQuantitySum / totalQuantity;
|
|
128
|
+
};
|
|
129
|
+
exports.calculateQWAPprice = calculateQWAPprice;
|
|
130
|
+
const prepareRequestUrl = (config, endpoint, payload) => {
|
|
131
|
+
const apiKey = config.API_KEY;
|
|
132
|
+
if (!apiKey) {
|
|
133
|
+
logger.error(new Error('API_KEY not set'), 'Set the API_KEY configuration variable to a valid Genesis API key');
|
|
134
|
+
}
|
|
135
|
+
const apiSecret = config.API_SECRET;
|
|
136
|
+
const nonce = (BigInt(Date.now()) * BigInt('1000000')).toString();
|
|
137
|
+
const hash = crypto_1.default.createHmac('sha384', Buffer.from(apiSecret ?? ''));
|
|
138
|
+
const data = hash.update(Buffer.from(apiKey + payload + nonce));
|
|
139
|
+
const sig = data.digest().toString('hex');
|
|
140
|
+
const baseUrl = config.API_ENDPOINT ?? DEFAULT_ENDPOINT;
|
|
141
|
+
const subDir = `${endpoint}?APIKEY=${apiKey}&PAYLOAD=${payload}&NONCE=${nonce}&SIGNATURE=${sig}`;
|
|
142
|
+
return new URL(subDir, baseUrl).toString();
|
|
143
|
+
};
|
|
144
|
+
exports.sseEndpoint = new adapter_1.AdapterEndpoint({
|
|
145
|
+
name: 'sseStream',
|
|
146
|
+
transport: exports.sseTransport,
|
|
147
|
+
inputParameters: exports.inputParameters,
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=sseStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,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,37 @@
|
|
|
1
|
+
import { AdapterEndpoint } from '../../adapter';
|
|
2
|
+
import { WebSocketTransport } from '../../transports/websocket';
|
|
3
|
+
import { SingleNumberResultResponse } from '../../util';
|
|
4
|
+
import { InputParameters } from '../../validation';
|
|
5
|
+
import { customSettings } from './config';
|
|
6
|
+
interface AdapterRequestParams {
|
|
7
|
+
base: string;
|
|
8
|
+
quote: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const inputParameters: InputParameters;
|
|
11
|
+
interface ProviderMessage {
|
|
12
|
+
timestamp: string;
|
|
13
|
+
currencyPair: string;
|
|
14
|
+
bid: number;
|
|
15
|
+
offer: number;
|
|
16
|
+
mid: number;
|
|
17
|
+
changes: [
|
|
18
|
+
{
|
|
19
|
+
period: string;
|
|
20
|
+
change: number;
|
|
21
|
+
percentage: number;
|
|
22
|
+
}
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
declare type PriceEndpointTypes = {
|
|
26
|
+
Request: {
|
|
27
|
+
Params: AdapterRequestParams;
|
|
28
|
+
};
|
|
29
|
+
Response: SingleNumberResultResponse;
|
|
30
|
+
CustomSettings: typeof customSettings;
|
|
31
|
+
Provider: {
|
|
32
|
+
WsMessage: ProviderMessage[];
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export declare const websocketTransport: WebSocketTransport<PriceEndpointTypes>;
|
|
36
|
+
export declare const webSocketEndpoint: AdapterEndpoint<PriceEndpointTypes>;
|
|
37
|
+
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
|
+
const logger = (0, util_1.makeLogger)('NcfxWebSocketTransport');
|
|
8
|
+
exports.inputParameters = {
|
|
9
|
+
base: {
|
|
10
|
+
aliases: ['from', 'coin'],
|
|
11
|
+
description: 'The symbol of the currency to query',
|
|
12
|
+
required: true,
|
|
13
|
+
},
|
|
14
|
+
quote: {
|
|
15
|
+
aliases: ['to', 'market'],
|
|
16
|
+
description: 'The symbol of the currency to convert to',
|
|
17
|
+
required: true,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
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+C;AAC/C,0DAA+D;AAC/D,qCAAmF;AAInF,MAAM,MAAM,GAAG,IAAA,iBAAU,EAAC,wBAAwB,CAAC,CAAA;AAOtC,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;AA4BY,QAAA,kBAAkB,GAAG,IAAI,8BAAkB,CAAqB;IAC3E,GAAG,EAAE,GAAG,EAAE,CAAC,uCAAuC;IAClD,QAAQ,EAAE;QACR,IAAI,CAAC,UAAU,EAAE,OAAO;YACtB,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,MAAM,EAAE,EAAE,CAAC,CAAC;YAC7B,OAAO,EAAE,WAAW;YACpB,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE;SACtC,CAAC;QACF,kBAAkB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC/B,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"}
|