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 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,15 +522,18 @@ class ProxyClient {
509
522
  messageId: metadata.messageId || uuid.v4()
510
523
  };
511
524
  let preparedData = data;
512
- if (protocolVersion) {
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: _.omitBy(
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 || {}, (value, key) => key.toLowerCase());
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.authHeader,
585
+ [HTTP2_HEADER_AUTHORIZATION]: this.proxyJWT,
571
586
  [MESSAGE_METADATA_QUERY_PARAM]: JSON.stringify(preparedMetadata)
572
587
  });
573
- postMessageStream.write(preparedData);
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.authHeader
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
- // TODO: encrypt errorInput
708
- payload.errorInput = originalMessage;
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
@@ -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-dev14",
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",