@chainlink/external-adapter-framework 0.9.0 → 0.10.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/README.md +67 -0
- package/adapter/basic.d.ts +51 -7
- package/adapter/basic.js +184 -4
- 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 +38 -8
- package/adapter/price.js +43 -1
- package/adapter/price.js.map +1 -1
- package/adapter/types.d.ts +40 -15
- package/background-executor.js +21 -5
- package/background-executor.js.map +1 -1
- package/cache/index.d.ts +11 -17
- package/cache/index.js +9 -51
- package/cache/index.js.map +1 -1
- package/config/index.d.ts +28 -11
- package/config/index.js +63 -46
- package/config/index.js.map +1 -1
- package/examples/bank-frick/accounts.d.ts +17 -25
- package/examples/bank-frick/accounts.js +23 -13
- package/examples/bank-frick/accounts.js.map +1 -1
- package/examples/bank-frick/config/index.d.ts +5 -0
- package/examples/bank-frick/config/index.js +5 -0
- package/examples/bank-frick/config/index.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/config/index.d.ts +7 -0
- package/examples/coingecko/src/config/index.js +8 -1
- package/examples/coingecko/src/config/index.js.map +1 -1
- package/examples/coingecko/src/crypto-utils.d.ts +19 -4
- package/examples/coingecko/src/crypto-utils.js +1 -2
- 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 +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 +2 -2
- package/examples/coingecko/src/endpoint/crypto-volume.js.map +1 -1
- package/examples/coingecko/src/endpoint/crypto.d.ts +2 -4
- package/examples/coingecko/src/endpoint/crypto.js +2 -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 +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 +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 +3 -1
- package/examples/coingecko/src/index.js.map +1 -1
- package/examples/cryptocompare/src/config/index.d.ts +7 -0
- package/examples/cryptocompare/src/config/index.js +8 -1
- package/examples/cryptocompare/src/config/index.js.map +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 +3 -1
- package/examples/cryptocompare/src/index.js.map +1 -1
- package/examples/genesis/config/index.d.ts +5 -0
- package/examples/genesis/config/index.js +5 -0
- package/examples/genesis/config/index.js.map +1 -1
- package/examples/genesis/index.js +1 -1
- package/examples/genesis/sseStream.d.ts +13 -2
- package/examples/genesis/sseStream.js +4 -1
- package/examples/genesis/sseStream.js.map +1 -1
- package/index.d.ts +2 -1
- package/index.js +4 -6
- package/index.js.map +1 -1
- package/metrics/index.d.ts +2 -0
- package/metrics/index.js +5 -4
- package/metrics/index.js.map +1 -1
- package/metrics/util.d.ts +5 -5
- package/metrics/util.js +2 -2
- package/metrics/util.js.map +1 -1
- package/package.json +8 -10
- 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 +40 -18
- package/transports/batch-warming.js +45 -18
- package/transports/batch-warming.js.map +1 -1
- package/transports/index.d.ts +65 -31
- package/transports/index.js +2 -59
- package/transports/index.js.map +1 -1
- package/transports/metrics.d.ts +3 -3
- package/transports/metrics.js +2 -2
- package/transports/metrics.js.map +1 -1
- package/transports/rest.d.ts +42 -30
- package/transports/rest.js +25 -30
- package/transports/rest.js.map +1 -1
- package/transports/routing.d.ts +22 -0
- package/transports/routing.js +60 -0
- package/transports/routing.js.map +1 -0
- package/transports/sse.d.ts +40 -20
- package/transports/sse.js +10 -8
- package/transports/sse.js.map +1 -1
- package/transports/util.d.ts +3 -1
- package/transports/util.js +69 -39
- package/transports/util.js.map +1 -1
- package/transports/websocket.d.ts +41 -26
- package/transports/websocket.js +16 -19
- package/transports/websocket.js.map +1 -1
- package/util/logger.d.ts +2 -0
- package/util/logger.js +4 -7
- package/util/logger.js.map +1 -1
- package/util/request.d.ts +46 -10
- package/util/subscription-set/subscription-set.d.ts +1 -1
- package/util/subscription-set/subscription-set.js +1 -1
- package/util/subscription-set/subscription-set.js.map +1 -1
- package/util/test-payload-loader.d.ts +1 -0
- package/util/test-payload-loader.js +2 -1
- package/util/test-payload-loader.js.map +1 -1
- package/validation/error.d.ts +1 -3
- package/validation/error.js +2 -4
- package/validation/error.js.map +1 -1
- package/validation/index.js +28 -18
- package/validation/index.js.map +1 -1
- package/validation/input-params.d.ts +0 -1
- package/validation/input-params.js +0 -28
- package/validation/input-params.js.map +1 -1
- package/validation/input-validator.js +1 -2
- package/validation/input-validator.js.map +1 -1
- package/examples/coingecko-old/batch-warming.d.ts +0 -7
- package/examples/coingecko-old/batch-warming.js +0 -54
- package/examples/coingecko-old/batch-warming.js.map +0 -1
- package/examples/coingecko-old/index.d.ts +0 -2
- package/examples/coingecko-old/index.js +0 -12
- package/examples/coingecko-old/index.js.map +0 -1
- package/examples/coingecko-old/rest.d.ts +0 -12
- package/examples/coingecko-old/rest.js +0 -55
- package/examples/coingecko-old/rest.js.map +0 -1
- package/examples/ncfx/config/index.d.ts +0 -12
- package/examples/ncfx/config/index.js +0 -16
- package/examples/ncfx/config/index.js.map +0 -1
- package/examples/ncfx/index.d.ts +0 -13
- package/examples/ncfx/index.js +0 -12
- package/examples/ncfx/index.js.map +0 -1
- package/examples/ncfx/websocket.d.ts +0 -47
- package/examples/ncfx/websocket.js +0 -74
- package/examples/ncfx/websocket.js.map +0 -1
- package/validation/override-functions.d.ts +0 -3
- package/validation/override-functions.js +0 -41
- package/validation/override-functions.js.map +0 -1
package/transports/rest.js
CHANGED
|
@@ -37,9 +37,7 @@ const logger = (0, util_1.makeLogger)('RestTransport');
|
|
|
37
37
|
* new adapter requests for the same feed will not trigger a new one, but return an empty promise from
|
|
38
38
|
* the setup instead so the normal cache polling mechanism is used.
|
|
39
39
|
*
|
|
40
|
-
* @typeParam
|
|
41
|
-
* @typeParam ProviderRequestBody - interface for the body of the request to the Data Provider
|
|
42
|
-
* @typeParam ProviderResponseBody - interface for the body of the Data Provider's response
|
|
40
|
+
* @typeParam T - Helper struct type that will be used to pass types to the generic parameters (check [[RestTransportGenerics]])
|
|
43
41
|
*/
|
|
44
42
|
class RestTransport {
|
|
45
43
|
constructor(config) {
|
|
@@ -48,30 +46,12 @@ class RestTransport {
|
|
|
48
46
|
async initialize(dependencies, config) {
|
|
49
47
|
this.inFlightPrefix = `${IN_FLIGHT_PREFIX}-`;
|
|
50
48
|
this.cache = dependencies.cache;
|
|
49
|
+
this.inFlightCache = dependencies.cache;
|
|
51
50
|
this.rateLimiter = dependencies.requestRateLimiter;
|
|
52
51
|
// Allow enabling/disabling request coalescing through env var
|
|
53
52
|
this.config.options.requestCoalescing.enabled = config.REQUEST_COALESCING_ENABLED;
|
|
54
53
|
this.config.options.requestCoalescing.entropyMax = config.REQUEST_COALESCING_ENTROPY_MAX;
|
|
55
54
|
}
|
|
56
|
-
async hasBeenSetUp(req) {
|
|
57
|
-
if (!this.config.options.requestCoalescing.enabled) {
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
// Add some entropy here because of possible scenario where the key won't be set before multiple
|
|
61
|
-
// other instances in a burst request try to access the coalescing key.
|
|
62
|
-
const randomMs = Math.random() * (this.config.options.requestCoalescing.entropyMax || 0);
|
|
63
|
-
await (0, util_1.sleep)(randomMs);
|
|
64
|
-
// Check if request is in flight
|
|
65
|
-
const inFlight = await this.cache.get(this.inFlightPrefix + req.requestContext.cacheKey);
|
|
66
|
-
if (inFlight) {
|
|
67
|
-
logger.debug('Request is in flight, transport has been set up');
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
logger.debug('Request not in flight, transport not set up');
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
55
|
async waitUntilUnderRateLimit(options, retry = 0) {
|
|
76
56
|
if (this.rateLimiter.isUnderLimits()) {
|
|
77
57
|
logger.trace('Incoming request would not be under limits, moving on');
|
|
@@ -87,21 +67,36 @@ class RestTransport {
|
|
|
87
67
|
await (0, util_1.sleep)(options.msBetweenRetries);
|
|
88
68
|
await this.waitUntilUnderRateLimit(options, retry + 1);
|
|
89
69
|
}
|
|
90
|
-
async
|
|
91
|
-
|
|
70
|
+
async foregroundExecute(req, config) {
|
|
71
|
+
// Add some entropy here because of possible scenario where the key won't be set before multiple
|
|
72
|
+
// other instances in a burst request try to access the coalescing key.
|
|
73
|
+
const randomMs = Math.random() * (this.config.options.requestCoalescing.entropyMax || 0);
|
|
74
|
+
await (0, util_1.sleep)(randomMs);
|
|
75
|
+
// Check if request is in flight if coalescing is enabled
|
|
76
|
+
const inFlight = this.config.options.requestCoalescing.enabled &&
|
|
77
|
+
(await this.cache.get(this.inFlightPrefix + req.requestContext.cacheKey));
|
|
78
|
+
if (inFlight) {
|
|
79
|
+
logger.debug('Request is in flight, transport has been set up');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
else if (this.config.options.requestCoalescing.enabled) {
|
|
83
|
+
// If it wasn't in flight and coalescing is disabled, register it as in flight
|
|
92
84
|
const ttl = config.REST_TRANSPORT_MAX_RATE_LIMIT_RETRIES *
|
|
93
85
|
config.REST_TRANSPORT_MS_BETWEEN_RATE_LIMIT_RETRIES;
|
|
94
86
|
logger.debug('Setting up rest transport, setting request in flight in cache');
|
|
95
|
-
await this.
|
|
87
|
+
await this.inFlightCache.set(this.inFlightPrefix + req.requestContext.cacheKey, true, ttl + 100); // Can't use Infinity for things like Redis
|
|
96
88
|
}
|
|
97
89
|
const request = await this.config.prepareRequest(req, config);
|
|
98
90
|
logger.trace('Check if we are under rate limits to perform request');
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
91
|
+
const checkForRateLimit = async () => {
|
|
92
|
+
return this.waitUntilUnderRateLimit({
|
|
93
|
+
maxRetries: config.REST_TRANSPORT_MAX_RATE_LIMIT_RETRIES,
|
|
94
|
+
msBetweenRetries: config.REST_TRANSPORT_MS_BETWEEN_RATE_LIMIT_RETRIES,
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
await checkForRateLimit();
|
|
103
98
|
logger.trace('Sending request to data provider...');
|
|
104
|
-
const providerResponse = await (0, util_2.axiosRequest)(request, config);
|
|
99
|
+
const providerResponse = await (0, util_2.axiosRequest)(request, config, checkForRateLimit);
|
|
105
100
|
logger.debug(`Got response from provider, parsing (raw body: ${providerResponse.data})`);
|
|
106
101
|
const parsedResponse = await this.config.parseResponse(req, providerResponse, config);
|
|
107
102
|
if (config.API_VERBOSE) {
|
package/transports/rest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../src/transports/rest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,kCAA2C;AAG3C,+CAAkD;AAClD,iCAAqC;AACrC,2EAA4D;AAK5D,MAAM,gBAAgB,GAAG,UAAU,CAAA;AAEnC,MAAM,MAAM,GAAG,IAAA,iBAAU,EAAC,eAAe,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../src/transports/rest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AdapterDependencies } from '../adapter';
|
|
2
|
+
import { AdapterConfig } from '../config';
|
|
3
|
+
import { AdapterRequest, AdapterResponse } from '../util';
|
|
4
|
+
import { MetaTransport, Transport, TransportGenerics } from './';
|
|
5
|
+
/**
|
|
6
|
+
* Transport implementation that takes 2 or more transports and a function that determines with transport to use.
|
|
7
|
+
*
|
|
8
|
+
* @typeParam T - Helper struct type that will be used to pass types to the generic parameters (check [[TransportGenerics]])
|
|
9
|
+
*/
|
|
10
|
+
export declare class RoutingTransport<T extends TransportGenerics> implements MetaTransport<T> {
|
|
11
|
+
transports: {
|
|
12
|
+
[key: string]: Transport<T>;
|
|
13
|
+
};
|
|
14
|
+
private route;
|
|
15
|
+
constructor(transports: {
|
|
16
|
+
[key: string]: Transport<T>;
|
|
17
|
+
}, route: (req: AdapterRequest<T['Request']>, adapterConfig?: AdapterConfig<T['CustomSettings']>) => string);
|
|
18
|
+
initialize(dependencies: AdapterDependencies, adapterConfig: AdapterConfig<T['CustomSettings']>, endpointName: string): Promise<void>;
|
|
19
|
+
registerRequest(req: AdapterRequest<T['Request']>, adapterConfig: AdapterConfig<T['CustomSettings']>): Promise<void>;
|
|
20
|
+
private resolveTransport;
|
|
21
|
+
foregroundExecute(req: AdapterRequest<T['Request']>, adapterConfig: AdapterConfig<T['CustomSettings']>): Promise<AdapterResponse<any> | void>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RoutingTransport = void 0;
|
|
4
|
+
const util_1 = require("../util");
|
|
5
|
+
const error_1 = require("../validation/error");
|
|
6
|
+
const logger = (0, util_1.makeLogger)('RoutingTransport');
|
|
7
|
+
/**
|
|
8
|
+
* Transport implementation that takes 2 or more transports and a function that determines with transport to use.
|
|
9
|
+
*
|
|
10
|
+
* @typeParam T - Helper struct type that will be used to pass types to the generic parameters (check [[TransportGenerics]])
|
|
11
|
+
*/
|
|
12
|
+
class RoutingTransport {
|
|
13
|
+
constructor(
|
|
14
|
+
// This is public for tests, which sometimes need the underlying transport for things like ticking the clock
|
|
15
|
+
transports,
|
|
16
|
+
// Route should return to a string key that corresponds to a transport in the transports object
|
|
17
|
+
route) {
|
|
18
|
+
this.transports = transports;
|
|
19
|
+
this.route = route;
|
|
20
|
+
}
|
|
21
|
+
async initialize(dependencies, adapterConfig, endpointName) {
|
|
22
|
+
logger.debug(`Initializing ${Object.keys(this.transports).length} transports`);
|
|
23
|
+
Object.entries(this.transports).forEach(([k, v]) => {
|
|
24
|
+
logger.debug(`Initializing transport ${k} (${v.constructor.name})`);
|
|
25
|
+
v.initialize(dependencies, adapterConfig, endpointName);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async registerRequest(req, adapterConfig) {
|
|
29
|
+
logger.debug(`registering request using `, req.requestContext.data);
|
|
30
|
+
const transport = this.resolveTransport(req, adapterConfig);
|
|
31
|
+
if (transport.registerRequest) {
|
|
32
|
+
logger.debug(`Running registerRequest on retrieved transport`);
|
|
33
|
+
return transport.registerRequest(req, adapterConfig);
|
|
34
|
+
}
|
|
35
|
+
logger.debug(`Retrieved transport doesn't implement registerRequest`);
|
|
36
|
+
}
|
|
37
|
+
resolveTransport(req, adapterConfig) {
|
|
38
|
+
logger.debug(`routing request using `, req.requestContext.data);
|
|
39
|
+
const key = this.route(req, adapterConfig || undefined);
|
|
40
|
+
if (!this.transports[key]) {
|
|
41
|
+
logger.error(`No transport found for key ${key}`);
|
|
42
|
+
throw new error_1.AdapterError({ statusCode: 400, message: `No transport found for ${key}` });
|
|
43
|
+
}
|
|
44
|
+
const transport = this.transports[key];
|
|
45
|
+
logger.debug(`Found ${transport.constructor.name} corresponding to ${key}`);
|
|
46
|
+
return transport;
|
|
47
|
+
}
|
|
48
|
+
// Allow AdapterResponse<any> below since we don't know what the adapter will return
|
|
49
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
50
|
+
async foregroundExecute(req, adapterConfig) {
|
|
51
|
+
const transport = this.resolveTransport(req, adapterConfig);
|
|
52
|
+
if (transport.foregroundExecute) {
|
|
53
|
+
logger.debug(`Running foregroundExecute on retrieved transport`);
|
|
54
|
+
return transport.foregroundExecute(req, adapterConfig);
|
|
55
|
+
}
|
|
56
|
+
logger.debug(`Retrieved transport doesn't implement foregroundExecute`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.RoutingTransport = RoutingTransport;
|
|
60
|
+
//# sourceMappingURL=routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../src/transports/routing.ts"],"names":[],"mappings":";;;AAEA,kCAAqE;AACrE,+CAAkD;AAGlD,MAAM,MAAM,GAAG,IAAA,iBAAU,EAAC,kBAAkB,CAAC,CAAA;AAE7C;;;;GAIG;AACH,MAAa,gBAAgB;IAI3B;IACE,6GAA6G;IACtG,UAA2C;IAClD,+FAA+F;IACvF,KAGG;QALJ,eAAU,GAAV,UAAU,CAAiC;QAE1C,UAAK,GAAL,KAAK,CAGF;IACV,CAAC;IAEJ,KAAK,CAAC,UAAU,CACd,YAAiC,EACjC,aAAiD,EACjD,YAAoB;QAEpB,MAAM,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,aAAa,CAAC,CAAA;QAC9E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;YACjD,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAA;YACnE,CAAC,CAAC,UAAU,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,GAAiC,EACjC,aAAiD;QAEjD,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAEnE,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;QAC3D,IAAI,SAAS,CAAC,eAAe,EAAE;YAC7B,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAA;YAC9D,OAAO,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;SACrD;QACD,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAA;IACvE,CAAC;IAEO,gBAAgB,CACtB,GAAiC,EACjC,aAAkD;QAElD,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,IAAI,SAAS,CAAC,CAAA;QACvD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACzB,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAA;YACjD,MAAM,IAAI,oBAAY,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,0BAA0B,GAAG,EAAE,EAAE,CAAC,CAAA;SACtF;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACtC,MAAM,CAAC,KAAK,CAAC,SAAS,SAAS,CAAC,WAAW,CAAC,IAAI,qBAAqB,GAAG,EAAE,CAAC,CAAA;QAC3E,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,oFAAoF;IACpF,wDAAwD;IACxD,KAAK,CAAC,iBAAiB,CACrB,GAAiC,EACjC,aAAiD;QAEjD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;QAC3D,IAAI,SAAS,CAAC,iBAAiB,EAAE;YAC/B,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAA;YAChE,OAAO,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;SACvD;QACD,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAA;IACzE,CAAC;CACF;AApED,4CAoEC"}
|
package/transports/sse.d.ts
CHANGED
|
@@ -1,41 +1,61 @@
|
|
|
1
|
-
import { Cache } from '../cache';
|
|
2
|
-
import EventSource from 'eventsource';
|
|
3
|
-
import { SettingsMap, AdapterConfig } from '../config';
|
|
4
1
|
import { AxiosRequestConfig } from 'axios';
|
|
2
|
+
import EventSource from 'eventsource';
|
|
3
|
+
import { EndpointContext, AdapterDependencies } from '../adapter';
|
|
4
|
+
import { Cache } from '../cache';
|
|
5
|
+
import { AdapterConfig } from '../config';
|
|
5
6
|
import { SubscriptionSet } from '../util';
|
|
6
|
-
import { AdapterRequest, ProviderResult } from '../util/request';
|
|
7
|
-
import { Transport } from './';
|
|
8
|
-
import { AdapterContext, AdapterDependencies } from '../adapter';
|
|
7
|
+
import { AdapterRequest, AdapterResponse, ProviderResult } from '../util/request';
|
|
8
|
+
import { Transport, TransportGenerics } from './';
|
|
9
9
|
export interface SSEConfig {
|
|
10
10
|
url: string;
|
|
11
11
|
eventSourceInitDict?: EventSource.EventSourceInitDict;
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Helper struct type that will be used to pass types to the generic parameters of a Transport.
|
|
15
|
+
* Extends the common TransportGenerics, adding Provider specific types for this Batch endpoint.
|
|
16
|
+
*/
|
|
17
|
+
declare type SSETransportGenerics = TransportGenerics & {
|
|
18
|
+
/**
|
|
19
|
+
* Type details for any provider specific interfaces.
|
|
20
|
+
*/
|
|
21
|
+
Provider: {
|
|
22
|
+
/**
|
|
23
|
+
* Structure of the body of the request that will be sent to the data provider.
|
|
24
|
+
*/
|
|
25
|
+
RequestBody: unknown;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Transport implementation that establishes a long lived connection to a server using the SSE protocol and subcribes to updates.
|
|
30
|
+
*
|
|
31
|
+
* @typeParam T - Helper struct type that will be used to pass types to the generic parameters (check [[SSETransportGenerics]])
|
|
32
|
+
*/
|
|
33
|
+
export declare class SSETransport<T extends SSETransportGenerics> implements Transport<T> {
|
|
14
34
|
private config;
|
|
15
35
|
EventSource: typeof EventSource;
|
|
16
|
-
cache: Cache
|
|
36
|
+
cache: Cache<AdapterResponse<T['Response']>>;
|
|
17
37
|
eventListeners: {
|
|
18
38
|
type: string;
|
|
19
|
-
parseResponse: (evt: MessageEvent) => ProviderResult<
|
|
39
|
+
parseResponse: (evt: MessageEvent) => ProviderResult<T>;
|
|
20
40
|
}[];
|
|
21
41
|
sseConnection?: EventSource;
|
|
22
|
-
subscriptionSet: SubscriptionSet<
|
|
42
|
+
subscriptionSet: SubscriptionSet<T['Request']['Params']>;
|
|
23
43
|
timeOfLastReq: number;
|
|
24
|
-
localSubscriptions:
|
|
44
|
+
localSubscriptions: T['Request']['Params'][];
|
|
25
45
|
constructor(config: {
|
|
26
|
-
prepareSSEConnectionConfig: (params:
|
|
27
|
-
prepareKeepAliveRequest
|
|
28
|
-
prepareSubscriptionRequest: (params:
|
|
29
|
-
prepareUnsubscriptionRequest: (params:
|
|
46
|
+
prepareSSEConnectionConfig: (params: T['Request']['Params'][], context: EndpointContext<T>) => SSEConfig;
|
|
47
|
+
prepareKeepAliveRequest?: (context: EndpointContext<T>) => AxiosRequestConfig<T['Provider']['RequestBody']>;
|
|
48
|
+
prepareSubscriptionRequest: (params: T['Request']['Params'][], context: EndpointContext<T>) => AxiosRequestConfig<T['Provider']['RequestBody']>;
|
|
49
|
+
prepareUnsubscriptionRequest: (params: T['Request']['Params'][], context: EndpointContext<T>) => AxiosRequestConfig<T['Provider']['RequestBody']>;
|
|
30
50
|
eventListeners: {
|
|
31
51
|
type: string;
|
|
32
|
-
parseResponse: (evt: MessageEvent) => ProviderResult<
|
|
52
|
+
parseResponse: (evt: MessageEvent) => ProviderResult<T>[];
|
|
33
53
|
}[];
|
|
34
54
|
keepaliveSleepMs?: number;
|
|
35
55
|
pollingSleepMs?: number;
|
|
36
56
|
});
|
|
37
|
-
initialize(dependencies: AdapterDependencies, config: AdapterConfig<
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
backgroundExecute(context: AdapterContext<CustomSettings>): Promise<number>;
|
|
57
|
+
initialize(dependencies: AdapterDependencies, config: AdapterConfig<T['CustomSettings']>, endpointName: string): Promise<void>;
|
|
58
|
+
registerRequest(req: AdapterRequest<T['Request']>, config: AdapterConfig<T['CustomSettings']>): Promise<void>;
|
|
59
|
+
backgroundExecute(context: EndpointContext<T>): Promise<number>;
|
|
41
60
|
}
|
|
61
|
+
export {};
|
package/transports/sse.js
CHANGED
|
@@ -4,11 +4,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.SSETransport = void 0;
|
|
7
|
-
const eventsource_1 = __importDefault(require("eventsource"));
|
|
8
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const eventsource_1 = __importDefault(require("eventsource"));
|
|
9
9
|
const util_1 = require("../util");
|
|
10
10
|
const _1 = require("./");
|
|
11
11
|
const logger = (0, util_1.makeLogger)('SSETransport');
|
|
12
|
+
/**
|
|
13
|
+
* Transport implementation that establishes a long lived connection to a server using the SSE protocol and subcribes to updates.
|
|
14
|
+
*
|
|
15
|
+
* @typeParam T - Helper struct type that will be used to pass types to the generic parameters (check [[SSETransportGenerics]])
|
|
16
|
+
*/
|
|
12
17
|
class SSETransport {
|
|
13
18
|
constructor(config) {
|
|
14
19
|
this.config = config;
|
|
@@ -25,11 +30,8 @@ class SSETransport {
|
|
|
25
30
|
this.EventSource = dependencies.eventSource;
|
|
26
31
|
}
|
|
27
32
|
}
|
|
28
|
-
async
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
async setup(req, config) {
|
|
32
|
-
logger.debug(`Adding entry to subscription set: [${req.requestContext.cacheKey}] = ${req.requestContext.data}`);
|
|
33
|
+
async registerRequest(req, config) {
|
|
34
|
+
logger.debug(`Adding entry to subscription set (ttl: ${config.SSE_SUBSCRIPTION_TTL}): [${req.requestContext.cacheKey}] = ${req.requestContext.data}`);
|
|
33
35
|
await this.subscriptionSet.add(req.requestContext.cacheKey, req.requestContext.data, config.SSE_SUBSCRIPTION_TTL);
|
|
34
36
|
}
|
|
35
37
|
// Unlike cache warming, this execute will manage subscriptions
|
|
@@ -37,7 +39,6 @@ class SSETransport {
|
|
|
37
39
|
logger.debug('Starting background execute, getting subscriptions from sorted set');
|
|
38
40
|
const desiredSubs = await this.subscriptionSet.getAll();
|
|
39
41
|
logger.debug('Generating delta (subscribes & unsubscribes)');
|
|
40
|
-
// TODO: More efficient algorithm, this is really easy to read, but high(er) time complexity
|
|
41
42
|
const subscribeParams = desiredSubs.filter((s) => !this.localSubscriptions.includes(s));
|
|
42
43
|
const unsubscribeParams = this.localSubscriptions.filter((s) => !desiredSubs.includes(s));
|
|
43
44
|
logger.debug(`${subscribeParams.length} new subscriptions; ${unsubscribeParams.length} to unsubscribe`);
|
|
@@ -81,7 +82,8 @@ class SSETransport {
|
|
|
81
82
|
const unsubscribeRequest = this.config.prepareUnsubscriptionRequest(unsubscribeParams, context);
|
|
82
83
|
makeRequest(unsubscribeRequest);
|
|
83
84
|
}
|
|
84
|
-
if (
|
|
85
|
+
if (this.config.prepareKeepAliveRequest &&
|
|
86
|
+
desiredSubs.length &&
|
|
85
87
|
Date.now() - this.timeOfLastReq > context.adapterConfig.SSE_KEEPALIVE_SLEEP) {
|
|
86
88
|
const prepareKeepAliveRequest = this.config.prepareKeepAliveRequest(context);
|
|
87
89
|
makeRequest(prepareKeepAliveRequest);
|
package/transports/sse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/transports/sse.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/transports/sse.ts"],"names":[],"mappings":"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"}
|
package/transports/util.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ import { AdapterConfig, SettingsMap } from '../config';
|
|
|
4
4
|
* Performs axios request along with metrics recording and error handling
|
|
5
5
|
*
|
|
6
6
|
* @param request - axios request config
|
|
7
|
+
* @param config - the adapter config containing the env vars
|
|
8
|
+
* @param checkForRateLimit - async function to check and wait for rate limit
|
|
7
9
|
* @returns axios response for the request
|
|
8
10
|
*/
|
|
9
|
-
export declare function axiosRequest<ProviderRequestBody, ProviderResponseBody, CustomSettings extends SettingsMap>(request: AxiosRequestConfig<ProviderRequestBody>, config: AdapterConfig<CustomSettings>): Promise<AxiosResponse<ProviderResponseBody>>;
|
|
11
|
+
export declare function axiosRequest<ProviderRequestBody, ProviderResponseBody, CustomSettings extends SettingsMap>(request: AxiosRequestConfig<ProviderRequestBody>, config: AdapterConfig<CustomSettings>, checkForRateLimit?: () => Promise<void>): Promise<AxiosResponse<ProviderResponseBody>>;
|
package/transports/util.js
CHANGED
|
@@ -30,58 +30,88 @@ exports.axiosRequest = void 0;
|
|
|
30
30
|
const axios_1 = __importDefault(require("axios"));
|
|
31
31
|
const error_1 = require("../validation/error");
|
|
32
32
|
const transportMetrics = __importStar(require("./metrics"));
|
|
33
|
+
const util_1 = require("../util");
|
|
33
34
|
/**
|
|
34
35
|
* Performs axios request along with metrics recording and error handling
|
|
35
36
|
*
|
|
36
37
|
* @param request - axios request config
|
|
38
|
+
* @param config - the adapter config containing the env vars
|
|
39
|
+
* @param checkForRateLimit - async function to check and wait for rate limit
|
|
37
40
|
* @returns axios response for the request
|
|
38
41
|
*/
|
|
39
|
-
async function axiosRequest(request, config) {
|
|
42
|
+
async function axiosRequest(request, config, checkForRateLimit) {
|
|
40
43
|
const responseTimer = transportMetrics.dataProviderRequestDurationSeconds.startTimer();
|
|
41
44
|
let providerResponse;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
45
|
+
const maxRetries = config.RETRY;
|
|
46
|
+
const initialExponent = 1;
|
|
47
|
+
const retry = async (exponent) => {
|
|
48
|
+
const _exponentialDelayRetry = async (exp) => {
|
|
49
|
+
await (0, util_1.sleep)((2 ** exp + Math.random()) * 1000);
|
|
50
|
+
if (checkForRateLimit) {
|
|
51
|
+
await checkForRateLimit();
|
|
52
|
+
}
|
|
53
|
+
return retry(exp + 1);
|
|
54
|
+
};
|
|
55
|
+
try {
|
|
56
|
+
request.timeout = config.API_TIMEOUT;
|
|
57
|
+
providerResponse = await axios_1.default.request(request);
|
|
55
58
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
+
catch (e) {
|
|
60
|
+
const error = e;
|
|
61
|
+
// Request error
|
|
62
|
+
let providerStatusCode;
|
|
63
|
+
let adapterError;
|
|
64
|
+
if (error.code === 'ECONNABORTED') {
|
|
65
|
+
providerStatusCode = error?.response?.status ?? 504;
|
|
66
|
+
adapterError = new error_1.AdapterTimeoutError({
|
|
67
|
+
statusCode: 504,
|
|
68
|
+
name: 'Data Provider Request Timeout error',
|
|
69
|
+
providerStatusCode: error?.response?.status ?? 504,
|
|
70
|
+
message: error?.message,
|
|
71
|
+
cause: error,
|
|
72
|
+
errorResponse: error?.response?.data,
|
|
73
|
+
url: request.url,
|
|
74
|
+
});
|
|
75
|
+
// Record count of failed data provider request
|
|
76
|
+
transportMetrics.dataProviderRequests
|
|
77
|
+
.labels(transportMetrics.dataProviderMetricsLabel(providerStatusCode, request.method))
|
|
78
|
+
.inc();
|
|
79
|
+
throw adapterError;
|
|
80
|
+
}
|
|
81
|
+
if (exponent >= maxRetries) {
|
|
82
|
+
if (error?.response?.status) {
|
|
83
|
+
adapterError = new error_1.AdapterDataProviderError({});
|
|
84
|
+
providerStatusCode = error?.response?.status;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
adapterError = new error_1.AdapterConnectionError({});
|
|
88
|
+
providerStatusCode = 0; // 0 -> connection error
|
|
89
|
+
}
|
|
90
|
+
// Record count of failed data provider request
|
|
91
|
+
transportMetrics.dataProviderRequests
|
|
92
|
+
.labels(transportMetrics.dataProviderMetricsLabel(providerStatusCode, request.method))
|
|
93
|
+
.inc();
|
|
94
|
+
adapterError.statusCode = 200;
|
|
95
|
+
adapterError.providerStatusCode = providerStatusCode;
|
|
96
|
+
adapterError.message = error?.message;
|
|
97
|
+
adapterError.cause = error;
|
|
98
|
+
adapterError.errorResponse = error?.response?.data;
|
|
99
|
+
adapterError.url = request.url;
|
|
100
|
+
throw adapterError;
|
|
101
|
+
}
|
|
102
|
+
return _exponentialDelayRetry(exponent);
|
|
59
103
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
104
|
+
finally {
|
|
105
|
+
// Record time taken for data provider request for success or failure
|
|
106
|
+
responseTimer();
|
|
63
107
|
}
|
|
64
|
-
// Record count of
|
|
108
|
+
// Record count of successful data provider requests
|
|
65
109
|
transportMetrics.dataProviderRequests
|
|
66
|
-
.labels(transportMetrics.dataProviderMetricsLabel(
|
|
110
|
+
.labels(transportMetrics.dataProviderMetricsLabel(providerResponse.status, request.method))
|
|
67
111
|
.inc();
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
adapterError.cause = error;
|
|
72
|
-
adapterError.errorResponse = error?.response?.data;
|
|
73
|
-
adapterError.url = request.url;
|
|
74
|
-
throw adapterError;
|
|
75
|
-
}
|
|
76
|
-
finally {
|
|
77
|
-
// Record time taken for data provider request for success or failure
|
|
78
|
-
responseTimer();
|
|
79
|
-
}
|
|
80
|
-
// Record count of successful data provider requests
|
|
81
|
-
transportMetrics.dataProviderRequests
|
|
82
|
-
.labels(transportMetrics.dataProviderMetricsLabel(providerResponse.status, request.method))
|
|
83
|
-
.inc();
|
|
84
|
-
return providerResponse;
|
|
112
|
+
return providerResponse;
|
|
113
|
+
};
|
|
114
|
+
return retry(initialExponent);
|
|
85
115
|
}
|
|
86
116
|
exports.axiosRequest = axiosRequest;
|
|
87
117
|
//# sourceMappingURL=util.js.map
|
package/transports/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/transports/util.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA4E;AAE5E,+CAK4B;AAC5B,4DAA6C;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/transports/util.ts"],"names":[],"mappings":"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"}
|