elasticio-sailor-nodejs 3.0.0-sailor-proxy-dev14 → 3.0.0-sailor-proxy-dev16
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/config/local.json +4 -2
- package/lib/proxy-client.js +42 -23
- package/lib/settings.js +2 -1
- package/package.json +2 -2
package/config/local.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"ELASTICIO_WORKSPACE_ID": "69b26526c4796609ca0da128",
|
|
8
8
|
"ELASTICIO_USER_ID": "69b26526c4796609ca0da127",
|
|
9
9
|
"ELASTICIO_COMP_ID": "69b26526c4796609ca0da126",
|
|
10
|
-
"ELASTICIO_FUNCTION": "
|
|
10
|
+
"ELASTICIO_FUNCTION": "rebound_trigger",
|
|
11
11
|
"ELASTICIO_API_URI": "http://localhost:9000",
|
|
12
12
|
"ELASTICIO_API_USERNAME": "task-692ee23d4ab5d34bb7321559",
|
|
13
13
|
"ELASTICIO_API_KEY": "976ffec8-455b-494e-9478-2d66761f4040",
|
|
@@ -15,5 +15,7 @@
|
|
|
15
15
|
"ELASTICIO_MESSAGE_CRYPTO_PASSWORD": "password",
|
|
16
16
|
"ELASTICIO_SAILOR_PROXY_URI": "http://localhost:4001",
|
|
17
17
|
"ELASTICIO_COMPONENT_PATH": "./spec/component",
|
|
18
|
-
"ELASTICIO_EMIT_LIGHTWEIGHT_MESSAGE": "true"
|
|
18
|
+
"ELASTICIO_EMIT_LIGHTWEIGHT_MESSAGE": "true",
|
|
19
|
+
"ELASTICIO_SAILOR_PROXY_JWT_SECRET": "super-secret-proxy"
|
|
20
|
+
|
|
19
21
|
}
|
package/lib/proxy-client.js
CHANGED
|
@@ -7,6 +7,7 @@ const http2 = require('http2');
|
|
|
7
7
|
const { getJitteredDelay } = require('./utils.js');
|
|
8
8
|
const { Promise } = require('q');
|
|
9
9
|
const pThrottle = require('p-throttle');
|
|
10
|
+
const { sign } = require('jsonwebtoken');
|
|
10
11
|
|
|
11
12
|
const {
|
|
12
13
|
HTTP2_HEADER_PATH,
|
|
@@ -42,7 +43,21 @@ class ProxyClient {
|
|
|
42
43
|
if (!username || !password) {
|
|
43
44
|
throw new Error('API_USERNAME and API_KEY must be set to connect to Sailor Proxy');
|
|
44
45
|
}
|
|
45
|
-
|
|
46
|
+
const proxySecret = settings.SAILOR_PROXY_JWT_SECRET;
|
|
47
|
+
if (!proxySecret) {
|
|
48
|
+
throw new Error('SAILOR_PROXY_JWT_SECRET must be set to connect to Sailor Proxy');
|
|
49
|
+
}
|
|
50
|
+
this.proxyJWT = sign({
|
|
51
|
+
username,
|
|
52
|
+
password,
|
|
53
|
+
stepId: settings.STEP_ID,
|
|
54
|
+
execId: settings.EXEC_ID,
|
|
55
|
+
containerId: settings.CONTAINER_ID,
|
|
56
|
+
workspaceId: settings.WORKSPACE_ID,
|
|
57
|
+
userId: settings.USER_ID,
|
|
58
|
+
compId: settings.COMP_ID,
|
|
59
|
+
function: settings.FUNCTION
|
|
60
|
+
}, proxySecret);
|
|
46
61
|
|
|
47
62
|
this.throttles = {
|
|
48
63
|
// 100 Messages per Second
|
|
@@ -321,7 +336,7 @@ class ProxyClient {
|
|
|
321
336
|
const getObjectStream = this.clientSession.request({
|
|
322
337
|
[HTTP2_HEADER_PATH]: `/object/${objectId}`,
|
|
323
338
|
[HTTP2_HEADER_METHOD]: 'GET',
|
|
324
|
-
[HTTP2_HEADER_AUTHORIZATION]: this.
|
|
339
|
+
[HTTP2_HEADER_AUTHORIZATION]: this.proxyJWT
|
|
325
340
|
}).pipe(this._encryptor.createDecipher());
|
|
326
341
|
|
|
327
342
|
const chunks = [];
|
|
@@ -353,7 +368,7 @@ class ProxyClient {
|
|
|
353
368
|
const postMessageStream = this.clientSession.request({
|
|
354
369
|
[HTTP2_HEADER_PATH]: '/object',
|
|
355
370
|
[HTTP2_HEADER_METHOD]: 'POST',
|
|
356
|
-
[HTTP2_HEADER_AUTHORIZATION]: this.
|
|
371
|
+
[HTTP2_HEADER_AUTHORIZATION]: this.proxyJWT
|
|
357
372
|
});
|
|
358
373
|
|
|
359
374
|
let responseData = '';
|
|
@@ -404,20 +419,18 @@ class ProxyClient {
|
|
|
404
419
|
log.debug('Starting to listen for messages from proxy');
|
|
405
420
|
await this._ensureConnection();
|
|
406
421
|
|
|
407
|
-
const stepId = this.settings.STEP_ID;
|
|
408
422
|
const prefetch = this.settings.PROXY_PREFETCH_SAILOR;
|
|
409
423
|
// TODO: When prefetch > 1, what if one message takes a long time to process - do we want to wait for it before requesting the next one?
|
|
410
424
|
await Promise.all(new Array(prefetch).fill().map(async () => {
|
|
411
425
|
const queryParams = new URLSearchParams({
|
|
412
|
-
stepId,
|
|
413
426
|
prefetch
|
|
414
427
|
}).toString();
|
|
415
|
-
log.info({
|
|
428
|
+
log.info({ prefetch }, 'Requesting message from proxy');
|
|
416
429
|
// TODO: what timeout is here? e.g. when flow is realtime - we might need to wait a long time...
|
|
417
430
|
const getMessageStream = this.clientSession.request({
|
|
418
431
|
[HTTP2_HEADER_PATH]: `/message?${queryParams}`,
|
|
419
432
|
[HTTP2_HEADER_METHOD]: 'GET',
|
|
420
|
-
[HTTP2_HEADER_AUTHORIZATION]: this.
|
|
433
|
+
[HTTP2_HEADER_AUTHORIZATION]: this.proxyJWT
|
|
421
434
|
});
|
|
422
435
|
this.getMessageStreams.add(getMessageStream);
|
|
423
436
|
|
|
@@ -509,15 +522,18 @@ class ProxyClient {
|
|
|
509
522
|
messageId: metadata.messageId || uuid.v4()
|
|
510
523
|
};
|
|
511
524
|
let preparedData = data;
|
|
512
|
-
if (
|
|
525
|
+
if (preparedData && preparedData.headers) {
|
|
526
|
+
preparedData.headers = _.omitBy(
|
|
527
|
+
preparedData.headers,
|
|
528
|
+
(value, key) => key.toLowerCase() === HEADER_ROUTING_KEY
|
|
529
|
+
);
|
|
530
|
+
}
|
|
531
|
+
if (protocolVersion && data) {
|
|
513
532
|
preparedData = this.encryptMessageContent(data, protocolVersion);
|
|
514
533
|
preparedMetadata.protocolVersion = protocolVersion;
|
|
515
534
|
}
|
|
516
535
|
return {
|
|
517
|
-
preparedMetadata
|
|
518
|
-
preparedMetadata,
|
|
519
|
-
(value, key) => key.toLowerCase() === HEADER_ROUTING_KEY
|
|
520
|
-
),
|
|
536
|
+
preparedMetadata,
|
|
521
537
|
preparedData
|
|
522
538
|
};
|
|
523
539
|
}
|
|
@@ -537,7 +553,7 @@ class ProxyClient {
|
|
|
537
553
|
await throttledSend();
|
|
538
554
|
}
|
|
539
555
|
|
|
540
|
-
const messageHeaders = _.mapKeys(data.headers
|
|
556
|
+
const messageHeaders = data && data.headers ? _.mapKeys(data.headers, (value, key) => key.toLowerCase()) : {};
|
|
541
557
|
const customRoutingKey = messageHeaders[HEADER_ROUTING_KEY];
|
|
542
558
|
|
|
543
559
|
log.debug({
|
|
@@ -549,17 +565,16 @@ class ProxyClient {
|
|
|
549
565
|
}, 'Sending message to proxy');
|
|
550
566
|
log.trace({ data }, 'Message data to send to proxy');
|
|
551
567
|
const { preparedMetadata, preparedData } = this._prepareData(data, metadata, type, forceProtocolVersion);
|
|
552
|
-
if (preparedData.length > this.settings.OUTGOING_MESSAGE_SIZE_LIMIT) {
|
|
568
|
+
if (preparedData && preparedData.length > this.settings.OUTGOING_MESSAGE_SIZE_LIMIT) {
|
|
553
569
|
const error = new Error(`Outgoing message size ${preparedData.length}` +
|
|
554
570
|
` exceeds limit of ${this.settings.OUTGOING_MESSAGE_SIZE_LIMIT}.`);
|
|
555
571
|
log.error(error);
|
|
556
572
|
throw error;
|
|
557
573
|
}
|
|
558
|
-
log.debug({ preparedMetadata, preparedDataSize: preparedData.length }, 'Prepared message for sending to proxy');
|
|
574
|
+
log.debug({ preparedMetadata, preparedDataSize: preparedData ? preparedData.length : null }, 'Prepared message for sending to proxy');
|
|
559
575
|
|
|
560
576
|
const queryParams = new URLSearchParams({
|
|
561
577
|
incomingMessageId,
|
|
562
|
-
stepId: this.settings.STEP_ID,
|
|
563
578
|
type,
|
|
564
579
|
...(customRoutingKey ? { customRoutingKey } : {})
|
|
565
580
|
}).toString();
|
|
@@ -567,10 +582,12 @@ class ProxyClient {
|
|
|
567
582
|
const postMessageStream = this.clientSession.request({
|
|
568
583
|
[HTTP2_HEADER_PATH]: `/message?${queryParams}`,
|
|
569
584
|
[HTTP2_HEADER_METHOD]: 'POST',
|
|
570
|
-
[HTTP2_HEADER_AUTHORIZATION]: this.
|
|
585
|
+
[HTTP2_HEADER_AUTHORIZATION]: this.proxyJWT,
|
|
571
586
|
[MESSAGE_METADATA_QUERY_PARAM]: JSON.stringify(preparedMetadata)
|
|
572
587
|
});
|
|
573
|
-
|
|
588
|
+
if (preparedData) {
|
|
589
|
+
postMessageStream.write(preparedData);
|
|
590
|
+
}
|
|
574
591
|
postMessageStream.end();
|
|
575
592
|
|
|
576
593
|
postMessageStream.on('response', (headers) => {
|
|
@@ -650,7 +667,7 @@ class ProxyClient {
|
|
|
650
667
|
const postMessageStream = this.clientSession.request({
|
|
651
668
|
[HTTP2_HEADER_PATH]: `/finish-processing?${queryParams}`,
|
|
652
669
|
[HTTP2_HEADER_METHOD]: 'POST',
|
|
653
|
-
[HTTP2_HEADER_AUTHORIZATION]: this.
|
|
670
|
+
[HTTP2_HEADER_AUTHORIZATION]: this.proxyJWT
|
|
654
671
|
});
|
|
655
672
|
postMessageStream.end();
|
|
656
673
|
|
|
@@ -697,6 +714,7 @@ class ProxyClient {
|
|
|
697
714
|
error: encryptedError
|
|
698
715
|
};
|
|
699
716
|
if (originalMessage) {
|
|
717
|
+
// No idea what is going on here - simply copied from previos implementation
|
|
700
718
|
const protocolVersion = Number(metadata.protocolVersion || 1);
|
|
701
719
|
if (protocolVersion >= 2) {
|
|
702
720
|
payload.errorInput = this._encryptor.encryptMessageContent(
|
|
@@ -704,8 +722,10 @@ class ProxyClient {
|
|
|
704
722
|
'base64'
|
|
705
723
|
).toString();
|
|
706
724
|
} else {
|
|
707
|
-
|
|
708
|
-
|
|
725
|
+
payload.errorInput = this.encryptMessageContent(
|
|
726
|
+
originalMessage,
|
|
727
|
+
metadata.protocolVersion
|
|
728
|
+
);
|
|
709
729
|
}
|
|
710
730
|
}
|
|
711
731
|
const errorPayload = JSON.stringify(payload);
|
|
@@ -728,8 +748,7 @@ class ProxyClient {
|
|
|
728
748
|
return this.sendMessage({
|
|
729
749
|
type: 'rebound',
|
|
730
750
|
metadata: outgoingMetadata,
|
|
731
|
-
incomingMessageId: metadata ? metadata.messageId : undefined
|
|
732
|
-
data: reboundError
|
|
751
|
+
incomingMessageId: metadata ? metadata.messageId : undefined
|
|
733
752
|
});
|
|
734
753
|
}
|
|
735
754
|
|
package/lib/settings.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "elasticio-sailor-nodejs",
|
|
3
3
|
"description": "The official elastic.io library for bootstrapping and executing for Node.js connectors",
|
|
4
|
-
"version": "3.0.0-sailor-proxy-
|
|
4
|
+
"version": "3.0.0-sailor-proxy-dev16",
|
|
5
5
|
"main": "run.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "tsc",
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"debug": "3.1.0",
|
|
24
24
|
"elasticio-rest-node": "2.0.0",
|
|
25
25
|
"event-to-promise": "0.8.0",
|
|
26
|
+
"jsonwebtoken": "^9.0.3",
|
|
26
27
|
"lodash": "4.17.21",
|
|
27
28
|
"p-throttle": "2.1.0",
|
|
28
29
|
"q": "1.5.1",
|
|
@@ -33,7 +34,6 @@
|
|
|
33
34
|
"chai": "4.2.0",
|
|
34
35
|
"del": "2.2.2",
|
|
35
36
|
"eslint": "6.2.2",
|
|
36
|
-
"eslint-plugin-mocha": "4.12.1",
|
|
37
37
|
"eslint-config-standard": "14.1.0",
|
|
38
38
|
"eslint-plugin-import": "2.20.1",
|
|
39
39
|
"eslint-plugin-mocha": "6.3.0",
|