@chainlink/external-adapter-framework 0.8.1 → 0.9.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/adapter/basic.d.ts +6 -50
- package/adapter/basic.js +2 -165
- package/adapter/basic.js.map +1 -1
- package/adapter/endpoint.d.ts +6 -6
- package/adapter/endpoint.js +0 -1
- package/adapter/endpoint.js.map +1 -1
- package/adapter/price.d.ts +8 -38
- package/adapter/price.js +1 -43
- package/adapter/price.js.map +1 -1
- package/adapter/types.d.ts +14 -37
- package/background-executor.js +4 -19
- package/background-executor.js.map +1 -1
- package/cache/index.d.ts +16 -9
- package/cache/index.js +46 -4
- package/cache/index.js.map +1 -1
- package/config/index.d.ts +11 -19
- package/config/index.js +39 -54
- package/config/index.js.map +1 -1
- package/examples/bank-frick/accounts.d.ts +25 -17
- package/examples/bank-frick/accounts.js +13 -23
- package/examples/bank-frick/accounts.js.map +1 -1
- package/examples/bank-frick/config/index.d.ts +0 -5
- package/examples/bank-frick/config/index.js +0 -5
- package/examples/bank-frick/config/index.js.map +1 -1
- package/examples/bank-frick/index.d.ts +15 -1
- package/examples/bank-frick/index.js +1 -1
- package/examples/coingecko/src/config/index.d.ts +0 -7
- package/examples/coingecko/src/config/index.js +1 -8
- package/examples/coingecko/src/config/index.js.map +1 -1
- package/examples/coingecko/src/crypto-utils.d.ts +4 -19
- package/examples/coingecko/src/crypto-utils.js +2 -1
- package/examples/coingecko/src/crypto-utils.js.map +1 -1
- package/examples/coingecko/src/endpoint/coins.d.ts +3 -20
- 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 +4 -2
- 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 +3 -18
- package/examples/coingecko/src/global-utils.js.map +1 -1
- package/examples/coingecko/src/index.js +1 -3
- package/examples/coingecko/src/index.js.map +1 -1
- package/examples/coingecko-old/batch-warming.d.ts +7 -0
- package/examples/coingecko-old/batch-warming.js +54 -0
- package/examples/coingecko-old/batch-warming.js.map +1 -0
- package/examples/coingecko-old/index.d.ts +2 -0
- package/examples/coingecko-old/index.js +12 -0
- package/examples/coingecko-old/index.js.map +1 -0
- package/examples/coingecko-old/rest.d.ts +12 -0
- package/examples/coingecko-old/rest.js +55 -0
- package/examples/coingecko-old/rest.js.map +1 -0
- package/examples/cryptocompare/src/config/index.d.ts +0 -7
- package/examples/cryptocompare/src/config/index.js +1 -8
- package/examples/cryptocompare/src/config/index.js.map +1 -1
- package/examples/cryptocompare/src/endpoints/crypto.d.ts +2 -14
- package/examples/cryptocompare/src/endpoints/crypto.js.map +1 -1
- package/examples/cryptocompare/src/index.js +1 -3
- package/examples/cryptocompare/src/index.js.map +1 -1
- package/examples/genesis/config/index.d.ts +0 -5
- package/examples/genesis/config/index.js +0 -5
- package/examples/genesis/config/index.js.map +1 -1
- package/examples/genesis/index.js +1 -1
- package/examples/genesis/sseStream.d.ts +2 -13
- package/examples/genesis/sseStream.js +1 -4
- package/examples/genesis/sseStream.js.map +1 -1
- package/examples/ncfx/config/index.d.ts +12 -0
- package/examples/ncfx/config/index.js +16 -0
- package/examples/ncfx/config/index.js.map +1 -0
- package/examples/ncfx/index.d.ts +13 -0
- package/examples/ncfx/index.js +12 -0
- package/examples/ncfx/index.js.map +1 -0
- package/examples/ncfx/websocket.d.ts +47 -0
- package/examples/ncfx/websocket.js +74 -0
- package/examples/ncfx/websocket.js.map +1 -0
- package/index.d.ts +0 -1
- package/index.js +6 -4
- package/index.js.map +1 -1
- package/metrics/index.d.ts +0 -2
- package/metrics/index.js +4 -5
- package/metrics/index.js.map +1 -1
- package/metrics/util.d.ts +5 -5
- package/metrics/util.js.map +1 -1
- package/package.json +9 -7
- package/rate-limiting/background/fixed-frequency.d.ts +3 -2
- 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 +3 -2
- package/rate-limiting/request/simple-counting.js.map +1 -1
- package/transports/batch-warming.d.ts +17 -39
- package/transports/batch-warming.js +16 -43
- package/transports/batch-warming.js.map +1 -1
- package/transports/index.d.ts +31 -65
- package/transports/index.js +59 -2
- 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 -42
- package/transports/rest.js +25 -17
- package/transports/rest.js.map +1 -1
- package/transports/sse.d.ts +20 -40
- package/transports/sse.js +8 -10
- package/transports/sse.js.map +1 -1
- package/transports/websocket.d.ts +25 -40
- package/transports/websocket.js +16 -13
- package/transports/websocket.js.map +1 -1
- package/util/logger.d.ts +0 -2
- package/util/logger.js +7 -4
- package/util/logger.js.map +1 -1
- package/util/request.d.ts +10 -46
- 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 +0 -1
- package/util/test-payload-loader.js +1 -2
- package/util/test-payload-loader.js.map +1 -1
- package/validation/error.d.ts +3 -1
- package/validation/error.js +4 -2
- package/validation/error.js.map +1 -1
- package/validation/index.js +17 -26
- package/validation/index.js.map +1 -1
- package/validation/input-params.d.ts +1 -0
- package/validation/input-params.js +28 -0
- package/validation/input-params.js.map +1 -1
- package/validation/input-validator.js +2 -1
- package/validation/input-validator.js.map +1 -1
- package/validation/override-functions.d.ts +3 -0
- package/validation/override-functions.js +41 -0
- package/validation/override-functions.js.map +1 -0
- package/README.md +0 -67
- package/transports/routing.d.ts +0 -21
- package/transports/routing.js +0 -50
- package/transports/routing.js.map +0 -1
package/validation/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validation/index.ts"],"names":[],"mappings":";;;AAEA,oCAA4C;AAC5C,0CAAgD;AAChD,kCAAoC;AAEpC,mCAAyD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validation/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.baseInputParameters = void 0;
|
|
4
|
+
exports.baseInputParameters = {
|
|
5
|
+
endpoint: {
|
|
6
|
+
description: 'The External Adapter "endpoint" name to use.',
|
|
7
|
+
required: false,
|
|
8
|
+
type: 'string',
|
|
9
|
+
},
|
|
10
|
+
resultPath: {
|
|
11
|
+
description: 'The path to key into the API response the retrieve the result',
|
|
12
|
+
required: false,
|
|
13
|
+
// Type: 'string', TODO: Once multiple types are supported this could be string or array of strings
|
|
14
|
+
},
|
|
15
|
+
overrides: {
|
|
16
|
+
description: 'Override the mapping of token symbols to another token symbol',
|
|
17
|
+
required: false,
|
|
18
|
+
// Type: 'string', TODO: Once complex types are supported this could be { [adapter: string]: { [token: string]: string } }
|
|
19
|
+
},
|
|
20
|
+
tokenOverrides: {
|
|
21
|
+
description: 'Override the mapping of token symbols to smart contract address',
|
|
22
|
+
required: false,
|
|
23
|
+
// Type: 'string', TODO: Once complex types are supported this could be { [network: string]: { [token: string]: string } }
|
|
24
|
+
},
|
|
25
|
+
includes: {
|
|
26
|
+
description: 'Override the array of includes that holds additional input parameters when matching a pair of symbols',
|
|
27
|
+
required: false,
|
|
28
|
+
// Type: 'string', TODO: Once complex types are supported this could be { from: string, to: string, includes: [{ from: string, to: string, adapters: string[], inverse: boolean, tokens: boolean }] } }[]
|
|
29
|
+
},
|
|
30
|
+
};
|
|
3
31
|
//# sourceMappingURL=input-params.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-params.js","sourceRoot":"","sources":["../../../src/validation/input-params.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"input-params.js","sourceRoot":"","sources":["../../../src/validation/input-params.ts"],"names":[],"mappings":";;;AAkBa,QAAA,mBAAmB,GAAoB;IAClD,QAAQ,EAAE;QACR,WAAW,EAAE,8CAA8C;QAC3D,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,QAAQ;KACf;IACD,UAAU,EAAE;QACV,WAAW,EAAE,+DAA+D;QAC5E,QAAQ,EAAE,KAAK;QACf,mGAAmG;KACpG;IACD,SAAS,EAAE;QACT,WAAW,EAAE,+DAA+D;QAC5E,QAAQ,EAAE,KAAK;QACf,0HAA0H;KAC3H;IACD,cAAc,EAAE;QACd,WAAW,EAAE,iEAAiE;QAC9E,QAAQ,EAAE,KAAK;QACf,0HAA0H;KAC3H;IACD,QAAQ,EAAE;QACR,WAAW,EACT,uGAAuG;QACzG,QAAQ,EAAE,KAAK;QACf,yMAAyM;KAC1M;CACF,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.InputValidator = void 0;
|
|
4
|
+
const input_params_1 = require("./input-params");
|
|
4
5
|
const error_1 = require("./error");
|
|
5
6
|
const util_1 = require("../util");
|
|
6
7
|
class InputValidator {
|
|
@@ -11,7 +12,7 @@ class InputValidator {
|
|
|
11
12
|
this.throwInvalid = (message) => {
|
|
12
13
|
throw new error_1.AdapterInputError({ statusCode: 400, message });
|
|
13
14
|
};
|
|
14
|
-
this.inputConfig = { ...inputConfig };
|
|
15
|
+
this.inputConfig = { ...input_params_1.baseInputParameters, ...inputConfig };
|
|
15
16
|
this.validateInputParamsSchema();
|
|
16
17
|
}
|
|
17
18
|
validateInput(input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-validator.js","sourceRoot":"","sources":["../../../src/validation/input-validator.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"input-validator.js","sourceRoot":"","sources":["../../../src/validation/input-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.performSymbolOverrides = void 0;
|
|
4
|
+
const performSymbolOverrides = (adapter, req) => {
|
|
5
|
+
let adapterOverrides = {};
|
|
6
|
+
if (req.requestContext.data &&
|
|
7
|
+
req.requestContext.data['overrides'] &&
|
|
8
|
+
req.requestContext.data['overrides'][adapter.name]) {
|
|
9
|
+
adapterOverrides = req.requestContext.data['overrides'][adapter.name];
|
|
10
|
+
}
|
|
11
|
+
if (!Array.isArray(req.requestContext.data['base'])) {
|
|
12
|
+
// Perform overrides specified in the request payload
|
|
13
|
+
req.requestContext.data['base'] =
|
|
14
|
+
adapterOverrides[req.requestContext.data['base']] ?? req.requestContext.data['base'];
|
|
15
|
+
// Perform hardcoded overrides
|
|
16
|
+
if (adapter.overrides) {
|
|
17
|
+
req.requestContext.data['base'] =
|
|
18
|
+
adapter.overrides[req.requestContext.data['base']] ??
|
|
19
|
+
req.requestContext.data['base'];
|
|
20
|
+
}
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
let requestedSymbols = req.requestContext.data['base'];
|
|
24
|
+
for (let i = 0; i < requestedSymbols.length; i++) {
|
|
25
|
+
const symbol = requestedSymbols[i];
|
|
26
|
+
// Perform overrides specified in the request payload
|
|
27
|
+
let overriddenSymbol = adapterOverrides[symbol.toUpperCase()] ?? adapterOverrides[symbol.toLowerCase()];
|
|
28
|
+
// Perform hardcoded overrides
|
|
29
|
+
if (adapter.overrides) {
|
|
30
|
+
overriddenSymbol =
|
|
31
|
+
adapter.overrides[symbol.toUpperCase()] ??
|
|
32
|
+
adapter.overrides[symbol.toLowerCase()] ??
|
|
33
|
+
overriddenSymbol;
|
|
34
|
+
}
|
|
35
|
+
requestedSymbols[i] = overriddenSymbol ?? requestedSymbols[i];
|
|
36
|
+
}
|
|
37
|
+
requestedSymbols = requestedSymbols.length > 1 ? requestedSymbols : requestedSymbols[1];
|
|
38
|
+
req.requestContext.data['base'] = requestedSymbols;
|
|
39
|
+
};
|
|
40
|
+
exports.performSymbolOverrides = performSymbolOverrides;
|
|
41
|
+
//# sourceMappingURL=override-functions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"override-functions.js","sourceRoot":"","sources":["../../../src/validation/override-functions.ts"],"names":[],"mappings":";;;AAKO,MAAM,sBAAsB,GAAG,CAAC,OAAgB,EAAE,GAAmB,EAAE,EAAE;IAC9E,IAAI,gBAAgB,GAAG,EAA4B,CAAA;IACnD,IACE,GAAG,CAAC,cAAc,CAAC,IAAI;QACvB,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;QACnC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAe,CAAC,OAAO,CAAC,IAAI,CAAC,EACjE;QACA,gBAAgB,GAAI,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;KACrF;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;QACnD,qDAAqD;QACrD,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAC7B,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAW,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAChG,8BAA8B;QAC9B,IAAI,OAAO,CAAC,SAAS,EAAE;YACrB,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC7B,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAW,CAAC;oBAC5D,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;SAClC;QACD,OAAM;KACP;IACD,IAAI,gBAAgB,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;QAClC,qDAAqD;QACrD,IAAI,gBAAgB,GAClB,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;QAClF,8BAA8B;QAC9B,IAAI,OAAO,CAAC,SAAS,EAAE;YACrB,gBAAgB;gBACd,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;oBACvC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;oBACvC,gBAAgB,CAAA;SACnB;QACD,gBAAgB,CAAC,CAAC,CAAC,GAAG,gBAAgB,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAA;KAC9D;IACD,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;IACvF,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAA;AACpD,CAAC,CAAA;AAtCY,QAAA,sBAAsB,0BAsClC"}
|
package/README.md
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
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"`.
|
package/transports/routing.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { AdapterDependencies } from '../adapter';
|
|
2
|
-
import { AdapterConfig } from '../config';
|
|
3
|
-
import { AdapterRequest, AdapterResponse } from '../util/request';
|
|
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
|
-
private resolveTransport;
|
|
20
|
-
foregroundExecute(req: AdapterRequest<T['Request']>, adapterConfig: AdapterConfig<T['CustomSettings']>): Promise<AdapterResponse<any> | void>;
|
|
21
|
-
}
|
package/transports/routing.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
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
|
-
resolveTransport(req, adapterConfig) {
|
|
29
|
-
logger.debug(`routing request using`, req.params);
|
|
30
|
-
const key = this.route(req, adapterConfig || undefined);
|
|
31
|
-
if (!this.transports[key]) {
|
|
32
|
-
throw new error_1.AdapterError({ statusCode: 400, message: `No transport found for ${key}` });
|
|
33
|
-
}
|
|
34
|
-
const transport = this.transports[key];
|
|
35
|
-
logger.debug(`Found ${transport.constructor.name} corresponding to ${key}`);
|
|
36
|
-
return transport;
|
|
37
|
-
}
|
|
38
|
-
// Allow AdapterResponse<any> below since we don't know what the adapter will return
|
|
39
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
40
|
-
async foregroundExecute(req, adapterConfig) {
|
|
41
|
-
const transport = this.resolveTransport(req, adapterConfig);
|
|
42
|
-
if (transport.foregroundExecute) {
|
|
43
|
-
logger.debug(`Running foregroundExecute on retrieved transport`);
|
|
44
|
-
return transport.foregroundExecute(req, adapterConfig);
|
|
45
|
-
}
|
|
46
|
-
logger.debug(`Retrieved transport doesn't implement foregroundExecute`);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
exports.RoutingTransport = RoutingTransport;
|
|
50
|
-
//# sourceMappingURL=routing.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../src/transports/routing.ts"],"names":[],"mappings":";;;AAEA,kCAAoC;AAEpC,+CAAkD;AAGlD,MAAM,MAAM,GAAG,IAAA,iBAAU,EAAC,kBAAkB,CAAC,CAAA;AAE7C;;;;GAIG;AACH,MAAa,gBAAgB;IAI3B;IACE,6GAA6G;IACtG,UAA2C;IAElD,+FAA+F;IACvF,KAGG;QANJ,eAAU,GAAV,UAAU,CAAiC;QAG1C,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;IAEO,gBAAgB,CACtB,GAAiC,EACjC,aAAkD;QAElD,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;QACjD,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,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;AAtDD,4CAsDC"}
|