@chainlink/external-adapter-framework 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapter/basic.d.ts +90 -0
- package/adapter/basic.js +325 -0
- package/adapter/basic.js.map +1 -0
- package/adapter/endpoint.d.ts +17 -0
- package/adapter/endpoint.js +20 -0
- package/adapter/endpoint.js.map +1 -0
- package/adapter/index.d.ts +4 -0
- package/adapter/index.js +21 -0
- package/adapter/index.js.map +1 -0
- package/adapter/price.d.ts +77 -0
- package/adapter/price.js +88 -0
- package/adapter/price.js.map +1 -0
- package/adapter/types.d.ts +124 -0
- package/adapter/types.js +3 -0
- package/adapter/types.js.map +1 -0
- package/background-executor.d.ts +9 -0
- package/background-executor.js +97 -0
- package/background-executor.js.map +1 -0
- package/cache/factory.d.ts +6 -0
- package/cache/factory.js +24 -0
- package/cache/factory.js.map +1 -0
- package/cache/index.d.ts +87 -0
- package/cache/index.js +133 -0
- package/cache/index.js.map +1 -0
- package/cache/local.d.ts +23 -0
- package/cache/local.js +84 -0
- package/cache/local.js.map +1 -0
- package/cache/metrics.d.ts +27 -0
- package/cache/metrics.js +121 -0
- package/cache/metrics.js.map +1 -0
- package/cache/redis.d.ts +16 -0
- package/cache/redis.js +101 -0
- package/cache/redis.js.map +1 -0
- package/config/index.d.ts +298 -0
- package/config/index.js +359 -0
- package/config/index.js.map +1 -0
- package/config/provider-limits.d.ts +27 -0
- package/config/provider-limits.js +75 -0
- package/config/provider-limits.js.map +1 -0
- package/examples/bank-frick/accounts.d.ts +45 -0
- package/examples/bank-frick/accounts.js +203 -0
- package/examples/bank-frick/accounts.js.map +1 -0
- package/examples/bank-frick/config/index.d.ts +17 -0
- package/examples/bank-frick/config/index.js +55 -0
- package/examples/bank-frick/config/index.js.map +1 -0
- package/examples/bank-frick/index.d.ts +2 -0
- package/examples/bank-frick/index.js +16 -0
- package/examples/bank-frick/index.js.map +1 -0
- package/examples/bank-frick/util.d.ts +4 -0
- package/examples/bank-frick/util.js +40 -0
- package/examples/bank-frick/util.js.map +1 -0
- package/examples/coingecko/src/config/index.d.ts +2 -0
- package/examples/coingecko/src/config/index.js +6 -0
- package/examples/coingecko/src/config/index.js.map +1 -0
- package/examples/coingecko/src/config/overrides.json +10825 -0
- package/examples/coingecko/src/crypto-utils.d.ts +62 -0
- package/examples/coingecko/src/crypto-utils.js +60 -0
- package/examples/coingecko/src/crypto-utils.js.map +1 -0
- package/examples/coingecko/src/endpoint/coins.d.ts +26 -0
- package/examples/coingecko/src/endpoint/coins.js +37 -0
- package/examples/coingecko/src/endpoint/coins.js.map +1 -0
- package/examples/coingecko/src/endpoint/crypto-marketcap.d.ts +3 -0
- package/examples/coingecko/src/endpoint/crypto-marketcap.js +30 -0
- package/examples/coingecko/src/endpoint/crypto-marketcap.js.map +1 -0
- package/examples/coingecko/src/endpoint/crypto-volume.d.ts +3 -0
- package/examples/coingecko/src/endpoint/crypto-volume.js +30 -0
- package/examples/coingecko/src/endpoint/crypto-volume.js.map +1 -0
- package/examples/coingecko/src/endpoint/crypto.d.ts +3 -0
- package/examples/coingecko/src/endpoint/crypto.js +28 -0
- package/examples/coingecko/src/endpoint/crypto.js.map +1 -0
- package/examples/coingecko/src/endpoint/dominance.d.ts +3 -0
- package/examples/coingecko/src/endpoint/dominance.js +28 -0
- package/examples/coingecko/src/endpoint/dominance.js.map +1 -0
- package/examples/coingecko/src/endpoint/global-marketcap.d.ts +3 -0
- package/examples/coingecko/src/endpoint/global-marketcap.js +28 -0
- package/examples/coingecko/src/endpoint/global-marketcap.js.map +1 -0
- package/examples/coingecko/src/endpoint/index.d.ts +6 -0
- package/examples/coingecko/src/endpoint/index.js +16 -0
- package/examples/coingecko/src/endpoint/index.js.map +1 -0
- package/examples/coingecko/src/global-utils.d.ts +42 -0
- package/examples/coingecko/src/global-utils.js +47 -0
- package/examples/coingecko/src/global-utils.js.map +1 -0
- package/examples/coingecko/src/index.d.ts +4 -0
- package/examples/coingecko/src/index.js +19 -0
- package/examples/coingecko/src/index.js.map +1 -0
- 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 +2 -0
- package/examples/cryptocompare/src/config/index.js +6 -0
- package/examples/cryptocompare/src/config/index.js.map +1 -0
- package/examples/cryptocompare/src/endpoints/crypto.d.ts +40 -0
- package/examples/cryptocompare/src/endpoints/crypto.js +54 -0
- package/examples/cryptocompare/src/endpoints/crypto.js.map +1 -0
- package/examples/cryptocompare/src/endpoints/index.d.ts +1 -0
- package/examples/cryptocompare/src/endpoints/index.js +6 -0
- package/examples/cryptocompare/src/endpoints/index.js.map +1 -0
- package/examples/cryptocompare/src/index.d.ts +4 -0
- package/examples/cryptocompare/src/index.js +14 -0
- package/examples/cryptocompare/src/index.js.map +1 -0
- package/examples/genesis/config/index.d.ts +7 -0
- package/examples/genesis/config/index.js +11 -0
- package/examples/genesis/config/index.js.map +1 -0
- package/examples/genesis/index.d.ts +2 -0
- package/examples/genesis/index.js +13 -0
- package/examples/genesis/index.js.map +1 -0
- package/examples/genesis/sseStream.d.ts +27 -0
- package/examples/genesis/sseStream.js +149 -0
- package/examples/genesis/sseStream.js.map +1 -0
- 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 +2 -0
- package/examples/ncfx/index.js +12 -0
- package/examples/ncfx/index.js.map +1 -0
- package/examples/ncfx/websocket.d.ts +37 -0
- package/examples/ncfx/websocket.js +74 -0
- package/examples/ncfx/websocket.js.map +1 -0
- package/index.d.ts +17 -0
- package/index.js +174 -0
- package/index.js.map +1 -0
- package/metrics/constants.d.ts +16 -0
- package/metrics/constants.js +26 -0
- package/metrics/constants.js.map +1 -0
- package/metrics/index.d.ts +19 -0
- package/metrics/index.js +139 -0
- package/metrics/index.js.map +1 -0
- package/metrics/util.d.ts +7 -0
- package/metrics/util.js +10 -0
- package/metrics/util.js.map +1 -0
- package/package.json +50 -42
- package/rate-limiting/background/fixed-frequency.d.ts +10 -0
- package/rate-limiting/background/fixed-frequency.js +36 -0
- package/rate-limiting/background/fixed-frequency.js.map +1 -0
- package/rate-limiting/index.d.ts +56 -0
- package/rate-limiting/index.js +86 -0
- package/rate-limiting/index.js.map +1 -0
- package/rate-limiting/metrics.d.ts +3 -0
- package/rate-limiting/metrics.js +45 -0
- package/rate-limiting/metrics.js.map +1 -0
- package/rate-limiting/request/simple-counting.d.ts +20 -0
- package/rate-limiting/request/simple-counting.js +63 -0
- package/rate-limiting/request/simple-counting.js.map +1 -0
- package/transports/batch-warming.d.ts +53 -0
- package/transports/batch-warming.js +136 -0
- package/transports/batch-warming.js.map +1 -0
- package/transports/index.d.ts +108 -0
- package/transports/index.js +56 -0
- package/transports/index.js.map +1 -0
- package/transports/inference-test.d.ts +0 -0
- package/transports/inference-test.js +202 -0
- package/transports/inference-test.js.map +1 -0
- package/transports/metrics.d.ts +25 -0
- package/transports/metrics.js +122 -0
- package/transports/metrics.js.map +1 -0
- package/transports/rest.d.ts +68 -0
- package/transports/rest.js +131 -0
- package/transports/rest.js.map +1 -0
- package/transports/routing.d.ts +21 -0
- package/transports/routing.js +50 -0
- package/transports/routing.js.map +1 -0
- package/transports/sse.d.ts +61 -0
- package/transports/sse.js +97 -0
- package/transports/sse.js.map +1 -0
- package/transports/util.d.ts +9 -0
- package/transports/util.js +87 -0
- package/transports/util.js.map +1 -0
- package/transports/websocket.d.ts +95 -0
- package/transports/websocket.js +164 -0
- package/transports/websocket.js.map +1 -0
- package/util/censor/censor-list.d.ts +9 -0
- package/util/censor/censor-list.js +13 -0
- package/util/censor/censor-list.js.map +1 -0
- package/util/index.d.ts +13 -0
- package/util/index.js +38 -0
- package/util/index.js.map +1 -0
- package/util/logger.d.ts +49 -0
- package/util/logger.js +123 -0
- package/util/logger.js.map +1 -0
- package/util/request.d.ts +138 -0
- package/util/request.js +3 -0
- package/util/request.js.map +1 -0
- package/util/subscription-set/expiring-sorted-set.d.ts +21 -0
- package/util/subscription-set/expiring-sorted-set.js +36 -0
- package/util/subscription-set/expiring-sorted-set.js.map +1 -0
- package/util/subscription-set/redis-sorted-set.d.ts +9 -0
- package/util/subscription-set/redis-sorted-set.js +29 -0
- package/util/subscription-set/redis-sorted-set.js.map +1 -0
- package/util/subscription-set/subscription-set.d.ts +19 -0
- package/util/subscription-set/subscription-set.js +28 -0
- package/util/subscription-set/subscription-set.js.map +1 -0
- package/util/test-payload-loader.d.ts +26 -0
- package/util/test-payload-loader.js +85 -0
- package/util/test-payload-loader.js.map +1 -0
- package/validation/error.d.ts +48 -0
- package/validation/error.js +78 -0
- package/validation/error.js.map +1 -0
- package/validation/index.d.ts +5 -0
- package/validation/index.js +102 -0
- package/validation/index.js.map +1 -0
- package/validation/input-params.d.ts +14 -0
- package/validation/input-params.js +3 -0
- package/validation/input-params.js.map +1 -0
- package/validation/input-validator.d.ts +16 -0
- package/validation/input-validator.js +123 -0
- package/validation/input-validator.js.map +1 -0
- package/README.md +0 -102
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transports/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,oCAAgF;AAUhF,kDAA+B;AAC/B,yCAAsB;AACtB,wCAAqB;AACrB,8CAA2B;AAgH3B;;;;;;GAMG;AACI,MAAM,4BAA4B,GAAG,CAC1C,OAA4B,EAC5B,OAA0B,EACoB,EAAE,CAChD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;IAChB,MAAM,UAAU,GAAG;QACjB,GAAG,EAAE,IAAA,yBAAiB,EAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QACzC,KAAK,EAAE;YACL,MAAM,EAAE,CAAC,CAAC,KAAK;YACf,UAAU,EAAE,GAAG;YACf,IAAI,EAAE;gBACJ,MAAM,EAAE,CAAC,CAAC,KAAK;aAChB;SACF;KACF,CAAA;IAED,IACE,OAAO,CAAC,aAAa,CAAC,eAAe;QACrC,OAAO,CAAC,aAAa,CAAC,4BAA4B,EAClD;QACA,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,aAAa;YACxD,IAAI,EAAE;gBACJ,OAAO,EAAE;oBACP,MAAM,EAAE,IAAA,uBAAe,EAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;iBAC3C;aACF;SACF,CAAA;QACD,UAAU,CAAC,KAAK,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,OAAO,EAAE,CAAA;KACvD;IACD,OAAO,UAAU,CAAA;AACnB,CAAC,CAAC,CAAA;AA/BS,QAAA,4BAA4B,gCA+BrC"}
|
|
File without changes
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Type BaseType = {
|
|
3
|
+
// asd: number
|
|
4
|
+
// }
|
|
5
|
+
// class WithNormalGeneric<T extends BaseType> {
|
|
6
|
+
// fn: (param: T) => void
|
|
7
|
+
// constructor(config: { fn: (param: T) => void }) {
|
|
8
|
+
// this.fn = config.fn
|
|
9
|
+
// }
|
|
10
|
+
// }
|
|
11
|
+
// type ComplexGeneric = {
|
|
12
|
+
// Subtype: unknown
|
|
13
|
+
// }
|
|
14
|
+
// class WithComplexGeneric<T extends ComplexGeneric> {
|
|
15
|
+
// fn: (param: T['Subtype']) => void
|
|
16
|
+
// constructor(config: { fn: (param: T['Subtype']) => void }) {
|
|
17
|
+
// this.fn = config.fn
|
|
18
|
+
// }
|
|
19
|
+
// }
|
|
20
|
+
// // Union-aware keyof operator
|
|
21
|
+
// // keyof ({ a: number} | { b: number}) => never
|
|
22
|
+
// // KeysOf<{a: number} | {b: number}> => "a" | "b"
|
|
23
|
+
// // this exists to allow users to override faulty type-provider logic.
|
|
24
|
+
// // type KeysOf<T> = T extends any ? keyof T : never
|
|
25
|
+
// // class WithComplexGeneric2<T extends Partial<ComplexGeneric>, TT = {
|
|
26
|
+
// // [K in KeysOf<T | >]
|
|
27
|
+
// // }>
|
|
28
|
+
// class WithComplexGeneric3<
|
|
29
|
+
// SubtypeParam extends BaseType,
|
|
30
|
+
// T extends ComplexGeneric = {
|
|
31
|
+
// Subtype: SubtypeParam
|
|
32
|
+
// },
|
|
33
|
+
// > {
|
|
34
|
+
// fn: (param: T['Subtype']) => void
|
|
35
|
+
// constructor(config: { fn: (param: T['Subtype']) => void }) {
|
|
36
|
+
// this.fn = config.fn
|
|
37
|
+
// }
|
|
38
|
+
// }
|
|
39
|
+
// // Test inference
|
|
40
|
+
// const instance1 = new WithNormalGeneric({
|
|
41
|
+
// fn: (_: BaseType) => {
|
|
42
|
+
// return
|
|
43
|
+
// },
|
|
44
|
+
// })
|
|
45
|
+
// // Test 2
|
|
46
|
+
// const instance2 = new WithComplexGeneric({
|
|
47
|
+
// fn: (_: BaseType) => {
|
|
48
|
+
// return
|
|
49
|
+
// },
|
|
50
|
+
// })
|
|
51
|
+
// // Test 3
|
|
52
|
+
// class WithComplexGeneric3<
|
|
53
|
+
// SubtypeParam extends BaseType,
|
|
54
|
+
// T extends ComplexGeneric = {
|
|
55
|
+
// Subtype: SubtypeParam
|
|
56
|
+
// },
|
|
57
|
+
// > {
|
|
58
|
+
// fn: (param: T['Subtype']) => void
|
|
59
|
+
// constructor(config: { fn: (param: T['Subtype']) => void }) {
|
|
60
|
+
// this.fn = config.fn
|
|
61
|
+
// }
|
|
62
|
+
// }
|
|
63
|
+
// const instance2 = new WithComplexGeneric3({
|
|
64
|
+
// fn: (_: { asd: number; qwe: number }) => {
|
|
65
|
+
// return
|
|
66
|
+
// },
|
|
67
|
+
// })
|
|
68
|
+
// // Test 4
|
|
69
|
+
// class WithComplexGeneric4<T extends ComplexGeneric = ComplexGeneric> {
|
|
70
|
+
// fn: (param: T['Subtype']) => void
|
|
71
|
+
// constructor(config: { fn: (param: T['Subtype']) => void }) {
|
|
72
|
+
// this.fn = config.fn
|
|
73
|
+
// }
|
|
74
|
+
// }
|
|
75
|
+
// const instance2 = new WithComplexGeneric4({
|
|
76
|
+
// fn: (_: { asd: number; qwe: number }) => {
|
|
77
|
+
// return
|
|
78
|
+
// },
|
|
79
|
+
// })
|
|
80
|
+
// // Test 5
|
|
81
|
+
// type ExtensibleType<T> = {
|
|
82
|
+
// [K in keyof T | string]: K extends keyof T ? T[K] : unknown
|
|
83
|
+
// }
|
|
84
|
+
// type ExtensibleComplexGeneric = {
|
|
85
|
+
// SubType: ExtensibleType<BaseType>
|
|
86
|
+
// }
|
|
87
|
+
// class WithComplexGeneric5<T extends ExtensibleComplexGeneric> {
|
|
88
|
+
// fn: (param: T['SubType']) => void
|
|
89
|
+
// constructor(config: { fn: (param: T['SubType']) => void }) {
|
|
90
|
+
// this.fn = config.fn
|
|
91
|
+
// }
|
|
92
|
+
// }
|
|
93
|
+
// const instance2 = new WithComplexGeneric5({
|
|
94
|
+
// fn: (_: { asd: number; qwe: number }) => {
|
|
95
|
+
// return
|
|
96
|
+
// },
|
|
97
|
+
// })
|
|
98
|
+
// // Test 6
|
|
99
|
+
// class WithComplexGeneric6<T extends ComplexGeneric> {
|
|
100
|
+
// fn: (param: T['Subtype']) => void
|
|
101
|
+
// constructor(config: { fn: (param: T['Subtype']) => void }) {
|
|
102
|
+
// this.fn = config.fn
|
|
103
|
+
// }
|
|
104
|
+
// }
|
|
105
|
+
// const instance6 = new WithComplexGeneric6<{
|
|
106
|
+
// Subtype: BaseType
|
|
107
|
+
// }>({
|
|
108
|
+
// fn: (_: BaseType) => {
|
|
109
|
+
// return
|
|
110
|
+
// },
|
|
111
|
+
// })
|
|
112
|
+
// const instance6_1 = new WithComplexGeneric6({
|
|
113
|
+
// fn: (_: BaseType) => {
|
|
114
|
+
// return
|
|
115
|
+
// },
|
|
116
|
+
// })
|
|
117
|
+
// // Test 7
|
|
118
|
+
// // type SubtypeForGeneric<T> = T extends ComplexGeneric<>
|
|
119
|
+
// type ComplexGeneric2 = {
|
|
120
|
+
// Subtype: any
|
|
121
|
+
// }
|
|
122
|
+
// class WithComplexGeneric7<T extends ComplexGeneric2> {
|
|
123
|
+
// fn: (param: T['Subtype']) => void
|
|
124
|
+
// constructor(config: { fn: (param: T['Subtype']) => void, fn2: (param: T['Subtype']) => void }) {
|
|
125
|
+
// this.fn = config.fn
|
|
126
|
+
// }
|
|
127
|
+
// }
|
|
128
|
+
// const instance7 = new WithComplexGeneric7({
|
|
129
|
+
// fn: (_: BaseType) => {
|
|
130
|
+
// return
|
|
131
|
+
// },
|
|
132
|
+
// fn2: (_: { asd: number }) => {
|
|
133
|
+
// return
|
|
134
|
+
// },
|
|
135
|
+
// })
|
|
136
|
+
// //
|
|
137
|
+
// //
|
|
138
|
+
// // //
|
|
139
|
+
// //
|
|
140
|
+
// // //
|
|
141
|
+
// //
|
|
142
|
+
// // //
|
|
143
|
+
// //
|
|
144
|
+
// // //
|
|
145
|
+
// //
|
|
146
|
+
// // //
|
|
147
|
+
// //
|
|
148
|
+
// // //
|
|
149
|
+
// //
|
|
150
|
+
// // //
|
|
151
|
+
// //
|
|
152
|
+
// // //
|
|
153
|
+
// //
|
|
154
|
+
// // //
|
|
155
|
+
// //
|
|
156
|
+
// // //
|
|
157
|
+
// //
|
|
158
|
+
// // //
|
|
159
|
+
// //
|
|
160
|
+
// //
|
|
161
|
+
// type Head<T> = T extends [infer I, ...infer _Rest] ? I : never
|
|
162
|
+
// type Tail<T> = T extends [infer _I, ...infer Rest] ? Rest : never
|
|
163
|
+
// type Zip_DeepMergeTwoTypes<T, U> = T extends []
|
|
164
|
+
// ? U
|
|
165
|
+
// : U extends []
|
|
166
|
+
// ? T
|
|
167
|
+
// : [DeepMergeTwoTypes<Head<T>, Head<U>>, ...Zip_DeepMergeTwoTypes<Tail<T>, Tail<U>>]
|
|
168
|
+
// /**
|
|
169
|
+
// * Take two objects T and U and create the new one with uniq keys for T a U objectI
|
|
170
|
+
// * helper generic for `DeepMergeTwoTypes`
|
|
171
|
+
// */
|
|
172
|
+
// type GetObjDifferentKeys<
|
|
173
|
+
// T,
|
|
174
|
+
// U,
|
|
175
|
+
// T0 = Omit<T, keyof U> & Omit<U, keyof T>,
|
|
176
|
+
// T1 = { [K in keyof T0]: T0[K] },
|
|
177
|
+
// > = T1
|
|
178
|
+
// /**
|
|
179
|
+
// * Take two objects T and U and create the new one with the same objects keys
|
|
180
|
+
// * helper generic for `DeepMergeTwoTypes`
|
|
181
|
+
// */
|
|
182
|
+
// type GetObjSameKeys<T, U> = Omit<T | U, keyof GetObjDifferentKeys<T, U>>
|
|
183
|
+
// type MergeTwoObjects<
|
|
184
|
+
// T,
|
|
185
|
+
// U,
|
|
186
|
+
// // Non shared keys are optional
|
|
187
|
+
// T0 = Partial<GetObjDifferentKeys<T, U>> & {
|
|
188
|
+
// // Shared keys are recursively resolved by `DeepMergeTwoTypes<...>`
|
|
189
|
+
// [K in keyof GetObjSameKeys<T, U>]: DeepMergeTwoTypes<T[K], U[K]>
|
|
190
|
+
// },
|
|
191
|
+
// T1 = { [K in keyof T0]: T0[K] },
|
|
192
|
+
// > = T1
|
|
193
|
+
// // It merge 2 static types and try to avoid of unnecessary options (`'`)
|
|
194
|
+
// export type DeepMergeTwoTypes<T, U> =
|
|
195
|
+
// // ----- 2 added lines ------
|
|
196
|
+
// [T, U] extends [any[], any[]]
|
|
197
|
+
// ? Zip_DeepMergeTwoTypes<T, U>
|
|
198
|
+
// : // Check if generic types are objects
|
|
199
|
+
// [T, U] extends [{ [key: string]: unknown }, { [key: string]: unknown }]
|
|
200
|
+
// ? MergeTwoObjects<T, U>
|
|
201
|
+
// : T | U
|
|
202
|
+
//# sourceMappingURL=inference-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inference-test.js","sourceRoot":"","sources":["../../../src/transports/inference-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as client from 'prom-client';
|
|
2
|
+
import { TransportGenerics } from '.';
|
|
3
|
+
import { AdapterContext } from '../adapter';
|
|
4
|
+
export declare const dataProviderMetricsLabel: (providerStatusCode?: number, method?: string) => {
|
|
5
|
+
provider_status_code: number | undefined;
|
|
6
|
+
method: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const dataProviderRequests: client.Counter<"method" | "provider_status_code">;
|
|
9
|
+
export declare const dataProviderRequestDurationSeconds: client.Histogram<string>;
|
|
10
|
+
export declare const connectionErrorLabels: (message: string) => {
|
|
11
|
+
message: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const messageSubsLabels: (feed_id: string, cache_key: string) => {
|
|
14
|
+
feed_id: string;
|
|
15
|
+
subscription_key: string;
|
|
16
|
+
};
|
|
17
|
+
export declare const recordWsMessageMetrics: <T extends TransportGenerics>(context: AdapterContext<T>, subscribes: T["Request"]["Params"][], unsubscribes: T["Request"]["Params"][]) => void;
|
|
18
|
+
export declare const wsConnectionActive: client.Gauge<"url">;
|
|
19
|
+
export declare const wsConnectionErrors: client.Counter<"message" | "url">;
|
|
20
|
+
export declare const wsSubscriptionActive: client.Gauge<"feed_id" | "connection_url" | "subscription_key">;
|
|
21
|
+
export declare const wsSubscriptionTotal: client.Counter<"feed_id" | "connection_url" | "subscription_key">;
|
|
22
|
+
export declare const wsMessageTotal: client.Counter<"feed_id" | "subscription_key">;
|
|
23
|
+
export declare const bgExecuteSubscriptionSetCount: client.Gauge<"endpoint" | "transport_type">;
|
|
24
|
+
export declare const transportPollingFailureCount: client.Counter<"endpoint">;
|
|
25
|
+
export declare const transportPollingDurationSeconds: client.Gauge<"succeeded" | "endpoint">;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.transportPollingDurationSeconds = exports.transportPollingFailureCount = exports.bgExecuteSubscriptionSetCount = exports.wsMessageTotal = exports.wsSubscriptionTotal = exports.wsSubscriptionActive = exports.wsConnectionErrors = exports.wsConnectionActive = exports.recordWsMessageMetrics = exports.messageSubsLabels = exports.connectionErrorLabels = exports.dataProviderRequestDurationSeconds = exports.dataProviderRequests = exports.dataProviderMetricsLabel = void 0;
|
|
27
|
+
const client = __importStar(require("prom-client"));
|
|
28
|
+
const cache_1 = require("../cache");
|
|
29
|
+
const constants_1 = require("../metrics/constants");
|
|
30
|
+
// Data Provider Metrics
|
|
31
|
+
const dataProviderMetricsLabel = (providerStatusCode, method = 'get') => ({
|
|
32
|
+
provider_status_code: providerStatusCode,
|
|
33
|
+
method: method.toUpperCase(),
|
|
34
|
+
});
|
|
35
|
+
exports.dataProviderMetricsLabel = dataProviderMetricsLabel;
|
|
36
|
+
exports.dataProviderRequests = new client.Counter({
|
|
37
|
+
name: 'data_provider_requests',
|
|
38
|
+
help: 'The number of http requests that are made to a data provider',
|
|
39
|
+
labelNames: ['method', 'provider_status_code'],
|
|
40
|
+
});
|
|
41
|
+
exports.dataProviderRequestDurationSeconds = new client.Histogram({
|
|
42
|
+
name: 'data_provider_request_duration_seconds',
|
|
43
|
+
help: 'A histogram bucket of the distribution of data provider request durations',
|
|
44
|
+
buckets: constants_1.requestDurationBuckets,
|
|
45
|
+
});
|
|
46
|
+
// Websocket Metrics
|
|
47
|
+
const connectionErrorLabels = (message) => ({
|
|
48
|
+
// Key,
|
|
49
|
+
message,
|
|
50
|
+
});
|
|
51
|
+
exports.connectionErrorLabels = connectionErrorLabels;
|
|
52
|
+
const messageSubsLabels = (feed_id, cache_key) => ({
|
|
53
|
+
feed_id,
|
|
54
|
+
subscription_key: cache_key,
|
|
55
|
+
});
|
|
56
|
+
exports.messageSubsLabels = messageSubsLabels;
|
|
57
|
+
// Record WS message and subscription metrics
|
|
58
|
+
// Recalculate cacheKey and feedId for metrics
|
|
59
|
+
// since avoiding storing extra info in expiring sorted set
|
|
60
|
+
const recordWsMessageMetrics = (context, subscribes, unsubscribes) => {
|
|
61
|
+
subscribes.forEach((param) => {
|
|
62
|
+
const feedId = (0, cache_1.calculateFeedId)(context, param);
|
|
63
|
+
const cacheKey = (0, cache_1.calculateCacheKey)(context, param);
|
|
64
|
+
// Record total number of ws messages sent
|
|
65
|
+
exports.wsMessageTotal.labels((0, exports.messageSubsLabels)(feedId, cacheKey)).inc();
|
|
66
|
+
// Record total number of subscriptions made
|
|
67
|
+
exports.wsSubscriptionTotal.labels((0, exports.messageSubsLabels)(feedId, cacheKey)).inc();
|
|
68
|
+
// Record number of active ws subscriptions
|
|
69
|
+
exports.wsSubscriptionActive.labels((0, exports.messageSubsLabels)(feedId, cacheKey)).inc();
|
|
70
|
+
});
|
|
71
|
+
unsubscribes.forEach((param) => {
|
|
72
|
+
const feedId = (0, cache_1.calculateFeedId)(context, param);
|
|
73
|
+
const cacheKey = (0, cache_1.calculateCacheKey)(context, param);
|
|
74
|
+
// Record total number of ws messages sent
|
|
75
|
+
exports.wsMessageTotal.labels((0, exports.messageSubsLabels)(feedId, cacheKey)).inc();
|
|
76
|
+
// Record number of active ws subscriptions
|
|
77
|
+
exports.wsSubscriptionActive.labels((0, exports.messageSubsLabels)(feedId, cacheKey)).dec();
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
exports.recordWsMessageMetrics = recordWsMessageMetrics;
|
|
81
|
+
exports.wsConnectionActive = new client.Gauge({
|
|
82
|
+
name: 'ws_connection_active',
|
|
83
|
+
help: 'The number of active connections',
|
|
84
|
+
labelNames: ['url'],
|
|
85
|
+
});
|
|
86
|
+
exports.wsConnectionErrors = new client.Counter({
|
|
87
|
+
name: 'ws_connection_errors',
|
|
88
|
+
help: 'The number of connection errors',
|
|
89
|
+
labelNames: ['url', 'message'],
|
|
90
|
+
});
|
|
91
|
+
exports.wsSubscriptionActive = new client.Gauge({
|
|
92
|
+
name: 'ws_subscription_active',
|
|
93
|
+
help: 'The number of currently active subscriptions',
|
|
94
|
+
labelNames: ['connection_url', 'feed_id', 'subscription_key'],
|
|
95
|
+
});
|
|
96
|
+
exports.wsSubscriptionTotal = new client.Counter({
|
|
97
|
+
name: 'ws_subscription_total',
|
|
98
|
+
help: 'The number of subscriptions opened in total',
|
|
99
|
+
labelNames: ['connection_url', 'feed_id', 'subscription_key'],
|
|
100
|
+
});
|
|
101
|
+
exports.wsMessageTotal = new client.Counter({
|
|
102
|
+
name: 'ws_message_total',
|
|
103
|
+
help: 'The number of messages received in total',
|
|
104
|
+
labelNames: ['feed_id', 'subscription_key'],
|
|
105
|
+
});
|
|
106
|
+
// V3 specific metrics
|
|
107
|
+
exports.bgExecuteSubscriptionSetCount = new client.Gauge({
|
|
108
|
+
name: 'bg_execute_subscription_set_count',
|
|
109
|
+
help: 'The number of active subscriptions in background execute',
|
|
110
|
+
labelNames: ['endpoint', 'transport_type'],
|
|
111
|
+
});
|
|
112
|
+
exports.transportPollingFailureCount = new client.Counter({
|
|
113
|
+
name: 'transport_polling_failure_count',
|
|
114
|
+
help: 'The number of times the polling mechanism ran out of attempts and failed to return a response',
|
|
115
|
+
labelNames: ['endpoint'],
|
|
116
|
+
});
|
|
117
|
+
exports.transportPollingDurationSeconds = new client.Gauge({
|
|
118
|
+
name: 'transport_polling_duration_seconds',
|
|
119
|
+
help: 'A histogram bucket of the distribution of transport polling idle time durations',
|
|
120
|
+
labelNames: ['endpoint', 'succeeded'],
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/transports/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { AdapterRequest, AdapterResponse } from '../util/request';
|
|
2
|
+
import { Transport, TransportGenerics } from './';
|
|
3
|
+
import { Cache } from '../cache';
|
|
4
|
+
import { AxiosRequestConfig, AxiosResponse } from 'axios';
|
|
5
|
+
import { AdapterConfig } from '../config';
|
|
6
|
+
import { RequestRateLimiter } from '../rate-limiting';
|
|
7
|
+
import { AdapterDependencies } from '../adapter';
|
|
8
|
+
export { AxiosRequestConfig as HttpRequestConfig, AxiosResponse as HttpResponse };
|
|
9
|
+
/**
|
|
10
|
+
* Helper struct type that will be used to pass types to the generic parameters of a Transport.
|
|
11
|
+
* Extends the common TransportGenerics, adding Provider specific types for this Batch endpoint.
|
|
12
|
+
*/
|
|
13
|
+
declare type RestTransportGenerics = TransportGenerics & {
|
|
14
|
+
/**
|
|
15
|
+
* Type details for any provider specific interfaces.
|
|
16
|
+
*/
|
|
17
|
+
Provider: {
|
|
18
|
+
/**
|
|
19
|
+
* Structure of the body of the request that will be sent to the data provider.
|
|
20
|
+
*/
|
|
21
|
+
RequestBody: unknown;
|
|
22
|
+
/**
|
|
23
|
+
* Structure for the body of the response coming from the data provider.
|
|
24
|
+
*/
|
|
25
|
+
ResponseBody: unknown;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Transport implementation that takes incoming requests, transforms them into a DataProvider request,
|
|
30
|
+
* and executes that request returning the response immediately from the `setup` function.
|
|
31
|
+
* Optionally, setting the `coalescing` option to `true` will make it so once a request is in flight,
|
|
32
|
+
* new adapter requests for the same feed will not trigger a new one, but return an empty promise from
|
|
33
|
+
* the setup instead so the normal cache polling mechanism is used.
|
|
34
|
+
*
|
|
35
|
+
* @typeParam T - Helper struct type that will be used to pass types to the generic parameters (check [[RestTransportGenerics]])
|
|
36
|
+
*/
|
|
37
|
+
export declare class RestTransport<T extends RestTransportGenerics> implements Transport<T> {
|
|
38
|
+
protected config: {
|
|
39
|
+
prepareRequest: (req: AdapterRequest<T['Request']>, config: AdapterConfig<T['CustomSettings']>) => AxiosRequestConfig<T['Provider']['RequestBody']> | Promise<AxiosRequestConfig<T['Provider']['RequestBody']>>;
|
|
40
|
+
parseResponse: (req: AdapterRequest<T['Request']>, res: AxiosResponse<T['Provider']['ResponseBody']>, config: AdapterConfig<T['CustomSettings']>) => AdapterResponse<T['Response']> | Promise<AdapterResponse<T['Response']>>;
|
|
41
|
+
options: {
|
|
42
|
+
requestCoalescing: {
|
|
43
|
+
enabled: boolean;
|
|
44
|
+
entropyMax?: number;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
inFlightPrefix: string;
|
|
49
|
+
cache: Cache<AdapterResponse<T['Response']>>;
|
|
50
|
+
inFlightCache: Cache<boolean>;
|
|
51
|
+
rateLimiter: RequestRateLimiter;
|
|
52
|
+
constructor(config: {
|
|
53
|
+
prepareRequest: (req: AdapterRequest<T['Request']>, config: AdapterConfig<T['CustomSettings']>) => AxiosRequestConfig<T['Provider']['RequestBody']> | Promise<AxiosRequestConfig<T['Provider']['RequestBody']>>;
|
|
54
|
+
parseResponse: (req: AdapterRequest<T['Request']>, res: AxiosResponse<T['Provider']['ResponseBody']>, config: AdapterConfig<T['CustomSettings']>) => AdapterResponse<T['Response']> | Promise<AdapterResponse<T['Response']>>;
|
|
55
|
+
options: {
|
|
56
|
+
requestCoalescing: {
|
|
57
|
+
enabled: boolean;
|
|
58
|
+
entropyMax?: number;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
initialize(dependencies: AdapterDependencies, config: AdapterConfig<T['CustomSettings']>): Promise<void>;
|
|
63
|
+
protected waitUntilUnderRateLimit(options: {
|
|
64
|
+
maxRetries: number;
|
|
65
|
+
msBetweenRetries: number;
|
|
66
|
+
}, retry?: number): Promise<void>;
|
|
67
|
+
foregroundExecute(req: AdapterRequest<T['Request']>, config: AdapterConfig<T['CustomSettings']>): Promise<AdapterResponse<T['Response']> | undefined>;
|
|
68
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.RestTransport = void 0;
|
|
27
|
+
const util_1 = require("../util");
|
|
28
|
+
const error_1 = require("../validation/error");
|
|
29
|
+
const util_2 = require("./util");
|
|
30
|
+
const rateLimitMetrics = __importStar(require("../rate-limiting/metrics"));
|
|
31
|
+
const IN_FLIGHT_PREFIX = 'InFlight';
|
|
32
|
+
const logger = (0, util_1.makeLogger)('RestTransport');
|
|
33
|
+
/**
|
|
34
|
+
* Transport implementation that takes incoming requests, transforms them into a DataProvider request,
|
|
35
|
+
* and executes that request returning the response immediately from the `setup` function.
|
|
36
|
+
* Optionally, setting the `coalescing` option to `true` will make it so once a request is in flight,
|
|
37
|
+
* new adapter requests for the same feed will not trigger a new one, but return an empty promise from
|
|
38
|
+
* the setup instead so the normal cache polling mechanism is used.
|
|
39
|
+
*
|
|
40
|
+
* @typeParam T - Helper struct type that will be used to pass types to the generic parameters (check [[RestTransportGenerics]])
|
|
41
|
+
*/
|
|
42
|
+
class RestTransport {
|
|
43
|
+
constructor(config) {
|
|
44
|
+
this.config = config;
|
|
45
|
+
}
|
|
46
|
+
async initialize(dependencies, config) {
|
|
47
|
+
this.inFlightPrefix = `${IN_FLIGHT_PREFIX}-`;
|
|
48
|
+
this.cache = dependencies.cache;
|
|
49
|
+
this.inFlightCache = dependencies.cache;
|
|
50
|
+
this.rateLimiter = dependencies.requestRateLimiter;
|
|
51
|
+
// Allow enabling/disabling request coalescing through env var
|
|
52
|
+
this.config.options.requestCoalescing.enabled = config.REQUEST_COALESCING_ENABLED;
|
|
53
|
+
this.config.options.requestCoalescing.entropyMax = config.REQUEST_COALESCING_ENTROPY_MAX;
|
|
54
|
+
}
|
|
55
|
+
async waitUntilUnderRateLimit(options, retry = 0) {
|
|
56
|
+
if (this.rateLimiter.isUnderLimits()) {
|
|
57
|
+
logger.trace('Incoming request would not be under limits, moving on');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (retry >= options.maxRetries) {
|
|
61
|
+
throw new error_1.AdapterError({
|
|
62
|
+
statusCode: 504,
|
|
63
|
+
message: `REST Transport timed out while waiting for rate limit availability (max retries: ${options.maxRetries})`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
logger.debug(`Request would be over rate limits, sleeping for ${options.msBetweenRetries}`);
|
|
67
|
+
await (0, util_1.sleep)(options.msBetweenRetries);
|
|
68
|
+
await this.waitUntilUnderRateLimit(options, retry + 1);
|
|
69
|
+
}
|
|
70
|
+
async foregroundExecute(req, config) {
|
|
71
|
+
// Add some entropy here because of possible scenario where the key won't be set before multiple
|
|
72
|
+
// other instances in a burst request try to access the coalescing key.
|
|
73
|
+
const randomMs = Math.random() * (this.config.options.requestCoalescing.entropyMax || 0);
|
|
74
|
+
await (0, util_1.sleep)(randomMs);
|
|
75
|
+
// Check if request is in flight if coalescing is enabled
|
|
76
|
+
const inFlight = this.config.options.requestCoalescing.enabled &&
|
|
77
|
+
(await this.cache.get(this.inFlightPrefix + req.requestContext.cacheKey));
|
|
78
|
+
if (inFlight) {
|
|
79
|
+
logger.debug('Request is in flight, transport has been set up');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
else if (this.config.options.requestCoalescing.enabled) {
|
|
83
|
+
// If it wasn't in flight and coalescing is disabled, register it as in flight
|
|
84
|
+
const ttl = config.REST_TRANSPORT_MAX_RATE_LIMIT_RETRIES *
|
|
85
|
+
config.REST_TRANSPORT_MS_BETWEEN_RATE_LIMIT_RETRIES;
|
|
86
|
+
logger.debug('Setting up rest transport, setting request in flight in cache');
|
|
87
|
+
await this.inFlightCache.set(this.inFlightPrefix + req.requestContext.cacheKey, true, ttl + 100); // Can't use Infinity for things like Redis
|
|
88
|
+
}
|
|
89
|
+
const request = await this.config.prepareRequest(req, config);
|
|
90
|
+
logger.trace('Check if we are under rate limits to perform request');
|
|
91
|
+
await this.waitUntilUnderRateLimit({
|
|
92
|
+
maxRetries: config.REST_TRANSPORT_MAX_RATE_LIMIT_RETRIES,
|
|
93
|
+
msBetweenRetries: config.REST_TRANSPORT_MS_BETWEEN_RATE_LIMIT_RETRIES,
|
|
94
|
+
});
|
|
95
|
+
logger.trace('Sending request to data provider...');
|
|
96
|
+
const providerResponse = await (0, util_2.axiosRequest)(request, config);
|
|
97
|
+
logger.debug(`Got response from provider, parsing (raw body: ${providerResponse.data})`);
|
|
98
|
+
const parsedResponse = await this.config.parseResponse(req, providerResponse, config);
|
|
99
|
+
if (config.API_VERBOSE) {
|
|
100
|
+
parsedResponse.data = providerResponse.data;
|
|
101
|
+
}
|
|
102
|
+
if (config.METRICS_ENABLED && config.EXPERIMENTAL_METRICS_ENABLED) {
|
|
103
|
+
parsedResponse.maxAge = Date.now() + config.CACHE_MAX_AGE;
|
|
104
|
+
parsedResponse.meta = {
|
|
105
|
+
metrics: { feedId: req.requestContext.meta?.metrics?.feedId || 'N/A' },
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
logger.debug('Setting provider response in cache');
|
|
109
|
+
await this.cache.set(req.requestContext.cacheKey, parsedResponse, config.CACHE_MAX_AGE);
|
|
110
|
+
// Record cost of data provider call
|
|
111
|
+
const cost = rateLimitMetrics.retrieveCost(providerResponse.data);
|
|
112
|
+
rateLimitMetrics.rateLimitCreditsSpentTotal
|
|
113
|
+
.labels({
|
|
114
|
+
feed_id: req.requestContext.meta?.metrics?.feedId || 'N/A',
|
|
115
|
+
participant_id: req.requestContext.cacheKey,
|
|
116
|
+
})
|
|
117
|
+
.inc(cost);
|
|
118
|
+
// Update cacheHit flag in request meta for metrics use
|
|
119
|
+
req.requestContext.meta = {
|
|
120
|
+
...req.requestContext.meta,
|
|
121
|
+
metrics: { ...req.requestContext.meta?.metrics, cacheHit: false },
|
|
122
|
+
};
|
|
123
|
+
if (this.config.options.requestCoalescing.enabled) {
|
|
124
|
+
logger.debug('Set provider response in cache, removing in flight from cache');
|
|
125
|
+
await this.cache.delete(this.inFlightPrefix);
|
|
126
|
+
}
|
|
127
|
+
return parsedResponse;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.RestTransport = RestTransport;
|
|
131
|
+
//# sourceMappingURL=rest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../src/transports/rest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,kCAA2C;AAG3C,+CAAkD;AAClD,iCAAqC;AACrC,2EAA4D;AAK5D,MAAM,gBAAgB,GAAG,UAAU,CAAA;AAEnC,MAAM,MAAM,GAAG,IAAA,iBAAU,EAAC,eAAe,CAAC,CAAA;AAuB1C;;;;;;;;GAQG;AACH,MAAa,aAAa;IAMxB,YACY,MAkBT;QAlBS,WAAM,GAAN,MAAM,CAkBf;IACA,CAAC;IAEJ,KAAK,CAAC,UAAU,CACd,YAAiC,EACjC,MAA0C;QAE1C,IAAI,CAAC,cAAc,GAAG,GAAG,gBAAgB,GAAG,CAAA;QAC5C,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,KAA8C,CAAA;QACxE,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC,KAAuB,CAAA;QACzD,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,kBAAkB,CAAA;QAElD,8DAA8D;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,GAAG,MAAM,CAAC,0BAA0B,CAAA;QACjF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,UAAU,GAAG,MAAM,CAAC,8BAA8B,CAAA;IAC1F,CAAC;IAES,KAAK,CAAC,uBAAuB,CACrC,OAGC,EACD,KAAK,GAAG,CAAC;QAET,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE;YACpC,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAA;YACrE,OAAM;SACP;QAED,IAAI,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE;YAC/B,MAAM,IAAI,oBAAY,CAAC;gBACrB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,oFAAoF,OAAO,CAAC,UAAU,GAAG;aACnH,CAAC,CAAA;SACH;QAED,MAAM,CAAC,KAAK,CAAC,mDAAmD,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAA;QAC3F,MAAM,IAAA,YAAK,EAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;QACrC,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;IACxD,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,GAAiC,EACjC,MAA0C;QAE1C,gGAAgG;QAChG,uEAAuE;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,UAAU,IAAI,CAAC,CAAC,CAAA;QACxF,MAAM,IAAA,YAAK,EAAC,QAAQ,CAAC,CAAA;QAErB,yDAAyD;QACzD,MAAM,QAAQ,GACZ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO;YAC7C,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC3E,IAAI,QAAQ,EAAE;YACZ,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAA;YAC/D,OAAM;SACP;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE;YACxD,8EAA8E;YAC9E,MAAM,GAAG,GACP,MAAM,CAAC,qCAAqC;gBAC5C,MAAM,CAAC,4CAA4C,CAAA;YACrD,MAAM,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAA;YAC7E,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAC1B,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC,QAAQ,EACjD,IAAI,EACJ,GAAG,GAAG,GAAG,CACV,CAAA,CAAC,2CAA2C;SAC9C;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAE7D,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAA;QACpE,MAAM,IAAI,CAAC,uBAAuB,CAAC;YACjC,UAAU,EAAE,MAAM,CAAC,qCAAqC;YACxD,gBAAgB,EAAE,MAAM,CAAC,4CAA4C;SACtE,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACnD,MAAM,gBAAgB,GAAG,MAAM,IAAA,mBAAY,EAIzC,OAAO,EAAE,MAAM,CAAC,CAAA;QAElB,MAAM,CAAC,KAAK,CAAC,kDAAkD,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAA;QACxF,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAA;QAErF,IAAI,MAAM,CAAC,WAAW,EAAE;YACtB,cAAc,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAA;SAC5C;QAED,IAAI,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,4BAA4B,EAAE;YACjE,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,aAAa,CAAA;YACzD,cAAc,CAAC,IAAI,GAAG;gBACpB,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK,EAAE;aACvE,CAAA;SACF;QAED,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAA;QAClD,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,CAAA;QAEvF,oCAAoC;QACpC,MAAM,IAAI,GAAG,gBAAgB,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACjE,gBAAgB,CAAC,0BAA0B;aACxC,MAAM,CAAC;YACN,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK;YAC1D,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC,QAAQ;SAC5C,CAAC;aACD,GAAG,CAAC,IAAI,CAAC,CAAA;QAEZ,uDAAuD;QACvD,GAAG,CAAC,cAAc,CAAC,IAAI,GAAG;YACxB,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI;YAC1B,OAAO,EAAE,EAAE,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE;SAClE,CAAA;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE;YACjD,MAAM,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAA;YAC7E,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;SAC7C;QAED,OAAO,cAAc,CAAA;IACvB,CAAC;CACF;AArJD,sCAqJC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|