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 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": "data_trigger",
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
  }
@@ -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
- this.authHeader = 'Basic ' + Buffer.from(`${username}:${password}`).toString('base64');
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.authHeader
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.authHeader
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({ stepId, prefetch }, 'Requesting message from proxy');
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.authHeader
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 || {}, (value, key) => key.toLowerCase());
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.authHeader,
585
+ [HTTP2_HEADER_AUTHORIZATION]: this.proxyJWT,
574
586
  [MESSAGE_METADATA_QUERY_PARAM]: JSON.stringify(preparedMetadata)
575
587
  });
576
- postMessageStream.write(preparedData);
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.authHeader
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
- // TODO: encrypt errorInput
711
- payload.errorInput = originalMessage;
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
@@ -87,7 +87,8 @@ function getMandatoryEnvVars(envVars) {
87
87
 
88
88
  'API_URI',
89
89
  'API_USERNAME',
90
- 'API_KEY'
90
+ 'API_KEY',
91
+ 'SAILOR_PROXY_JWT_SECRET'
91
92
  ];
92
93
 
93
94
  const requiredForMessageProcessing = [
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-dev15",
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",