@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 +12 -0
- package/index.cjs +70 -46
- package/index.js +70 -46
- package/lib/http/types.d.ts +4 -4
- package/lib/step/abstract-fragmentary-pipeline-step.d.ts +4 -4
- package/lib/step/parallel-step-sets.d.ts +2 -2
- package/package.json +6 -6
- package/rollup.config.base.js +1 -1
- package/src/lib/http/fetch-step.ts +9 -9
- package/src/lib/http/types.ts +4 -4
- package/src/lib/step/abstract-fragmentary-pipeline-step.ts +30 -25
- package/src/lib/step/conditional-step-sets.ts +2 -2
- package/src/lib/step/each-step-sets.ts +1 -1
- package/src/lib/step/parallel-step-sets.ts +7 -7
- package/src/lib/step/ref-pipeline-step.ts +2 -3
- package/src/lib/step/routes-step-sets.ts +2 -2
- package/src/lib/step/step-sets.ts +6 -3
- package/src/lib/step/utils.ts +18 -0
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.
|
|
490
|
-
createDefault: () => ($factor, _$request, _$helpers, _$) =>
|
|
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.
|
|
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
|
-
|
|
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({
|
|
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
|
-
|
|
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({
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
488
|
-
createDefault: () => ($factor, _$request, _$helpers, _$) =>
|
|
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.
|
|
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
|
-
|
|
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({
|
|
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
|
-
|
|
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({
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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);
|
package/lib/http/types.d.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
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": "
|
|
77
|
+
"node": "20.17.0",
|
|
78
78
|
"yarn": "1.22.21"
|
|
79
79
|
}
|
|
80
80
|
}
|
package/rollup.config.base.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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
|
}
|
package/src/lib/http/types.ts
CHANGED
|
@@ -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.
|
|
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 =>
|
|
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
|
|
216
|
-
createDefault: ()
|
|
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
|
-
|
|
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({
|
|
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.
|
|
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
|
-
|
|
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({
|
|
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);
|
package/src/lib/step/utils.ts
CHANGED
|
@@ -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);
|