@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.
Files changed (151) hide show
  1. package/README.md +67 -0
  2. package/adapter/basic.d.ts +51 -7
  3. package/adapter/basic.js +184 -4
  4. package/adapter/basic.js.map +1 -1
  5. package/adapter/endpoint.d.ts +6 -6
  6. package/adapter/endpoint.js +1 -0
  7. package/adapter/endpoint.js.map +1 -1
  8. package/adapter/price.d.ts +38 -8
  9. package/adapter/price.js +43 -1
  10. package/adapter/price.js.map +1 -1
  11. package/adapter/types.d.ts +40 -15
  12. package/background-executor.js +21 -5
  13. package/background-executor.js.map +1 -1
  14. package/cache/index.d.ts +11 -17
  15. package/cache/index.js +9 -51
  16. package/cache/index.js.map +1 -1
  17. package/config/index.d.ts +28 -11
  18. package/config/index.js +63 -46
  19. package/config/index.js.map +1 -1
  20. package/examples/bank-frick/accounts.d.ts +17 -25
  21. package/examples/bank-frick/accounts.js +23 -13
  22. package/examples/bank-frick/accounts.js.map +1 -1
  23. package/examples/bank-frick/config/index.d.ts +5 -0
  24. package/examples/bank-frick/config/index.js +5 -0
  25. package/examples/bank-frick/config/index.js.map +1 -1
  26. package/examples/bank-frick/index.d.ts +1 -15
  27. package/examples/bank-frick/index.js +1 -1
  28. package/examples/coingecko/src/config/index.d.ts +7 -0
  29. package/examples/coingecko/src/config/index.js +8 -1
  30. package/examples/coingecko/src/config/index.js.map +1 -1
  31. package/examples/coingecko/src/crypto-utils.d.ts +19 -4
  32. package/examples/coingecko/src/crypto-utils.js +1 -2
  33. package/examples/coingecko/src/crypto-utils.js.map +1 -1
  34. package/examples/coingecko/src/endpoint/coins.d.ts +20 -3
  35. package/examples/coingecko/src/endpoint/coins.js +2 -2
  36. package/examples/coingecko/src/endpoint/coins.js.map +1 -1
  37. package/examples/coingecko/src/endpoint/crypto-marketcap.d.ts +2 -2
  38. package/examples/coingecko/src/endpoint/crypto-marketcap.js +2 -2
  39. package/examples/coingecko/src/endpoint/crypto-marketcap.js.map +1 -1
  40. package/examples/coingecko/src/endpoint/crypto-volume.d.ts +2 -2
  41. package/examples/coingecko/src/endpoint/crypto-volume.js +2 -2
  42. package/examples/coingecko/src/endpoint/crypto-volume.js.map +1 -1
  43. package/examples/coingecko/src/endpoint/crypto.d.ts +2 -4
  44. package/examples/coingecko/src/endpoint/crypto.js +2 -2
  45. package/examples/coingecko/src/endpoint/crypto.js.map +1 -1
  46. package/examples/coingecko/src/endpoint/dominance.d.ts +2 -2
  47. package/examples/coingecko/src/endpoint/dominance.js +2 -2
  48. package/examples/coingecko/src/endpoint/dominance.js.map +1 -1
  49. package/examples/coingecko/src/endpoint/global-marketcap.d.ts +2 -2
  50. package/examples/coingecko/src/endpoint/global-marketcap.js +2 -2
  51. package/examples/coingecko/src/endpoint/global-marketcap.js.map +1 -1
  52. package/examples/coingecko/src/global-utils.d.ts +18 -3
  53. package/examples/coingecko/src/global-utils.js.map +1 -1
  54. package/examples/coingecko/src/index.js +3 -1
  55. package/examples/coingecko/src/index.js.map +1 -1
  56. package/examples/cryptocompare/src/config/index.d.ts +7 -0
  57. package/examples/cryptocompare/src/config/index.js +8 -1
  58. package/examples/cryptocompare/src/config/index.js.map +1 -1
  59. package/examples/cryptocompare/src/endpoints/crypto.d.ts +14 -2
  60. package/examples/cryptocompare/src/endpoints/crypto.js.map +1 -1
  61. package/examples/cryptocompare/src/index.js +3 -1
  62. package/examples/cryptocompare/src/index.js.map +1 -1
  63. package/examples/genesis/config/index.d.ts +5 -0
  64. package/examples/genesis/config/index.js +5 -0
  65. package/examples/genesis/config/index.js.map +1 -1
  66. package/examples/genesis/index.js +1 -1
  67. package/examples/genesis/sseStream.d.ts +13 -2
  68. package/examples/genesis/sseStream.js +4 -1
  69. package/examples/genesis/sseStream.js.map +1 -1
  70. package/index.d.ts +2 -1
  71. package/index.js +4 -6
  72. package/index.js.map +1 -1
  73. package/metrics/index.d.ts +2 -0
  74. package/metrics/index.js +5 -4
  75. package/metrics/index.js.map +1 -1
  76. package/metrics/util.d.ts +5 -5
  77. package/metrics/util.js +2 -2
  78. package/metrics/util.js.map +1 -1
  79. package/package.json +8 -10
  80. package/rate-limiting/background/fixed-frequency.d.ts +2 -3
  81. package/rate-limiting/background/fixed-frequency.js.map +1 -1
  82. package/rate-limiting/index.d.ts +4 -4
  83. package/rate-limiting/index.js +1 -1
  84. package/rate-limiting/index.js.map +1 -1
  85. package/rate-limiting/request/simple-counting.d.ts +2 -3
  86. package/rate-limiting/request/simple-counting.js.map +1 -1
  87. package/transports/batch-warming.d.ts +40 -18
  88. package/transports/batch-warming.js +45 -18
  89. package/transports/batch-warming.js.map +1 -1
  90. package/transports/index.d.ts +65 -31
  91. package/transports/index.js +2 -59
  92. package/transports/index.js.map +1 -1
  93. package/transports/metrics.d.ts +3 -3
  94. package/transports/metrics.js +2 -2
  95. package/transports/metrics.js.map +1 -1
  96. package/transports/rest.d.ts +42 -30
  97. package/transports/rest.js +25 -30
  98. package/transports/rest.js.map +1 -1
  99. package/transports/routing.d.ts +22 -0
  100. package/transports/routing.js +60 -0
  101. package/transports/routing.js.map +1 -0
  102. package/transports/sse.d.ts +40 -20
  103. package/transports/sse.js +10 -8
  104. package/transports/sse.js.map +1 -1
  105. package/transports/util.d.ts +3 -1
  106. package/transports/util.js +69 -39
  107. package/transports/util.js.map +1 -1
  108. package/transports/websocket.d.ts +41 -26
  109. package/transports/websocket.js +16 -19
  110. package/transports/websocket.js.map +1 -1
  111. package/util/logger.d.ts +2 -0
  112. package/util/logger.js +4 -7
  113. package/util/logger.js.map +1 -1
  114. package/util/request.d.ts +46 -10
  115. package/util/subscription-set/subscription-set.d.ts +1 -1
  116. package/util/subscription-set/subscription-set.js +1 -1
  117. package/util/subscription-set/subscription-set.js.map +1 -1
  118. package/util/test-payload-loader.d.ts +1 -0
  119. package/util/test-payload-loader.js +2 -1
  120. package/util/test-payload-loader.js.map +1 -1
  121. package/validation/error.d.ts +1 -3
  122. package/validation/error.js +2 -4
  123. package/validation/error.js.map +1 -1
  124. package/validation/index.js +28 -18
  125. package/validation/index.js.map +1 -1
  126. package/validation/input-params.d.ts +0 -1
  127. package/validation/input-params.js +0 -28
  128. package/validation/input-params.js.map +1 -1
  129. package/validation/input-validator.js +1 -2
  130. package/validation/input-validator.js.map +1 -1
  131. package/examples/coingecko-old/batch-warming.d.ts +0 -7
  132. package/examples/coingecko-old/batch-warming.js +0 -54
  133. package/examples/coingecko-old/batch-warming.js.map +0 -1
  134. package/examples/coingecko-old/index.d.ts +0 -2
  135. package/examples/coingecko-old/index.js +0 -12
  136. package/examples/coingecko-old/index.js.map +0 -1
  137. package/examples/coingecko-old/rest.d.ts +0 -12
  138. package/examples/coingecko-old/rest.js +0 -55
  139. package/examples/coingecko-old/rest.js.map +0 -1
  140. package/examples/ncfx/config/index.d.ts +0 -12
  141. package/examples/ncfx/config/index.js +0 -16
  142. package/examples/ncfx/config/index.js.map +0 -1
  143. package/examples/ncfx/index.d.ts +0 -13
  144. package/examples/ncfx/index.js +0 -12
  145. package/examples/ncfx/index.js.map +0 -1
  146. package/examples/ncfx/websocket.d.ts +0 -47
  147. package/examples/ncfx/websocket.js +0 -74
  148. package/examples/ncfx/websocket.js.map +0 -1
  149. package/validation/override-functions.d.ts +0 -3
  150. package/validation/override-functions.js +0 -41
  151. package/validation/override-functions.js.map +0 -1
package/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # EA Framework v3
2
+
3
+ > **Warning**
4
+ > This framework is in a Beta state, and under active development. While many of the features from version 2 are present, they have not been tested extensively enough to mark this as production ready. You can find v2 in the [External Adapters Monorepo](https://github.com/smartcontractkit/external-adapters-js)
5
+
6
+ Framework to create External adapters, microservices that serve as middleware to facilitate connections between Chainlink Nodes and Data Providers (DP).
7
+
8
+ ## Requirements
9
+
10
+ - Node.js 16+
11
+ - Yarn
12
+
13
+ ### Optional development tools
14
+
15
+ If available, consider setting up your development environment with:
16
+
17
+ - ESLint
18
+ - Prettier
19
+
20
+ Note that both of the above are not necessary, but PRs submitted to the repo will be blocked from merging unless they comply with the linting and formatting rules.
21
+
22
+ ## Setup
23
+
24
+ ```sh
25
+ yarn # Install yarn dependencies
26
+ ```
27
+
28
+ ## Guides & Docs
29
+
30
+ - [Basics](./docs/basics.md)
31
+ - Porting a v2 EA to v3
32
+ - Creating a new v3 EA
33
+ - Transports
34
+ - Basic
35
+ - REST
36
+ - WebSocket
37
+ - SSE
38
+ - Meta
39
+ - Routing
40
+
41
+ ## Testing
42
+
43
+ The EA framework is tested by a suite of integration tests located [here](./test).
44
+
45
+ ```
46
+ yarn test
47
+ ```
48
+
49
+ ## Publishing releases
50
+
51
+ ### Automatic
52
+
53
+ The normal flow for publishing a release is through a series o GitHub actions that are triggered when a PR is closed by merging with the base branch. Full details about our workflows can be found in [./.github/WORKFLOW-README.MD]. A summary of our publish workflow follows:
54
+
55
+ 1. Close a PR containing your changes
56
+ 2. If the PR was merged and if it contains a version label instruction (patch, minor, major, none), a new PR will be created that contains the result of running `npm version LABEL` on master with the original PR author assigned as a reviewer.
57
+ 3. A link to the newly created version bump PR will be added to your original PR. Click on that link, and approve it to be merged.
58
+ 4. Close the version bump PR. If merged, the package will be published to npm.
59
+ 5. When the publish workflow finishes, a comment will be added to the version bump PR that tells you if it ran successfully
60
+
61
+ This adds an extra step (approving a version bump PR) that has to be taken every time a PR is merged. This is annoying, but it is an effective workaround for permissions issues when running against protected branches, and eliminates the need for the PR author to manually update their branch's version by referring to master.
62
+
63
+ ### Manual
64
+
65
+ If you need to publish a release manually, you can do so by running `yarn release` at the project root
66
+
67
+ This runs a script that publishes the package from dist/src. If you publish from the root directory, imports will be in the form of: `import {something} from "@chainlink/external-adapter-framework/src/some_directory"`. By publishing the package from dist/src, the "src" part of the import path gets dropped, which looks cleaner: `import {something} from "@chainlink/external-adapter-framework/some_directory"`.
@@ -1,24 +1,33 @@
1
- import { SettingsMap, BaseAdapterConfig, AdapterConfig } from '../config';
1
+ import { AdapterConfig, BaseAdapterConfig, SettingsMap } from '../config';
2
+ import { AdapterRequest, AdapterResponse, Merge } from '../util';
2
3
  import { AdapterEndpoint } from './endpoint';
3
- import { AdapterDependencies, AdapterParams, AdapterRateLimitingConfig, CustomAdapterSettings } from './types';
4
+ import { AdapterDependencies, AdapterParams, AdapterRateLimitingConfig, CustomAdapterSettings, EndpointGenerics, RequestTransform } from './types';
4
5
  /**
5
6
  * Main class to represent an External Adapter
6
7
  */
7
- export declare class Adapter<CustomSettings extends CustomAdapterSettings = SettingsMap> implements AdapterParams<CustomSettings> {
8
- name: string;
8
+ export declare class Adapter<CustomSettings extends CustomAdapterSettings = SettingsMap> implements Omit<AdapterParams<CustomSettings>, 'bootstrap'> {
9
+ name: Uppercase<string>;
9
10
  defaultEndpoint?: string | undefined;
10
- endpoints: AdapterEndpoint<unknown, unknown, CustomSettings>[];
11
+ endpoints: AdapterEndpoint<Merge<EndpointGenerics, {
12
+ CustomSettings: CustomSettings;
13
+ }>>[];
11
14
  envDefaultOverrides?: Partial<BaseAdapterConfig> | undefined;
12
15
  customSettings?: SettingsMap | undefined;
13
16
  rateLimiting?: AdapterRateLimitingConfig | undefined;
14
17
  overrides?: Record<string, string> | undefined;
18
+ requestTransforms?: RequestTransform[];
19
+ envVarsPrefix?: string;
15
20
  initialized: boolean;
16
21
  /** Object containing alias translations for all endpoints */
17
- endpointsMap: Record<string, AdapterEndpoint<unknown, unknown, CustomSettings>>;
22
+ endpointsMap: Record<string, AdapterEndpoint<Merge<EndpointGenerics, {
23
+ CustomSettings: CustomSettings;
24
+ }>>>;
18
25
  /** Initialized dependencies that the adapter will use */
19
26
  dependencies: AdapterDependencies;
20
27
  /** Configuration params for various adapter properties */
21
- config: AdapterConfig;
28
+ config: AdapterConfig<CustomSettings>;
29
+ /** Bootstrap function that will run when initializing the adapter */
30
+ private readonly bootstrap?;
22
31
  constructor(params: AdapterParams<CustomSettings>);
23
32
  /**
24
33
  * Initializes all of the [[Transport]]s in the adapter, passing along any [[AdapterDependencies]] and [[AdapterConfig]].
@@ -41,6 +50,11 @@ export declare class Adapter<CustomSettings extends CustomAdapterSettings = Sett
41
50
  * using the sensitive flag in the adapter config
42
51
  */
43
52
  private buildCensorList;
53
+ /**
54
+ * Logs a warning for certain configs if set to particular values.
55
+ * Used to warn stakeholders of potential risks.
56
+ */
57
+ private logConfigWarnings;
44
58
  /**
45
59
  * This function will process dependencies for an adapter, such as caches or rate limiters,
46
60
  * in order to inject them into transports and other relevant places later in the lifecycle.
@@ -49,4 +63,34 @@ export declare class Adapter<CustomSettings extends CustomAdapterSettings = Sett
49
63
  * @returns a set of AdapterDependencies all initialized
50
64
  */
51
65
  initializeDependencies(inputDependencies?: Partial<AdapterDependencies>): AdapterDependencies;
66
+ /**
67
+ * Attempts to find a value from the Cache and return that if found.
68
+ *
69
+ * @param req - the incoming request to this adapter
70
+ * @returns the cached value if exists
71
+ */
72
+ findResponseInCache(req: AdapterRequest): Promise<AdapterResponse | undefined>;
73
+ /**
74
+ * Default request transform that takes requests and manipulates
75
+ *
76
+ * @param adapter - the current adapter
77
+ * @param req - the current adapter request
78
+ * @returns the modified (or new) request
79
+ */
80
+ symbolOverrider(req: AdapterRequest): AdapterRequest<import("../util").RequestGenerics>;
81
+ /**
82
+ * Takes the incoming request and applies all request transforms in the adapter
83
+ *
84
+ * @param req - the current adapter request
85
+ * @returns the request after passing through all request transforms
86
+ */
87
+ runRequestTransforms(req: AdapterRequest): void;
88
+ /**
89
+ * Function to serve as middleware to pass along the AdapterRequest to the appropriate Transport (acc. to the endpoint in the req.)
90
+ *
91
+ * @param req - the incoming request to this adapter
92
+ * @param replySent - a promise that resolves when the reply has already been sent
93
+ * @returns a simple Promise when it's done
94
+ */
95
+ handleRequest(req: AdapterRequest, replySent: Promise<unknown>): Promise<AdapterResponse>;
52
96
  }
package/adapter/basic.js CHANGED
@@ -31,9 +31,11 @@ const ioredis_1 = __importDefault(require("ioredis"));
31
31
  const cache_1 = require("../cache");
32
32
  const cacheMetrics = __importStar(require("../cache/metrics"));
33
33
  const config_1 = require("../config");
34
+ const transportMetrics = __importStar(require("../transports/metrics"));
34
35
  const rate_limiting_1 = require("../rate-limiting");
35
36
  const util_1 = require("../util");
36
37
  const censor_list_1 = __importDefault(require("../util/censor/censor-list"));
38
+ const error_1 = require("../validation/error");
37
39
  const logger = (0, util_1.makeLogger)('Adapter');
38
40
  /**
39
41
  * Main class to represent an External Adapter
@@ -52,9 +54,12 @@ class Adapter {
52
54
  this.customSettings = params.customSettings;
53
55
  this.rateLimiting = params.rateLimiting;
54
56
  this.overrides = params.overrides;
57
+ this.requestTransforms = [this.symbolOverrider.bind(this), ...(params.requestTransforms || [])];
58
+ this.bootstrap = params.bootstrap;
55
59
  this.config = (0, config_1.buildAdapterConfig)({
56
60
  overrides: this.envDefaultOverrides,
57
61
  customSettings: this.customSettings,
62
+ envVarsPrefix: this.envVarsPrefix,
58
63
  });
59
64
  this.normalizeEndpointNames();
60
65
  this.calculateRateLimitAllocations();
@@ -67,6 +72,13 @@ class Adapter {
67
72
  if (this.initialized) {
68
73
  throw new Error('This adapter has already been initialized!');
69
74
  }
75
+ // Building configs during initialization to avoid validation errors during construction
76
+ (0, config_1.validateAdapterConfig)(this.config, this.customSettings);
77
+ // Log warnings for risks associated with certain configs and values
78
+ this.logConfigWarnings();
79
+ if (this.bootstrap) {
80
+ await this.bootstrap(this);
81
+ }
70
82
  this.dependencies = this.initializeDependencies(dependencies);
71
83
  for (const endpoint of this.endpoints) {
72
84
  // Add aliases to map to use in validation
@@ -132,7 +144,10 @@ class Adapter {
132
144
  buildCensorList() {
133
145
  const censorList = Object.entries(config_1.BaseSettings)
134
146
  .concat(Object.entries(this.customSettings || {}))
135
- .filter(([name, setting]) => setting && setting.type === 'string' && setting.sensitive && this.config[name])
147
+ .filter(([name, setting]) => setting &&
148
+ setting.type === 'string' &&
149
+ setting.sensitive &&
150
+ this.config[name])
136
151
  .map(([name]) => ({
137
152
  key: name,
138
153
  // Escaping potential special characters in values before creating regex
@@ -142,6 +157,19 @@ class Adapter {
142
157
  }));
143
158
  censor_list_1.default.set(censorList);
144
159
  }
160
+ /**
161
+ * Logs a warning for certain configs if set to particular values.
162
+ * Used to warn stakeholders of potential risks.
163
+ */
164
+ logConfigWarnings() {
165
+ if (this.config.LOG_LEVEL.toUpperCase() === 'DEBUG' ||
166
+ this.config.LOG_LEVEL.toUpperCase() === 'TRACE') {
167
+ logger.warn(`LOG_LEVEL has been set to ${this.config.LOG_LEVEL.toUpperCase()}. Setting higher log levels results in increased memory usage and potentially slower performance.`);
168
+ }
169
+ if (this.config.DEBUG === true) {
170
+ logger.warn(`The adapter is running with DEBUG mode on.`);
171
+ }
172
+ }
145
173
  /**
146
174
  * This function will process dependencies for an adapter, such as caches or rate limiters,
147
175
  * in order to inject them into transports and other relevant places later in the lifecycle.
@@ -153,14 +181,28 @@ class Adapter {
153
181
  const dependencies = inputDependencies || {};
154
182
  if (!dependencies.redisClient) {
155
183
  if (this.config.CACHE_TYPE === 'redis') {
156
- dependencies.redisClient = new ioredis_1.default({
184
+ const maxCooldown = this.config.CACHE_REDIS_MAX_RECONNECT_COOLDOWN;
185
+ const redisOptions = {
157
186
  enableAutoPipelining: true,
158
187
  host: this.config.CACHE_REDIS_HOST,
159
188
  port: this.config.CACHE_REDIS_PORT,
160
189
  password: this.config.CACHE_REDIS_PASSWORD,
161
190
  path: this.config.CACHE_REDIS_PATH,
162
191
  timeout: this.config.CACHE_REDIS_TIMEOUT,
163
- });
192
+ retryStrategy(times) {
193
+ cacheMetrics.redisRetriesCount.inc();
194
+ logger.warn(`Redis reconnect attempt #${times}`);
195
+ return Math.min(times * 100, maxCooldown); // Next reconnect attempt time
196
+ },
197
+ connectTimeout: this.config.CACHE_REDIS_CONNECTION_TIMEOUT,
198
+ maxRetriesPerRequest: 30, // Limits the number of retries before the adapter shuts down
199
+ };
200
+ if (this.config.CACHE_REDIS_URL) {
201
+ dependencies.redisClient = new ioredis_1.default(this.config.CACHE_REDIS_URL, redisOptions);
202
+ }
203
+ else {
204
+ dependencies.redisClient = new ioredis_1.default(redisOptions);
205
+ }
164
206
  dependencies.redisClient.on('connect', () => {
165
207
  cacheMetrics.redisConnectionsOpen.inc();
166
208
  });
@@ -177,10 +219,148 @@ class Adapter {
177
219
  dependencies.backgroundExecuteRateLimiter = new rate_limiting_1.FixedFrequencyRateLimiter().initialize(this.endpoints, rateLimitingTier);
178
220
  }
179
221
  if (!dependencies.subscriptionSetFactory) {
180
- dependencies.subscriptionSetFactory = new util_1.SubscriptionSetFactory(this.config, dependencies.redisClient, this.name);
222
+ dependencies.subscriptionSetFactory = new util_1.SubscriptionSetFactory(this.config, this.name, dependencies.redisClient);
181
223
  }
182
224
  return dependencies;
183
225
  }
226
+ /**
227
+ * Attempts to find a value from the Cache and return that if found.
228
+ *
229
+ * @param req - the incoming request to this adapter
230
+ * @returns the cached value if exists
231
+ */
232
+ async findResponseInCache(req) {
233
+ const response = await this.dependencies.cache.get(req.requestContext.cacheKey);
234
+ if (response) {
235
+ if (this.config.METRICS_ENABLED && this.config.EXPERIMENTAL_METRICS_ENABLED) {
236
+ const label = cacheMetrics.cacheMetricsLabel(req.requestContext.cacheKey, req.requestContext.meta?.metrics?.feedId || 'N/A', this.config.CACHE_TYPE);
237
+ // Record cache staleness and cache get count and value
238
+ const staleness = (0, cache_1.calculateStaleness)(response.maxAge, this.config.CACHE_MAX_AGE);
239
+ cacheMetrics.cacheGet(label, response.result, staleness);
240
+ req.requestContext.meta = {
241
+ ...req.requestContext.meta,
242
+ metrics: { ...req.requestContext.meta?.metrics, cacheHit: true },
243
+ };
244
+ }
245
+ return response;
246
+ }
247
+ }
248
+ /**
249
+ * Default request transform that takes requests and manipulates
250
+ *
251
+ * @param adapter - the current adapter
252
+ * @param req - the current adapter request
253
+ * @returns the modified (or new) request
254
+ */
255
+ symbolOverrider(req) {
256
+ const rawRequestBody = req.body;
257
+ const requestOverrides = rawRequestBody.data?.overrides?.[this.name.toLowerCase()];
258
+ const base = req.requestContext.data['base'];
259
+ if (requestOverrides?.[base]) {
260
+ // Perform overrides specified in the request payload
261
+ req.requestContext.data['base'] = requestOverrides[base];
262
+ }
263
+ else if (this.overrides?.[base]) {
264
+ // Perform hardcoded adapter overrides
265
+ req.requestContext.data['base'] = this.overrides[base];
266
+ }
267
+ return req;
268
+ }
269
+ /**
270
+ * Takes the incoming request and applies all request transforms in the adapter
271
+ *
272
+ * @param req - the current adapter request
273
+ * @returns the request after passing through all request transforms
274
+ */
275
+ runRequestTransforms(req) {
276
+ if (!this.requestTransforms) {
277
+ return;
278
+ }
279
+ for (const transform of this.requestTransforms) {
280
+ transform(req);
281
+ }
282
+ }
283
+ /**
284
+ * Function to serve as middleware to pass along the AdapterRequest to the appropriate Transport (acc. to the endpoint in the req.)
285
+ *
286
+ * @param req - the incoming request to this adapter
287
+ * @param replySent - a promise that resolves when the reply has already been sent
288
+ * @returns a simple Promise when it's done
289
+ */
290
+ async handleRequest(req, replySent) {
291
+ // Get transport, must be here because it's already checked in the validator
292
+ const transport = this.endpointsMap[req.requestContext.endpointName].transport;
293
+ // First try to find the response in our cache, keep it ready
294
+ const cachedResponse = await this.findResponseInCache(req);
295
+ // Next we fire off the transport's registration of the request if defined, regardless of if we already have a cached response.
296
+ // This is necessary to ensure things like subscription sets are updated each time we get a request
297
+ let requestRegistrationPromise;
298
+ let requestRegistrationError;
299
+ if (transport.registerRequest) {
300
+ const handler = async () => {
301
+ // If we already have a cached response, wait for it to be sent back before continuing with registration
302
+ // This way we respond to incoming requests from the cache as fast as possible
303
+ if (cachedResponse) {
304
+ await replySent;
305
+ }
306
+ try {
307
+ // `await` is required to catch the error, you'll get an unhandled promise rejection otherwise
308
+ // Disable non-null assertion operator because we already checked for the existence of registerRequest
309
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
310
+ return await transport.registerRequest(req, this.config);
311
+ }
312
+ catch (err) {
313
+ logger.error(`Error registering request: ${err}`);
314
+ requestRegistrationError = err;
315
+ }
316
+ };
317
+ // Execute the registration handler without blocking
318
+ logger.debug(`Firing request registration handler${cachedResponse ? ' (cached response already sent)' : ''}`);
319
+ requestRegistrationPromise = handler();
320
+ }
321
+ // Now that we have dealt with request registration, can return the cached response if present
322
+ if (cachedResponse) {
323
+ logger.debug('Found response from cache, sending that');
324
+ return cachedResponse;
325
+ }
326
+ // If there was no cached response, execute the foregroundExecute if defined
327
+ const immediateResponse = transport.foregroundExecute && (await transport.foregroundExecute(req, this.config));
328
+ if (immediateResponse) {
329
+ logger.debug('Got immediate response from transport, sending as response');
330
+ return immediateResponse;
331
+ }
332
+ // Finally, either because there was no synchronous execute or because it returned an empty response,
333
+ // we wait for the cache to be filled (either from background work started in the sync execute, or the backgroundExecute).
334
+ // We can wait for the request registration to have finished here, since we're going to be sleeping for the cache anyways,
335
+ // and it's useful in case the registration throws a promise so that it doesn't go unhandled.
336
+ await requestRegistrationPromise;
337
+ if (requestRegistrationError) {
338
+ throw requestRegistrationError;
339
+ }
340
+ // Observe the idle time taken for polling response
341
+ const metricsTimer = transportMetrics.transportPollingDurationSeconds
342
+ .labels({ endpoint: req.requestContext.endpointName })
343
+ .startTimer();
344
+ logger.debug('Transport is set up, polling cache for response...');
345
+ const response = await (0, cache_1.pollResponseFromCache)(this.dependencies.cache, req.requestContext.cacheKey, {
346
+ maxRetries: this.config.CACHE_POLLING_MAX_RETRIES,
347
+ sleep: this.config.CACHE_POLLING_SLEEP_MS,
348
+ });
349
+ metricsTimer({ succeeded: String(!!response) });
350
+ if (response) {
351
+ logger.debug('Got a response from polling the cache, sending that back');
352
+ return response;
353
+ }
354
+ // Record polling mechanism failure to return response
355
+ transportMetrics.transportPollingFailureCount
356
+ .labels({ endpoint: req.requestContext.endpointName })
357
+ .inc();
358
+ logger.debug('Ran out of polling attempts, returning timeout');
359
+ throw new error_1.AdapterTimeoutError({
360
+ message: 'Timed out waiting for provider result.',
361
+ statusCode: 504,
362
+ });
363
+ }
184
364
  }
185
365
  exports.Adapter = Adapter;
186
366
  //# sourceMappingURL=basic.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"basic.js","sourceRoot":"","sources":["../../../src/adapter/basic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"basic.js","sourceRoot":"","sources":["../../../src/adapter/basic.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,17 @@
1
- import { SettingsMap } from '../config';
2
- import { Transport } from '../transports';
1
+ import { MetaTransport, Transport } from '../transports';
3
2
  import { InputParameters } from '../validation';
4
- import { AdapterEndpointParams, EndpointRateLimitingConfig } from './types';
5
3
  import { InputValidator } from '../validation/input-validator';
4
+ import { AdapterEndpointParams, EndpointGenerics, EndpointRateLimitingConfig } from './types';
6
5
  /**
7
6
  * Main class to represent an endpoint within an External Adapter
8
7
  */
9
- export declare class AdapterEndpoint<Params, Result, CustomSettings extends SettingsMap> implements AdapterEndpointParams<Params, Result, CustomSettings> {
8
+ export declare class AdapterEndpoint<T extends EndpointGenerics> implements AdapterEndpointParams<T> {
10
9
  name: string;
11
10
  aliases?: string[] | undefined;
12
- transport: Transport<Params, Result, CustomSettings>;
11
+ transport: Transport<T> | MetaTransport<T>;
13
12
  inputParameters: InputParameters;
14
13
  rateLimiting?: EndpointRateLimitingConfig | undefined;
15
14
  validator: InputValidator;
16
- constructor(params: AdapterEndpointParams<Params, Result, CustomSettings>);
15
+ cacheKeyGenerator?: (data: Record<string, unknown>) => string;
16
+ constructor(params: AdapterEndpointParams<T>);
17
17
  }
@@ -13,6 +13,7 @@ class AdapterEndpoint {
13
13
  this.inputParameters = params.inputParameters;
14
14
  this.rateLimiting = params.rateLimiting;
15
15
  this.validator = new input_validator_1.InputValidator(this.inputParameters);
16
+ this.cacheKeyGenerator = params.cacheKeyGenerator;
16
17
  }
17
18
  }
18
19
  exports.AdapterEndpoint = AdapterEndpoint;
@@ -1 +1 @@
1
- {"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/adapter/endpoint.ts"],"names":[],"mappings":";;;AAIA,mEAA8D;AAE9D;;GAEG;AACH,MAAa,eAAe;IAU1B,YAAY,MAA6D;QACvE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QAC7B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;QACjC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAA;QAC7C,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;QACvC,IAAI,CAAC,SAAS,GAAG,IAAI,gCAAc,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC3D,CAAC;CACF;AAlBD,0CAkBC"}
1
+ {"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/adapter/endpoint.ts"],"names":[],"mappings":";;;AAEA,mEAA8D;AAG9D;;GAEG;AACH,MAAa,eAAe;IAS1B,YAAY,MAAgC;QAC1C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QAC7B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;QACjC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAA;QAC7C,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;QACvC,IAAI,CAAC,SAAS,GAAG,IAAI,gCAAc,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACzD,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAA;IACnD,CAAC;CACF;AAlBD,0CAkBC"}
@@ -1,6 +1,7 @@
1
- import { Adapter, AdapterEndpointParams, AdapterParams } from './index';
2
- import { AdapterEndpoint } from './endpoint';
3
1
  import { SettingsMap } from '../config';
2
+ import { AdapterRequest, AdapterRequestContext, AdapterResponse, RequestGenerics } from '../util';
3
+ import { AdapterEndpoint } from './endpoint';
4
+ import { Adapter, AdapterEndpointParams, AdapterParams, EndpointGenerics } from './index';
4
5
  /**
5
6
  * Type for the base input parameter config that any [[PriceEndpoint]] must extend
6
7
  */
@@ -9,13 +10,13 @@ export declare type PriceEndpointInputParameters = {
9
10
  aliases: readonly ['from', 'coin', ...string[]];
10
11
  type: 'string';
11
12
  description: 'The symbol of symbols of the currency to query';
12
- required: true;
13
+ required: boolean;
13
14
  };
14
15
  quote: {
15
16
  aliases: readonly ['to', 'market', ...string[]];
16
17
  type: 'string';
17
18
  description: 'The symbol of the currency to convert to';
18
- required: true;
19
+ required: boolean;
19
20
  };
20
21
  };
21
22
  /**
@@ -25,23 +26,52 @@ export declare const priceEndpointInputParameters: PriceEndpointInputParameters;
25
26
  /**
26
27
  * Type for base input params for a PriceEndpoint
27
28
  */
28
- declare type PriceEndpointParams = {
29
+ export declare type PriceEndpointParams = {
29
30
  base: string;
30
31
  quote: string;
31
32
  };
33
+ /**
34
+ * Structure of an "includes" file.
35
+ * Include pairs describe an incoming price feed request, and the details specify
36
+ */
37
+ export declare type IncludesFile = IncludePair[];
38
+ declare type IncludeDetails = {
39
+ from: string;
40
+ to: string;
41
+ inverse: boolean;
42
+ };
43
+ declare type IncludePair = {
44
+ from: string;
45
+ to: string;
46
+ includes: IncludeDetails[];
47
+ };
48
+ declare type IncludesMap = Record<string, Record<string, IncludeDetails>>;
32
49
  /**
33
50
  * A PriceEndpoint is a specific type of AdapterEndpoint. Meant to comply with standard practices for
34
51
  * Data Feeds, its InputParameters must extend the basic ones (base/quote).
35
52
  */
36
- export declare class PriceEndpoint<Params extends PriceEndpointParams, ProviderResponseBody, CustomSettings extends SettingsMap> extends AdapterEndpoint<Params, ProviderResponseBody, CustomSettings> {
37
- constructor(params: AdapterEndpointParams<Params, ProviderResponseBody, CustomSettings> & {
53
+ export declare class PriceEndpoint<T extends EndpointGenerics> extends AdapterEndpoint<T> {
54
+ constructor(params: AdapterEndpointParams<T> & {
38
55
  inputParameters: PriceEndpointInputParameters;
39
56
  });
40
57
  }
58
+ declare type PriceAdapterRequest<T extends RequestGenerics> = AdapterRequest<T> & {
59
+ requestContext: AdapterRequestContext<T> & {
60
+ priceMeta: {
61
+ inverse: boolean;
62
+ };
63
+ };
64
+ };
41
65
  /**
42
66
  * A PriceAdapter is a specific kind of Adapter that includes at least one PriceEnpoint.
43
67
  */
44
68
  export declare class PriceAdapter<CustomSettings extends SettingsMap> extends Adapter<CustomSettings> {
45
- constructor(params: AdapterParams<CustomSettings>);
69
+ includesMap?: IncludesMap;
70
+ constructor(params: AdapterParams<CustomSettings> & {
71
+ includes?: IncludesFile;
72
+ });
73
+ handleRequest(req: PriceAdapterRequest<{
74
+ Params: PriceEndpointParams;
75
+ }>, replySent: Promise<unknown>): Promise<AdapterResponse>;
46
76
  }
47
77
  export {};
package/adapter/price.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PriceAdapter = exports.PriceEndpoint = exports.priceEndpointInputParameters = void 0;
4
- const index_1 = require("./index");
5
4
  const endpoint_1 = require("./endpoint");
5
+ const index_1 = require("./index");
6
6
  /**
7
7
  * Base input parameter config that any [[PriceEndpoint]] must extend
8
8
  */
@@ -30,6 +30,16 @@ class PriceEndpoint extends endpoint_1.AdapterEndpoint {
30
30
  }
31
31
  }
32
32
  exports.PriceEndpoint = PriceEndpoint;
33
+ const buildIncludesMap = (includesFile) => {
34
+ const includesMap = {};
35
+ for (const { from, to, includes } of includesFile) {
36
+ if (!includesMap[from]) {
37
+ includesMap[from] = {};
38
+ }
39
+ includesMap[from][to] = includes[0];
40
+ }
41
+ return includesMap;
42
+ };
33
43
  /**
34
44
  * A PriceAdapter is a specific kind of Adapter that includes at least one PriceEnpoint.
35
45
  */
@@ -40,6 +50,38 @@ class PriceAdapter extends index_1.Adapter {
40
50
  throw new Error(`This PriceAdapter's list of endpoints does not contain a valid PriceEndpoint`);
41
51
  }
42
52
  super(params);
53
+ if (params.includes) {
54
+ // Build includes map for constant lookups
55
+ this.includesMap = buildIncludesMap(params.includes);
56
+ const requestTransform = (req) => {
57
+ const priceRequest = req;
58
+ const requestData = priceRequest.requestContext.data;
59
+ const includesDetails = this.includesMap?.[requestData.base]?.[requestData.quote];
60
+ if (includesDetails) {
61
+ requestData.base = includesDetails.from || requestData.base;
62
+ requestData.quote = includesDetails.to || requestData.quote;
63
+ }
64
+ const inverse = includesDetails?.inverse || false;
65
+ priceRequest.requestContext.priceMeta = {
66
+ inverse,
67
+ };
68
+ };
69
+ this.requestTransforms?.push(requestTransform);
70
+ }
71
+ }
72
+ async handleRequest(req, replySent) {
73
+ const response = await super.handleRequest(req, replySent);
74
+ if (this.includesMap && req.requestContext.priceMeta.inverse) {
75
+ // We need to search in the reverse order (quote -> base) because the request transform will have inverted the pair
76
+ const inverseResult = 1 / response.result;
77
+ response.result = inverseResult;
78
+ // Check if response data has a result within it
79
+ const data = response.data;
80
+ if (data?.result) {
81
+ data.result = inverseResult;
82
+ }
83
+ }
84
+ return response;
43
85
  }
44
86
  }
45
87
  exports.PriceAdapter = PriceAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"price.js","sourceRoot":"","sources":["../../../src/adapter/price.ts"],"names":[],"mappings":";;;AAAA,mCAAuE;AACvE,yCAA4C;AAqB5C;;GAEG;AACU,QAAA,4BAA4B,GAAiC;IACxE,IAAI,EAAE;QACJ,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;QACzB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gDAAgD;QAC7D,QAAQ,EAAE,IAAI;KACf;IACD,KAAK,EAAE;QACL,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;QACzB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,0CAA0C;QACvD,QAAQ,EAAE,IAAI;KACf;CACF,CAAA;AAUD;;;GAGG;AACH,MAAa,aAIX,SAAQ,0BAA6D;IACrE,YACE,MAEC;QAED,KAAK,CAAC,MAAM,CAAC,CAAA;IACf,CAAC;CACF;AAZD,sCAYC;AAED;;GAEG;AACH,MAAa,YAAiD,SAAQ,eAAuB;IAC3F,YAAY,MAAqC;QAC/C,yDAAyD;QACzD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,aAAa,CAAC,EAAE;YAC7D,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAA;SACF;QAED,KAAK,CAAC,MAAM,CAAC,CAAA;IACf,CAAC;CACF;AAXD,oCAWC"}
1
+ {"version":3,"file":"price.js","sourceRoot":"","sources":["../../../src/adapter/price.ts"],"names":[],"mappings":"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"}