@chainlink/external-adapter-framework 0.10.4 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -89,8 +89,10 @@ export declare class WebSocketTransport<T extends WebsocketTransportGenerics> im
|
|
|
89
89
|
constructor(config: WebSocketTransportConfig<T>);
|
|
90
90
|
initialize(dependencies: AdapterDependencies, config: AdapterConfig<T['CustomSettings']>, endpointName: string): Promise<void>;
|
|
91
91
|
registerRequest(req: AdapterRequest<T['Request']>, config: AdapterConfig<T['CustomSettings']>): Promise<void>;
|
|
92
|
+
connectionClosed(): boolean;
|
|
92
93
|
serializeMessage(payload: unknown): string;
|
|
93
94
|
deserializeMessage(data: WebSocket.Data): T['Provider']['WsMessage'];
|
|
94
95
|
establishWsConnection(context: EndpointContext<T>, url: string, options?: WebSocket.ClientOptions | undefined): Promise<unknown>;
|
|
96
|
+
sendMessages(context: EndpointContext<T>, subscribes: unknown[], unsubscribes: unknown[]): Promise<void>;
|
|
95
97
|
backgroundExecute(context: EndpointContext<T>): Promise<number>;
|
|
96
98
|
}
|
package/transports/websocket.js
CHANGED
|
@@ -65,6 +65,9 @@ class WebSocketTransport {
|
|
|
65
65
|
logger.debug(`Adding entry to subscription set (ttl: ${config.WS_SUBSCRIPTION_TTL}): [${req.requestContext.cacheKey}] = ${req.requestContext.data}`);
|
|
66
66
|
await this.subscriptionSet.add(req.requestContext.cacheKey, req.requestContext.data, config.WS_SUBSCRIPTION_TTL);
|
|
67
67
|
}
|
|
68
|
+
connectionClosed() {
|
|
69
|
+
return !this.wsConnection || this.wsConnection.readyState === ws_1.default.CLOSED;
|
|
70
|
+
}
|
|
68
71
|
serializeMessage(payload) {
|
|
69
72
|
return typeof payload === 'string' ? payload : JSON.stringify(payload);
|
|
70
73
|
}
|
|
@@ -77,15 +80,17 @@ class WebSocketTransport {
|
|
|
77
80
|
this.wsConnection = new ctor(url, undefined, options);
|
|
78
81
|
this.wsConnection.addEventListener('open', async (event) => {
|
|
79
82
|
logger.debug(`Opened websocket connection. (event type ${event.type})`);
|
|
80
|
-
|
|
81
|
-
|
|
83
|
+
if (this.config.handlers.open) {
|
|
84
|
+
await this.config.handlers.open(this.wsConnection, context);
|
|
85
|
+
logger.debug('Successfully executed connection opened handler');
|
|
86
|
+
}
|
|
82
87
|
// Record active ws connections by incrementing count on open
|
|
83
88
|
transportMetrics.wsConnectionActive.inc();
|
|
84
89
|
resolve(true);
|
|
85
90
|
});
|
|
86
91
|
this.wsConnection.addEventListener('message', async (event) => {
|
|
87
92
|
const parsed = this.deserializeMessage(event.data);
|
|
88
|
-
logger.trace(`Got ws message: ${
|
|
93
|
+
logger.trace(`Got ws message: ${event.data}`);
|
|
89
94
|
const results = this.config.handlers.message(parsed, context);
|
|
90
95
|
if (Array.isArray(results)) {
|
|
91
96
|
const responses = (0, _1.buildCacheEntriesFromResults)(results, context);
|
|
@@ -108,6 +113,14 @@ class WebSocketTransport {
|
|
|
108
113
|
});
|
|
109
114
|
});
|
|
110
115
|
}
|
|
116
|
+
async sendMessages(context, subscribes, unsubscribes) {
|
|
117
|
+
const serializedSubscribes = subscribes.map(this.serializeMessage);
|
|
118
|
+
const serializedUnsubscribes = unsubscribes.map(this.serializeMessage);
|
|
119
|
+
const messages = serializedSubscribes.concat(serializedUnsubscribes);
|
|
120
|
+
for (const message of messages) {
|
|
121
|
+
this.wsConnection.send(message);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
111
124
|
// Unlike cache warming, this execute will manage subscriptions
|
|
112
125
|
async backgroundExecute(context) {
|
|
113
126
|
logger.debug('Starting background execute, getting subscriptions from sorted set');
|
|
@@ -117,14 +130,8 @@ class WebSocketTransport {
|
|
|
117
130
|
.labels({ endpoint: context.endpointName, transport_type: 'websocket' })
|
|
118
131
|
.set(desiredSubs.length);
|
|
119
132
|
logger.debug('Generating delta (subscribes & unsubscribes)');
|
|
120
|
-
const
|
|
121
|
-
const
|
|
122
|
-
.map(this.config.builders.subscribeMessage)
|
|
123
|
-
.map(this.serializeMessage);
|
|
124
|
-
const unsubscribeParams = this.localSubscriptions.filter((s) => !desiredSubs.map((ds) => JSON.stringify(ds)).includes(JSON.stringify(s)));
|
|
125
|
-
const unsubscribes = unsubscribeParams
|
|
126
|
-
.map(this.config.builders.unsubscribeMessage)
|
|
127
|
-
.map(this.serializeMessage);
|
|
133
|
+
const subscribes = desiredSubs.filter((s) => !this.localSubscriptions.map((ls) => JSON.stringify(ls)).includes(JSON.stringify(s)));
|
|
134
|
+
const unsubscribes = this.localSubscriptions.filter((s) => !desiredSubs.map((ds) => JSON.stringify(ds)).includes(JSON.stringify(s)));
|
|
128
135
|
logger.debug(`${subscribes.length} new subscriptions; ${unsubscribes.length} to unsubscribe`);
|
|
129
136
|
if (subscribes.length) {
|
|
130
137
|
logger.trace(`Will subscribe to: ${subscribes}`);
|
|
@@ -140,20 +147,19 @@ class WebSocketTransport {
|
|
|
140
147
|
logger.debug('No entries in subscription set and no established connection, skipping');
|
|
141
148
|
return this.rateLimiter.msUntilNextExecution(context.endpointName);
|
|
142
149
|
}
|
|
143
|
-
if (
|
|
150
|
+
if (this.connectionClosed() && subscribes.length) {
|
|
144
151
|
logger.debug('No established connection and new subscriptions available, connecting to WS');
|
|
145
|
-
const url =
|
|
152
|
+
const url = await this.config.url(context);
|
|
153
|
+
if (!url) {
|
|
154
|
+
throw new Error('Got no URL from url builder or WS_API_ENDPOINT');
|
|
155
|
+
}
|
|
146
156
|
const options = this.config.options && (await this.config.options(context));
|
|
147
157
|
await this.establishWsConnection(context, url, options);
|
|
148
158
|
}
|
|
149
159
|
logger.debug('Sending subs/unsubs if there are any');
|
|
150
|
-
|
|
151
|
-
for (const message of messages) {
|
|
152
|
-
logger.trace(`Sending message: ${JSON.stringify(message)}`);
|
|
153
|
-
this.wsConnection.send(message);
|
|
154
|
-
}
|
|
160
|
+
await this.sendMessages(context, subscribes.map(this.config.builders.subscribeMessage), unsubscribes.map(this.config.builders.unsubscribeMessage));
|
|
155
161
|
// Record WS message and subscription metrics
|
|
156
|
-
transportMetrics.recordWsMessageMetrics(context,
|
|
162
|
+
transportMetrics.recordWsMessageMetrics(context, subscribes, unsubscribes);
|
|
157
163
|
logger.debug('Setting local state to cache value');
|
|
158
164
|
this.localSubscriptions = desiredSubs;
|
|
159
165
|
logger.debug('Background execute complete');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/transports/websocket.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAsD;AAW7C,oBAXF,YAAS,CAWE;AANlB,kCAAqD;AAErD,yBAA+E;AAC/E,4DAA6C;AAK7C,MAAM,MAAM,GAAG,IAAA,iBAAU,EAAC,oBAAoB,CAAC,CAAA;AAQ/C,MAAa,sBAAsB;IAGjC,MAAM,CAAC,GAAG,CAAC,IAAoB;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAED,MAAM,CAAC,GAAG;QACR,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;;AATH,wDAUC;AATQ,2BAAI,GAAmB,YAAS,CAAA;AAiFzC;;;;;GAKG;AACH,MAAa,kBAAkB;IAW7B,YAAoB,MAAmC;QAAnC,WAAM,GAAN,MAAM,CAA6B;QANvD,+FAA+F;QAC/F,iDAAiD;QACjD,uBAAkB,GAA6B,EAAE,CAAA;IAIS,CAAC;IAE3D,KAAK,CAAC,UAAU,CACd,YAAiC,EACjC,MAA0C,EAC1C,YAAoB;QAEpB,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,KAA8C,CAAA;QACxE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,4BAA4B,CAAA;QAC5D,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC,sBAAsB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;IACnF,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,GAAiC,EACjC,MAA0C;QAE1C,MAAM,CAAC,KAAK,CACV,0CAA0C,MAAM,CAAC,mBAAmB,OAAO,GAAG,CAAC,cAAc,CAAC,QAAQ,OAAO,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CACvI,CAAA;QACD,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAC5B,GAAG,CAAC,cAAc,CAAC,QAAQ,EAC3B,GAAG,CAAC,cAAc,CAAC,IAAI,EACvB,MAAM,CAAC,mBAAmB,CAC3B,CAAA;IACH,CAAC;IAED,gBAAgB,CAAC,OAAgB;QAC/B,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACxE,CAAC;IACD,kBAAkB,CAAC,IAAoB;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAA+B,CAAA;IAClE,CAAC;IAED,qBAAqB,CACnB,OAA2B,EAC3B,GAAW,EACX,OAA6C;QAE7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,sBAAsB,CAAC,GAAG,EAAE,CAAA;YACzC,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;YACrD,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAsB,EAAE,EAAE;gBAC1E,MAAM,CAAC,KAAK,CAAC,4CAA4C,KAAK,CAAC,IAAI,GAAG,CAAC,CAAA;gBACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/transports/websocket.ts"],"names":[],"mappings":"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"}
|