elasticio-sailor-nodejs 3.0.0-sailor-proxy-dev15 → 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 +36 -20
- 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,13 +522,13 @@ class ProxyClient {
|
|
|
509
522
|
messageId: metadata.messageId || uuid.v4()
|
|
510
523
|
};
|
|
511
524
|
let preparedData = data;
|
|
512
|
-
if (preparedData.headers) {
|
|
525
|
+
if (preparedData && preparedData.headers) {
|
|
513
526
|
preparedData.headers = _.omitBy(
|
|
514
527
|
preparedData.headers,
|
|
515
528
|
(value, key) => key.toLowerCase() === HEADER_ROUTING_KEY
|
|
516
529
|
);
|
|
517
530
|
}
|
|
518
|
-
if (protocolVersion) {
|
|
531
|
+
if (protocolVersion && data) {
|
|
519
532
|
preparedData = this.encryptMessageContent(data, protocolVersion);
|
|
520
533
|
preparedMetadata.protocolVersion = protocolVersion;
|
|
521
534
|
}
|
|
@@ -540,7 +553,7 @@ class ProxyClient {
|
|
|
540
553
|
await throttledSend();
|
|
541
554
|
}
|
|
542
555
|
|
|
543
|
-
const messageHeaders = _.mapKeys(data.headers
|
|
556
|
+
const messageHeaders = data && data.headers ? _.mapKeys(data.headers, (value, key) => key.toLowerCase()) : {};
|
|
544
557
|
const customRoutingKey = messageHeaders[HEADER_ROUTING_KEY];
|
|
545
558
|
|
|
546
559
|
log.debug({
|
|
@@ -552,17 +565,16 @@ class ProxyClient {
|
|
|
552
565
|
}, 'Sending message to proxy');
|
|
553
566
|
log.trace({ data }, 'Message data to send to proxy');
|
|
554
567
|
const { preparedMetadata, preparedData } = this._prepareData(data, metadata, type, forceProtocolVersion);
|
|
555
|
-
if (preparedData.length > this.settings.OUTGOING_MESSAGE_SIZE_LIMIT) {
|
|
568
|
+
if (preparedData && preparedData.length > this.settings.OUTGOING_MESSAGE_SIZE_LIMIT) {
|
|
556
569
|
const error = new Error(`Outgoing message size ${preparedData.length}` +
|
|
557
570
|
` exceeds limit of ${this.settings.OUTGOING_MESSAGE_SIZE_LIMIT}.`);
|
|
558
571
|
log.error(error);
|
|
559
572
|
throw error;
|
|
560
573
|
}
|
|
561
|
-
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');
|
|
562
575
|
|
|
563
576
|
const queryParams = new URLSearchParams({
|
|
564
577
|
incomingMessageId,
|
|
565
|
-
stepId: this.settings.STEP_ID,
|
|
566
578
|
type,
|
|
567
579
|
...(customRoutingKey ? { customRoutingKey } : {})
|
|
568
580
|
}).toString();
|
|
@@ -570,10 +582,12 @@ class ProxyClient {
|
|
|
570
582
|
const postMessageStream = this.clientSession.request({
|
|
571
583
|
[HTTP2_HEADER_PATH]: `/message?${queryParams}`,
|
|
572
584
|
[HTTP2_HEADER_METHOD]: 'POST',
|
|
573
|
-
[HTTP2_HEADER_AUTHORIZATION]: this.
|
|
585
|
+
[HTTP2_HEADER_AUTHORIZATION]: this.proxyJWT,
|
|
574
586
|
[MESSAGE_METADATA_QUERY_PARAM]: JSON.stringify(preparedMetadata)
|
|
575
587
|
});
|
|
576
|
-
|
|
588
|
+
if (preparedData) {
|
|
589
|
+
postMessageStream.write(preparedData);
|
|
590
|
+
}
|
|
577
591
|
postMessageStream.end();
|
|
578
592
|
|
|
579
593
|
postMessageStream.on('response', (headers) => {
|
|
@@ -653,7 +667,7 @@ class ProxyClient {
|
|
|
653
667
|
const postMessageStream = this.clientSession.request({
|
|
654
668
|
[HTTP2_HEADER_PATH]: `/finish-processing?${queryParams}`,
|
|
655
669
|
[HTTP2_HEADER_METHOD]: 'POST',
|
|
656
|
-
[HTTP2_HEADER_AUTHORIZATION]: this.
|
|
670
|
+
[HTTP2_HEADER_AUTHORIZATION]: this.proxyJWT
|
|
657
671
|
});
|
|
658
672
|
postMessageStream.end();
|
|
659
673
|
|
|
@@ -700,6 +714,7 @@ class ProxyClient {
|
|
|
700
714
|
error: encryptedError
|
|
701
715
|
};
|
|
702
716
|
if (originalMessage) {
|
|
717
|
+
// No idea what is going on here - simply copied from previos implementation
|
|
703
718
|
const protocolVersion = Number(metadata.protocolVersion || 1);
|
|
704
719
|
if (protocolVersion >= 2) {
|
|
705
720
|
payload.errorInput = this._encryptor.encryptMessageContent(
|
|
@@ -707,8 +722,10 @@ class ProxyClient {
|
|
|
707
722
|
'base64'
|
|
708
723
|
).toString();
|
|
709
724
|
} else {
|
|
710
|
-
|
|
711
|
-
|
|
725
|
+
payload.errorInput = this.encryptMessageContent(
|
|
726
|
+
originalMessage,
|
|
727
|
+
metadata.protocolVersion
|
|
728
|
+
);
|
|
712
729
|
}
|
|
713
730
|
}
|
|
714
731
|
const errorPayload = JSON.stringify(payload);
|
|
@@ -731,8 +748,7 @@ class ProxyClient {
|
|
|
731
748
|
return this.sendMessage({
|
|
732
749
|
type: 'rebound',
|
|
733
750
|
metadata: outgoingMetadata,
|
|
734
|
-
incomingMessageId: metadata ? metadata.messageId : undefined
|
|
735
|
-
data: reboundError
|
|
751
|
+
incomingMessageId: metadata ? metadata.messageId : undefined
|
|
736
752
|
});
|
|
737
753
|
}
|
|
738
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",
|