@chainlink/external-adapter-framework 0.0.12 → 0.0.15
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/.eslintignore +1 -0
- package/.github/README.MD +35 -10
- package/.github/workflows/label.yaml +39 -0
- package/.github/workflows/publish.yaml +0 -3
- package/dist/examples/coingecko/test/e2e/adapter.test.ts.js +82953 -0
- package/dist/examples/coingecko/test/integration/adapter.test.ts.js +91672 -0
- package/dist/main.js +72703 -0
- package/jest.config.js +5 -0
- package/package.json +14 -3
- package/src/config/provider-limits.ts +14 -17
- package/src/examples/coingecko/src/config/index.ts +12 -0
- package/src/examples/coingecko/src/config/overrides.json +10826 -0
- package/src/examples/coingecko/src/cryptoUtils.ts +88 -0
- package/src/examples/coingecko/src/endpoint/coins.ts +54 -0
- package/src/examples/coingecko/src/endpoint/crypto-marketcap.ts +66 -0
- package/src/examples/coingecko/src/endpoint/crypto-volume.ts +66 -0
- package/src/examples/coingecko/src/endpoint/crypto.ts +63 -0
- package/src/examples/coingecko/src/endpoint/dominance.ts +40 -0
- package/src/examples/coingecko/src/endpoint/global-marketcap.ts +40 -0
- package/src/examples/coingecko/src/endpoint/index.ts +6 -0
- package/src/examples/coingecko/src/globalUtils.ts +78 -0
- package/src/examples/coingecko/src/index.ts +17 -0
- package/src/examples/coingecko/test/e2e/adapter.test.ts +278 -0
- package/src/examples/coingecko/test/integration/__snapshots__/adapter.test.ts.snap +15 -0
- package/src/examples/coingecko/test/integration/adapter.test.ts +281 -0
- package/src/examples/coingecko/test/integration/capturedRequests.json +1 -0
- package/src/examples/coingecko/test/integration/fixtures.ts +42 -0
- package/src/examples/{coingecko → coingecko-old}/batch-warming.ts +1 -0
- package/src/examples/{coingecko → coingecko-old}/index.ts +0 -0
- package/src/examples/{coingecko → coingecko-old}/rest.ts +0 -0
- package/src/transports/batch-warming.ts +7 -2
- package/src/transports/rest.ts +5 -1
- package/src/util/index.ts +1 -0
- package/src/util/recordRequests.ts +47 -0
- package/src/validation/overrideFunctions.ts +44 -0
- package/test/metrics/warmer-metrics.test.ts +1 -0
- package/test/{smoke.test.ts → smoke/smoke.test.ts} +13 -13
- package/{test-payload-fail.json → test/smoke/test-payload-fail.json} +0 -0
- package/{test-payload.js → test/smoke/test-payload.js} +0 -0
- package/{test-payload.json → test/smoke/test-payload.json} +0 -0
- package/test/transports/batch.test.ts +1 -0
- package/tsconfig.json +4 -1
- package/webpack.config.js +39 -5
- package/yarn-error.log +3778 -0
- package/dist/src/adapter.d.ts +0 -135
- package/dist/src/adapter.js +0 -145
- package/dist/src/background-executor.d.ts +0 -11
- package/dist/src/background-executor.js +0 -45
- package/dist/src/cache/factory.d.ts +0 -6
- package/dist/src/cache/factory.js +0 -55
- package/dist/src/cache/index.d.ts +0 -94
- package/dist/src/cache/index.js +0 -173
- package/dist/src/cache/local.d.ts +0 -23
- package/dist/src/cache/local.js +0 -83
- package/dist/src/cache/metrics.d.ts +0 -27
- package/dist/src/cache/metrics.js +0 -120
- package/dist/src/cache/redis.d.ts +0 -16
- package/dist/src/cache/redis.js +0 -100
- package/dist/src/chainlink-external-adapter-framework-0.0.6.tgz +0 -0
- package/dist/src/config/index.d.ts +0 -214
- package/dist/src/config/index.js +0 -380
- package/dist/src/config/provider-limits.d.ts +0 -31
- package/dist/src/config/provider-limits.js +0 -75
- package/dist/src/examples/bank-frick/accounts.d.ts +0 -39
- package/dist/src/examples/bank-frick/accounts.js +0 -192
- package/dist/src/examples/bank-frick/config/index.d.ts +0 -4
- package/dist/src/examples/bank-frick/config/index.js +0 -54
- package/dist/src/examples/bank-frick/index.d.ts +0 -2
- package/dist/src/examples/bank-frick/index.js +0 -15
- package/dist/src/examples/bank-frick/util.d.ts +0 -4
- package/dist/src/examples/bank-frick/util.js +0 -39
- package/dist/src/examples/coingecko/batch-warming.d.ts +0 -7
- package/dist/src/examples/coingecko/batch-warming.js +0 -53
- package/dist/src/examples/coingecko/index.d.ts +0 -2
- package/dist/src/examples/coingecko/index.js +0 -11
- package/dist/src/examples/coingecko/rest.d.ts +0 -12
- package/dist/src/examples/coingecko/rest.js +0 -51
- package/dist/src/examples/ncfx/config/index.d.ts +0 -12
- package/dist/src/examples/ncfx/config/index.js +0 -15
- package/dist/src/examples/ncfx/index.d.ts +0 -13
- package/dist/src/examples/ncfx/index.js +0 -11
- package/dist/src/examples/ncfx/websocket.d.ts +0 -47
- package/dist/src/examples/ncfx/websocket.js +0 -73
- package/dist/src/index.d.ts +0 -11
- package/dist/src/index.js +0 -128
- package/dist/src/metrics/constants.d.ts +0 -16
- package/dist/src/metrics/constants.js +0 -25
- package/dist/src/metrics/index.d.ts +0 -15
- package/dist/src/metrics/index.js +0 -122
- package/dist/src/metrics/util.d.ts +0 -7
- package/dist/src/metrics/util.js +0 -9
- package/dist/src/package/adapter.d.ts +0 -88
- package/dist/src/package/adapter.js +0 -112
- package/dist/src/package/background-executor.d.ts +0 -11
- package/dist/src/package/background-executor.js +0 -45
- package/dist/src/package/cache/factory.d.ts +0 -6
- package/dist/src/package/cache/factory.js +0 -57
- package/dist/src/package/cache/index.d.ts +0 -90
- package/dist/src/package/cache/index.js +0 -169
- package/dist/src/package/cache/local.d.ts +0 -23
- package/dist/src/package/cache/local.js +0 -83
- package/dist/src/package/cache/metrics.d.ts +0 -27
- package/dist/src/package/cache/metrics.js +0 -120
- package/dist/src/package/cache/redis.d.ts +0 -16
- package/dist/src/package/cache/redis.js +0 -100
- package/dist/src/package/config/index.d.ts +0 -195
- package/dist/src/package/config/index.js +0 -365
- package/dist/src/package/config/provider-limits.d.ts +0 -31
- package/dist/src/package/config/provider-limits.js +0 -76
- package/dist/src/package/examples/coingecko/batch-warming.d.ts +0 -2
- package/dist/src/package/examples/coingecko/batch-warming.js +0 -52
- package/dist/src/package/examples/coingecko/index.d.ts +0 -2
- package/dist/src/package/examples/coingecko/index.js +0 -10
- package/dist/src/package/examples/coingecko/rest.d.ts +0 -2
- package/dist/src/package/examples/coingecko/rest.js +0 -50
- package/dist/src/package/examples/ncfx/config/index.d.ts +0 -12
- package/dist/src/package/examples/ncfx/config/index.js +0 -15
- package/dist/src/package/examples/ncfx/index.d.ts +0 -2
- package/dist/src/package/examples/ncfx/index.js +0 -10
- package/dist/src/package/examples/ncfx/websocket.d.ts +0 -36
- package/dist/src/package/examples/ncfx/websocket.js +0 -72
- package/dist/src/package/index.d.ts +0 -12
- package/dist/src/package/index.js +0 -92
- package/dist/src/package/metrics/constants.d.ts +0 -16
- package/dist/src/package/metrics/constants.js +0 -25
- package/dist/src/package/metrics/index.d.ts +0 -15
- package/dist/src/package/metrics/index.js +0 -123
- package/dist/src/package/metrics/util.d.ts +0 -3
- package/dist/src/package/metrics/util.js +0 -9
- package/dist/src/package/package.json +0 -72
- package/dist/src/package/rate-limiting/background/fixed-frequency.d.ts +0 -10
- package/dist/src/package/rate-limiting/background/fixed-frequency.js +0 -37
- package/dist/src/package/rate-limiting/index.d.ts +0 -54
- package/dist/src/package/rate-limiting/index.js +0 -63
- package/dist/src/package/rate-limiting/metrics.d.ts +0 -3
- package/dist/src/package/rate-limiting/metrics.js +0 -44
- package/dist/src/package/rate-limiting/request/simple-counting.d.ts +0 -20
- package/dist/src/package/rate-limiting/request/simple-counting.js +0 -62
- package/dist/src/package/test.d.ts +0 -1
- package/dist/src/package/test.js +0 -6
- package/dist/src/package/transports/batch-warming.d.ts +0 -34
- package/dist/src/package/transports/batch-warming.js +0 -101
- package/dist/src/package/transports/index.d.ts +0 -87
- package/dist/src/package/transports/index.js +0 -87
- package/dist/src/package/transports/metrics.d.ts +0 -21
- package/dist/src/package/transports/metrics.js +0 -105
- package/dist/src/package/transports/rest.d.ts +0 -43
- package/dist/src/package/transports/rest.js +0 -129
- package/dist/src/package/transports/util.d.ts +0 -8
- package/dist/src/package/transports/util.js +0 -85
- package/dist/src/package/transports/websocket.d.ts +0 -80
- package/dist/src/package/transports/websocket.js +0 -169
- package/dist/src/package/util/expiring-sorted-set.d.ts +0 -21
- package/dist/src/package/util/expiring-sorted-set.js +0 -47
- package/dist/src/package/util/index.d.ts +0 -11
- package/dist/src/package/util/index.js +0 -35
- package/dist/src/package/util/logger.d.ts +0 -42
- package/dist/src/package/util/logger.js +0 -62
- package/dist/src/package/util/request.d.ts +0 -55
- package/dist/src/package/util/request.js +0 -2
- package/dist/src/package/validation/error.d.ts +0 -50
- package/dist/src/package/validation/error.js +0 -79
- package/dist/src/package/validation/index.d.ts +0 -5
- package/dist/src/package/validation/index.js +0 -86
- package/dist/src/package/validation/input-params.d.ts +0 -15
- package/dist/src/package/validation/input-params.js +0 -30
- package/dist/src/package/validation/override-functions.d.ts +0 -3
- package/dist/src/package/validation/override-functions.js +0 -40
- package/dist/src/package/validation/preset-tokens.json +0 -23
- package/dist/src/package/validation/validator.d.ts +0 -47
- package/dist/src/package/validation/validator.js +0 -303
- package/dist/src/package.json +0 -72
- package/dist/src/rate-limiting/background/fixed-frequency.d.ts +0 -11
- package/dist/src/rate-limiting/background/fixed-frequency.js +0 -35
- package/dist/src/rate-limiting/index.d.ts +0 -55
- package/dist/src/rate-limiting/index.js +0 -63
- package/dist/src/rate-limiting/metrics.d.ts +0 -3
- package/dist/src/rate-limiting/metrics.js +0 -44
- package/dist/src/rate-limiting/request/simple-counting.d.ts +0 -21
- package/dist/src/rate-limiting/request/simple-counting.js +0 -62
- package/dist/src/test.d.ts +0 -1
- package/dist/src/test.js +0 -6
- package/dist/src/transports/batch-warming.d.ts +0 -35
- package/dist/src/transports/batch-warming.js +0 -101
- package/dist/src/transports/index.d.ts +0 -70
- package/dist/src/transports/index.js +0 -87
- package/dist/src/transports/metrics.d.ts +0 -22
- package/dist/src/transports/metrics.js +0 -105
- package/dist/src/transports/rest.d.ts +0 -44
- package/dist/src/transports/rest.js +0 -131
- package/dist/src/transports/util.d.ts +0 -8
- package/dist/src/transports/util.js +0 -85
- package/dist/src/transports/websocket.d.ts +0 -80
- package/dist/src/transports/websocket.js +0 -166
- package/dist/src/util/expiring-sorted-set.d.ts +0 -21
- package/dist/src/util/expiring-sorted-set.js +0 -47
- package/dist/src/util/index.d.ts +0 -12
- package/dist/src/util/index.js +0 -35
- package/dist/src/util/logger.d.ts +0 -42
- package/dist/src/util/logger.js +0 -62
- package/dist/src/util/request.d.ts +0 -57
- package/dist/src/util/request.js +0 -2
- package/dist/src/util/subscription-set/expiring-sorted-set.d.ts +0 -22
- package/dist/src/util/subscription-set/expiring-sorted-set.js +0 -47
- package/dist/src/util/subscription-set/subscription-set.d.ts +0 -18
- package/dist/src/util/subscription-set/subscription-set.js +0 -19
- package/dist/src/util/test-payload-loader.d.ts +0 -25
- package/dist/src/util/test-payload-loader.js +0 -83
- package/dist/src/validation/error.d.ts +0 -50
- package/dist/src/validation/error.js +0 -79
- package/dist/src/validation/index.d.ts +0 -5
- package/dist/src/validation/index.js +0 -91
- package/dist/src/validation/input-params.d.ts +0 -15
- package/dist/src/validation/input-params.js +0 -30
- package/dist/src/validation/override-functions.d.ts +0 -3
- package/dist/src/validation/override-functions.js +0 -40
- package/dist/src/validation/preset-tokens.json +0 -23
- package/dist/src/validation/validator.d.ts +0 -47
- package/dist/src/validation/validator.js +0 -303
- package/src/test.ts +0 -5
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import nock from 'nock'
|
|
2
|
+
import capturedRequests from './capturedRequests.json'
|
|
3
|
+
|
|
4
|
+
type RecordedRequest = Record<
|
|
5
|
+
string,
|
|
6
|
+
{ statusCode: number; response: unknown; method: string; path: string }[]
|
|
7
|
+
>
|
|
8
|
+
|
|
9
|
+
// This is a generic fixture file that can be copy-pasted to generate fixtures from a
|
|
10
|
+
// capturedRequests.json file. To generate a capturedRequests.json file,
|
|
11
|
+
// set env var RECORD=true and run e2e tests.
|
|
12
|
+
export const createMocks = (): nock.Scope[] => {
|
|
13
|
+
const mocks: nock.Scope[] = []
|
|
14
|
+
for (const baseUrl in capturedRequests) {
|
|
15
|
+
const mock = nock(baseUrl, { encodedQueryParams: true })
|
|
16
|
+
for (const request of (capturedRequests as RecordedRequest)[baseUrl]) {
|
|
17
|
+
if (request.method === 'GET') {
|
|
18
|
+
mock
|
|
19
|
+
.get((uri: string) => {
|
|
20
|
+
const deconstructedRequestUrl = uri.split(/[?=,&]+/)
|
|
21
|
+
const deconstructedMockUrl = request.path.split(/[?=,&]+/)
|
|
22
|
+
return (
|
|
23
|
+
deconstructedRequestUrl.sort().join(',') === deconstructedMockUrl.sort().join(',')
|
|
24
|
+
)
|
|
25
|
+
})
|
|
26
|
+
.times(100)
|
|
27
|
+
.reply(request.statusCode, () => request.response, [
|
|
28
|
+
'Content-Type',
|
|
29
|
+
'application/json',
|
|
30
|
+
'Connection',
|
|
31
|
+
'close',
|
|
32
|
+
'Vary',
|
|
33
|
+
'Accept-Encoding',
|
|
34
|
+
'Vary',
|
|
35
|
+
'Origin',
|
|
36
|
+
])
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
mocks.push(mock)
|
|
40
|
+
}
|
|
41
|
+
return mocks
|
|
42
|
+
}
|
|
@@ -56,6 +56,7 @@ const batchEndpointTransport = new BatchWarmingTransport({
|
|
|
56
56
|
}
|
|
57
57
|
},
|
|
58
58
|
parseResponse: (
|
|
59
|
+
params: AdapterRequestParams[],
|
|
59
60
|
res: AxiosResponse<ProviderResponseBody>,
|
|
60
61
|
): ProviderResult<AdapterRequestParams>[] => {
|
|
61
62
|
const entries = [] as ProviderResult<AdapterRequestParams>[]
|
|
File without changes
|
|
File without changes
|
|
@@ -2,7 +2,7 @@ import { AxiosRequestConfig, AxiosResponse } from 'axios'
|
|
|
2
2
|
import { Cache } from '../cache'
|
|
3
3
|
import { AdapterConfig, SettingsMap } from '../config'
|
|
4
4
|
import { BackgroundExecuteRateLimiter } from '../rate-limiting'
|
|
5
|
-
import { makeLogger, SubscriptionSet } from '../util'
|
|
5
|
+
import { makeLogger, recordRequests, SubscriptionSet } from '../util'
|
|
6
6
|
import { AdapterRequest, ProviderResult } from '../util/request'
|
|
7
7
|
import { Transport, buildCacheEntriesFromResults } from './'
|
|
8
8
|
import { axiosRequest } from './util'
|
|
@@ -48,6 +48,7 @@ export class BatchWarmingTransport<
|
|
|
48
48
|
context: AdapterContext<CustomSettings>,
|
|
49
49
|
) => AxiosRequestConfig<ProviderRequestBody>
|
|
50
50
|
parseResponse: (
|
|
51
|
+
params: AdapterParams[],
|
|
51
52
|
res: AxiosResponse<ProviderResponseBody>,
|
|
52
53
|
context: AdapterContext<CustomSettings>,
|
|
53
54
|
) => ProviderResult<AdapterParams>[]
|
|
@@ -101,8 +102,12 @@ export class BatchWarmingTransport<
|
|
|
101
102
|
logger.trace('Sending request to data provider...')
|
|
102
103
|
const providerResponse = await axiosRequest<ProviderRequestBody, ProviderResponseBody>(request)
|
|
103
104
|
|
|
105
|
+
if (process.env['RECORD'] === 'true') {
|
|
106
|
+
recordRequests(request, providerResponse)
|
|
107
|
+
}
|
|
108
|
+
|
|
104
109
|
logger.debug(`Got response from provider, parsing (raw body: ${providerResponse.data})`)
|
|
105
|
-
const results = this.config.parseResponse(providerResponse, context)
|
|
110
|
+
const results = this.config.parseResponse(entries, providerResponse, context)
|
|
106
111
|
const adapterResponses = buildCacheEntriesFromResults(results, context)
|
|
107
112
|
|
|
108
113
|
logger.debug('Setting adapter responses in cache')
|
package/src/transports/rest.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { AdapterRequest, AdapterResponse } from '../util/request'
|
|
|
2
2
|
import { Transport } from './'
|
|
3
3
|
import { Cache } from '../cache'
|
|
4
4
|
import { AxiosRequestConfig, AxiosResponse } from 'axios'
|
|
5
|
-
import { makeLogger, sleep } from '../util'
|
|
5
|
+
import { makeLogger, recordRequests, sleep } from '../util'
|
|
6
6
|
import { AdapterConfig, SettingsMap } from '../config'
|
|
7
7
|
import { RequestRateLimiter } from '../rate-limiting'
|
|
8
8
|
import { AdapterError } from '../validation/error'
|
|
@@ -124,6 +124,10 @@ export class RestTransport<
|
|
|
124
124
|
logger.trace('Sending request to data provider...')
|
|
125
125
|
const providerResponse = await axiosRequest<ProviderRequestBody, ProviderResponseBody>(request)
|
|
126
126
|
|
|
127
|
+
if (process.env['RECORD'] === 'true') {
|
|
128
|
+
recordRequests(request, providerResponse)
|
|
129
|
+
}
|
|
130
|
+
|
|
127
131
|
logger.debug(`Got response from provider, parsing (raw body: ${providerResponse.data})`) // TODO: Sensitive data?
|
|
128
132
|
const parsedResponse = await this.config.parseResponse(req, providerResponse, config)
|
|
129
133
|
|
package/src/util/index.ts
CHANGED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import { AxiosRequestConfig, AxiosResponse } from 'axios'
|
|
3
|
+
|
|
4
|
+
export const recordRequests = (
|
|
5
|
+
requestConfig: AxiosRequestConfig<unknown>,
|
|
6
|
+
providerResponse: AxiosResponse<unknown, unknown>,
|
|
7
|
+
) => {
|
|
8
|
+
let recordedRequests: Record<
|
|
9
|
+
string,
|
|
10
|
+
{ method: string; path: string; data?: unknown; response: unknown; statusCode: number }[]
|
|
11
|
+
> = {}
|
|
12
|
+
try {
|
|
13
|
+
recordedRequests = JSON.parse(fs.readFileSync('capturedRequests.json').toString())
|
|
14
|
+
} catch {} // eslint-disable-line no-empty
|
|
15
|
+
let baseUrl = requestConfig.baseURL as string
|
|
16
|
+
baseUrl =
|
|
17
|
+
nthIndexOf(baseUrl, '/', 3) === -1 ? baseUrl : baseUrl.slice(0, nthIndexOf(baseUrl, '/', 3))
|
|
18
|
+
const recordedRequest = {
|
|
19
|
+
method: requestConfig.method as string,
|
|
20
|
+
path: providerResponse.request.path,
|
|
21
|
+
data: requestConfig.data,
|
|
22
|
+
response: providerResponse.data,
|
|
23
|
+
statusCode: providerResponse.status,
|
|
24
|
+
}
|
|
25
|
+
if (!recordedRequests[baseUrl]) {
|
|
26
|
+
recordedRequests[baseUrl] = [recordedRequest]
|
|
27
|
+
} else if (
|
|
28
|
+
recordedRequests[baseUrl].every((r) => {
|
|
29
|
+
return r.path !== recordedRequest.path
|
|
30
|
+
})
|
|
31
|
+
) {
|
|
32
|
+
recordedRequests[baseUrl].push(recordedRequest)
|
|
33
|
+
}
|
|
34
|
+
fs.writeFileSync('capturedRequests.json', JSON.stringify(recordedRequests))
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const nthIndexOf = (input: string, match: string, n: number) => {
|
|
38
|
+
let i = -1
|
|
39
|
+
let n_ = n
|
|
40
|
+
while (n_-- && i++ < input.length) {
|
|
41
|
+
i = input.indexOf(match, i)
|
|
42
|
+
if (i < 0) {
|
|
43
|
+
break
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return i
|
|
47
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { InitializedAdapter } from '../adapter'
|
|
2
|
+
import { AdapterRequest } from '../util/request'
|
|
3
|
+
|
|
4
|
+
type Overrides = Record<string, Record<string, string>>
|
|
5
|
+
|
|
6
|
+
export const performSymbolOverrides = (adapter: InitializedAdapter, req: AdapterRequest) => {
|
|
7
|
+
let adapterOverrides = {} as Record<string, string>
|
|
8
|
+
if (
|
|
9
|
+
req.requestContext.data &&
|
|
10
|
+
req.requestContext.data['overrides'] &&
|
|
11
|
+
(req.requestContext.data['overrides'] as Overrides)[adapter.name]
|
|
12
|
+
) {
|
|
13
|
+
adapterOverrides = (req.requestContext.data['overrides'] as Overrides)[adapter.name]
|
|
14
|
+
}
|
|
15
|
+
if (!Array.isArray(req.requestContext.data['base'])) {
|
|
16
|
+
// Perform overrides specified in the request payload
|
|
17
|
+
req.requestContext.data['base'] =
|
|
18
|
+
adapterOverrides[req.requestContext.data['base'] as string] ?? req.requestContext.data['base']
|
|
19
|
+
// Perform hardcoded overrides
|
|
20
|
+
if (adapter.overrides) {
|
|
21
|
+
req.requestContext.data['base'] =
|
|
22
|
+
adapter.overrides[req.requestContext.data['base'] as string] ??
|
|
23
|
+
req.requestContext.data['base']
|
|
24
|
+
}
|
|
25
|
+
return
|
|
26
|
+
}
|
|
27
|
+
let requestedSymbols = req.requestContext.data['base']
|
|
28
|
+
for (let i = 0; i < requestedSymbols.length; i++) {
|
|
29
|
+
const symbol = requestedSymbols[i]
|
|
30
|
+
// Perform overrides specified in the request payload
|
|
31
|
+
let overriddenSymbol =
|
|
32
|
+
adapterOverrides[symbol.toUpperCase()] ?? adapterOverrides[symbol.toLowerCase()]
|
|
33
|
+
// Perform hardcoded overrides
|
|
34
|
+
if (adapter.overrides) {
|
|
35
|
+
overriddenSymbol =
|
|
36
|
+
adapter.overrides[symbol.toUpperCase()] ??
|
|
37
|
+
adapter.overrides[symbol.toLowerCase()] ??
|
|
38
|
+
overriddenSymbol
|
|
39
|
+
}
|
|
40
|
+
requestedSymbols[i] = overriddenSymbol ?? requestedSymbols[i]
|
|
41
|
+
}
|
|
42
|
+
requestedSymbols = requestedSymbols.length > 1 ? requestedSymbols : requestedSymbols[1]
|
|
43
|
+
req.requestContext.data['base'] = requestedSymbols
|
|
44
|
+
}
|
|
@@ -96,6 +96,7 @@ class MockBatchWarmingTransport extends BatchWarmingTransport<
|
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
parseResponse: (
|
|
99
|
+
params: AdapterRequestParams[],
|
|
99
100
|
res: AxiosResponse<ProviderResponseBody>,
|
|
100
101
|
): ProviderResult<AdapterRequestParams>[] => {
|
|
101
102
|
return res.data.prices.map((p) => {
|
|
@@ -2,12 +2,12 @@ import untypedTest, { TestFn } from 'ava'
|
|
|
2
2
|
import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'
|
|
3
3
|
import { AddressInfo } from 'net'
|
|
4
4
|
import nock from 'nock'
|
|
5
|
-
import { expose } from '
|
|
6
|
-
import { Adapter, AdapterEndpoint } from '
|
|
7
|
-
import { EmptySettings } from '
|
|
8
|
-
import { RestTransport } from '
|
|
9
|
-
import { AdapterRequest, AdapterResponse } from '
|
|
10
|
-
import { loadTestPayload } from '
|
|
5
|
+
import { expose } from '../../src'
|
|
6
|
+
import { Adapter, AdapterEndpoint } from '../../src/adapter'
|
|
7
|
+
import { EmptySettings } from '../../src/config'
|
|
8
|
+
import { RestTransport } from '../../src/transports'
|
|
9
|
+
import { AdapterRequest, AdapterResponse } from '../../src/util'
|
|
10
|
+
import { loadTestPayload } from '../../src/util/test-payload-loader'
|
|
11
11
|
|
|
12
12
|
const test = untypedTest as TestFn
|
|
13
13
|
|
|
@@ -99,7 +99,7 @@ const quote = 'USD'
|
|
|
99
99
|
const price = 1234
|
|
100
100
|
|
|
101
101
|
test('Test payload loader static', async (t) => {
|
|
102
|
-
const testPayload = loadTestPayload('test-payload.json')
|
|
102
|
+
const testPayload = loadTestPayload('test/smoke/test-payload.json')
|
|
103
103
|
if (testPayload.isDefault) {
|
|
104
104
|
t.fail('Test payload loader return isDefault request unexpectedly')
|
|
105
105
|
return
|
|
@@ -108,7 +108,7 @@ test('Test payload loader static', async (t) => {
|
|
|
108
108
|
})
|
|
109
109
|
|
|
110
110
|
test('Test payload loader dynamic', async (t) => {
|
|
111
|
-
const testPayload = loadTestPayload('test-payload.js')
|
|
111
|
+
const testPayload = loadTestPayload('test/smoke/test-payload.js')
|
|
112
112
|
if (testPayload.isDefault) {
|
|
113
113
|
t.fail('Test payload loader return isDefault request unexpectedly')
|
|
114
114
|
return
|
|
@@ -119,13 +119,13 @@ test('Test payload loader dynamic', async (t) => {
|
|
|
119
119
|
t.deepEqual(testPayload.requests[3], { from: 'BTC', to: 'JPY' })
|
|
120
120
|
})
|
|
121
121
|
|
|
122
|
-
test('Test payload loader bad file name', async (t) => {
|
|
123
|
-
const testPayload = loadTestPayload('test-payload-bad.json')
|
|
124
|
-
t.is(testPayload.isDefault,
|
|
122
|
+
test.only('Test payload loader bad file name', async (t) => {
|
|
123
|
+
const testPayload = loadTestPayload('test/smoke/test-payload-bad.json')
|
|
124
|
+
t.is(testPayload.isDefault, true)
|
|
125
125
|
})
|
|
126
126
|
|
|
127
127
|
test.serial('Test smoke endpoint success', async (t) => {
|
|
128
|
-
process.env['SMOKE_TEST_PAYLOAD_FILE_NAME'] = 'test-payload.json'
|
|
128
|
+
process.env['SMOKE_TEST_PAYLOAD_FILE_NAME'] = 'test/smoke/test-payload.json'
|
|
129
129
|
const server = await expose(adapter)
|
|
130
130
|
if (!server) {
|
|
131
131
|
throw 'Server did not start'
|
|
@@ -150,7 +150,7 @@ test.serial('Test smoke endpoint success', async (t) => {
|
|
|
150
150
|
})
|
|
151
151
|
|
|
152
152
|
test.serial('Test smoke endpoint failure', async (t) => {
|
|
153
|
-
process.env['SMOKE_TEST_PAYLOAD_FILE_NAME'] = 'test-payload-fail.json'
|
|
153
|
+
process.env['SMOKE_TEST_PAYLOAD_FILE_NAME'] = 'test/smoke/test-payload-fail.json'
|
|
154
154
|
const server = await expose(adapter)
|
|
155
155
|
if (!server) {
|
|
156
156
|
throw 'Server did not start'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -75,6 +75,7 @@ class MockBatchWarmingTransport extends BatchWarmingTransport<
|
|
|
75
75
|
}
|
|
76
76
|
},
|
|
77
77
|
parseResponse: (
|
|
78
|
+
params: AdapterRequestParams[],
|
|
78
79
|
res: AxiosResponse<ProviderResponseBody>,
|
|
79
80
|
): ProviderResult<AdapterRequestParams>[] => {
|
|
80
81
|
return res.data.prices.map((p) => {
|
package/tsconfig.json
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
// Type checking
|
|
12
12
|
"allowUnreachableCode": false,
|
|
13
13
|
"allowUnusedLabels": false,
|
|
14
|
+
"allowJs": true,
|
|
14
15
|
"alwaysStrict": true,
|
|
15
16
|
"noImplicitAny": true,
|
|
16
17
|
"noImplicitOverride": true,
|
|
@@ -19,7 +20,9 @@
|
|
|
19
20
|
"noPropertyAccessFromIndexSignature": true,
|
|
20
21
|
"noUnusedLocals": true,
|
|
21
22
|
"strict": true,
|
|
22
|
-
"
|
|
23
|
+
"sourceMap": true,
|
|
24
|
+
// "declaration": true
|
|
23
25
|
},
|
|
26
|
+
"exclude": ["src/**/test/**/*"],
|
|
24
27
|
"include": ["./src/**/*"]
|
|
25
28
|
}
|
package/webpack.config.js
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
const path = require('path')
|
|
2
|
+
const glob = require('glob')
|
|
2
3
|
|
|
3
4
|
module.exports = {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
target: 'node',
|
|
6
|
+
// entry: './src/index.ts',
|
|
7
|
+
// entry: glob.sync('./src/**/*.test.{ts,tsx}').reduce((acc, file) => {
|
|
8
|
+
// acc[file.replace(/^\.\/src\//, '')] = file
|
|
9
|
+
// return acc
|
|
10
|
+
// }, {}),
|
|
11
|
+
mode: 'development', // This shouldn't be used in production, but is fine for now since the pkg is in active development.
|
|
12
|
+
devtool: 'inline-source-map', // This shouldn't be used in production, but is fine for now since the pkg is in active development.
|
|
7
13
|
module: {
|
|
8
14
|
rules: [
|
|
9
15
|
{
|
|
@@ -11,13 +17,41 @@ module.exports = {
|
|
|
11
17
|
use: 'ts-loader',
|
|
12
18
|
exclude: /node_modules/,
|
|
13
19
|
},
|
|
20
|
+
{ test: /\.json$/, type: 'json' },
|
|
21
|
+
// { test: /\.js$/, type: 'js' },
|
|
14
22
|
],
|
|
15
23
|
},
|
|
16
24
|
resolve: {
|
|
17
|
-
extensions: ['.tsx', '.ts', '.js'],
|
|
25
|
+
extensions: ['.tsx', '.ts', '.js', '.json'],
|
|
26
|
+
fallback: {
|
|
27
|
+
// buffer: require.resolve('buffer'),
|
|
28
|
+
// https: require.resolve('https-browserify'),
|
|
29
|
+
// assert: require.resolve('assert'),
|
|
30
|
+
// http: require.resolve('stream-http'),
|
|
31
|
+
// querystring: require.resolve('querystring-es3'),
|
|
32
|
+
// url: require.resolve('url'),
|
|
33
|
+
// stream: require.resolve('stream-browserify'),
|
|
34
|
+
// crypto: require.resolve('crypto-browserify'),
|
|
35
|
+
// path: require.resolve('path-browserify'),
|
|
36
|
+
// os: require.resolve('os-browserify/browser'),
|
|
37
|
+
// process: require.resolve('process/browser'),
|
|
38
|
+
// fs: false,
|
|
39
|
+
// tls: false,
|
|
40
|
+
long: false,
|
|
41
|
+
},
|
|
42
|
+
// alias: {
|
|
43
|
+
// 'node:async_hooks': 'async_hooks',
|
|
44
|
+
// },
|
|
18
45
|
},
|
|
19
46
|
output: {
|
|
20
|
-
filename: 'bundle.js',
|
|
47
|
+
// filename: 'bundle.js',
|
|
21
48
|
path: path.resolve(__dirname, 'dist'),
|
|
49
|
+
// filename: '[name].[contenthash].js',
|
|
50
|
+
filename: '[name].js',
|
|
51
|
+
},
|
|
52
|
+
optimization: {
|
|
53
|
+
splitChunks: {
|
|
54
|
+
chunks: 'all',
|
|
55
|
+
},
|
|
22
56
|
},
|
|
23
57
|
}
|