@chainlink/external-adapter-framework 2.9.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/adapter/market-status.d.ts +26 -15
- package/adapter/market-status.js +38 -1
- package/adapter/market-status.js.map +1 -1
- package/package.json +8 -7
- package/validation/market-status.d.ts +6 -0
- package/validation/market-status.js +69 -0
- package/validation/market-status.js.map +1 -0
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# EA Framework v3
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@chainlink/external-adapter-framework)
|
|
4
|
-

|
|
5
5
|
|
|
6
6
|
Framework to create External adapters, microservices that serve as middleware to facilitate connections between Chainlink Nodes and Data Providers (DP).
|
|
7
7
|
|
|
@@ -1,17 +1,6 @@
|
|
|
1
1
|
import { TransportGenerics } from '../transports';
|
|
2
|
-
import { InputParametersDefinition } from '../validation/input-params';
|
|
3
2
|
import { AdapterEndpoint } from './endpoint';
|
|
4
|
-
|
|
5
|
-
* Type for the base input parameter config that any [[MarketStatusEndpoint]] must extend
|
|
6
|
-
*/
|
|
7
|
-
export type MarketStatusEndpointInputParametersDefinition = InputParametersDefinition & {
|
|
8
|
-
market: {
|
|
9
|
-
aliases: readonly [];
|
|
10
|
-
type: 'string';
|
|
11
|
-
description: 'The name of the market';
|
|
12
|
-
required: boolean;
|
|
13
|
-
};
|
|
14
|
-
};
|
|
3
|
+
import { AdapterEndpointParams } from './types';
|
|
15
4
|
/**
|
|
16
5
|
* Base input parameter config that any [[MarketStatusEndpoint]] must extend
|
|
17
6
|
*/
|
|
@@ -22,23 +11,43 @@ export declare const marketStatusEndpointInputParametersDefinition: {
|
|
|
22
11
|
readonly description: "The name of the market";
|
|
23
12
|
readonly required: true;
|
|
24
13
|
};
|
|
14
|
+
readonly type: {
|
|
15
|
+
readonly type: "string";
|
|
16
|
+
readonly description: "Type of the market status";
|
|
17
|
+
readonly options: readonly ["regular", "24/5"];
|
|
18
|
+
readonly default: "regular";
|
|
19
|
+
};
|
|
20
|
+
readonly weekend: {
|
|
21
|
+
readonly type: "string";
|
|
22
|
+
readonly description: "DHH-DHH:TZ, 520-020:America/New_York means Fri 20:00 to Sun 20:00 Eastern Time Zone";
|
|
23
|
+
};
|
|
25
24
|
};
|
|
26
25
|
export declare enum MarketStatus {
|
|
27
26
|
UNKNOWN = 0,
|
|
28
27
|
CLOSED = 1,
|
|
29
28
|
OPEN = 2
|
|
30
29
|
}
|
|
30
|
+
export declare enum TwentyfourFiveMarketStatus {
|
|
31
|
+
UNKNOWN = 0,
|
|
32
|
+
PRE_MARKET = 1,
|
|
33
|
+
REGULAR = 2,
|
|
34
|
+
POST_MARKET = 3,
|
|
35
|
+
OVERNIGHT = 4,
|
|
36
|
+
WEEKEND = 5
|
|
37
|
+
}
|
|
38
|
+
type AggregatedMarketStatus = MarketStatus | TwentyfourFiveMarketStatus;
|
|
31
39
|
export type MarketStatusResultResponse = {
|
|
32
|
-
Result:
|
|
40
|
+
Result: AggregatedMarketStatus;
|
|
33
41
|
Data: {
|
|
34
|
-
result:
|
|
42
|
+
result: AggregatedMarketStatus;
|
|
43
|
+
statusString: string;
|
|
35
44
|
};
|
|
36
45
|
};
|
|
37
46
|
/**
|
|
38
47
|
* Helper type structure that contains the different types passed to the generic parameters of a PriceEndpoint
|
|
39
48
|
*/
|
|
40
49
|
export type MarketStatusEndpointGenerics = TransportGenerics & {
|
|
41
|
-
Parameters:
|
|
50
|
+
Parameters: typeof marketStatusEndpointInputParametersDefinition;
|
|
42
51
|
Response: MarketStatusResultResponse;
|
|
43
52
|
};
|
|
44
53
|
/**
|
|
@@ -46,4 +55,6 @@ export type MarketStatusEndpointGenerics = TransportGenerics & {
|
|
|
46
55
|
* Data Feeds, its InputParameters must extend the basic ones (base).
|
|
47
56
|
*/
|
|
48
57
|
export declare class MarketStatusEndpoint<T extends MarketStatusEndpointGenerics> extends AdapterEndpoint<T> {
|
|
58
|
+
constructor(params: AdapterEndpointParams<T>);
|
|
49
59
|
}
|
|
60
|
+
export {};
|
package/adapter/market-status.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MarketStatusEndpoint = exports.MarketStatus = exports.marketStatusEndpointInputParametersDefinition = void 0;
|
|
3
|
+
exports.MarketStatusEndpoint = exports.TwentyfourFiveMarketStatus = exports.MarketStatus = exports.marketStatusEndpointInputParametersDefinition = void 0;
|
|
4
4
|
const endpoint_1 = require("./endpoint");
|
|
5
|
+
const market_status_1 = require("../validation/market-status");
|
|
6
|
+
const error_1 = require("../validation/error");
|
|
5
7
|
/**
|
|
6
8
|
* Base input parameter config that any [[MarketStatusEndpoint]] must extend
|
|
7
9
|
*/
|
|
@@ -12,6 +14,16 @@ exports.marketStatusEndpointInputParametersDefinition = {
|
|
|
12
14
|
description: 'The name of the market',
|
|
13
15
|
required: true,
|
|
14
16
|
},
|
|
17
|
+
type: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
description: 'Type of the market status',
|
|
20
|
+
options: ['regular', '24/5'],
|
|
21
|
+
default: 'regular',
|
|
22
|
+
},
|
|
23
|
+
weekend: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
description: 'DHH-DHH:TZ, 520-020:America/New_York means Fri 20:00 to Sun 20:00 Eastern Time Zone',
|
|
26
|
+
},
|
|
15
27
|
};
|
|
16
28
|
var MarketStatus;
|
|
17
29
|
(function (MarketStatus) {
|
|
@@ -19,11 +31,36 @@ var MarketStatus;
|
|
|
19
31
|
MarketStatus[MarketStatus["CLOSED"] = 1] = "CLOSED";
|
|
20
32
|
MarketStatus[MarketStatus["OPEN"] = 2] = "OPEN";
|
|
21
33
|
})(MarketStatus || (exports.MarketStatus = MarketStatus = {}));
|
|
34
|
+
var TwentyfourFiveMarketStatus;
|
|
35
|
+
(function (TwentyfourFiveMarketStatus) {
|
|
36
|
+
TwentyfourFiveMarketStatus[TwentyfourFiveMarketStatus["UNKNOWN"] = 0] = "UNKNOWN";
|
|
37
|
+
TwentyfourFiveMarketStatus[TwentyfourFiveMarketStatus["PRE_MARKET"] = 1] = "PRE_MARKET";
|
|
38
|
+
TwentyfourFiveMarketStatus[TwentyfourFiveMarketStatus["REGULAR"] = 2] = "REGULAR";
|
|
39
|
+
TwentyfourFiveMarketStatus[TwentyfourFiveMarketStatus["POST_MARKET"] = 3] = "POST_MARKET";
|
|
40
|
+
TwentyfourFiveMarketStatus[TwentyfourFiveMarketStatus["OVERNIGHT"] = 4] = "OVERNIGHT";
|
|
41
|
+
TwentyfourFiveMarketStatus[TwentyfourFiveMarketStatus["WEEKEND"] = 5] = "WEEKEND";
|
|
42
|
+
})(TwentyfourFiveMarketStatus || (exports.TwentyfourFiveMarketStatus = TwentyfourFiveMarketStatus = {}));
|
|
22
43
|
/**
|
|
23
44
|
* A MarketStatusEndpoint is a specific type of AdapterEndpoint. Meant to comply with standard practices for
|
|
24
45
|
* Data Feeds, its InputParameters must extend the basic ones (base).
|
|
25
46
|
*/
|
|
26
47
|
class MarketStatusEndpoint extends endpoint_1.AdapterEndpoint {
|
|
48
|
+
constructor(params) {
|
|
49
|
+
params.customInputValidation = (req, _adapterSettings) => {
|
|
50
|
+
const data = req.requestContext.data;
|
|
51
|
+
if (data['type'] === '24/5') {
|
|
52
|
+
(0, market_status_1.parseWeekendString)(data['weekend']);
|
|
53
|
+
}
|
|
54
|
+
if (data['type'] === 'regular' && data['weekend']) {
|
|
55
|
+
throw new error_1.AdapterInputError({
|
|
56
|
+
statusCode: 400,
|
|
57
|
+
message: '[Param: weekend] must be empty when [Param: type] is regular',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return undefined;
|
|
61
|
+
};
|
|
62
|
+
super(params);
|
|
63
|
+
}
|
|
27
64
|
}
|
|
28
65
|
exports.MarketStatusEndpoint = MarketStatusEndpoint;
|
|
29
66
|
//# sourceMappingURL=market-status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market-status.js","sourceRoot":"","sources":["../../../src/adapter/market-status.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"market-status.js","sourceRoot":"","sources":["../../../src/adapter/market-status.ts"],"names":[],"mappings":";;;AACA,yCAA4C;AAE5C,+DAAgE;AAChE,+CAAuD;AAEvD;;GAEG;AACU,QAAA,6CAA6C,GAAG;IAC3D,MAAM,EAAE;QACN,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,wBAAwB;QACrC,QAAQ,EAAE,IAAI;KACf;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,2BAA2B;QACxC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;QAC5B,OAAO,EAAE,SAAS;KACnB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,qFAAqF;KACxF;CACO,CAAA;AAEV,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,qDAAW,CAAA;IACX,mDAAU,CAAA;IACV,+CAAQ,CAAA;AACV,CAAC,EAJW,YAAY,4BAAZ,YAAY,QAIvB;AAED,IAAY,0BAOX;AAPD,WAAY,0BAA0B;IACpC,iFAAW,CAAA;IACX,uFAAc,CAAA;IACd,iFAAW,CAAA;IACX,yFAAe,CAAA;IACf,qFAAa,CAAA;IACb,iFAAW,CAAA;AACb,CAAC,EAPW,0BAA0B,0CAA1B,0BAA0B,QAOrC;AAoBD;;;GAGG;AACH,MAAa,oBAEX,SAAQ,0BAAkB;IAC1B,YAAY,MAAgC;QAC1C,MAAM,CAAC,qBAAqB,GAAG,CAAC,GAAG,EAAE,gBAAgB,EAAE,EAAE;YACvD,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,IAA8B,CAAA;YAC9D,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;gBAC5B,IAAA,kCAAkB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;YACrC,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,yBAAiB,CAAC;oBAC1B,UAAU,EAAE,GAAG;oBACf,OAAO,EAAE,8DAA8D;iBACxE,CAAC,CAAA;YACJ,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC,CAAA;QACD,KAAK,CAAC,MAAM,CAAC,CAAA;IACf,CAAC;CACF;AAnBD,oDAmBC"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chainlink/external-adapter-framework",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.11.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": "git://github.com/smartcontractkit/ea-framework-js.git",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"ajv": "8.17.1",
|
|
9
|
-
"axios": "1.13.
|
|
9
|
+
"axios": "1.13.2",
|
|
10
10
|
"eventsource": "4.0.0",
|
|
11
|
-
"fastify": "5.6.
|
|
11
|
+
"fastify": "5.6.2",
|
|
12
12
|
"ioredis": "5.8.2",
|
|
13
13
|
"mock-socket": "9.3.1",
|
|
14
14
|
"pino": "10.1.0",
|
|
15
15
|
"pino-pretty": "13.1.2",
|
|
16
16
|
"prom-client": "15.1.3",
|
|
17
17
|
"redlock": "5.0.0-beta.2",
|
|
18
|
-
"ws": "8.18.3"
|
|
18
|
+
"ws": "8.18.3",
|
|
19
|
+
"@date-fns/tz": "1.4.1"
|
|
19
20
|
},
|
|
20
21
|
"scripts": {
|
|
21
22
|
"build": "rm -rf dist/src && mkdir -p ./dist/src && cp package.json dist/src && cp README.md dist/src && tsc && yarn pre-build-generator",
|
|
@@ -40,12 +41,12 @@
|
|
|
40
41
|
"@types/node": "24.10.0",
|
|
41
42
|
"@types/sinonjs__fake-timers": "15.0.1",
|
|
42
43
|
"@types/ws": "8.18.1",
|
|
43
|
-
"@typescript-eslint/eslint-plugin": "8.46.
|
|
44
|
-
"@typescript-eslint/parser": "8.46.
|
|
44
|
+
"@typescript-eslint/eslint-plugin": "8.46.3",
|
|
45
|
+
"@typescript-eslint/parser": "8.46.3",
|
|
45
46
|
"ava": "6.4.1",
|
|
46
47
|
"axios-mock-adapter": "2.1.0",
|
|
47
48
|
"c8": "10.1.3",
|
|
48
|
-
"eslint": "9.39.
|
|
49
|
+
"eslint": "9.39.1",
|
|
49
50
|
"eslint-config-prettier": "10.1.8",
|
|
50
51
|
"eslint-plugin-tsdoc": "0.4.0",
|
|
51
52
|
"mocksse": "1.0.4",
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isWeekendNow = exports.parseWeekendString = void 0;
|
|
4
|
+
const error_1 = require("../validation/error");
|
|
5
|
+
const tz_1 = require("@date-fns/tz");
|
|
6
|
+
const parseWeekendString = (weekend) => {
|
|
7
|
+
const dayHour = /[0-6](0\d|1\d|2[0-3])/;
|
|
8
|
+
const timezonePattern = /[^\s]+/;
|
|
9
|
+
const regex = new RegExp(`^(${dayHour.source})-(${dayHour.source}):(${timezonePattern.source})$`);
|
|
10
|
+
const match = weekend?.match(regex);
|
|
11
|
+
if (!match) {
|
|
12
|
+
throw new error_1.AdapterInputError({
|
|
13
|
+
statusCode: 400,
|
|
14
|
+
message: '[Param: weekend] does not match format of DHH-DHH:TZ',
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
const result = {
|
|
18
|
+
start: match[1],
|
|
19
|
+
end: match[3],
|
|
20
|
+
tz: match[5],
|
|
21
|
+
};
|
|
22
|
+
try {
|
|
23
|
+
// eslint-disable-next-line new-cap
|
|
24
|
+
Intl.DateTimeFormat(undefined, { timeZone: result.tz });
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
throw new error_1.AdapterInputError({
|
|
28
|
+
statusCode: 400,
|
|
29
|
+
message: `timezone ${result.tz} in [Param: weekend] is not valid: ${error}`,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
exports.parseWeekendString = parseWeekendString;
|
|
35
|
+
const isWeekendNow = (weekend) => {
|
|
36
|
+
const parsed = (0, exports.parseWeekendString)(weekend);
|
|
37
|
+
const startDay = Number(parsed.start[0]);
|
|
38
|
+
const startHour = Number(parsed.start.slice(1));
|
|
39
|
+
const endDay = Number(parsed.end[0]);
|
|
40
|
+
const endHour = Number(parsed.end.slice(1));
|
|
41
|
+
const nowDay = tz_1.TZDate.tz(parsed.tz).getDay();
|
|
42
|
+
const nowHour = tz_1.TZDate.tz(parsed.tz).getHours();
|
|
43
|
+
// Case 1: weekend does NOT wrap around the week
|
|
44
|
+
if (startDay < endDay || (startDay === endDay && startHour < endHour)) {
|
|
45
|
+
if (nowDay < startDay || nowDay > endDay) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
else if (nowDay === startDay && nowHour < startHour) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
else if (nowDay === endDay && nowHour >= endHour) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
// Case 2: weekend wraps around (e.g. Fri → Sun)
|
|
57
|
+
if (nowDay > startDay || nowDay < endDay) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
else if (nowDay === startDay && nowHour >= startHour) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
else if (nowDay === endDay && nowHour < endHour) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
};
|
|
68
|
+
exports.isWeekendNow = isWeekendNow;
|
|
69
|
+
//# sourceMappingURL=market-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market-status.js","sourceRoot":"","sources":["../../../src/validation/market-status.ts"],"names":[],"mappings":"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"}
|