@chainlink/external-adapter-framework 0.0.6 → 0.0.7

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 (161) hide show
  1. package/dist/adapter.js +60 -0
  2. package/dist/background-executor.js +45 -0
  3. package/dist/cache/factory.js +57 -0
  4. package/dist/cache/index.js +163 -0
  5. package/dist/cache/local.js +83 -0
  6. package/dist/cache/metrics.js +114 -0
  7. package/dist/cache/redis.js +100 -0
  8. package/dist/config/index.js +364 -0
  9. package/dist/config/provider-limits.js +75 -0
  10. package/dist/examples/coingecko/batch-warming.js +52 -0
  11. package/dist/examples/coingecko/index.js +10 -0
  12. package/dist/examples/coingecko/rest.js +50 -0
  13. package/dist/examples/ncfx/config/index.js +15 -0
  14. package/dist/examples/ncfx/index.js +10 -0
  15. package/dist/examples/ncfx/websocket.js +72 -0
  16. package/dist/index.js +89 -0
  17. package/dist/metrics/constants.js +25 -0
  18. package/dist/metrics/index.js +76 -0
  19. package/dist/metrics/util.js +9 -0
  20. package/dist/rate-limiting/factory.js +33 -0
  21. package/dist/rate-limiting/index.js +36 -0
  22. package/dist/rate-limiting/metrics.js +32 -0
  23. package/dist/rate-limiting/nop-limiter.js +15 -0
  24. package/dist/rate-limiting/simple-counting.js +61 -0
  25. package/dist/src/adapter.js +112 -0
  26. package/dist/src/background-executor.js +45 -0
  27. package/dist/src/cache/factory.js +57 -0
  28. package/dist/src/cache/index.js +165 -0
  29. package/dist/src/cache/local.js +83 -0
  30. package/dist/src/cache/metrics.js +114 -0
  31. package/dist/src/cache/redis.js +100 -0
  32. package/dist/src/config/index.js +366 -0
  33. package/dist/src/config/provider-limits.js +75 -0
  34. package/dist/src/examples/bank-frick/accounts.js +191 -0
  35. package/dist/src/examples/bank-frick/config/index.js +45 -0
  36. package/dist/src/examples/bank-frick/index.js +14 -0
  37. package/dist/src/examples/bank-frick/util.js +39 -0
  38. package/dist/src/examples/coingecko/batch-warming.js +52 -0
  39. package/dist/src/examples/coingecko/index.js +10 -0
  40. package/dist/src/examples/coingecko/rest.js +50 -0
  41. package/dist/src/examples/ncfx/config/index.js +15 -0
  42. package/dist/src/examples/ncfx/index.js +10 -0
  43. package/dist/src/examples/ncfx/websocket.js +72 -0
  44. package/dist/src/index.js +89 -0
  45. package/dist/src/metrics/constants.js +25 -0
  46. package/dist/src/metrics/index.js +76 -0
  47. package/dist/src/metrics/util.js +9 -0
  48. package/dist/src/rate-limiting/background/fixed-frequency.js +37 -0
  49. package/dist/src/rate-limiting/index.js +63 -0
  50. package/dist/src/rate-limiting/metrics.js +32 -0
  51. package/dist/src/rate-limiting/request/simple-counting.js +62 -0
  52. package/dist/src/test.js +6 -0
  53. package/dist/src/transports/batch-warming.js +55 -0
  54. package/dist/src/transports/index.js +85 -0
  55. package/dist/src/transports/metrics.js +119 -0
  56. package/dist/src/transports/rest.js +93 -0
  57. package/dist/src/transports/util.js +85 -0
  58. package/dist/src/transports/websocket.js +175 -0
  59. package/dist/src/util/expiring-sorted-set.js +47 -0
  60. package/dist/src/util/index.js +35 -0
  61. package/dist/src/util/logger.js +62 -0
  62. package/dist/src/util/request.js +2 -0
  63. package/dist/src/validation/error.js +41 -0
  64. package/dist/src/validation/index.js +84 -0
  65. package/dist/src/validation/input-params.js +30 -0
  66. package/dist/src/validation/override-functions.js +40 -0
  67. package/dist/src/validation/preset-tokens.json +23 -0
  68. package/dist/src/validation/validator.js +303 -0
  69. package/dist/test.js +6 -0
  70. package/dist/transports/batch-warming.js +57 -0
  71. package/dist/transports/index.js +76 -0
  72. package/dist/transports/metrics.js +133 -0
  73. package/dist/transports/rest.js +91 -0
  74. package/dist/transports/util.js +85 -0
  75. package/dist/transports/websocket.js +171 -0
  76. package/dist/util/expiring-sorted-set.js +47 -0
  77. package/dist/util/index.js +35 -0
  78. package/dist/util/logger.js +62 -0
  79. package/dist/util/request.js +2 -0
  80. package/dist/validation/error.js +41 -0
  81. package/dist/validation/index.js +82 -0
  82. package/dist/validation/input-params.js +30 -0
  83. package/dist/validation/overrideFunctions.js +42 -0
  84. package/dist/validation/presetTokens.json +23 -0
  85. package/dist/validation/validator.js +303 -0
  86. package/package.json +6 -2
  87. package/.c8rc.json +0 -3
  88. package/.eslintignore +0 -9
  89. package/.eslintrc.js +0 -96
  90. package/.github/README.MD +0 -17
  91. package/.github/actions/setup/action.yaml +0 -13
  92. package/.github/workflows/main.yaml +0 -39
  93. package/.github/workflows/publish.yaml +0 -17
  94. package/.prettierignore +0 -13
  95. package/.yarnrc +0 -0
  96. package/docker-compose.yaml +0 -35
  97. package/src/adapter.ts +0 -236
  98. package/src/background-executor.ts +0 -53
  99. package/src/cache/factory.ts +0 -28
  100. package/src/cache/index.ts +0 -236
  101. package/src/cache/local.ts +0 -73
  102. package/src/cache/metrics.ts +0 -112
  103. package/src/cache/redis.ts +0 -93
  104. package/src/config/index.ts +0 -501
  105. package/src/config/provider-limits.ts +0 -130
  106. package/src/examples/coingecko/batch-warming.ts +0 -79
  107. package/src/examples/coingecko/index.ts +0 -9
  108. package/src/examples/coingecko/rest.ts +0 -77
  109. package/src/examples/ncfx/config/index.ts +0 -12
  110. package/src/examples/ncfx/index.ts +0 -9
  111. package/src/examples/ncfx/websocket.ts +0 -100
  112. package/src/index.ts +0 -106
  113. package/src/metrics/constants.ts +0 -23
  114. package/src/metrics/index.ts +0 -116
  115. package/src/metrics/util.ts +0 -11
  116. package/src/rate-limiting/background/fixed-frequency.ts +0 -47
  117. package/src/rate-limiting/index.ts +0 -100
  118. package/src/rate-limiting/metrics.ts +0 -18
  119. package/src/rate-limiting/request/simple-counting.ts +0 -76
  120. package/src/test.ts +0 -5
  121. package/src/transports/batch-warming.ts +0 -121
  122. package/src/transports/index.ts +0 -173
  123. package/src/transports/metrics.ts +0 -95
  124. package/src/transports/rest.ts +0 -161
  125. package/src/transports/util.ts +0 -63
  126. package/src/transports/websocket.ts +0 -238
  127. package/src/util/expiring-sorted-set.ts +0 -52
  128. package/src/util/index.ts +0 -20
  129. package/src/util/logger.ts +0 -69
  130. package/src/util/request.ts +0 -115
  131. package/src/validation/error.ts +0 -116
  132. package/src/validation/index.ts +0 -101
  133. package/src/validation/input-params.ts +0 -45
  134. package/src/validation/override-functions.ts +0 -44
  135. package/src/validation/preset-tokens.json +0 -23
  136. package/src/validation/validator.ts +0 -384
  137. package/test/adapter.test.ts +0 -27
  138. package/test/background-executor.test.ts +0 -109
  139. package/test/cache/cache-key.test.ts +0 -96
  140. package/test/cache/helper.ts +0 -101
  141. package/test/cache/local.test.ts +0 -54
  142. package/test/cache/redis.test.ts +0 -89
  143. package/test/correlation.test.ts +0 -114
  144. package/test/index.test.ts +0 -37
  145. package/test/metrics/feed-id.test.ts +0 -33
  146. package/test/metrics/helper.ts +0 -14
  147. package/test/metrics/labels.test.ts +0 -36
  148. package/test/metrics/metrics.test.ts +0 -267
  149. package/test/metrics/redis-metrics.test.ts +0 -113
  150. package/test/metrics/warmer-metrics.test.ts +0 -192
  151. package/test/metrics/ws-metrics.test.ts +0 -225
  152. package/test/rate-limit-config.test.ts +0 -243
  153. package/test/transports/batch.test.ts +0 -465
  154. package/test/transports/rest.test.ts +0 -242
  155. package/test/transports/websocket.test.ts +0 -183
  156. package/test/tsconfig.json +0 -5
  157. package/test/util.ts +0 -76
  158. package/test/validation.test.ts +0 -169
  159. package/test.sh +0 -20
  160. package/tsconfig.json +0 -24
  161. package/typedoc.json +0 -6
@@ -1,109 +0,0 @@
1
- import test from 'ava'
2
- import FakeTimers from '@sinonjs/fake-timers'
3
- import { expose } from '../src'
4
- import { Adapter } from '../src/adapter'
5
- import { AdapterContext } from '../src/transports'
6
- import { deferredPromise, NopTransport } from './util'
7
-
8
- test('background executor calls transport function with background context', async (t) => {
9
- const [promise, resolve] = deferredPromise<AdapterContext>()
10
-
11
- const transport = new (class extends NopTransport {
12
- async backgroundExecute(context: AdapterContext): Promise<number> {
13
- resolve(context)
14
- return 100
15
- }
16
- })()
17
-
18
- const adapter: Adapter = {
19
- name: 'test',
20
- endpoints: [
21
- {
22
- name: 'test',
23
- inputParameters: {},
24
- transport,
25
- },
26
- {
27
- name: 'skipped',
28
- inputParameters: {},
29
- transport: new NopTransport(), // Also add coverage for skipped executors
30
- },
31
- ],
32
- }
33
-
34
- await expose(adapter)
35
- const context = await promise
36
- t.is(context.adapterEndpoint.name, 'test')
37
- })
38
-
39
- // Needs to be serial to avoid mocking global clock more than once at the same time
40
- // TODO: Inject clock?
41
- test.serial(
42
- 'background executor calls transport function second time after sleeping',
43
- async (t) => {
44
- const clock = FakeTimers.install()
45
- let timesCalled = 0
46
-
47
- const transport = new (class extends NopTransport {
48
- async backgroundExecute(): Promise<number> {
49
- timesCalled++
50
- return 1000
51
- }
52
- })()
53
-
54
- const adapter: Adapter = {
55
- name: 'test',
56
- endpoints: [
57
- {
58
- name: 'test',
59
- inputParameters: {},
60
- aliases: ['other'], // Add an alias to ensure it's not called once per alias
61
- transport,
62
- },
63
- ],
64
- }
65
-
66
- await expose(adapter)
67
- t.is(timesCalled, 1)
68
- await clock.tickAsync(999)
69
- t.is(timesCalled, 1)
70
- await clock.tickAsync(1)
71
- t.is(timesCalled, 2)
72
-
73
- clock.uninstall()
74
- },
75
- )
76
-
77
- test.serial('background executor ends recursive chain on server close', async (t) => {
78
- const clock = FakeTimers.install()
79
- let timesCalled = 0
80
-
81
- const transport = new (class extends NopTransport {
82
- async backgroundExecute(): Promise<number> {
83
- timesCalled++
84
- return 1000
85
- }
86
- })()
87
-
88
- const adapter: Adapter = {
89
- name: 'test',
90
- endpoints: [
91
- {
92
- name: 'test',
93
- inputParameters: {},
94
- transport,
95
- },
96
- ],
97
- }
98
-
99
- const server = await expose(adapter)
100
- if (!server) {
101
- throw 'Server did not start'
102
- }
103
- t.is(timesCalled, 1)
104
- server.close()
105
- await clock.tickAsync(999999)
106
- t.is(timesCalled, 1) // The background process closed, so this was never called again
107
-
108
- clock.uninstall()
109
- })
@@ -1,96 +0,0 @@
1
- import untypedTest, { TestFn } from 'ava'
2
- import axios from 'axios'
3
- import { AddressInfo } from 'net'
4
- import { expose } from '../../src'
5
- import { Adapter, AdapterEndpoint } from '../../src/adapter'
6
- import { Cache } from '../../src/cache'
7
- import { BaseSettings } from '../../src/config'
8
- import { AdapterRequest, AdapterResponse } from '../../src/util'
9
- import { NopTransport } from '../util'
10
-
11
- const test = untypedTest as TestFn<{
12
- serverAddress: string
13
- cache: Cache
14
- adapterEndpoint: AdapterEndpoint
15
- }>
16
-
17
- test.beforeEach(async (t) => {
18
- const adapter: Adapter = {
19
- name: 'test',
20
- defaultEndpoint: 'test',
21
- endpoints: [
22
- {
23
- name: 'test',
24
- inputParameters: {},
25
- transport: new (class extends NopTransport {
26
- override async setup(
27
- req: AdapterRequest<unknown>,
28
- ): Promise<void | AdapterResponse<null>> {
29
- return {
30
- data: null,
31
- statusCode: 200,
32
- result: req.requestContext.cacheKey,
33
- }
34
- }
35
- })(),
36
- },
37
- ],
38
- }
39
-
40
- t.context.adapterEndpoint = adapter.endpoints[0]
41
- const server = await expose(adapter)
42
- if (!server) {
43
- throw 'Server did not start'
44
- }
45
- t.context.serverAddress = `http://localhost:${(server.address() as AddressInfo).port}`
46
- })
47
-
48
- test.serial('no parameters returns default cache key', async (t) => {
49
- const response = await axios.post(`${t.context.serverAddress}`, {})
50
- t.is(response.data.result, BaseSettings.DEFAULT_CACHE_KEY.default)
51
- })
52
-
53
- test.serial('builds cache key correctly from input params', async (t) => {
54
- t.context.adapterEndpoint.inputParameters = {
55
- base: {
56
- type: 'string',
57
- required: true,
58
- },
59
- quote: {
60
- type: 'string',
61
- required: false,
62
- },
63
- factor: {
64
- type: 'number',
65
- required: true,
66
- },
67
- proper: {
68
- type: 'boolean',
69
- required: false,
70
- },
71
- details: {
72
- type: 'object',
73
- required: true,
74
- },
75
- nullable: {
76
- type: 'object',
77
- required: false,
78
- },
79
- }
80
- const response = await axios.post(`${t.context.serverAddress}`, {
81
- data: {
82
- base: 'eth',
83
- factor: 123,
84
- proper: true,
85
- details: {
86
- asd: 'qwe',
87
- zxc: 432,
88
- },
89
- nullable: null,
90
- },
91
- })
92
- t.is(
93
- response.data.result,
94
- 'test-|base:eth|factor:123|proper:true|details:{"asd":"qwe","zxc":432}',
95
- )
96
- })
@@ -1,101 +0,0 @@
1
- import untypedTest, { TestFn } from 'ava'
2
- import axios, { AxiosError } from 'axios'
3
- import { AdapterEndpoint } from '../../src/adapter'
4
- import { Cache } from '../../src/cache'
5
- import { AdapterDependencies } from '../../src/transports'
6
- import { AdapterRequest, AdapterResponse } from '../../src/util'
7
- import { NopTransport } from '../util'
8
-
9
- export const test = untypedTest as TestFn<{
10
- serverAddress: string
11
- cache: Cache
12
- adapterEndpoint: AdapterEndpoint
13
- }>
14
-
15
- export class BasicCacheSetterTransport extends NopTransport {
16
- cache!: Cache
17
-
18
- override async initialize(dependencies: AdapterDependencies): Promise<void> {
19
- this.cache = dependencies.cache
20
- }
21
-
22
- override async setup(req: AdapterRequest): Promise<void> {
23
- const response: AdapterResponse = {
24
- data: null,
25
- statusCode: 200,
26
- result: req.requestContext.data['factor'],
27
- }
28
- await this.cache.setMany(
29
- [
30
- {
31
- key: req.requestContext.cacheKey,
32
- value: response,
33
- },
34
- ],
35
- 10000,
36
- )
37
- }
38
- }
39
-
40
- export const cacheTests = () => {
41
- test('returns value set in cache from setup', async (t) => {
42
- const data = {
43
- base: 'eth',
44
- factor: 123,
45
- }
46
-
47
- const response = await axios.post(`${t.context.serverAddress}`, { data })
48
- t.is(response.data.result, 123)
49
- })
50
-
51
- test('returns value already found in cache', async (t) => {
52
- const data = {
53
- base: 'qweqwe',
54
- factor: 111,
55
- }
56
-
57
- const cacheKey = 'test-|base:qweqwe|factor:111'
58
-
59
- // Inject values directly into the cache
60
- const injectedEntry = {
61
- data: null,
62
- statusCode: 200,
63
- result: 'injected',
64
- }
65
-
66
- t.context.cache.set(cacheKey, injectedEntry, 10000)
67
-
68
- const response = await axios.post(`${t.context.serverAddress}`, { data })
69
- t.is(response.data.result, 'injected')
70
- })
71
-
72
- test('skips expired cache entry and returns set up value', async (t) => {
73
- const data = {
74
- base: 'sdfghj',
75
- factor: 24637,
76
- }
77
-
78
- const cacheKey = 'test-|base:sdfghj|factor:24637'
79
-
80
- // Inject values directly into the cache
81
- const injectedEntry = {
82
- data: null,
83
- statusCode: 200,
84
- result: 'injected',
85
- }
86
-
87
- t.context.cache.set(cacheKey, injectedEntry, -10)
88
-
89
- const response = await axios.post(`${t.context.serverAddress}`, { data })
90
- t.is(response.data.result, 24637)
91
- })
92
-
93
- test('polls forever and returns timeout', async (t) => {
94
- const makeRequest = () =>
95
- axios.post(`${t.context.serverAddress}`, {
96
- endpoint: 'nowork',
97
- })
98
- const error: AxiosError | undefined = await t.throwsAsync(makeRequest)
99
- t.is(error?.response?.status, 504)
100
- })
101
- }
@@ -1,54 +0,0 @@
1
- import { AddressInfo } from 'ws'
2
- import { expose } from '../../src'
3
- import { Adapter } from '../../src/adapter'
4
- import { LocalCache } from '../../src/cache'
5
- import { SettingsMap } from '../../src/config'
6
- import { AdapterDependencies, Transport } from '../../src/transports'
7
- import { NopTransport } from '../util'
8
- import { BasicCacheSetterTransport, cacheTests, test } from './helper'
9
-
10
- test.beforeEach(async (t) => {
11
- const adapter: Adapter = {
12
- name: 'test',
13
- defaultEndpoint: 'test',
14
- endpoints: [
15
- {
16
- name: 'test',
17
- inputParameters: {
18
- base: {
19
- type: 'string',
20
- required: true,
21
- },
22
- factor: {
23
- type: 'number',
24
- required: true,
25
- },
26
- },
27
- transport: new BasicCacheSetterTransport() as Transport<unknown, unknown, SettingsMap>,
28
- },
29
- {
30
- name: 'nowork',
31
- inputParameters: {},
32
- transport: new NopTransport(),
33
- },
34
- ],
35
- envDefaultOverrides: {
36
- CACHE_POLLING_SLEEP_MS: 10,
37
- CACHE_POLLING_MAX_RETRIES: 3,
38
- },
39
- }
40
-
41
- const cache = new LocalCache()
42
- const dependencies: Partial<AdapterDependencies> = {
43
- cache,
44
- }
45
-
46
- t.context.cache = cache
47
- const server = await expose(adapter, dependencies)
48
- if (!server) {
49
- throw 'Server did not start'
50
- }
51
- t.context.serverAddress = `http://localhost:${(server.address() as AddressInfo).port}`
52
- })
53
-
54
- cacheTests()
@@ -1,89 +0,0 @@
1
- import Redis from 'ioredis'
2
- import { AddressInfo } from 'ws'
3
- import { expose } from '../../src'
4
- import { Adapter } from '../../src/adapter'
5
- import { LocalCache, RedisCache } from '../../src/cache'
6
- import { SettingsMap } from '../../src/config'
7
- import { AdapterDependencies, Transport } from '../../src/transports'
8
- import { NopTransport } from '../util'
9
- import { BasicCacheSetterTransport, cacheTests, test } from './helper'
10
-
11
- class RedisMock {
12
- store = new LocalCache<string>()
13
-
14
- get(key: string) {
15
- return this.store.get(key)
16
- }
17
-
18
- del(key: string) {
19
- return this.store.delete(key)
20
- }
21
-
22
- set(key: string, value: string, px: 'PX', ttl: number) {
23
- return this.store.set(key, value, ttl)
24
- }
25
-
26
- multi() {
27
- return new CommandChainMock(this)
28
- }
29
- }
30
-
31
- class CommandChainMock {
32
- promises: Promise<unknown>[] = []
33
- constructor(private redisMock: RedisMock) {}
34
-
35
- set(key: string, value: string, px: 'PX', ttl: number) {
36
- this.promises.push(this.redisMock.set(key, value, px, ttl))
37
- return this
38
- }
39
-
40
- exec() {
41
- return Promise.all(this.promises)
42
- }
43
- }
44
-
45
- test.beforeEach(async (t) => {
46
- const adapter: Adapter = {
47
- name: 'test',
48
- defaultEndpoint: 'test',
49
- endpoints: [
50
- {
51
- name: 'test',
52
- inputParameters: {
53
- base: {
54
- type: 'string',
55
- required: true,
56
- },
57
- factor: {
58
- type: 'number',
59
- required: true,
60
- },
61
- },
62
- transport: new BasicCacheSetterTransport() as Transport<unknown, unknown, SettingsMap>,
63
- },
64
- {
65
- name: 'nowork',
66
- inputParameters: {},
67
- transport: new NopTransport(),
68
- },
69
- ],
70
- envDefaultOverrides: {
71
- CACHE_POLLING_SLEEP_MS: 10,
72
- CACHE_POLLING_MAX_RETRIES: 3,
73
- },
74
- }
75
-
76
- const cache = new RedisCache(new RedisMock() as unknown as Redis) // Fake redis
77
- const dependencies: Partial<AdapterDependencies> = {
78
- cache,
79
- }
80
-
81
- t.context.cache = cache
82
- const server = await expose(adapter, dependencies)
83
- if (!server) {
84
- throw 'Server did not start'
85
- }
86
- t.context.serverAddress = `http://localhost:${(server.address() as AddressInfo).port}`
87
- })
88
-
89
- cacheTests()
@@ -1,114 +0,0 @@
1
- import untypedTest, { TestFn } from 'ava'
2
- import axios from 'axios'
3
- import { AddressInfo } from 'net'
4
- import { expose } from '../src'
5
- import { Adapter, AdapterEndpoint } from '../src/adapter'
6
- import { AdapterResponse, sleep } from '../src/util'
7
- import { NopTransport } from './util'
8
- import { asyncLocalStorage, Store } from '../src/util/logger'
9
-
10
- const test = untypedTest as TestFn<{
11
- serverAddress: string
12
- adapterEndpoint: AdapterEndpoint
13
- }>
14
-
15
- const startAdapter = async (enabled: boolean) => {
16
- process.env['CORRELATION_ID_ENABLED'] = enabled.toString()
17
-
18
- const adapter: Adapter = {
19
- name: 'test',
20
- defaultEndpoint: 'test',
21
- endpoints: [
22
- {
23
- name: 'test',
24
- inputParameters: {},
25
- transport: new (class extends NopTransport {
26
- override async setup(): Promise<void | AdapterResponse<null>> {
27
- const store = asyncLocalStorage.getStore() as Store
28
- if (store !== undefined && store['correlationId'] === '1') {
29
- await sleep(100)
30
- }
31
- return {
32
- data: null,
33
- statusCode: 200,
34
- result: store as unknown as null,
35
- }
36
- }
37
- })(),
38
- },
39
- ],
40
- }
41
-
42
- const server = await expose(adapter)
43
- if (!server) {
44
- throw 'Server did not start'
45
- }
46
- const serverAddress = `http://localhost:${(server.address() as AddressInfo).port}`
47
- return serverAddress
48
- }
49
-
50
- test.serial('uses the correct correlation id when it is passed in a header', async (t) => {
51
- const testId = 'test'
52
- const serverAddress = await startAdapter(true)
53
- const response = await axios.post(
54
- serverAddress,
55
- {
56
- base: 'asd',
57
- },
58
- {
59
- headers: {
60
- 'x-correlation-id': testId,
61
- },
62
- },
63
- )
64
- t.is(response.data.result.correlationId, testId)
65
- })
66
-
67
- test.serial('sets a correlation id when it is enabled as an env var', async (t) => {
68
- const serverAddress = await startAdapter(true)
69
- const response = await axios.post(serverAddress, {
70
- base: 'asd',
71
- })
72
- t.is(typeof response.data.result.correlationId, 'string')
73
- })
74
-
75
- test.serial('correlation Id is not set when enabled is set to false', async (t) => {
76
- const serverAddress = await startAdapter(false)
77
- const response = await axios.post(serverAddress, {
78
- base: 'asd',
79
- })
80
- t.is(response.data.result, undefined)
81
- })
82
-
83
- test.serial('preserves concurrency through subsequent calls', async (t) => {
84
- const serverAddress = await startAdapter(true)
85
- const request1 = await axios.post(
86
- serverAddress,
87
- {
88
- base: 'asd',
89
- },
90
- {
91
- headers: {
92
- 'x-correlation-id': '1',
93
- },
94
- },
95
- )
96
- // Send out second call normally
97
-
98
- // Check that each call has the correct correlation Id
99
- const request2 = axios.post(
100
- serverAddress,
101
- {
102
- base: 'asd',
103
- },
104
- {
105
- headers: {
106
- 'x-correlation-id': '2',
107
- },
108
- },
109
- )
110
- const response2 = await request2
111
- const response1 = await request1
112
- t.is(response1.data.result.correlationId === '1', true)
113
- t.is(response2.data.result.correlationId === '2', true)
114
- })
@@ -1,37 +0,0 @@
1
- import untypedTest, { TestFn } from 'ava'
2
- import axios from 'axios'
3
- import { AddressInfo } from 'net'
4
- import { expose } from '../src'
5
- import { Adapter } from '../src/adapter'
6
- import { NopTransport } from './util'
7
-
8
- const test = untypedTest as TestFn<{
9
- serverAddress: string
10
- }>
11
-
12
- test.beforeEach(async (t) => {
13
- const adapter: Adapter = {
14
- name: 'test',
15
- endpoints: [
16
- {
17
- name: 'test',
18
- inputParameters: {},
19
- transport: new NopTransport(),
20
- },
21
- ],
22
- }
23
-
24
- const server = await expose(adapter)
25
- if (!server) {
26
- throw 'Server did not start'
27
- }
28
- t.context.serverAddress = `http://localhost:${(server.address() as AddressInfo).port}`
29
- })
30
-
31
- test('health endpoint returns health OK', async (t) => {
32
- const response = await axios.get(`${t.context.serverAddress}/health`)
33
- t.deepEqual(response.data, {
34
- message: 'OK',
35
- version: process.env['npm_package_version'],
36
- })
37
- })
@@ -1,33 +0,0 @@
1
- import untypedTest, { TestFn } from 'ava'
2
- import { AdapterEndpoint } from '../../src/adapter'
3
- import { calculateFeedId } from '../../src/cache'
4
- import { NopTransport } from '../util'
5
-
6
- const feedIdTest = untypedTest as TestFn<{ adapterEndpoint: AdapterEndpoint }>
7
-
8
- feedIdTest.beforeEach(async (t) => {
9
- t.context.adapterEndpoint = {
10
- name: 'test',
11
- inputParameters: {},
12
- transport: new (class extends NopTransport {})(),
13
- }
14
- })
15
-
16
- feedIdTest.serial('no parameters returns N/A', async (t) => {
17
- t.is(calculateFeedId(t.context.adapterEndpoint, {}), 'N/A')
18
- })
19
-
20
- feedIdTest.serial('builds feed ID correctly from input params', async (t) => {
21
- t.context.adapterEndpoint.inputParameters = {
22
- base: {
23
- type: 'string',
24
- required: true,
25
- },
26
- quote: {
27
- type: 'string',
28
- required: true,
29
- }
30
- }
31
- const data = { base: 'ETH', quote: 'BTC' }
32
- t.is(calculateFeedId(t.context.adapterEndpoint, data), '|base:eth|quote:btc')
33
- })
@@ -1,14 +0,0 @@
1
- // Parse metrics scrape into object to use for tests
2
- export const parsePromMetrics = (data: string): Map<string, number> => {
3
- const responseLines = data.split('\n')
4
- const metricsMap = new Map<string, number>()
5
- responseLines.forEach((line) => {
6
- if (!line.startsWith('#') && line !== '') {
7
- const metric = line.split(' ')
8
- const nameLabel = metric[0]
9
- const value = Number(metric[1])
10
- metricsMap.set(nameLabel, value)
11
- }
12
- })
13
- return metricsMap
14
- }
@@ -1,36 +0,0 @@
1
- import test from 'ava'
2
- import { cacheMetricsLabel } from '../../src/cache/metrics'
3
- import { connectionErrorLabels, messageSubsLabels } from '../../src/transports/metrics'
4
-
5
- test('Generate cache label test', t => {
6
- const result = {
7
- participant_id: 'test-|base:eth|quote:btc',
8
- feed_id: '|base:eth|quote:btc',
9
- cache_type: 'local',
10
- }
11
- t.deepEqual(cacheMetricsLabel('test-|base:eth|quote:btc','|base:eth|quote:btc','local'), result)
12
- })
13
-
14
- test('Generate data provider metrics label test', t => {
15
- const result = {
16
- participant_id: 'test-|base:eth|quote:btc',
17
- feed_id: '|base:eth|quote:btc',
18
- cache_type: 'local',
19
- }
20
- t.deepEqual(cacheMetricsLabel('test-|base:eth|quote:btc','|base:eth|quote:btc','local'), result)
21
- })
22
-
23
- test('Generate WS connection error label test', t => {
24
- const result = {
25
- message: 'error',
26
- }
27
- t.deepEqual(connectionErrorLabels('error'), result)
28
- })
29
-
30
- test('Generate WS message and subscription label test', t => {
31
- const result = {
32
- feed_id: '|base:eth|quote:btc',
33
- subscription_key: 'test-|base:eth|quote:btc',
34
- }
35
- t.deepEqual(messageSubsLabels('|base:eth|quote:btc','test-|base:eth|quote:btc'), result)
36
- })