@rainbow-o23/n3 1.0.44 → 1.0.46

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/README.md CHANGED
@@ -30,6 +30,18 @@ When using scripts, pay attention to the usage of variables. Typically:
30
30
  - `$helpers` represents function supporting and can be used in all snippets,
31
31
  - `$options` represents a set of data, usually in error handles.
32
32
 
33
+ ### Typescript support
34
+
35
+ In dynamic snippet, TypeScript syntax can also be used. Currently, `o23/n3` is compiled using ES2022 syntax. It is important to note that
36
+ dynamic script fragments are function bodies, so `import`/`export` syntax is not supported. Moreover, they are compiled in loose mode, and
37
+ the compilation process does not report any errors. Additionally, for script security reasons, the following keywords or classes are also
38
+ not supported.
39
+
40
+ - `process`
41
+ - `global`
42
+ - `eval`
43
+ - `Function`
44
+
33
45
  ## Basic Steps
34
46
 
35
47
  ### Fragmentary
package/index.cjs CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  var n1 = require('@rainbow-o23/n1');
4
4
  var typeorm = require('typeorm');
5
+ var ts = require('typescript');
5
6
  var fetch = require('node-fetch');
6
7
 
7
8
  const ERR_PIPELINE_STEP_SNIPPET_NOT_EMPTY = 'O03-00001';
@@ -380,6 +381,21 @@ class Utils {
380
381
  return creators.createDefault();
381
382
  }
382
383
  else if (typeof snippet === 'string') {
384
+ const transpiled = ts.transpileModule(snippet, {
385
+ compilerOptions: {
386
+ target: ts.ScriptTarget.ES2022,
387
+ jsx: ts.JsxEmit.None,
388
+ strict: false,
389
+ noEmitOnError: true,
390
+ esModuleInterop: true,
391
+ module: ts.ModuleKind.ES2022,
392
+ suppressOutputPathCheck: false,
393
+ skipLibCheck: true,
394
+ skipDefaultLibCheck: true,
395
+ moduleResolution: ts.ModuleResolutionKind.Node16
396
+ }
397
+ });
398
+ snippet = transpiled.outputText;
383
399
  const variableNames = creators.getVariableNames() ?? [];
384
400
  if (creators.async) {
385
401
  const func = new AsyncFunction(...variableNames, ...AvoidNames, snippet);
@@ -486,8 +502,10 @@ class AbstractFragmentaryPipelineStep extends n1.AbstractPipelineStep {
486
502
  else {
487
503
  this._mergeRequest = options.mergeRequest ?? false;
488
504
  }
489
- this._fromRequestFunc = Utils.createSyncFunction(this.getFromRequestSnippet(), {
490
- createDefault: () => ($factor, _$request, _$helpers, _$) => $factor,
505
+ this._fromRequestFunc = Utils.createAsyncFunction(this.getFromRequestSnippet(), {
506
+ createDefault: () => async ($factor, _$request, _$helpers, _$) => {
507
+ return $factor;
508
+ },
491
509
  getVariableNames: () => this.generateFromRequestVariableNames(),
492
510
  error: (e) => {
493
511
  this.getLogger().error(`Failed on create function for from request transformer, snippet is [${this.getFromRequestSnippet()}].`);
@@ -567,24 +585,24 @@ class AbstractFragmentaryPipelineStep extends n1.AbstractPipelineStep {
567
585
  const funcOrSnippet = this.getToResponseSnippet();
568
586
  if (funcOrSnippet == null || (typeof funcOrSnippet === 'string' && funcOrSnippet.trim().length === 0)) {
569
587
  if (this.useUnboxMerging()) {
570
- return ($result, $request, _$helpers, _$) => {
588
+ return async ($result, $request, _$helpers, _$) => {
571
589
  return { ...$request.content, ...$result };
572
590
  };
573
591
  }
574
592
  else if (this.hasMergeKey()) {
575
- return ($result, $request, _$helpers, _$) => {
593
+ return async ($result, $request, _$helpers, _$) => {
576
594
  return { ...$request.content, [this.getMergeKey()]: $result };
577
595
  };
578
596
  }
579
597
  else {
580
- return ($result, _$request, _$helpers, _$) => {
598
+ return async ($result, _$request, _$helpers, _$) => {
581
599
  return $result;
582
600
  };
583
601
  }
584
602
  }
585
603
  else if (typeof funcOrSnippet === 'string') {
586
- const func = Utils.createSyncFunction(funcOrSnippet, {
587
- createDefault: () => {
604
+ const func = Utils.createAsyncFunction(funcOrSnippet, {
605
+ createDefault: async () => {
588
606
  throw new n1.UncatchableError(ERR_PIPELINE_STEP_SNIPPET_NOT_EMPTY, 'Cannot create perform func on empty snippet.');
589
607
  },
590
608
  getVariableNames: () => this.generateToResponseVariableNames(),
@@ -594,13 +612,13 @@ class AbstractFragmentaryPipelineStep extends n1.AbstractPipelineStep {
594
612
  }
595
613
  });
596
614
  if (this.useUnboxMerging()) {
597
- return ($result, $request, $helpers, $) => {
598
- const r = func($result, $request, $helpers, $);
615
+ return async ($result, $request, $helpers, $) => {
616
+ const r = await func($result, $request, $helpers, $);
599
617
  return { ...$request.content, ...r };
600
618
  };
601
619
  }
602
620
  else if (this.hasMergeKey()) {
603
- return ($result, $request, $helpers, $) => {
621
+ return async ($result, $request, $helpers, $) => {
604
622
  const r = func($result, $request, $helpers, $);
605
623
  return { ...$request.content, [this.getMergeKey()]: r };
606
624
  };
@@ -610,13 +628,13 @@ class AbstractFragmentaryPipelineStep extends n1.AbstractPipelineStep {
610
628
  }
611
629
  }
612
630
  else if (this.useUnboxMerging()) {
613
- return ($result, $request, $helpers, $) => {
631
+ return async ($result, $request, $helpers, $) => {
614
632
  const r = funcOrSnippet($result, $request, $helpers, $);
615
633
  return { ...$request.content, ...r };
616
634
  };
617
635
  }
618
636
  else if (this.hasMergeKey()) {
619
- return ($result, $request, $helpers, $) => {
637
+ return async ($result, $request, $helpers, $) => {
620
638
  const r = funcOrSnippet($result, $request, $helpers, $);
621
639
  return { ...$request.content, [this.getMergeKey()]: r };
622
640
  };
@@ -625,13 +643,13 @@ class AbstractFragmentaryPipelineStep extends n1.AbstractPipelineStep {
625
643
  return funcOrSnippet;
626
644
  }
627
645
  }
628
- getFromInput($factor, $request) {
646
+ async getFromInput($factor, $request) {
629
647
  const $helpers = this.getHelpers();
630
648
  return this._fromRequestFunc($factor, $request, $helpers, $helpers);
631
649
  }
632
- setToOutput($result, $request) {
650
+ async setToOutput($result, $request) {
633
651
  const $helpers = this.getHelpers();
634
- return { content: this._toResponseFunc($result, $request, $helpers, $helpers) };
652
+ return { content: await this._toResponseFunc($result, $request, $helpers, $helpers) };
635
653
  }
636
654
  buildStepOptions() {
637
655
  return { config: this.getConfig(), logger: this.getLogger() };
@@ -642,11 +660,12 @@ class AbstractFragmentaryPipelineStep extends n1.AbstractPipelineStep {
642
660
  return {};
643
661
  }
644
662
  else {
645
- return Utils.clone(context);
663
+ const { authorization, traceId, ...rest } = context;
664
+ return { authorization, traceId, ...Utils.clone(rest) };
646
665
  }
647
666
  }
648
667
  async handleErrorSteps(fragment, errorCode, error, request, builders) {
649
- const { $context: { traceId } = {} } = request;
668
+ const { $context: { authorization, traceId } = {} } = request;
650
669
  const errorContext = this.createErrorHandleContext(request);
651
670
  const options = this.buildStepOptions();
652
671
  const steps = await Promise.all(builders.map(async (builder) => await builder.create(options)));
@@ -655,7 +674,9 @@ class AbstractFragmentaryPipelineStep extends n1.AbstractPipelineStep {
655
674
  return await this.measurePerformance(traceId, 'STEP', step.constructor.name)
656
675
  .execute(async () => {
657
676
  this.traceStepIn(traceId, step, request);
658
- const response = await step.perform({ ...request, $context: { ...errorContext, traceId } });
677
+ const response = await step.perform({
678
+ ...request, $context: { ...errorContext, authorization, traceId }
679
+ });
659
680
  this.traceStepOut(traceId, step, response);
660
681
  return this.returnOrContinueOrClear(request, response);
661
682
  });
@@ -717,18 +738,18 @@ class AbstractFragmentaryPipelineStep extends n1.AbstractPipelineStep {
717
738
  async performAndCatch(request, perform) {
718
739
  let fragment = null;
719
740
  try {
720
- fragment = this.getFromInput(request.content, request);
741
+ fragment = await this.getFromInput(request.content, request);
721
742
  return await perform(fragment);
722
743
  }
723
744
  catch (e) {
724
745
  const result = await this.handleError(fragment, request, e);
725
- return this.setToOutput(result, request);
746
+ return await this.setToOutput(result, request);
726
747
  }
727
748
  }
728
749
  async perform(request) {
729
750
  return await this.performAndCatch(request, async (fragment) => {
730
751
  const result = await this.doPerform(fragment, request);
731
- return this.setToOutput(result, request);
752
+ return await this.setToOutput(result, request);
732
753
  });
733
754
  }
734
755
  }
@@ -755,7 +776,8 @@ class PipelineStepSets extends AbstractFragmentaryPipelineStep {
755
776
  return {};
756
777
  }
757
778
  else {
758
- return Utils.clone(context);
779
+ const { authorization, traceId, ...rest } = context;
780
+ return { authorization, traceId, ...Utils.clone(rest) };
759
781
  }
760
782
  }
761
783
  async attachMineToInternalContext(inheritedContext, _request) {
@@ -770,14 +792,16 @@ class PipelineStepSets extends AbstractFragmentaryPipelineStep {
770
792
  }
771
793
  async doPerform(data, request) {
772
794
  return await this.performWithContext(request, async (request, context) => {
773
- const { $context: { traceId } = {} } = request;
795
+ const { $context: { authorization, traceId } = {} } = request;
774
796
  const steps = await this.createSteps();
775
797
  const response = await steps.reduce(async (promise, step) => {
776
798
  const request = await promise;
777
799
  return await this.measurePerformance(traceId, 'STEP', step.constructor.name)
778
800
  .execute(async () => {
779
801
  this.traceStepIn(traceId, step, request);
780
- const response = await step.perform({ ...request, $context: { ...context, traceId } });
802
+ const response = await step.perform({
803
+ ...request, $context: { ...context, authorization, traceId }
804
+ });
781
805
  this.traceStepOut(traceId, step, response);
782
806
  return this.returnOrContinueOrClear(request, response);
783
807
  });
@@ -801,8 +825,8 @@ class ParallelPipelineStepSets extends PipelineStepSets {
801
825
  constructor(options) {
802
826
  super(options);
803
827
  this._cloneDataSnippet = options.cloneData;
804
- this._cloneData = Utils.createSyncFunction(this.getCloneDataSnippet(), {
805
- createDefault: () => ($factor, _$request, _$helpers, _$) => {
828
+ this._cloneData = Utils.createAsyncFunction(this.getCloneDataSnippet(), {
829
+ createDefault: () => async ($factor, _$request, _$helpers, _$) => {
806
830
  return $factor;
807
831
  },
808
832
  getVariableNames: () => ['$factor', '$request', ...this.getHelpersVariableNames()],
@@ -819,7 +843,7 @@ class ParallelPipelineStepSets extends PipelineStepSets {
819
843
  raceOne() {
820
844
  return this._race;
821
845
  }
822
- cloneDataForEach($factor, $request) {
846
+ async cloneDataForEach($factor, $request) {
823
847
  if ($factor == null) {
824
848
  return null;
825
849
  }
@@ -828,14 +852,14 @@ class ParallelPipelineStepSets extends PipelineStepSets {
828
852
  }
829
853
  async doPerform(data, request) {
830
854
  return await this.performWithContext(request, async (request, context) => {
831
- const { $context: { traceId } = {} } = request;
855
+ const { $context: { authorization, traceId } = {} } = request;
832
856
  const steps = await this.createSteps();
833
857
  const execute = () => {
834
858
  return steps.map(async (step) => {
835
859
  return await this.measurePerformance(traceId, 'STEP', step.constructor.name)
836
860
  .execute(async () => {
837
- const eachData = this.cloneDataForEach(data, request);
838
- const eachRequest = { content: eachData, $context: { ...context, traceId } };
861
+ const eachData = await this.cloneDataForEach(data, request);
862
+ const eachRequest = { content: eachData, $context: { ...context, authorization, traceId } };
839
863
  this.traceStepIn(traceId, step, request);
840
864
  const response = await step.perform(eachRequest);
841
865
  this.traceStepOut(traceId, step, response);
@@ -902,7 +926,7 @@ class EachPipelineStepSets extends PipelineStepSets {
902
926
  }
903
927
  results.push(result);
904
928
  }
905
- return this.setToOutput(results, request);
929
+ return await this.setToOutput(results, request);
906
930
  });
907
931
  }
908
932
  }
@@ -944,7 +968,7 @@ class ConditionalPipelineStepSets extends PipelineStepSets {
944
968
  const checked = await this.check(fragment, request);
945
969
  if (checked) {
946
970
  const result = await this.doPerform(request.content, request);
947
- return this.setToOutput(result, request);
971
+ return await this.setToOutput(result, request);
948
972
  }
949
973
  const otherwiseStepBuilders = this.getOtherwiseStepBuilders();
950
974
  if (otherwiseStepBuilders != null) {
@@ -952,7 +976,7 @@ class ConditionalPipelineStepSets extends PipelineStepSets {
952
976
  ...this.buildStepOptions(), name: this.getName(), steps: otherwiseStepBuilders
953
977
  });
954
978
  const result = await sets.perform(request);
955
- return this.setToOutput(result.content, request);
979
+ return await this.setToOutput(result.content, request);
956
980
  }
957
981
  else {
958
982
  return request;
@@ -1020,7 +1044,7 @@ class RoutesPipelineStepSets extends AbstractFragmentaryPipelineStep {
1020
1044
  ...this.buildStepOptions(), name: this.getName(), steps
1021
1045
  });
1022
1046
  const result = await sets.perform(request);
1023
- return this.setToOutput(result.content, request);
1047
+ return await this.setToOutput(result.content, request);
1024
1048
  }
1025
1049
  }
1026
1050
  }
@@ -1030,7 +1054,7 @@ class RoutesPipelineStepSets extends AbstractFragmentaryPipelineStep {
1030
1054
  ...this.buildStepOptions(), name: this.getName(), steps: otherwiseStepBuilders
1031
1055
  });
1032
1056
  const result = await sets.perform(request);
1033
- return this.setToOutput(result.content, request);
1057
+ return await this.setToOutput(result.content, request);
1034
1058
  }
1035
1059
  else {
1036
1060
  return request;
@@ -1200,9 +1224,9 @@ class RefPipelinePipelineStep extends AbstractFragmentaryPipelineStep {
1200
1224
  return { config: this.getConfig(), logger: this.getLogger() };
1201
1225
  }
1202
1226
  async doPerform(data, request) {
1203
- const { $context: { traceId } = {} } = request;
1227
+ const { $context: { authorization, traceId } = {} } = request;
1204
1228
  const pipeline = await this.getPipelineBuilder().create(this.buildPipelineOptions());
1205
- const result = await pipeline.perform({ payload: data, traceId });
1229
+ const result = await pipeline.perform({ payload: data, authorization, traceId });
1206
1230
  return result.payload;
1207
1231
  }
1208
1232
  }
@@ -1277,8 +1301,8 @@ class FetchPipelineStep extends AbstractFragmentaryPipelineStep {
1277
1301
  ?? config.getNumber(`endpoints.${this.getEndpointSystemCode()}.global.timeout`, -1);
1278
1302
  this._endpointTimeout = this._endpointTimeout > 0 ? this._endpointTimeout * 1000 : -1;
1279
1303
  this._urlGenerateSnippet = options.urlGenerate;
1280
- this._urlGenerateFunc = Utils.createSyncFunction(this.getUrlGenerateSnippet(), {
1281
- createDefault: () => ($endpointUrl, _$factor, _$request, _$helpers, _$) => $endpointUrl,
1304
+ this._urlGenerateFunc = Utils.createAsyncFunction(this.getUrlGenerateSnippet(), {
1305
+ createDefault: () => async ($endpointUrl, _$factor, _$request, _$helpers, _$) => $endpointUrl,
1282
1306
  getVariableNames: () => this.getUrlGenerateVariableName(),
1283
1307
  error: (e) => {
1284
1308
  this.getLogger().error(`Failed on create function for url generate, snippet is [${this.getUrlGenerateSnippet()}].`);
@@ -1286,8 +1310,8 @@ class FetchPipelineStep extends AbstractFragmentaryPipelineStep {
1286
1310
  }
1287
1311
  });
1288
1312
  this._headersGenerateSnippet = options.headersGenerate;
1289
- this._headersGenerateFunc = Utils.createSyncFunction(this.getHeadersGenerateSnippet(), {
1290
- createDefault: () => (_$factor, _$request, _$helpers, _$) => (void 0),
1313
+ this._headersGenerateFunc = Utils.createAsyncFunction(this.getHeadersGenerateSnippet(), {
1314
+ createDefault: () => async (_$factor, _$request, _$helpers, _$) => (void 0),
1291
1315
  getVariableNames: () => this.getHeadersGenerateVariableNames(),
1292
1316
  error: (e) => {
1293
1317
  this.getLogger().error(`Failed on create function for request headers generate, snippet is [${this.getHeadersGenerateSnippet()}].`);
@@ -1296,8 +1320,8 @@ class FetchPipelineStep extends AbstractFragmentaryPipelineStep {
1296
1320
  });
1297
1321
  this._bodyUsed = options.bodyUsed;
1298
1322
  this._bodyGenerateSnippet = options.bodyGenerate;
1299
- this._bodyGenerateFunc = Utils.createSyncFunction(this.getBodyGenerateSnippet(), {
1300
- createDefault: () => ($factor, _$request, _$helpers, _$) => {
1323
+ this._bodyGenerateFunc = Utils.createAsyncFunction(this.getBodyGenerateSnippet(), {
1324
+ createDefault: () => async ($factor, _$request, _$helpers, _$) => {
1301
1325
  return ($factor == null || (typeof $factor === 'string' && $factor.length === 0)) ? (void 0) : JSON.stringify($factor);
1302
1326
  },
1303
1327
  getVariableNames: () => this.getBodyGenerateVariableNames(),
@@ -1429,14 +1453,14 @@ class FetchPipelineStep extends AbstractFragmentaryPipelineStep {
1429
1453
  const $helpers = this.getHelpers();
1430
1454
  let url = '';
1431
1455
  try {
1432
- url = this._urlGenerateFunc(this.getEndpointUrl(), data, request, $helpers, $helpers);
1456
+ url = await this._urlGenerateFunc(this.getEndpointUrl(), data, request, $helpers, $helpers);
1433
1457
  const method = this.getEndpointMethod();
1434
1458
  const staticHeaders = this.getEndpointHeaders() ?? {};
1435
- const headers = this._headersGenerateFunc(data, request, $helpers, $helpers) ?? {};
1459
+ const headers = await this._headersGenerateFunc(data, request, $helpers, $helpers) ?? {};
1436
1460
  let body;
1437
1461
  const bodyUsed = this.isBodyUsed();
1438
1462
  if (bodyUsed === true || (bodyUsed == null && method !== 'get')) {
1439
- body = this._bodyGenerateFunc(data, request, $helpers, $helpers);
1463
+ body = await this._bodyGenerateFunc(data, request, $helpers, $helpers);
1440
1464
  }
1441
1465
  else {
1442
1466
  body = (void 0);
package/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { ErrorCodes, UncatchableError, AbstractPipelineStep, CatchableError, ExposedUncatchableError, ERR_UNKNOWN, PipelineRepository, StepHelpersUtils } from '@rainbow-o23/n1';
2
2
  import { DataSource } from 'typeorm';
3
+ import ts, { ScriptTarget, JsxEmit, ModuleKind, ModuleResolutionKind } from 'typescript';
3
4
  import fetch from 'node-fetch';
4
5
 
5
6
  const ERR_PIPELINE_STEP_SNIPPET_NOT_EMPTY = 'O03-00001';
@@ -378,6 +379,21 @@ class Utils {
378
379
  return creators.createDefault();
379
380
  }
380
381
  else if (typeof snippet === 'string') {
382
+ const transpiled = ts.transpileModule(snippet, {
383
+ compilerOptions: {
384
+ target: ScriptTarget.ES2022,
385
+ jsx: JsxEmit.None,
386
+ strict: false,
387
+ noEmitOnError: true,
388
+ esModuleInterop: true,
389
+ module: ModuleKind.ES2022,
390
+ suppressOutputPathCheck: false,
391
+ skipLibCheck: true,
392
+ skipDefaultLibCheck: true,
393
+ moduleResolution: ModuleResolutionKind.Node16
394
+ }
395
+ });
396
+ snippet = transpiled.outputText;
381
397
  const variableNames = creators.getVariableNames() ?? [];
382
398
  if (creators.async) {
383
399
  const func = new AsyncFunction(...variableNames, ...AvoidNames, snippet);
@@ -484,8 +500,10 @@ class AbstractFragmentaryPipelineStep extends AbstractPipelineStep {
484
500
  else {
485
501
  this._mergeRequest = options.mergeRequest ?? false;
486
502
  }
487
- this._fromRequestFunc = Utils.createSyncFunction(this.getFromRequestSnippet(), {
488
- createDefault: () => ($factor, _$request, _$helpers, _$) => $factor,
503
+ this._fromRequestFunc = Utils.createAsyncFunction(this.getFromRequestSnippet(), {
504
+ createDefault: () => async ($factor, _$request, _$helpers, _$) => {
505
+ return $factor;
506
+ },
489
507
  getVariableNames: () => this.generateFromRequestVariableNames(),
490
508
  error: (e) => {
491
509
  this.getLogger().error(`Failed on create function for from request transformer, snippet is [${this.getFromRequestSnippet()}].`);
@@ -565,24 +583,24 @@ class AbstractFragmentaryPipelineStep extends AbstractPipelineStep {
565
583
  const funcOrSnippet = this.getToResponseSnippet();
566
584
  if (funcOrSnippet == null || (typeof funcOrSnippet === 'string' && funcOrSnippet.trim().length === 0)) {
567
585
  if (this.useUnboxMerging()) {
568
- return ($result, $request, _$helpers, _$) => {
586
+ return async ($result, $request, _$helpers, _$) => {
569
587
  return { ...$request.content, ...$result };
570
588
  };
571
589
  }
572
590
  else if (this.hasMergeKey()) {
573
- return ($result, $request, _$helpers, _$) => {
591
+ return async ($result, $request, _$helpers, _$) => {
574
592
  return { ...$request.content, [this.getMergeKey()]: $result };
575
593
  };
576
594
  }
577
595
  else {
578
- return ($result, _$request, _$helpers, _$) => {
596
+ return async ($result, _$request, _$helpers, _$) => {
579
597
  return $result;
580
598
  };
581
599
  }
582
600
  }
583
601
  else if (typeof funcOrSnippet === 'string') {
584
- const func = Utils.createSyncFunction(funcOrSnippet, {
585
- createDefault: () => {
602
+ const func = Utils.createAsyncFunction(funcOrSnippet, {
603
+ createDefault: async () => {
586
604
  throw new UncatchableError(ERR_PIPELINE_STEP_SNIPPET_NOT_EMPTY, 'Cannot create perform func on empty snippet.');
587
605
  },
588
606
  getVariableNames: () => this.generateToResponseVariableNames(),
@@ -592,13 +610,13 @@ class AbstractFragmentaryPipelineStep extends AbstractPipelineStep {
592
610
  }
593
611
  });
594
612
  if (this.useUnboxMerging()) {
595
- return ($result, $request, $helpers, $) => {
596
- const r = func($result, $request, $helpers, $);
613
+ return async ($result, $request, $helpers, $) => {
614
+ const r = await func($result, $request, $helpers, $);
597
615
  return { ...$request.content, ...r };
598
616
  };
599
617
  }
600
618
  else if (this.hasMergeKey()) {
601
- return ($result, $request, $helpers, $) => {
619
+ return async ($result, $request, $helpers, $) => {
602
620
  const r = func($result, $request, $helpers, $);
603
621
  return { ...$request.content, [this.getMergeKey()]: r };
604
622
  };
@@ -608,13 +626,13 @@ class AbstractFragmentaryPipelineStep extends AbstractPipelineStep {
608
626
  }
609
627
  }
610
628
  else if (this.useUnboxMerging()) {
611
- return ($result, $request, $helpers, $) => {
629
+ return async ($result, $request, $helpers, $) => {
612
630
  const r = funcOrSnippet($result, $request, $helpers, $);
613
631
  return { ...$request.content, ...r };
614
632
  };
615
633
  }
616
634
  else if (this.hasMergeKey()) {
617
- return ($result, $request, $helpers, $) => {
635
+ return async ($result, $request, $helpers, $) => {
618
636
  const r = funcOrSnippet($result, $request, $helpers, $);
619
637
  return { ...$request.content, [this.getMergeKey()]: r };
620
638
  };
@@ -623,13 +641,13 @@ class AbstractFragmentaryPipelineStep extends AbstractPipelineStep {
623
641
  return funcOrSnippet;
624
642
  }
625
643
  }
626
- getFromInput($factor, $request) {
644
+ async getFromInput($factor, $request) {
627
645
  const $helpers = this.getHelpers();
628
646
  return this._fromRequestFunc($factor, $request, $helpers, $helpers);
629
647
  }
630
- setToOutput($result, $request) {
648
+ async setToOutput($result, $request) {
631
649
  const $helpers = this.getHelpers();
632
- return { content: this._toResponseFunc($result, $request, $helpers, $helpers) };
650
+ return { content: await this._toResponseFunc($result, $request, $helpers, $helpers) };
633
651
  }
634
652
  buildStepOptions() {
635
653
  return { config: this.getConfig(), logger: this.getLogger() };
@@ -640,11 +658,12 @@ class AbstractFragmentaryPipelineStep extends AbstractPipelineStep {
640
658
  return {};
641
659
  }
642
660
  else {
643
- return Utils.clone(context);
661
+ const { authorization, traceId, ...rest } = context;
662
+ return { authorization, traceId, ...Utils.clone(rest) };
644
663
  }
645
664
  }
646
665
  async handleErrorSteps(fragment, errorCode, error, request, builders) {
647
- const { $context: { traceId } = {} } = request;
666
+ const { $context: { authorization, traceId } = {} } = request;
648
667
  const errorContext = this.createErrorHandleContext(request);
649
668
  const options = this.buildStepOptions();
650
669
  const steps = await Promise.all(builders.map(async (builder) => await builder.create(options)));
@@ -653,7 +672,9 @@ class AbstractFragmentaryPipelineStep extends AbstractPipelineStep {
653
672
  return await this.measurePerformance(traceId, 'STEP', step.constructor.name)
654
673
  .execute(async () => {
655
674
  this.traceStepIn(traceId, step, request);
656
- const response = await step.perform({ ...request, $context: { ...errorContext, traceId } });
675
+ const response = await step.perform({
676
+ ...request, $context: { ...errorContext, authorization, traceId }
677
+ });
657
678
  this.traceStepOut(traceId, step, response);
658
679
  return this.returnOrContinueOrClear(request, response);
659
680
  });
@@ -715,18 +736,18 @@ class AbstractFragmentaryPipelineStep extends AbstractPipelineStep {
715
736
  async performAndCatch(request, perform) {
716
737
  let fragment = null;
717
738
  try {
718
- fragment = this.getFromInput(request.content, request);
739
+ fragment = await this.getFromInput(request.content, request);
719
740
  return await perform(fragment);
720
741
  }
721
742
  catch (e) {
722
743
  const result = await this.handleError(fragment, request, e);
723
- return this.setToOutput(result, request);
744
+ return await this.setToOutput(result, request);
724
745
  }
725
746
  }
726
747
  async perform(request) {
727
748
  return await this.performAndCatch(request, async (fragment) => {
728
749
  const result = await this.doPerform(fragment, request);
729
- return this.setToOutput(result, request);
750
+ return await this.setToOutput(result, request);
730
751
  });
731
752
  }
732
753
  }
@@ -753,7 +774,8 @@ class PipelineStepSets extends AbstractFragmentaryPipelineStep {
753
774
  return {};
754
775
  }
755
776
  else {
756
- return Utils.clone(context);
777
+ const { authorization, traceId, ...rest } = context;
778
+ return { authorization, traceId, ...Utils.clone(rest) };
757
779
  }
758
780
  }
759
781
  async attachMineToInternalContext(inheritedContext, _request) {
@@ -768,14 +790,16 @@ class PipelineStepSets extends AbstractFragmentaryPipelineStep {
768
790
  }
769
791
  async doPerform(data, request) {
770
792
  return await this.performWithContext(request, async (request, context) => {
771
- const { $context: { traceId } = {} } = request;
793
+ const { $context: { authorization, traceId } = {} } = request;
772
794
  const steps = await this.createSteps();
773
795
  const response = await steps.reduce(async (promise, step) => {
774
796
  const request = await promise;
775
797
  return await this.measurePerformance(traceId, 'STEP', step.constructor.name)
776
798
  .execute(async () => {
777
799
  this.traceStepIn(traceId, step, request);
778
- const response = await step.perform({ ...request, $context: { ...context, traceId } });
800
+ const response = await step.perform({
801
+ ...request, $context: { ...context, authorization, traceId }
802
+ });
779
803
  this.traceStepOut(traceId, step, response);
780
804
  return this.returnOrContinueOrClear(request, response);
781
805
  });
@@ -799,8 +823,8 @@ class ParallelPipelineStepSets extends PipelineStepSets {
799
823
  constructor(options) {
800
824
  super(options);
801
825
  this._cloneDataSnippet = options.cloneData;
802
- this._cloneData = Utils.createSyncFunction(this.getCloneDataSnippet(), {
803
- createDefault: () => ($factor, _$request, _$helpers, _$) => {
826
+ this._cloneData = Utils.createAsyncFunction(this.getCloneDataSnippet(), {
827
+ createDefault: () => async ($factor, _$request, _$helpers, _$) => {
804
828
  return $factor;
805
829
  },
806
830
  getVariableNames: () => ['$factor', '$request', ...this.getHelpersVariableNames()],
@@ -817,7 +841,7 @@ class ParallelPipelineStepSets extends PipelineStepSets {
817
841
  raceOne() {
818
842
  return this._race;
819
843
  }
820
- cloneDataForEach($factor, $request) {
844
+ async cloneDataForEach($factor, $request) {
821
845
  if ($factor == null) {
822
846
  return null;
823
847
  }
@@ -826,14 +850,14 @@ class ParallelPipelineStepSets extends PipelineStepSets {
826
850
  }
827
851
  async doPerform(data, request) {
828
852
  return await this.performWithContext(request, async (request, context) => {
829
- const { $context: { traceId } = {} } = request;
853
+ const { $context: { authorization, traceId } = {} } = request;
830
854
  const steps = await this.createSteps();
831
855
  const execute = () => {
832
856
  return steps.map(async (step) => {
833
857
  return await this.measurePerformance(traceId, 'STEP', step.constructor.name)
834
858
  .execute(async () => {
835
- const eachData = this.cloneDataForEach(data, request);
836
- const eachRequest = { content: eachData, $context: { ...context, traceId } };
859
+ const eachData = await this.cloneDataForEach(data, request);
860
+ const eachRequest = { content: eachData, $context: { ...context, authorization, traceId } };
837
861
  this.traceStepIn(traceId, step, request);
838
862
  const response = await step.perform(eachRequest);
839
863
  this.traceStepOut(traceId, step, response);
@@ -900,7 +924,7 @@ class EachPipelineStepSets extends PipelineStepSets {
900
924
  }
901
925
  results.push(result);
902
926
  }
903
- return this.setToOutput(results, request);
927
+ return await this.setToOutput(results, request);
904
928
  });
905
929
  }
906
930
  }
@@ -942,7 +966,7 @@ class ConditionalPipelineStepSets extends PipelineStepSets {
942
966
  const checked = await this.check(fragment, request);
943
967
  if (checked) {
944
968
  const result = await this.doPerform(request.content, request);
945
- return this.setToOutput(result, request);
969
+ return await this.setToOutput(result, request);
946
970
  }
947
971
  const otherwiseStepBuilders = this.getOtherwiseStepBuilders();
948
972
  if (otherwiseStepBuilders != null) {
@@ -950,7 +974,7 @@ class ConditionalPipelineStepSets extends PipelineStepSets {
950
974
  ...this.buildStepOptions(), name: this.getName(), steps: otherwiseStepBuilders
951
975
  });
952
976
  const result = await sets.perform(request);
953
- return this.setToOutput(result.content, request);
977
+ return await this.setToOutput(result.content, request);
954
978
  }
955
979
  else {
956
980
  return request;
@@ -1018,7 +1042,7 @@ class RoutesPipelineStepSets extends AbstractFragmentaryPipelineStep {
1018
1042
  ...this.buildStepOptions(), name: this.getName(), steps
1019
1043
  });
1020
1044
  const result = await sets.perform(request);
1021
- return this.setToOutput(result.content, request);
1045
+ return await this.setToOutput(result.content, request);
1022
1046
  }
1023
1047
  }
1024
1048
  }
@@ -1028,7 +1052,7 @@ class RoutesPipelineStepSets extends AbstractFragmentaryPipelineStep {
1028
1052
  ...this.buildStepOptions(), name: this.getName(), steps: otherwiseStepBuilders
1029
1053
  });
1030
1054
  const result = await sets.perform(request);
1031
- return this.setToOutput(result.content, request);
1055
+ return await this.setToOutput(result.content, request);
1032
1056
  }
1033
1057
  else {
1034
1058
  return request;
@@ -1198,9 +1222,9 @@ class RefPipelinePipelineStep extends AbstractFragmentaryPipelineStep {
1198
1222
  return { config: this.getConfig(), logger: this.getLogger() };
1199
1223
  }
1200
1224
  async doPerform(data, request) {
1201
- const { $context: { traceId } = {} } = request;
1225
+ const { $context: { authorization, traceId } = {} } = request;
1202
1226
  const pipeline = await this.getPipelineBuilder().create(this.buildPipelineOptions());
1203
- const result = await pipeline.perform({ payload: data, traceId });
1227
+ const result = await pipeline.perform({ payload: data, authorization, traceId });
1204
1228
  return result.payload;
1205
1229
  }
1206
1230
  }
@@ -1275,8 +1299,8 @@ class FetchPipelineStep extends AbstractFragmentaryPipelineStep {
1275
1299
  ?? config.getNumber(`endpoints.${this.getEndpointSystemCode()}.global.timeout`, -1);
1276
1300
  this._endpointTimeout = this._endpointTimeout > 0 ? this._endpointTimeout * 1000 : -1;
1277
1301
  this._urlGenerateSnippet = options.urlGenerate;
1278
- this._urlGenerateFunc = Utils.createSyncFunction(this.getUrlGenerateSnippet(), {
1279
- createDefault: () => ($endpointUrl, _$factor, _$request, _$helpers, _$) => $endpointUrl,
1302
+ this._urlGenerateFunc = Utils.createAsyncFunction(this.getUrlGenerateSnippet(), {
1303
+ createDefault: () => async ($endpointUrl, _$factor, _$request, _$helpers, _$) => $endpointUrl,
1280
1304
  getVariableNames: () => this.getUrlGenerateVariableName(),
1281
1305
  error: (e) => {
1282
1306
  this.getLogger().error(`Failed on create function for url generate, snippet is [${this.getUrlGenerateSnippet()}].`);
@@ -1284,8 +1308,8 @@ class FetchPipelineStep extends AbstractFragmentaryPipelineStep {
1284
1308
  }
1285
1309
  });
1286
1310
  this._headersGenerateSnippet = options.headersGenerate;
1287
- this._headersGenerateFunc = Utils.createSyncFunction(this.getHeadersGenerateSnippet(), {
1288
- createDefault: () => (_$factor, _$request, _$helpers, _$) => (void 0),
1311
+ this._headersGenerateFunc = Utils.createAsyncFunction(this.getHeadersGenerateSnippet(), {
1312
+ createDefault: () => async (_$factor, _$request, _$helpers, _$) => (void 0),
1289
1313
  getVariableNames: () => this.getHeadersGenerateVariableNames(),
1290
1314
  error: (e) => {
1291
1315
  this.getLogger().error(`Failed on create function for request headers generate, snippet is [${this.getHeadersGenerateSnippet()}].`);
@@ -1294,8 +1318,8 @@ class FetchPipelineStep extends AbstractFragmentaryPipelineStep {
1294
1318
  });
1295
1319
  this._bodyUsed = options.bodyUsed;
1296
1320
  this._bodyGenerateSnippet = options.bodyGenerate;
1297
- this._bodyGenerateFunc = Utils.createSyncFunction(this.getBodyGenerateSnippet(), {
1298
- createDefault: () => ($factor, _$request, _$helpers, _$) => {
1321
+ this._bodyGenerateFunc = Utils.createAsyncFunction(this.getBodyGenerateSnippet(), {
1322
+ createDefault: () => async ($factor, _$request, _$helpers, _$) => {
1299
1323
  return ($factor == null || (typeof $factor === 'string' && $factor.length === 0)) ? (void 0) : JSON.stringify($factor);
1300
1324
  },
1301
1325
  getVariableNames: () => this.getBodyGenerateVariableNames(),
@@ -1427,14 +1451,14 @@ class FetchPipelineStep extends AbstractFragmentaryPipelineStep {
1427
1451
  const $helpers = this.getHelpers();
1428
1452
  let url = '';
1429
1453
  try {
1430
- url = this._urlGenerateFunc(this.getEndpointUrl(), data, request, $helpers, $helpers);
1454
+ url = await this._urlGenerateFunc(this.getEndpointUrl(), data, request, $helpers, $helpers);
1431
1455
  const method = this.getEndpointMethod();
1432
1456
  const staticHeaders = this.getEndpointHeaders() ?? {};
1433
- const headers = this._headersGenerateFunc(data, request, $helpers, $helpers) ?? {};
1457
+ const headers = await this._headersGenerateFunc(data, request, $helpers, $helpers) ?? {};
1434
1458
  let body;
1435
1459
  const bodyUsed = this.isBodyUsed();
1436
1460
  if (bodyUsed === true || (bodyUsed == null && method !== 'get')) {
1437
- body = this._bodyGenerateFunc(data, request, $helpers, $helpers);
1461
+ body = await this._bodyGenerateFunc(data, request, $helpers, $helpers);
1438
1462
  }
1439
1463
  else {
1440
1464
  body = (void 0);
@@ -1,8 +1,8 @@
1
1
  import { PipelineStepData, PipelineStepHelpers, Undefinable } from '@rainbow-o23/n1';
2
2
  import { Response } from 'node-fetch';
3
- export type HttpGenerateUrl<In, InFragment> = ($endpointUrl: string, $factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => string;
4
- export type HttpGenerateHeaders<In, InFragment> = ($factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Undefinable<Record<string, string>>;
5
- export type HttpGenerateBody<In, InFragment> = ($factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => any;
3
+ export type HttpGenerateUrl<In, InFragment> = ($endpointUrl: string, $factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<string>;
4
+ export type HttpGenerateHeaders<In, InFragment> = ($factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<Undefinable<Record<string, string>>>;
5
+ export type HttpGenerateBody<In, InFragment> = ($factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<any>;
6
6
  export type HttpGenerateResponse<In, InFragment> = ($response: Response, $factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<any>;
7
7
  export type HttpUnpredictedErrorCode = `0${number}`;
8
8
  export declare const HttpUnknownErrorCode: HttpUnpredictedErrorCode;
@@ -18,4 +18,4 @@ export interface HttpErrorHandleOptions<In, InFragment> {
18
18
  $factor: InFragment;
19
19
  $request: PipelineStepData<In>;
20
20
  }
21
- export type HttpHandleError<In, InFragment, OutFragment> = (options: HttpErrorHandleOptions<In, InFragment>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<OutFragment> | never;
21
+ export type HttpHandleError<In, InFragment, OutFragment> = ($options: HttpErrorHandleOptions<In, InFragment>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<OutFragment> | never;
@@ -12,8 +12,8 @@ export interface FragmentaryPipelineStepOptions<In = PipelineStepPayload, Out =
12
12
  any?: ScriptFuncOrBody<HandleAnyError<In, InFragment, OutFragment>> | Array<PipelineStepBuilder>;
13
13
  };
14
14
  }
15
- export type GetInFragmentFromRequestFunc<In, InFragment> = ($factor: In, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => InFragment;
16
- export type SetOutFragmentToResponseFunc<In, Out, OutFragment> = ($result: OutFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Out;
15
+ export type GetInFragmentFromRequestFunc<In, InFragment> = ($factor: In, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<InFragment>;
16
+ export type SetOutFragmentToResponseFunc<In, Out, OutFragment> = ($result: OutFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<Out>;
17
17
  export declare abstract class AbstractFragmentaryPipelineStep<In = PipelineStepPayload, Out = PipelineStepPayload, InFragment = In, OutFragment = Out> extends AbstractPipelineStep<In, Out> {
18
18
  private readonly _fromRequestSnippet;
19
19
  private readonly _toResponseSnippet;
@@ -32,8 +32,8 @@ export declare abstract class AbstractFragmentaryPipelineStep<In = PipelineStepP
32
32
  protected generateFromRequestVariableNames(): Array<string>;
33
33
  protected generateToResponseVariableNames(): Array<string>;
34
34
  protected createToResponseFunc(): SetOutFragmentToResponseFunc<In, Out, OutFragment>;
35
- protected getFromInput($factor: In, $request: PipelineStepData<In>): InFragment;
36
- protected setToOutput($result: OutFragment, $request: PipelineStepData<In>): PipelineStepData<Out>;
35
+ protected getFromInput($factor: In, $request: PipelineStepData<In>): Promise<InFragment>;
36
+ protected setToOutput($result: OutFragment, $request: PipelineStepData<In>): Promise<PipelineStepData<Out>>;
37
37
  protected abstract doPerform(data: InFragment, request: PipelineStepData<In>): Promise<OutFragment>;
38
38
  protected buildStepOptions(): Pick<PipelineStepOptions, 'config' | 'logger'>;
39
39
  protected createErrorHandleContext(request: PipelineStepData<In>): PipelineStepSetsContext;
@@ -1,7 +1,7 @@
1
1
  import { PipelineStepData, PipelineStepHelpers, PipelineStepPayload } from '@rainbow-o23/n1';
2
2
  import { PipelineStepSets, PipelineStepSetsOptions } from './step-sets';
3
3
  import { ScriptFuncOrBody } from './types';
4
- export type CloneDataFunc<In, InFragment, EachInFragment = InFragment> = ($factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => EachInFragment;
4
+ export type CloneDataFunc<In, InFragment, EachInFragment = InFragment> = ($factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<EachInFragment>;
5
5
  export interface ParallelPipelineStepSetsOptions<In = PipelineStepPayload, Out = PipelineStepPayload, InFragment = In, OutFragment = Out, EachInFragment = InFragment> extends PipelineStepSetsOptions<In, Out, InFragment, OutFragment> {
6
6
  cloneData?: ScriptFuncOrBody<CloneDataFunc<In, InFragment, EachInFragment>>;
7
7
  race?: boolean;
@@ -13,6 +13,6 @@ export declare class ParallelPipelineStepSets<In = PipelineStepPayload, Out = Pi
13
13
  constructor(options: ParallelPipelineStepSetsOptions<In, Out, InFragment, OutFragment, EachInFragment>);
14
14
  getCloneDataSnippet(): ScriptFuncOrBody<CloneDataFunc<In, InFragment, EachInFragment>>;
15
15
  raceOne(): boolean;
16
- protected cloneDataForEach($factor: InFragment, $request: PipelineStepData<In>): EachInFragment;
16
+ protected cloneDataForEach($factor: InFragment, $request: PipelineStepData<In>): Promise<EachInFragment>;
17
17
  protected doPerform(data: InFragment, request: PipelineStepData<In>): Promise<OutFragment>;
18
18
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rainbow-o23/n3",
3
- "version": "1.0.44",
3
+ "version": "1.0.46",
4
4
  "description": "o23 pipelines",
5
5
  "main": "index.cjs",
6
6
  "module": "index.js",
@@ -21,9 +21,10 @@
21
21
  "url": "https://github.com/InsureMO/rainbow-o23/issues"
22
22
  },
23
23
  "dependencies": {
24
- "@rainbow-o23/n1": "1.0.44",
24
+ "@rainbow-o23/n1": "1.0.46",
25
25
  "node-fetch": "2.6.7",
26
- "typeorm": "^0.3.17"
26
+ "typeorm": "^0.3.17",
27
+ "typescript": "5.5.4"
27
28
  },
28
29
  "devDependencies": {
29
30
  "@babel/core": "^7.23.9",
@@ -48,8 +49,7 @@
48
49
  "rollup": "^3.7.0",
49
50
  "rollup-plugin-tslint": "^0.2.2",
50
51
  "rollup-plugin-typescript2": "^0.34.1",
51
- "tslib": "^2.4.1",
52
- "typescript": "5.1.6"
52
+ "tslib": "^2.4.1"
53
53
  },
54
54
  "jest": {
55
55
  "moduleFileExtensions": [
@@ -74,7 +74,7 @@
74
74
  "testEnvironment": "node"
75
75
  },
76
76
  "volta": {
77
- "node": "18.19.0",
77
+ "node": "20.17.0",
78
78
  "yarn": "1.22.21"
79
79
  }
80
80
  }
@@ -25,7 +25,7 @@ export const buildConfig = (lint) => {
25
25
  external(id) {
26
26
  return ["@rainbow-o23/", "typeorm/"].some(scope => id.startsWith(scope))
27
27
  || [
28
- "typeorm", "reflect-metadata", "node-fetch"
28
+ "typescript", "typeorm", "reflect-metadata", "node-fetch"
29
29
  ].includes(id);
30
30
  }
31
31
  };
@@ -67,9 +67,9 @@ export class FetchPipelineStep<In = PipelineStepPayload, Out = PipelineStepPaylo
67
67
  // to millisecond
68
68
  this._endpointTimeout = this._endpointTimeout > 0 ? this._endpointTimeout * 1000 : -1;
69
69
  this._urlGenerateSnippet = options.urlGenerate;
70
- this._urlGenerateFunc = Utils.createSyncFunction(this.getUrlGenerateSnippet(), {
70
+ this._urlGenerateFunc = Utils.createAsyncFunction(this.getUrlGenerateSnippet(), {
71
71
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
72
- createDefault: () => ($endpointUrl: string, _$factor: InFragment, _$request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers) => $endpointUrl,
72
+ createDefault: () => async ($endpointUrl: string, _$factor: InFragment, _$request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers) => $endpointUrl,
73
73
  getVariableNames: () => this.getUrlGenerateVariableName(),
74
74
  error: (e: Error) => {
75
75
  this.getLogger().error(`Failed on create function for url generate, snippet is [${this.getUrlGenerateSnippet()}].`);
@@ -77,9 +77,9 @@ export class FetchPipelineStep<In = PipelineStepPayload, Out = PipelineStepPaylo
77
77
  }
78
78
  });
79
79
  this._headersGenerateSnippet = options.headersGenerate;
80
- this._headersGenerateFunc = Utils.createSyncFunction(this.getHeadersGenerateSnippet(), {
80
+ this._headersGenerateFunc = Utils.createAsyncFunction(this.getHeadersGenerateSnippet(), {
81
81
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
82
- createDefault: () => (_$factor: InFragment, _$request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers) => (void 0),
82
+ createDefault: () => async (_$factor: InFragment, _$request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers) => (void 0),
83
83
  getVariableNames: () => this.getHeadersGenerateVariableNames(),
84
84
  error: (e: Error) => {
85
85
  this.getLogger().error(`Failed on create function for request headers generate, snippet is [${this.getHeadersGenerateSnippet()}].`);
@@ -88,9 +88,9 @@ export class FetchPipelineStep<In = PipelineStepPayload, Out = PipelineStepPaylo
88
88
  });
89
89
  this._bodyUsed = options.bodyUsed;
90
90
  this._bodyGenerateSnippet = options.bodyGenerate;
91
- this._bodyGenerateFunc = Utils.createSyncFunction(this.getBodyGenerateSnippet(), {
91
+ this._bodyGenerateFunc = Utils.createAsyncFunction(this.getBodyGenerateSnippet(), {
92
92
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
93
- createDefault: () => ($factor: InFragment, _$request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers) => {
93
+ createDefault: () => async ($factor: InFragment, _$request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers) => {
94
94
  return ($factor == null || (typeof $factor === 'string' && $factor.length === 0)) ? (void 0) : JSON.stringify($factor);
95
95
  },
96
96
  getVariableNames: () => this.getBodyGenerateVariableNames(),
@@ -251,15 +251,15 @@ export class FetchPipelineStep<In = PipelineStepPayload, Out = PipelineStepPaylo
251
251
  const $helpers = this.getHelpers();
252
252
  let url = '';
253
253
  try {
254
- url = this._urlGenerateFunc(this.getEndpointUrl(), data, request, $helpers, $helpers);
254
+ url = await this._urlGenerateFunc(this.getEndpointUrl(), data, request, $helpers, $helpers);
255
255
  const method = this.getEndpointMethod();
256
256
  const staticHeaders = this.getEndpointHeaders() ?? {};
257
- const headers = this._headersGenerateFunc(data, request, $helpers, $helpers) ?? {};
257
+ const headers = await this._headersGenerateFunc(data, request, $helpers, $helpers) ?? {};
258
258
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
259
259
  let body: any;
260
260
  const bodyUsed = this.isBodyUsed();
261
261
  if (bodyUsed === true || (bodyUsed == null && method !== 'get')) {
262
- body = this._bodyGenerateFunc(data, request, $helpers, $helpers);
262
+ body = await this._bodyGenerateFunc(data, request, $helpers, $helpers);
263
263
  } else {
264
264
  body = (void 0);
265
265
  }
@@ -2,11 +2,11 @@ import {PipelineStepData, PipelineStepHelpers, Undefinable} from '@rainbow-o23/n
2
2
  import {Response} from 'node-fetch';
3
3
 
4
4
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
- export type HttpGenerateUrl<In, InFragment> = ($endpointUrl: string, $factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => string;
5
+ export type HttpGenerateUrl<In, InFragment> = ($endpointUrl: string, $factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<string>;
6
6
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
- export type HttpGenerateHeaders<In, InFragment> = ($factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Undefinable<Record<string, string>>;
7
+ export type HttpGenerateHeaders<In, InFragment> = ($factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<Undefinable<Record<string, string>>>;
8
8
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
- export type HttpGenerateBody<In, InFragment> = ($factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => any;
9
+ export type HttpGenerateBody<In, InFragment> = ($factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<any>;
10
10
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
11
  export type HttpGenerateResponse<In, InFragment> = ($response: Response, $factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<any>;
12
12
 
@@ -30,4 +30,4 @@ export interface HttpErrorHandleOptions<In, InFragment> {
30
30
  $request: PipelineStepData<In>;
31
31
  }
32
32
 
33
- export type HttpHandleError<In, InFragment, OutFragment> = (options: HttpErrorHandleOptions<In, InFragment>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<OutFragment> | never;
33
+ export type HttpHandleError<In, InFragment, OutFragment> = ($options: HttpErrorHandleOptions<In, InFragment>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<OutFragment> | never;
@@ -43,11 +43,11 @@ export interface FragmentaryPipelineStepOptions<In = PipelineStepPayload, Out =
43
43
  /**
44
44
  * parameter names could be change {@link AbstractFragmentaryPipelineStep#generateFromRequestVariableNames}
45
45
  */
46
- export type GetInFragmentFromRequestFunc<In, InFragment> = ($factor: In, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => InFragment;
46
+ export type GetInFragmentFromRequestFunc<In, InFragment> = ($factor: In, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<InFragment>;
47
47
  /**
48
48
  * parameter names could be change {@link AbstractFragmentaryPipelineStep#generateToResponseVariableNames}
49
49
  */
50
- export type SetOutFragmentToResponseFunc<In, Out, OutFragment> = ($result: OutFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Out;
50
+ export type SetOutFragmentToResponseFunc<In, Out, OutFragment> = ($result: OutFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<Out>;
51
51
 
52
52
  /**
53
53
  * deal with fragment data from request, and put result into response.
@@ -86,9 +86,11 @@ export abstract class AbstractFragmentaryPipelineStep<In = PipelineStepPayload,
86
86
  } else {
87
87
  this._mergeRequest = options.mergeRequest ?? false;
88
88
  }
89
- this._fromRequestFunc = Utils.createSyncFunction(this.getFromRequestSnippet(), {
89
+ this._fromRequestFunc = Utils.createAsyncFunction(this.getFromRequestSnippet(), {
90
90
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
91
- createDefault: () => ($factor: In, _$request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers): InFragment => $factor as unknown as InFragment,
91
+ createDefault: () => async ($factor: In, _$request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers): Promise<InFragment> => {
92
+ return $factor as unknown as InFragment;
93
+ },
92
94
  getVariableNames: () => this.generateFromRequestVariableNames(),
93
95
  error: (e: Error) => {
94
96
  this.getLogger().error(`Failed on create function for from request transformer, snippet is [${this.getFromRequestSnippet()}].`);
@@ -196,24 +198,24 @@ export abstract class AbstractFragmentaryPipelineStep<In = PipelineStepPayload,
196
198
  if (funcOrSnippet == null || (typeof funcOrSnippet === 'string' && funcOrSnippet.trim().length === 0)) {
197
199
  if (this.useUnboxMerging()) {
198
200
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
199
- return ($result: OutFragment, $request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers): Out => {
201
+ return async ($result: OutFragment, $request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers): Promise<Out> => {
200
202
  return {...$request.content, ...$result} as Out;
201
203
  };
202
204
  } else if (this.hasMergeKey()) {
203
205
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
204
- return ($result: OutFragment, $request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers): Out => {
206
+ return async ($result: OutFragment, $request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers): Promise<Out> => {
205
207
  return {...$request.content, [this.getMergeKey()]: $result} as Out;
206
208
  };
207
209
  } else {
208
210
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
209
- return ($result: OutFragment, _$request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers): Out => {
211
+ return async ($result: OutFragment, _$request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers): Promise<Out> => {
210
212
  return $result as unknown as Out;
211
213
  };
212
214
  }
213
215
  } else if (typeof funcOrSnippet === 'string') {
214
216
  // eslint-disable-next-line @typescript-eslint/ban-types
215
- const func: Function = Utils.createSyncFunction(funcOrSnippet, {
216
- createDefault: (): never => {
217
+ const func = Utils.createAsyncFunction(funcOrSnippet, {
218
+ createDefault: async () => {
217
219
  throw new UncatchableError(ERR_PIPELINE_STEP_SNIPPET_NOT_EMPTY, 'Cannot create perform func on empty snippet.');
218
220
  },
219
221
  getVariableNames: () => this.generateToResponseVariableNames(),
@@ -221,14 +223,14 @@ export abstract class AbstractFragmentaryPipelineStep<In = PipelineStepPayload,
221
223
  this.getLogger().error(`Failed on create function for snippet[${funcOrSnippet}].`);
222
224
  throw e;
223
225
  }
224
- });
226
+ }) as unknown as SetOutFragmentToResponseFunc<In, Out, OutFragment>;
225
227
  if (this.useUnboxMerging()) {
226
- return ($result: OutFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers): Out => {
227
- const r = func($result, $request, $helpers, $);
228
+ return async ($result: OutFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers): Promise<Out> => {
229
+ const r = await func($result, $request, $helpers, $);
228
230
  return {...$request.content, ...r};
229
231
  };
230
232
  } else if (this.hasMergeKey()) {
231
- return ($result: OutFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers): Out => {
233
+ return async ($result: OutFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers): Promise<Out> => {
232
234
  const r = func($result, $request, $helpers, $);
233
235
  return {...$request.content, [this.getMergeKey()]: r} as Out;
234
236
  };
@@ -236,12 +238,12 @@ export abstract class AbstractFragmentaryPipelineStep<In = PipelineStepPayload,
236
238
  return func as SetOutFragmentToResponseFunc<In, Out, OutFragment>;
237
239
  }
238
240
  } else if (this.useUnboxMerging()) {
239
- return ($result: OutFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers): Out => {
241
+ return async ($result: OutFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers): Promise<Out> => {
240
242
  const r = funcOrSnippet($result, $request, $helpers, $);
241
- return {...$request.content, ...r};
243
+ return {...$request.content, ...r} as Out;
242
244
  };
243
245
  } else if (this.hasMergeKey()) {
244
- return ($result: OutFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers): Out => {
246
+ return async ($result: OutFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers): Promise<Out> => {
245
247
  const r = funcOrSnippet($result, $request, $helpers, $);
246
248
  return {...$request.content, [this.getMergeKey()]: r} as Out;
247
249
  };
@@ -253,7 +255,7 @@ export abstract class AbstractFragmentaryPipelineStep<In = PipelineStepPayload,
253
255
  /**
254
256
  * default get request content
255
257
  */
256
- protected getFromInput($factor: In, $request: PipelineStepData<In>): InFragment {
258
+ protected async getFromInput($factor: In, $request: PipelineStepData<In>): Promise<InFragment> {
257
259
  const $helpers = this.getHelpers();
258
260
  return this._fromRequestFunc($factor, $request, $helpers, $helpers);
259
261
  }
@@ -261,9 +263,9 @@ export abstract class AbstractFragmentaryPipelineStep<In = PipelineStepPayload,
261
263
  /**
262
264
  * default set to response content
263
265
  */
264
- protected setToOutput($result: OutFragment, $request: PipelineStepData<In>): PipelineStepData<Out> {
266
+ protected async setToOutput($result: OutFragment, $request: PipelineStepData<In>): Promise<PipelineStepData<Out>> {
265
267
  const $helpers = this.getHelpers();
266
- return {content: this._toResponseFunc($result, $request, $helpers, $helpers)};
268
+ return {content: await this._toResponseFunc($result, $request, $helpers, $helpers)};
267
269
  }
268
270
 
269
271
  /**
@@ -282,7 +284,8 @@ export abstract class AbstractFragmentaryPipelineStep<In = PipelineStepPayload,
282
284
  if (context == null) {
283
285
  return {};
284
286
  } else {
285
- return Utils.clone(context);
287
+ const {authorization, traceId, ...rest} = context;
288
+ return {authorization, traceId, ...Utils.clone(rest)};
286
289
  }
287
290
  }
288
291
 
@@ -291,7 +294,7 @@ export abstract class AbstractFragmentaryPipelineStep<In = PipelineStepPayload,
291
294
  */
292
295
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
293
296
  protected async handleErrorSteps(fragment: InFragment, errorCode: string, error: any, request: PipelineStepData<In>, builders: Array<PipelineStepBuilder>): Promise<OutFragment> {
294
- const {$context: {traceId} = {}} = request;
297
+ const {$context: {authorization, traceId} = {}} = request;
295
298
  const errorContext = this.createErrorHandleContext(request);
296
299
  const options = this.buildStepOptions();
297
300
  const steps = await Promise.all(builders.map(async builder => await builder.create(options)));
@@ -300,7 +303,9 @@ export abstract class AbstractFragmentaryPipelineStep<In = PipelineStepPayload,
300
303
  return await this.measurePerformance(traceId, 'STEP', step.constructor.name)
301
304
  .execute(async () => {
302
305
  this.traceStepIn(traceId, step, request);
303
- const response = await step.perform({...request, $context: {...errorContext, traceId}});
306
+ const response = await step.perform({
307
+ ...request, $context: {...errorContext, authorization, traceId}
308
+ });
304
309
  this.traceStepOut(traceId, step, response);
305
310
  // if no response returned, keep using request for next
306
311
  return this.returnOrContinueOrClear(request, response);
@@ -360,19 +365,19 @@ export abstract class AbstractFragmentaryPipelineStep<In = PipelineStepPayload,
360
365
  public async performAndCatch(request: PipelineStepData<In>, perform: (data: InFragment) => Promise<PipelineStepData<Out>>): Promise<PipelineStepData<Out>> {
361
366
  let fragment = null;
362
367
  try {
363
- fragment = this.getFromInput(request.content, request);
368
+ fragment = await this.getFromInput(request.content, request);
364
369
  return await perform(fragment);
365
370
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
366
371
  } catch (e: any) {
367
372
  const result = await this.handleError(fragment, request, e);
368
- return this.setToOutput(result, request);
373
+ return await this.setToOutput(result, request);
369
374
  }
370
375
  }
371
376
 
372
377
  public async perform(request: PipelineStepData<In>): Promise<PipelineStepData<Out>> {
373
378
  return await this.performAndCatch(request, async (fragment) => {
374
379
  const result = await this.doPerform(fragment, request);
375
- return this.setToOutput(result, request);
380
+ return await this.setToOutput(result, request);
376
381
  });
377
382
  }
378
383
  }
@@ -67,7 +67,7 @@ export class ConditionalPipelineStepSets<In = PipelineStepPayload, Out = Pipelin
67
67
  const checked = await this.check(fragment, request);
68
68
  if (checked) {
69
69
  const result = await this.doPerform(request.content as unknown as InFragment, request);
70
- return this.setToOutput(result, request);
70
+ return await this.setToOutput(result, request);
71
71
  }
72
72
  // noinspection DuplicatedCode
73
73
  const otherwiseStepBuilders = this.getOtherwiseStepBuilders();
@@ -77,7 +77,7 @@ export class ConditionalPipelineStepSets<In = PipelineStepPayload, Out = Pipelin
77
77
  ...this.buildStepOptions(), name: this.getName(), steps: otherwiseStepBuilders
78
78
  });
79
79
  const result = await sets.perform(request);
80
- return this.setToOutput(result.content, request);
80
+ return await this.setToOutput(result.content, request);
81
81
  } else {
82
82
  // otherwise route not declared
83
83
  return request as unknown as PipelineStepData<Out>;
@@ -74,7 +74,7 @@ export class EachPipelineStepSets<In = PipelineStepPayload, Out = PipelineStepPa
74
74
  results.push(result);
75
75
  }
76
76
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
- return this.setToOutput(results as any, request);
77
+ return await this.setToOutput(results as any, request);
78
78
  });
79
79
  }
80
80
  }
@@ -3,7 +3,7 @@ import {PipelineStepSets, PipelineStepSetsContext, PipelineStepSetsOptions} from
3
3
  import {ScriptFuncOrBody} from './types';
4
4
  import {Utils} from './utils';
5
5
 
6
- export type CloneDataFunc<In, InFragment, EachInFragment = InFragment> = ($factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => EachInFragment;
6
+ export type CloneDataFunc<In, InFragment, EachInFragment = InFragment> = ($factor: InFragment, $request: PipelineStepData<In>, $helpers: PipelineStepHelpers, $: PipelineStepHelpers) => Promise<EachInFragment>;
7
7
 
8
8
  export interface ParallelPipelineStepSetsOptions<In = PipelineStepPayload, Out = PipelineStepPayload, InFragment = In, OutFragment = Out, EachInFragment = InFragment>
9
9
  extends PipelineStepSetsOptions<In, Out, InFragment, OutFragment> {
@@ -23,9 +23,9 @@ export class ParallelPipelineStepSets<In = PipelineStepPayload, Out = PipelineSt
23
23
  public constructor(options: ParallelPipelineStepSetsOptions<In, Out, InFragment, OutFragment, EachInFragment>) {
24
24
  super(options);
25
25
  this._cloneDataSnippet = options.cloneData;
26
- this._cloneData = Utils.createSyncFunction(this.getCloneDataSnippet(), {
26
+ this._cloneData = Utils.createAsyncFunction(this.getCloneDataSnippet(), {
27
27
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
28
- createDefault: () => ($factor: InFragment, _$request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers): EachInFragment => {
28
+ createDefault: () => async ($factor: InFragment, _$request: PipelineStepData<In>, _$helpers: PipelineStepHelpers, _$: PipelineStepHelpers): Promise<EachInFragment> => {
29
29
  return $factor as unknown as EachInFragment;
30
30
  },
31
31
  getVariableNames: () => ['$factor', '$request', ...this.getHelpersVariableNames()], //this.generateFromRequestVariableNames(),
@@ -51,7 +51,7 @@ export class ParallelPipelineStepSets<In = PipelineStepPayload, Out = PipelineSt
51
51
  /**
52
52
  * default get request content
53
53
  */
54
- protected cloneDataForEach($factor: InFragment, $request: PipelineStepData<In>): EachInFragment {
54
+ protected async cloneDataForEach($factor: InFragment, $request: PipelineStepData<In>): Promise<EachInFragment> {
55
55
  if ($factor == null) {
56
56
  return null;
57
57
  }
@@ -62,14 +62,14 @@ export class ParallelPipelineStepSets<In = PipelineStepPayload, Out = PipelineSt
62
62
  protected async doPerform(data: InFragment, request: PipelineStepData<In>): Promise<OutFragment> {
63
63
  return await this.performWithContext(
64
64
  request, async (request: PipelineStepData<In>, context: PipelineStepSetsContext): Promise<OutFragment> => {
65
- const {$context: {traceId} = {}} = request;
65
+ const {$context: {authorization, traceId} = {}} = request;
66
66
  const steps = await this.createSteps();
67
67
  const execute = () => {
68
68
  return steps.map(async step => {
69
69
  return await this.measurePerformance(traceId, 'STEP', step.constructor.name)
70
70
  .execute(async () => {
71
- const eachData = this.cloneDataForEach(data, request);
72
- const eachRequest = {content: eachData, $context: {...context, traceId}};
71
+ const eachData = await this.cloneDataForEach(data, request);
72
+ const eachRequest = {content: eachData, $context: {...context, authorization, traceId}};
73
73
  this.traceStepIn(traceId, step, request);
74
74
  const response = await step.perform(eachRequest);
75
75
  this.traceStepOut(traceId, step, response);
@@ -56,10 +56,9 @@ export class RefPipelinePipelineStep<In = PipelineStepPayload, Out = PipelineSte
56
56
  }
57
57
 
58
58
  protected async doPerform(data: InFragment, request: PipelineStepData<In>): Promise<OutFragment> {
59
- const {$context: {traceId} = {}} = request;
59
+ const {$context: {authorization, traceId} = {}} = request;
60
60
  const pipeline = await this.getPipelineBuilder().create(this.buildPipelineOptions());
61
- const result = await pipeline.perform({payload: data, traceId});
62
- // const result = await step.perform({content: data, $context: request.$context});
61
+ const result = await pipeline.perform({payload: data, authorization, traceId});
63
62
  return result.payload;
64
63
  }
65
64
  }
@@ -98,7 +98,7 @@ export class RoutesPipelineStepSets<In = PipelineStepPayload, Out = PipelineStep
98
98
  ...this.buildStepOptions(), name: this.getName(), steps
99
99
  });
100
100
  const result = await sets.perform(request);
101
- return this.setToOutput(result.content, request);
101
+ return await this.setToOutput(result.content, request);
102
102
  }
103
103
  }
104
104
  }
@@ -110,7 +110,7 @@ export class RoutesPipelineStepSets<In = PipelineStepPayload, Out = PipelineStep
110
110
  ...this.buildStepOptions(), name: this.getName(), steps: otherwiseStepBuilders
111
111
  });
112
112
  const result = await sets.perform(request);
113
- return this.setToOutput(result.content, request);
113
+ return await this.setToOutput(result.content, request);
114
114
  } else {
115
115
  // otherwise route not declared
116
116
  return request as unknown as PipelineStepData<Out>;
@@ -50,7 +50,8 @@ export class PipelineStepSets<In = PipelineStepPayload, Out = PipelineStepPayloa
50
50
  if (context == null) {
51
51
  return {};
52
52
  } else {
53
- return Utils.clone(context);
53
+ const {authorization, traceId, ...rest} = context;
54
+ return {authorization, traceId, ...Utils.clone(rest)};
54
55
  }
55
56
  }
56
57
 
@@ -79,14 +80,16 @@ export class PipelineStepSets<In = PipelineStepPayload, Out = PipelineStepPayloa
79
80
  protected async doPerform(data: InFragment, request: PipelineStepData<In>): Promise<OutFragment> {
80
81
  return await this.performWithContext(
81
82
  request, async (request: PipelineStepData<In>, context: PipelineStepSetsContext): Promise<OutFragment> => {
82
- const {$context: {traceId} = {}} = request;
83
+ const {$context: {authorization, traceId} = {}} = request;
83
84
  const steps = await this.createSteps();
84
85
  const response = await steps.reduce(async (promise, step) => {
85
86
  const request = await promise;
86
87
  return await this.measurePerformance(traceId, 'STEP', step.constructor.name)
87
88
  .execute(async () => {
88
89
  this.traceStepIn(traceId, step, request);
89
- const response = await step.perform({...request, $context: {...context, traceId}});
90
+ const response = await step.perform({
91
+ ...request, $context: {...context, authorization, traceId}
92
+ });
90
93
  this.traceStepOut(traceId, step, response);
91
94
  // if no response returned, keep using request for next
92
95
  return this.returnOrContinueOrClear(request, response);
@@ -1,4 +1,5 @@
1
1
  import {Nullable, UncatchableError, Undefinable} from '@rainbow-o23/n1';
2
+ import ts, {JsxEmit, ModuleKind, ModuleResolutionKind, ScriptTarget} from 'typescript';
2
3
  import {
3
4
  ERR_PIPELINE_SNIPPET_CANNOT_USE_EVAL,
4
5
  ERR_PIPELINE_SNIPPET_CANNOT_USE_FUNCTION,
@@ -57,6 +58,23 @@ export class Utils {
57
58
  // // noinspection ExceptionCaughtLocallyJS
58
59
  // throw new UncatchableError(ERR_PIPELINE_SNIPPET_CANNOT_USE_GLOBAL, '"global" is not allowed in dynamic snippet.');
59
60
  // }
61
+ // transpiled by typescript
62
+ const transpiled = ts.transpileModule(snippet, {
63
+ compilerOptions: {
64
+ target: ScriptTarget.ES2022,
65
+ jsx: JsxEmit.None, // no jsx
66
+ strict: false,
67
+ noEmitOnError: true, // ignore errors
68
+ esModuleInterop: true,
69
+ module: ModuleKind.ES2022,
70
+ suppressOutputPathCheck: false,
71
+ skipLibCheck: true,
72
+ skipDefaultLibCheck: true,
73
+ moduleResolution: ModuleResolutionKind.Node16 // default use node 16
74
+ }
75
+ });
76
+ snippet = transpiled.outputText;
77
+ // build function
60
78
  const variableNames = creators.getVariableNames() ?? [];
61
79
  if (creators.async) {
62
80
  const func = new AsyncFunction(...variableNames, ...AvoidNames, snippet);