@chainlink/external-adapter-framework 0.5.4 → 0.5.6
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 +16 -6
- package/adapter/basic.js +34 -7
- package/adapter/basic.js.map +1 -1
- package/adapter/endpoint.d.ts +6 -6
- package/adapter/endpoint.js +1 -0
- package/adapter/endpoint.js.map +1 -1
- package/adapter/price.d.ts +10 -8
- package/adapter/price.js +8 -5
- package/adapter/price.js.map +1 -1
- package/adapter/types.d.ts +20 -13
- package/background-executor.js +19 -4
- package/background-executor.js.map +1 -1
- package/cache/index.d.ts +6 -6
- package/cache/redis.d.ts +0 -3
- package/cache/redis.js +19 -12
- package/cache/redis.js.map +1 -1
- package/config/index.d.ts +14 -1
- package/config/index.js +37 -20
- package/config/index.js.map +1 -1
- package/examples/bank-frick/accounts.d.ts +17 -24
- package/examples/bank-frick/accounts.js +22 -9
- package/examples/bank-frick/accounts.js.map +1 -1
- package/examples/bank-frick/index.d.ts +1 -15
- package/examples/bank-frick/index.js +1 -1
- package/examples/coingecko/src/crypto-utils.d.ts +15 -1
- package/examples/coingecko/src/crypto-utils.js.map +1 -1
- package/examples/coingecko/src/endpoint/coins.d.ts +20 -3
- 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 +2 -1
- 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 +18 -3
- package/examples/coingecko/src/global-utils.js.map +1 -1
- package/examples/coingecko/src/index.js +1 -1
- package/examples/cryptocompare/src/endpoints/crypto.d.ts +14 -2
- 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 +13 -2
- package/examples/genesis/sseStream.js.map +1 -1
- package/metrics/util.d.ts +5 -5
- package/metrics/util.js.map +1 -1
- package/package.json +1 -1
- package/rate-limiting/background/fixed-frequency.d.ts +2 -3
- 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 +2 -3
- package/rate-limiting/request/simple-counting.js.map +1 -1
- package/transports/batch-warming.d.ts +31 -13
- package/transports/batch-warming.js +4 -4
- package/transports/batch-warming.js.map +1 -1
- package/transports/index.d.ts +50 -13
- 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 +30 -13
- package/transports/rest.js +1 -3
- package/transports/rest.js.map +1 -1
- package/transports/routing.d.ts +11 -12
- package/transports/routing.js +16 -4
- package/transports/routing.js.map +1 -1
- package/transports/sse.d.ts +39 -18
- package/transports/sse.js +8 -2
- package/transports/sse.js.map +1 -1
- package/transports/websocket.d.ts +39 -23
- package/transports/websocket.js +8 -7
- package/transports/websocket.js.map +1 -1
- package/util/data-validation.d.ts +15 -0
- package/util/data-validation.js +61 -0
- package/util/data-validation.js.map +1 -0
- package/util/index.d.ts +1 -0
- package/util/index.js +5 -1
- package/util/index.js.map +1 -1
- package/util/logger.js +2 -6
- package/util/logger.js.map +1 -1
- package/util/request.d.ts +46 -10
- package/validation/error.js +1 -1
- package/validation/error.js.map +1 -1
- package/validation/index.js +16 -15
- package/validation/index.js.map +1 -1
package/util/request.d.ts
CHANGED
|
@@ -6,6 +6,9 @@ declare module 'fastify' {
|
|
|
6
6
|
requestContext: AdapterRequestContext;
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
+
export declare type Merge<T1, T2> = {
|
|
10
|
+
[K in keyof T1 | keyof T2]: K extends keyof T2 ? T2[K] : K extends keyof T1 ? T1[K] : never;
|
|
11
|
+
};
|
|
9
12
|
/**
|
|
10
13
|
* Structure for the body of all requests that will be sent to the adapter
|
|
11
14
|
*/
|
|
@@ -43,11 +46,11 @@ export declare type AdapterRouteGeneric = {
|
|
|
43
46
|
/**
|
|
44
47
|
* Structure for all requests incoming to this adapter
|
|
45
48
|
*/
|
|
46
|
-
export declare type AdapterRequest<T =
|
|
49
|
+
export declare type AdapterRequest<T extends RequestGenerics = RequestGenerics> = FastifyRequest<AdapterRouteGeneric> & {
|
|
47
50
|
/** Set to an empty record so the user does not access the raw request data and uses the Validated data from the context instead */
|
|
48
51
|
body: EmptyBody;
|
|
49
52
|
/** Container for all validated information that will be used by the framework across this request's lifecycle */
|
|
50
|
-
requestContext: AdapterRequestContext<T>;
|
|
53
|
+
requestContext: AdapterRequestContext<T['Params']>;
|
|
51
54
|
};
|
|
52
55
|
/**
|
|
53
56
|
* Metadata for a particular request
|
|
@@ -74,29 +77,62 @@ export declare type AdapterRequestData = Record<string, unknown> & {
|
|
|
74
77
|
endpoint?: string;
|
|
75
78
|
};
|
|
76
79
|
/**
|
|
77
|
-
* Helper type to hold the value from responses from a provider, and the adapter params they correspond to
|
|
80
|
+
* Helper type to hold the value from responses from a provider, and the adapter params they correspond to.
|
|
78
81
|
*/
|
|
79
|
-
export interface ProviderResult<
|
|
82
|
+
export interface ProviderResult<T extends {
|
|
83
|
+
Request: RequestGenerics;
|
|
84
|
+
Response: ResponseGenerics;
|
|
85
|
+
}> {
|
|
80
86
|
/** The set of parameters that uniquely relate to the response */
|
|
81
|
-
params: Params;
|
|
82
|
-
/**
|
|
83
|
-
value:
|
|
87
|
+
params: T['Request']['Params'];
|
|
88
|
+
/** Value that will be included in the result property of the response */
|
|
89
|
+
value: T['Response']['Result'];
|
|
84
90
|
}
|
|
91
|
+
export declare type EmptyObject = Object;
|
|
92
|
+
/**
|
|
93
|
+
* Helper struct type that provides detail about the incoming Adapter Request
|
|
94
|
+
*/
|
|
95
|
+
export declare type RequestGenerics = {
|
|
96
|
+
/**
|
|
97
|
+
* Type for the parameters sent to the EA in the data property of the body.
|
|
98
|
+
*/
|
|
99
|
+
Params: EmptyObject;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Helper struct type that provides detail about the outgoing Adapter Response
|
|
103
|
+
*/
|
|
104
|
+
export declare type ResponseGenerics = {
|
|
105
|
+
/**
|
|
106
|
+
* Type for the data property of the response.
|
|
107
|
+
*/
|
|
108
|
+
Data: unknown;
|
|
109
|
+
/**
|
|
110
|
+
* Type for the result property of the response.
|
|
111
|
+
* This is mostly used for OCR, and corresponds to one "word" when talking about it from an on-chain perspective.
|
|
112
|
+
*/
|
|
113
|
+
Result: string | number | null;
|
|
114
|
+
};
|
|
85
115
|
/**
|
|
86
116
|
* Shape of the response body from the adapter
|
|
87
117
|
*/
|
|
88
|
-
export declare type AdapterResponse<T =
|
|
118
|
+
export declare type AdapterResponse<T extends ResponseGenerics = ResponseGenerics> = {
|
|
89
119
|
/** HTTP status code */
|
|
90
120
|
statusCode: number;
|
|
91
121
|
/** Response data, holds "result" for Flux Monitor */
|
|
92
|
-
data: T;
|
|
122
|
+
data: T['Data'];
|
|
93
123
|
/** Result value used for OCR */
|
|
94
|
-
result:
|
|
124
|
+
result: T['Result'];
|
|
95
125
|
/** Number detailing the maximum age of the result in the cache, will be replaced by telemetry eventually */
|
|
96
126
|
maxAge?: number;
|
|
97
127
|
/** Metadata relevant to this request */
|
|
98
128
|
meta?: AdapterRequestMeta;
|
|
99
129
|
};
|
|
130
|
+
export declare type SingleNumberResultResponse = {
|
|
131
|
+
Result: number;
|
|
132
|
+
Data: {
|
|
133
|
+
result: number;
|
|
134
|
+
};
|
|
135
|
+
};
|
|
100
136
|
export declare type Middleware = ((req: AdapterRequest, reply: FastifyReply, done: HookHandlerDoneFunction) => FastifyReply | void) | ((req: AdapterRequest, reply: FastifyReply) => Promise<FastifyReply | void>);
|
|
101
137
|
export declare type AdapterMiddlewareBuilder = (adapter: Adapter) => Middleware;
|
|
102
138
|
export {};
|
package/validation/error.js
CHANGED
|
@@ -21,7 +21,7 @@ class AdapterError extends Error {
|
|
|
21
21
|
this.metricsLabel = metricsLabel;
|
|
22
22
|
}
|
|
23
23
|
toJSONResponse() {
|
|
24
|
-
const showDebugInfo = process.env['
|
|
24
|
+
const showDebugInfo = process.env['DEBUG'] === 'true';
|
|
25
25
|
const errorBasic = {
|
|
26
26
|
name: this.name,
|
|
27
27
|
message: this.message,
|
package/validation/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../../src/validation/error.ts"],"names":[],"mappings":";;;AAAA,oDAAsD;AAkBtD,MAAa,YAAa,SAAQ,KAAK;IAarC,YAAY,EACV,MAAM,GAAG,SAAS,EAClB,UAAU,GAAG,GAAG,EAChB,IAAI,GAAG,cAAc,EACrB,OAAO,GAAG,+CAA+C,EACzD,KAAK,EACL,GAAG,EACH,aAAa,EACb,MAAM,EACN,kBAAkB,EAClB,YAAY,GAAG,2BAAe,CAAC,aAAa,GACtB;QACtB,KAAK,CAAC,OAAO,CAAC,CAAA;QAEd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,GAAG,EAAE;YACP,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;SACf;QACD,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;SACrB;QACD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;QAC5C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IAClC,CAAC;IAED,cAAc;QACZ,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../../src/validation/error.ts"],"names":[],"mappings":"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"}
|
package/validation/index.js
CHANGED
|
@@ -5,8 +5,6 @@ const cache_1 = require("../cache");
|
|
|
5
5
|
const util_1 = require("../metrics/util");
|
|
6
6
|
const util_2 = require("../util");
|
|
7
7
|
const error_1 = require("./error");
|
|
8
|
-
const ioredis_1 = require("ioredis");
|
|
9
|
-
const metrics_1 = require("../cache/metrics");
|
|
10
8
|
const errorCatcherLogger = (0, util_2.makeLogger)('ErrorCatchingMiddleware');
|
|
11
9
|
const validatorMiddleware = (adapter) => (req, reply, done) => {
|
|
12
10
|
if (req.headers['content-type'] !== 'application/json') {
|
|
@@ -41,7 +39,7 @@ const validatorMiddleware = (adapter) => (req, reply, done) => {
|
|
|
41
39
|
statusCode: 404,
|
|
42
40
|
});
|
|
43
41
|
}
|
|
44
|
-
const validatedData = endpoint.validator.validateInput(
|
|
42
|
+
const validatedData = endpoint.validator.validateInput(requestBody.data);
|
|
45
43
|
req.requestContext = {
|
|
46
44
|
cacheKey: '',
|
|
47
45
|
data: validatedData,
|
|
@@ -60,10 +58,21 @@ const validatorMiddleware = (adapter) => (req, reply, done) => {
|
|
|
60
58
|
// This is the last time modifications are supposed to happen to the request.
|
|
61
59
|
adapter.runRequestTransforms(req);
|
|
62
60
|
// Now that all the transformations have been applied, all that's left is calculating the cache key
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
61
|
+
if (endpoint.cacheKeyGenerator) {
|
|
62
|
+
let cacheKey;
|
|
63
|
+
cacheKey = endpoint.cacheKeyGenerator(req.requestContext.data);
|
|
64
|
+
if (cacheKey.length > adapter.config.MAX_COMMON_KEY_SIZE) {
|
|
65
|
+
errorCatcherLogger.warn(`Generated custom cache key for adapter request is bigger than the MAX_COMMON_KEY_SIZE and will be truncated`);
|
|
66
|
+
cacheKey = cacheKey.slice(0, adapter.config.MAX_COMMON_KEY_SIZE);
|
|
67
|
+
}
|
|
68
|
+
req.requestContext.cacheKey = cacheKey;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
req.requestContext.cacheKey = (0, cache_1.calculateCacheKey)({
|
|
72
|
+
adapterEndpoint: endpoint,
|
|
73
|
+
adapterConfig: adapter.config,
|
|
74
|
+
}, req.requestContext.data);
|
|
75
|
+
}
|
|
67
76
|
done();
|
|
68
77
|
};
|
|
69
78
|
exports.validatorMiddleware = validatorMiddleware;
|
|
@@ -84,14 +93,6 @@ const errorCatchingMiddleware = (err, req, res) => {
|
|
|
84
93
|
errorCatcherLogger.warn(errorWithContext);
|
|
85
94
|
res.status(err.statusCode).send(err.toJSONResponse());
|
|
86
95
|
}
|
|
87
|
-
else if (err instanceof ioredis_1.ReplyError) {
|
|
88
|
-
errorCatcherLogger.warn(errorWithContext);
|
|
89
|
-
const replyError = err;
|
|
90
|
-
if (process.env['METRICS_ENABLED']) {
|
|
91
|
-
(0, cache_1.recordRedisCommandMetric)(metrics_1.CMD_SENT_STATUS.FAIL, replyError.command?.name);
|
|
92
|
-
}
|
|
93
|
-
res.status(500).send(replyError.message || 'There was an unexpected error with the Redis cache');
|
|
94
|
-
}
|
|
95
96
|
else {
|
|
96
97
|
errorCatcherLogger.error(errorWithContext);
|
|
97
98
|
res.status(500).send(err.message || 'There was an unexpected error in the adapter.');
|
package/validation/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validation/index.ts"],"names":[],"mappings":";;;AAEA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validation/index.ts"],"names":[],"mappings":"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"}
|