@chainlink/external-adapter-framework 0.12.1 → 0.13.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.js +9 -4
- package/adapter/basic.js.map +1 -1
- package/adapter/endpoint.d.ts +9 -1
- package/adapter/endpoint.js +23 -0
- package/adapter/endpoint.js.map +1 -1
- package/cache/index.d.ts +4 -2
- package/cache/index.js +2 -2
- package/cache/index.js.map +1 -1
- package/cache/local.d.ts +2 -0
- package/cache/local.js +2 -31
- package/cache/local.js.map +1 -1
- package/cache/metrics.d.ts +5 -2
- package/cache/metrics.js +19 -3
- package/cache/metrics.js.map +1 -1
- package/cache/redis.d.ts +2 -0
- package/cache/redis.js +7 -9
- package/cache/redis.js.map +1 -1
- package/cache/response.d.ts +36 -0
- package/cache/response.js +97 -0
- package/cache/response.js.map +1 -0
- package/config/index.d.ts +6 -6
- package/config/index.js +6 -10
- package/config/index.js.map +1 -1
- package/index.js +4 -1
- package/index.js.map +1 -1
- package/metrics/util.d.ts +1 -1
- package/metrics/util.js +2 -2
- package/metrics/util.js.map +1 -1
- package/package.json +2 -2
- package/rate-limiting/metrics.js +1 -1
- package/rate-limiting/metrics.js.map +1 -1
- package/transports/abstract/streaming.d.ts +34 -0
- package/transports/abstract/streaming.js +44 -0
- package/transports/abstract/streaming.js.map +1 -0
- package/transports/abstract/subscription.d.ts +38 -0
- package/transports/abstract/subscription.js +63 -0
- package/transports/abstract/subscription.js.map +1 -0
- package/transports/batch-warming.d.ts +7 -12
- package/transports/batch-warming.js +42 -28
- package/transports/batch-warming.js.map +1 -1
- package/transports/index.d.ts +20 -13
- package/transports/index.js +0 -35
- package/transports/index.js.map +1 -1
- package/transports/meta/index.d.ts +1 -0
- package/transports/meta/index.js +18 -0
- package/transports/meta/index.js.map +1 -0
- package/transports/{routing.d.ts → meta/routing.d.ts} +11 -5
- package/transports/{routing.js → meta/routing.js} +6 -6
- package/transports/meta/routing.js.map +1 -0
- package/transports/metrics.d.ts +11 -4
- package/transports/metrics.js +30 -20
- package/transports/metrics.js.map +1 -1
- package/transports/rest.d.ts +10 -7
- package/transports/rest.js +22 -12
- package/transports/rest.js.map +1 -1
- package/transports/sse.d.ts +8 -12
- package/transports/sse.js +29 -39
- package/transports/sse.js.map +1 -1
- package/transports/websocket.d.ts +15 -14
- package/transports/websocket.js +87 -60
- package/transports/websocket.js.map +1 -1
- package/util/request.d.ts +90 -11
- package/transports/routing.js.map +0 -1
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import WebSocket, { ClientOptions, RawData } from 'ws';
|
|
2
|
-
import {
|
|
3
|
-
import { Cache } from '../cache';
|
|
2
|
+
import { EndpointContext } from '../adapter';
|
|
4
3
|
import { AdapterConfig } from '../config';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { Transport, TransportGenerics } from './';
|
|
4
|
+
import { ProviderResult } from '../util/request';
|
|
5
|
+
import { TransportGenerics } from './';
|
|
6
|
+
import { StreamingTransport, SubscriptionDeltas } from './abstract/streaming';
|
|
9
7
|
export { WebSocket, RawData as WebSocketRawData };
|
|
10
8
|
declare type WebSocketClass = new (url: string, protocols?: string | string[] | undefined, options?: ClientOptions) => WebSocket;
|
|
11
9
|
export declare class WebSocketClassProvider {
|
|
@@ -79,21 +77,24 @@ declare type WebsocketTransportGenerics = TransportGenerics & {
|
|
|
79
77
|
*
|
|
80
78
|
* @typeParam T - Helper struct type that will be used to pass types to the generic parameters (check [[WebsocketTransportGenerics]])
|
|
81
79
|
*/
|
|
82
|
-
export declare class WebSocketTransport<T extends WebsocketTransportGenerics>
|
|
80
|
+
export declare class WebSocketTransport<T extends WebsocketTransportGenerics> extends StreamingTransport<T> {
|
|
83
81
|
private config;
|
|
84
|
-
cache: Cache<AdapterResponse<T['Response']>>;
|
|
85
|
-
rateLimiter: BackgroundExecuteRateLimiter;
|
|
86
|
-
subscriptionSet: SubscriptionSet<T['Request']['Params']>;
|
|
87
|
-
localSubscriptions: T['Request']['Params'][];
|
|
88
82
|
wsConnection: WebSocket;
|
|
89
83
|
currentUrl: string;
|
|
84
|
+
lastMessageReceivedAt: number;
|
|
85
|
+
connectionOpenedAt: number;
|
|
90
86
|
constructor(config: WebSocketTransportConfig<T>);
|
|
91
|
-
|
|
92
|
-
registerRequest(req: AdapterRequest<T['Request']>, config: AdapterConfig<T['CustomSettings']>): Promise<void>;
|
|
87
|
+
getSubscriptionTtlFromConfig(config: AdapterConfig<T['CustomSettings']>): number;
|
|
93
88
|
connectionClosed(): boolean;
|
|
94
89
|
serializeMessage(payload: unknown): string;
|
|
95
90
|
deserializeMessage(data: WebSocket.Data): T['Provider']['WsMessage'];
|
|
91
|
+
buildConnectionHandlers(context: EndpointContext<T>, connectionReadyResolve: (value: unknown) => void): {
|
|
92
|
+
open: (event: WebSocket.Event) => Promise<void>;
|
|
93
|
+
message: (event: WebSocket.MessageEvent) => Promise<void>;
|
|
94
|
+
error: (event: WebSocket.ErrorEvent) => Promise<void>;
|
|
95
|
+
close: (event: WebSocket.CloseEvent) => void;
|
|
96
|
+
};
|
|
96
97
|
establishWsConnection(context: EndpointContext<T>, url: string, options?: WebSocket.ClientOptions | undefined): Promise<unknown>;
|
|
97
98
|
sendMessages(context: EndpointContext<T>, subscribes: unknown[], unsubscribes: unknown[]): Promise<void>;
|
|
98
|
-
|
|
99
|
+
streamHandler(context: EndpointContext<T>, subscriptions: SubscriptionDeltas<T['Request']['Params']>): Promise<void>;
|
|
99
100
|
}
|
package/transports/websocket.js
CHANGED
|
@@ -30,8 +30,8 @@ exports.WebSocketTransport = exports.WebSocketClassProvider = exports.WebSocket
|
|
|
30
30
|
const ws_1 = __importDefault(require("ws"));
|
|
31
31
|
exports.WebSocket = ws_1.default;
|
|
32
32
|
const util_1 = require("../util");
|
|
33
|
-
const _1 = require("./");
|
|
34
33
|
const transportMetrics = __importStar(require("./metrics"));
|
|
34
|
+
const streaming_1 = require("./abstract/streaming");
|
|
35
35
|
const logger = (0, util_1.makeLogger)('WebSocketTransport');
|
|
36
36
|
class WebSocketClassProvider {
|
|
37
37
|
static set(ctor) {
|
|
@@ -49,22 +49,16 @@ WebSocketClassProvider.ctor = ws_1.default;
|
|
|
49
49
|
*
|
|
50
50
|
* @typeParam T - Helper struct type that will be used to pass types to the generic parameters (check [[WebsocketTransportGenerics]])
|
|
51
51
|
*/
|
|
52
|
-
class WebSocketTransport {
|
|
52
|
+
class WebSocketTransport extends streaming_1.StreamingTransport {
|
|
53
53
|
constructor(config) {
|
|
54
|
+
super();
|
|
54
55
|
this.config = config;
|
|
55
|
-
// The double sets serve to create a simple polling mechanism instead of needing a subscription
|
|
56
|
-
// This one would not; this is always local state
|
|
57
|
-
this.localSubscriptions = [];
|
|
58
56
|
this.currentUrl = '';
|
|
57
|
+
this.lastMessageReceivedAt = 0;
|
|
58
|
+
this.connectionOpenedAt = 0;
|
|
59
59
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
this.rateLimiter = dependencies.backgroundExecuteRateLimiter;
|
|
63
|
-
this.subscriptionSet = dependencies.subscriptionSetFactory.buildSet(endpointName);
|
|
64
|
-
}
|
|
65
|
-
async registerRequest(req, config) {
|
|
66
|
-
logger.debug(`Adding entry to subscription set (ttl: ${config.WS_SUBSCRIPTION_TTL}): [${req.requestContext.cacheKey}] = ${req.requestContext.data}`);
|
|
67
|
-
await this.subscriptionSet.add(req.requestContext.cacheKey, req.requestContext.data, config.WS_SUBSCRIPTION_TTL);
|
|
60
|
+
getSubscriptionTtlFromConfig(config) {
|
|
61
|
+
return config.WS_SUBSCRIPTION_TTL;
|
|
68
62
|
}
|
|
69
63
|
connectionClosed() {
|
|
70
64
|
return !this.wsConnection || this.wsConnection.readyState === ws_1.default.CLOSED;
|
|
@@ -75,11 +69,10 @@ class WebSocketTransport {
|
|
|
75
69
|
deserializeMessage(data) {
|
|
76
70
|
return JSON.parse(data.toString());
|
|
77
71
|
}
|
|
78
|
-
|
|
79
|
-
return
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
this.wsConnection.addEventListener('open', async (event) => {
|
|
72
|
+
buildConnectionHandlers(context, connectionReadyResolve) {
|
|
73
|
+
return {
|
|
74
|
+
// Called when the WS connection is opened
|
|
75
|
+
open: async (event) => {
|
|
83
76
|
logger.debug(`Opened websocket connection. (event type ${event.type})`);
|
|
84
77
|
if (this.config.handlers.open) {
|
|
85
78
|
await this.config.handlers.open(this.wsConnection, context);
|
|
@@ -87,31 +80,64 @@ class WebSocketTransport {
|
|
|
87
80
|
}
|
|
88
81
|
// Record active ws connections by incrementing count on open
|
|
89
82
|
transportMetrics.wsConnectionActive.inc();
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
|
|
83
|
+
connectionReadyResolve(true);
|
|
84
|
+
},
|
|
85
|
+
// Called when any message is received by the open connection
|
|
86
|
+
message: async (event) => {
|
|
93
87
|
const parsed = this.deserializeMessage(event.data);
|
|
94
88
|
logger.trace(`Got ws message: ${event.data}`);
|
|
95
|
-
const
|
|
89
|
+
const providerDataReceived = Date.now();
|
|
90
|
+
const results = this.config.handlers.message(parsed, context)?.map((r) => {
|
|
91
|
+
const result = r;
|
|
92
|
+
const partialResponse = r.response;
|
|
93
|
+
result.response.timestamps = {
|
|
94
|
+
providerDataStreamEstablished: this.providerDataStreamEstablished,
|
|
95
|
+
providerDataReceived,
|
|
96
|
+
providerIndicatedTime: partialResponse.timestamps?.providerIndicatedTime,
|
|
97
|
+
};
|
|
98
|
+
return result;
|
|
99
|
+
});
|
|
96
100
|
if (Array.isArray(results)) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
101
|
+
// Updating the last message received time here, to only care about messages we use
|
|
102
|
+
this.lastMessageReceivedAt = Date.now();
|
|
103
|
+
logger.trace(`Writing ${results.length} responses to cache`);
|
|
104
|
+
await this.responseCache.write(results);
|
|
100
105
|
}
|
|
101
|
-
|
|
102
|
-
|
|
106
|
+
// Do this after writing so we get the values to the cache ASAP
|
|
107
|
+
// We're not calculating feedId or subscription because this is only a single message,
|
|
108
|
+
// and it could in theory contain more than one value to set to the cache
|
|
109
|
+
transportMetrics.wsMessageTotal
|
|
110
|
+
.labels({
|
|
111
|
+
direction: 'received',
|
|
112
|
+
})
|
|
113
|
+
.inc();
|
|
114
|
+
},
|
|
115
|
+
// Called when an error is thrown by the connection
|
|
116
|
+
error: async (event) => {
|
|
103
117
|
logger.debug(`Error occurred in web socket connection. Error: ${event.error} ; Message: ${event.message}`);
|
|
104
118
|
// Record connection error count
|
|
105
119
|
transportMetrics.wsConnectionErrors
|
|
106
120
|
.labels(transportMetrics.connectionErrorLabels(event.message))
|
|
107
121
|
.inc();
|
|
108
|
-
}
|
|
109
|
-
|
|
122
|
+
},
|
|
123
|
+
// Called when the WS connection closes for any reason
|
|
124
|
+
close: (event) => {
|
|
110
125
|
logger.debug(`Closed websocket connection. Code: ${event.code} ; reason: ${event.reason?.toString()}`);
|
|
111
126
|
// Record active ws connections by decrementing count on close
|
|
112
127
|
// Using URL in label since connection_key is removed from v3
|
|
113
128
|
transportMetrics.wsConnectionActive.dec();
|
|
114
|
-
}
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
establishWsConnection(context, url, options) {
|
|
133
|
+
return new Promise((resolve) => {
|
|
134
|
+
const ctor = WebSocketClassProvider.get();
|
|
135
|
+
const handlers = this.buildConnectionHandlers(context, resolve);
|
|
136
|
+
this.wsConnection = new ctor(url, undefined, options);
|
|
137
|
+
this.wsConnection.addEventListener('open', handlers.open);
|
|
138
|
+
this.wsConnection.addEventListener('message', handlers.message);
|
|
139
|
+
this.wsConnection.addEventListener('error', handlers.error);
|
|
140
|
+
this.wsConnection.addEventListener('close', handlers.close);
|
|
115
141
|
});
|
|
116
142
|
}
|
|
117
143
|
async sendMessages(context, subscribes, unsubscribes) {
|
|
@@ -122,59 +148,60 @@ class WebSocketTransport {
|
|
|
122
148
|
this.wsConnection.send(message);
|
|
123
149
|
}
|
|
124
150
|
}
|
|
125
|
-
|
|
126
|
-
async backgroundExecute(context) {
|
|
127
|
-
logger.debug('Starting background execute, getting subscriptions from sorted set');
|
|
128
|
-
const desiredSubs = await this.subscriptionSet.getAll();
|
|
129
|
-
// Keep track of active subscriptions for background execute
|
|
130
|
-
transportMetrics.bgExecuteSubscriptionSetCount
|
|
131
|
-
.labels({ endpoint: context.endpointName, transport_type: 'websocket' })
|
|
132
|
-
.set(desiredSubs.length);
|
|
133
|
-
logger.debug('Generating delta (subscribes & unsubscribes)');
|
|
134
|
-
const subscribes = desiredSubs.filter((s) => !this.localSubscriptions.map((ls) => JSON.stringify(ls)).includes(JSON.stringify(s)));
|
|
135
|
-
const unsubscribes = this.localSubscriptions.filter((s) => !desiredSubs.map((ds) => JSON.stringify(ds)).includes(JSON.stringify(s)));
|
|
136
|
-
logger.debug(`${subscribes.length} new subscriptions; ${unsubscribes.length} to unsubscribe`);
|
|
137
|
-
if (subscribes.length) {
|
|
138
|
-
logger.trace(`Will subscribe to: ${JSON.stringify(subscribes)}`);
|
|
139
|
-
}
|
|
140
|
-
if (unsubscribes.length) {
|
|
141
|
-
logger.trace(`Will unsubscribe to: ${JSON.stringify(unsubscribes)}`);
|
|
142
|
-
}
|
|
151
|
+
async streamHandler(context, subscriptions) {
|
|
143
152
|
// New subs && no connection -> connect -> add subs
|
|
144
153
|
// No new subs && no connection -> skip
|
|
145
154
|
// New subs && connection -> add subs
|
|
146
155
|
// No new subs && connection -> unsubs only
|
|
147
|
-
if (!
|
|
156
|
+
if (!subscriptions.new.length && !this.wsConnection) {
|
|
148
157
|
logger.debug('No entries in subscription set and no established connection, skipping');
|
|
149
|
-
return
|
|
158
|
+
return;
|
|
150
159
|
}
|
|
151
|
-
|
|
160
|
+
// We want to check if the URL we calculate is different from the one currently connected.
|
|
161
|
+
// This is because some providers handle subscriptions on the URLs and not through messages.
|
|
162
|
+
const urlFromConfig = await this.config.url(context, subscriptions.desired);
|
|
152
163
|
const urlChanged = this.currentUrl !== urlFromConfig;
|
|
164
|
+
// We want to check that if we have a connection, it hasn't gone stale. That is,
|
|
165
|
+
// since opening it, have we had any activity from the provider.
|
|
166
|
+
const now = Date.now();
|
|
167
|
+
const timeSinceLastMessage = Math.max(0, now - this.lastMessageReceivedAt);
|
|
168
|
+
const timeSinceConnectionOpened = Math.max(0, now - this.connectionOpenedAt);
|
|
169
|
+
const timeSinceLastActivity = Math.min(timeSinceLastMessage, timeSinceConnectionOpened);
|
|
170
|
+
const connectionUnresponsive = timeSinceLastActivity > 0 &&
|
|
171
|
+
timeSinceLastActivity > context.adapterConfig.WS_SUBSCRIPTION_UNRESPONSIVE_TTL;
|
|
153
172
|
let connectionClosed = this.connectionClosed();
|
|
154
173
|
// Check if we should close the current connection
|
|
155
|
-
if (!connectionClosed && urlChanged) {
|
|
156
|
-
|
|
174
|
+
if (!connectionClosed && (urlChanged || connectionUnresponsive)) {
|
|
175
|
+
const reason = urlChanged
|
|
176
|
+
? `Websocket url has changed from ${this.currentUrl} to ${urlFromConfig}, closing connection...`
|
|
177
|
+
: `Last message was received ${timeSinceLastMessage} ago, exceeding the threshold of ${context.adapterConfig.WS_SUBSCRIPTION_UNRESPONSIVE_TTL}ms, closing connection...`;
|
|
178
|
+
logger.info(reason);
|
|
157
179
|
this.wsConnection.close();
|
|
158
180
|
connectionClosed = true;
|
|
181
|
+
// If the connection was closed, the new subscriptions should be the desired ones
|
|
182
|
+
subscriptions.new = subscriptions.desired;
|
|
183
|
+
if (subscriptions.new.length) {
|
|
184
|
+
logger.trace(`Connection will be reopened and will subscribe to new and resubscribe to existing: ${JSON.stringify(subscriptions.new)}`);
|
|
185
|
+
}
|
|
159
186
|
}
|
|
160
187
|
// Check if we need to open a new connection
|
|
161
|
-
if (connectionClosed &&
|
|
188
|
+
if (connectionClosed && subscriptions.desired.length) {
|
|
162
189
|
logger.debug('No established connection and new subscriptions available, connecting to WS');
|
|
163
190
|
const options = this.config.options && (await this.config.options(context));
|
|
164
191
|
this.currentUrl = urlFromConfig;
|
|
192
|
+
// Need to write this now, otherwise there could be messages sent with values before the open handler finishes
|
|
193
|
+
this.providerDataStreamEstablished = Date.now();
|
|
165
194
|
await this.establishWsConnection(context, urlFromConfig, options);
|
|
195
|
+
this.connectionOpenedAt = Date.now();
|
|
166
196
|
}
|
|
167
197
|
if (this.config.builders) {
|
|
168
198
|
logger.debug('Sending subs/unsubs if there are any');
|
|
169
199
|
const { subscribeMessage, unsubscribeMessage } = this.config.builders;
|
|
170
|
-
await this.sendMessages(context, subscribeMessage ?
|
|
200
|
+
await this.sendMessages(context, subscribeMessage ? subscriptions.new.map(subscribeMessage) : subscriptions.new, unsubscribeMessage ? subscriptions.stale.map(unsubscribeMessage) : subscriptions.stale);
|
|
171
201
|
}
|
|
172
202
|
// Record WS message and subscription metrics
|
|
173
|
-
transportMetrics.recordWsMessageMetrics(context,
|
|
174
|
-
|
|
175
|
-
this.localSubscriptions = desiredSubs;
|
|
176
|
-
logger.debug('Background execute complete');
|
|
177
|
-
return this.rateLimiter.msUntilNextExecution(context.endpointName);
|
|
203
|
+
transportMetrics.recordWsMessageMetrics(context, subscriptions.new, subscriptions.stale);
|
|
204
|
+
return;
|
|
178
205
|
}
|
|
179
206
|
}
|
|
180
207
|
exports.WebSocketTransport = WebSocketTransport;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/transports/websocket.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAsD;
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/transports/websocket.ts"],"names":[],"mappings":"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"}
|
package/util/request.d.ts
CHANGED
|
@@ -76,18 +76,27 @@ export interface AdapterMetricsMeta {
|
|
|
76
76
|
export declare type AdapterRequestData = Record<string, unknown> & {
|
|
77
77
|
endpoint?: string;
|
|
78
78
|
};
|
|
79
|
+
export declare type ProviderResultGenerics = {
|
|
80
|
+
Request: RequestGenerics;
|
|
81
|
+
Response: ResponseGenerics;
|
|
82
|
+
};
|
|
79
83
|
/**
|
|
80
84
|
* Helper type to hold the value from responses from a provider, and the adapter params they correspond to.
|
|
81
85
|
*/
|
|
82
|
-
export
|
|
83
|
-
Request: RequestGenerics;
|
|
84
|
-
Response: ResponseGenerics;
|
|
85
|
-
}> {
|
|
86
|
+
export declare type ProviderResult<T extends ProviderResultGenerics> = {
|
|
86
87
|
/** The set of parameters that uniquely relate to the response */
|
|
87
88
|
params: T['Request']['Params'];
|
|
88
89
|
/** Value that will be included in the result property of the response */
|
|
89
|
-
|
|
90
|
-
}
|
|
90
|
+
response: PartialAdapterResponse<T['Response']>;
|
|
91
|
+
};
|
|
92
|
+
export declare type TimestampedProviderResult<T extends ProviderResultGenerics> = Pick<ProviderResult<T>, 'params'> & {
|
|
93
|
+
/** Value that will be included in the result property of the response, with timestamps applied */
|
|
94
|
+
response: TimestampedAdapterResponse<T['Response']>;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Here we do actually want an object, since unknown could be a primitive.
|
|
98
|
+
* The rule itself does say "marginally better"
|
|
99
|
+
*/
|
|
91
100
|
export declare type EmptyObject = Object;
|
|
92
101
|
/**
|
|
93
102
|
* Helper struct type that provides detail about the incoming Adapter Request
|
|
@@ -113,20 +122,90 @@ export declare type ResponseGenerics = {
|
|
|
113
122
|
Result: string | number | null;
|
|
114
123
|
};
|
|
115
124
|
/**
|
|
116
|
-
*
|
|
125
|
+
* Details for timestamps to be included in the response
|
|
126
|
+
*/
|
|
127
|
+
declare type ResponseTimestamps = {
|
|
128
|
+
/** Time at which data was received from the provider */
|
|
129
|
+
providerDataReceived: number;
|
|
130
|
+
/** Time indicated by the provider representing the time at which this value was calculated/set/valid */
|
|
131
|
+
providerIndicatedTime: number | undefined;
|
|
132
|
+
} & ({
|
|
133
|
+
/**
|
|
134
|
+
* For sync protocols (request -\> response).
|
|
135
|
+
* Time at which data was requested from the provider.
|
|
136
|
+
*/
|
|
137
|
+
providerDataRequested: number;
|
|
138
|
+
providerDataStreamEstablished?: never;
|
|
139
|
+
} | {
|
|
140
|
+
/**
|
|
141
|
+
* For async protocols (subscription -\> n events received).
|
|
142
|
+
* Time at which a data stream was established for the provider.
|
|
143
|
+
*/
|
|
144
|
+
providerDataStreamEstablished: number;
|
|
145
|
+
providerDataRequested?: never;
|
|
146
|
+
});
|
|
147
|
+
/**
|
|
148
|
+
* Object with timestamps that will be present in both successful and provider error responses
|
|
149
|
+
*/
|
|
150
|
+
declare type TimestampedResponseObject = {
|
|
151
|
+
/** Timestamps relevant for data provider timings */
|
|
152
|
+
timestamps: ResponseTimestamps;
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* Response from the EA to send when manually storing an error in the cache
|
|
117
156
|
*/
|
|
118
|
-
|
|
119
|
-
/**
|
|
157
|
+
declare type ProviderErrorResponse = {
|
|
158
|
+
/** Status code for the errored response */
|
|
120
159
|
statusCode: number;
|
|
160
|
+
/** Error message that will be sent back from the adapter */
|
|
161
|
+
errorMessage: string;
|
|
162
|
+
} & {
|
|
163
|
+
data?: never;
|
|
164
|
+
result?: never;
|
|
165
|
+
meta?: never;
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* Provider error response with timestamps added
|
|
169
|
+
*/
|
|
170
|
+
export declare type TimestampedProviderErrorResponse = ProviderErrorResponse & TimestampedResponseObject;
|
|
171
|
+
/**
|
|
172
|
+
* The most basic data that needs to be manually set for an adapter response.
|
|
173
|
+
*/
|
|
174
|
+
export declare type PartialSuccessfulResponse<T extends ResponseGenerics> = {
|
|
121
175
|
/** Response data, holds "result" for Flux Monitor */
|
|
122
176
|
data: T['Data'];
|
|
123
177
|
/** Result value used for OCR */
|
|
124
178
|
result: T['Result'];
|
|
125
|
-
/**
|
|
126
|
-
|
|
179
|
+
/** Optionally, specify manually some of the timestamps here */
|
|
180
|
+
timestamps?: Pick<ResponseTimestamps, 'providerIndicatedTime'>;
|
|
181
|
+
} & {
|
|
182
|
+
errorMessage?: never;
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* Partial EA response, with timestamps added
|
|
186
|
+
*/
|
|
187
|
+
declare type TimestampedSuccessfulResponse<T extends ResponseGenerics> = PartialSuccessfulResponse<T> & TimestampedResponseObject;
|
|
188
|
+
/**
|
|
189
|
+
* Full EA successful response, with metadata and defaults added
|
|
190
|
+
*/
|
|
191
|
+
declare type SuccessfulResponse<T extends ResponseGenerics> = TimestampedSuccessfulResponse<T> & {
|
|
127
192
|
/** Metadata relevant to this request */
|
|
128
193
|
meta?: AdapterRequestMeta;
|
|
194
|
+
/** HTTP status code, by default will be set to 200 */
|
|
195
|
+
statusCode: number;
|
|
129
196
|
};
|
|
197
|
+
/**
|
|
198
|
+
* Response body from the EA, before timestamps, defaults and metadata are filled in
|
|
199
|
+
*/
|
|
200
|
+
export declare type PartialAdapterResponse<T extends ResponseGenerics = ResponseGenerics> = PartialSuccessfulResponse<T> | ProviderErrorResponse;
|
|
201
|
+
/**
|
|
202
|
+
* Response body from the EA with timestamps, before defaults and metadata are filled in
|
|
203
|
+
*/
|
|
204
|
+
export declare type TimestampedAdapterResponse<T extends ResponseGenerics = ResponseGenerics> = TimestampedSuccessfulResponse<T> | TimestampedProviderErrorResponse;
|
|
205
|
+
/**
|
|
206
|
+
* Shape of the response body from the adapter
|
|
207
|
+
*/
|
|
208
|
+
export declare type AdapterResponse<T extends ResponseGenerics = ResponseGenerics> = SuccessfulResponse<T> | TimestampedProviderErrorResponse;
|
|
130
209
|
export declare type SingleNumberResultResponse = {
|
|
131
210
|
Result: number;
|
|
132
211
|
Data: {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../src/transports/routing.ts"],"names":[],"mappings":";;;AAEA,kCAAqE;AACrE,+CAAkD;AAGlD,MAAM,MAAM,GAAG,IAAA,iBAAU,EAAC,kBAAkB,CAAC,CAAA;AAE7C;;;;GAIG;AACH,MAAa,gBAAgB;IAI3B;IACE,6GAA6G;IACtG,UAA2C;IAClD,+FAA+F;IACvF,KAGG;QALJ,eAAU,GAAV,UAAU,CAAiC;QAE1C,UAAK,GAAL,KAAK,CAGF;IACV,CAAC;IAEJ,KAAK,CAAC,UAAU,CACd,YAAiC,EACjC,aAAiD,EACjD,YAAoB;QAEpB,MAAM,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,aAAa,CAAC,CAAA;QAC9E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;YACjD,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAA;YACnE,CAAC,CAAC,UAAU,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,GAAiC,EACjC,aAAiD;QAEjD,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAEnE,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;QAC3D,IAAI,SAAS,CAAC,eAAe,EAAE;YAC7B,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAA;YAC9D,OAAO,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;SACrD;QACD,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAA;IACvE,CAAC;IAEO,gBAAgB,CACtB,GAAiC,EACjC,aAAkD;QAElD,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,IAAI,SAAS,CAAC,CAAA;QACvD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACzB,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAA;YACjD,MAAM,IAAI,oBAAY,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,0BAA0B,GAAG,EAAE,EAAE,CAAC,CAAA;SACtF;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACtC,MAAM,CAAC,KAAK,CAAC,SAAS,SAAS,CAAC,WAAW,CAAC,IAAI,qBAAqB,GAAG,EAAE,CAAC,CAAA;QAC3E,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,oFAAoF;IACpF,wDAAwD;IACxD,KAAK,CAAC,iBAAiB,CACrB,GAAiC,EACjC,aAAiD;QAEjD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;QAC3D,IAAI,SAAS,CAAC,iBAAiB,EAAE;YAC/B,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAA;YAChE,OAAO,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;SACvD;QACD,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAA;IACzE,CAAC;CACF;AApED,4CAoEC"}
|