@6thbridge/utils 1.8.2-3 → 1.8.3
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/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/pipelines/index.d.ts +3 -0
- package/lib/pipelines/index.js +20 -0
- package/lib/pipelines/index.js.map +1 -0
- package/lib/pipelines/parallel-pipeline.d.ts +7 -0
- package/lib/pipelines/parallel-pipeline.js +49 -0
- package/lib/pipelines/parallel-pipeline.js.map +1 -0
- package/lib/pipelines/pipeline-step.d.ts +5 -0
- package/lib/pipelines/pipeline-step.js +3 -0
- package/lib/pipelines/pipeline-step.js.map +1 -0
- package/lib/pipelines/pipeline.example.d.ts +2 -0
- package/lib/pipelines/pipeline.example.js +96 -0
- package/lib/pipelines/pipeline.example.js.map +1 -0
- package/lib/pipelines/pipelines.test.d.ts +1 -0
- package/lib/pipelines/pipelines.test.js +204 -0
- package/lib/pipelines/pipelines.test.js.map +1 -0
- package/lib/pipelines/pipelines.typecheck.d.ts +1 -0
- package/lib/pipelines/pipelines.typecheck.js +68 -0
- package/lib/pipelines/pipelines.typecheck.js.map +1 -0
- package/lib/pipelines/serial-pipeline.d.ts +7 -0
- package/lib/pipelines/serial-pipeline.js +39 -0
- package/lib/pipelines/serial-pipeline.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/readme.md +88 -0
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -56,6 +56,7 @@ __exportStar(require("./database"), exports);
|
|
|
56
56
|
__exportStar(require("./schemas"), exports);
|
|
57
57
|
__exportStar(require("./utils"), exports);
|
|
58
58
|
__exportStar(require("./actions"), exports);
|
|
59
|
+
__exportStar(require("./pipelines"), exports);
|
|
59
60
|
__exportStar(require("./logger"), exports);
|
|
60
61
|
process.on('uncaughtException', (err) => {
|
|
61
62
|
logger_1.logger.critical('uncaughtException: ' + err.message, {}, err.stack);
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gEAAqC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./pipeline-step"), exports);
|
|
18
|
+
__exportStar(require("./serial-pipeline"), exports);
|
|
19
|
+
__exportStar(require("./parallel-pipeline"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pipelines/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,oDAAkC;AAClC,sDAAoC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ContextEntity } from '../types';
|
|
2
|
+
import type { PipelineStep } from './pipeline-step';
|
|
3
|
+
export declare class ParallelPipeline<Input, Results extends object = {}> {
|
|
4
|
+
private steps;
|
|
5
|
+
pipe<Name extends string, Result>(name: Name, step: PipelineStep<Input, Result>): ParallelPipeline<Input, Results & Partial<Record<Name, Result>>>;
|
|
6
|
+
run(contextEntity: ContextEntity, input: Input): Promise<Results>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ParallelPipeline = void 0;
|
|
13
|
+
class ParallelPipeline {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.steps = [];
|
|
16
|
+
}
|
|
17
|
+
pipe(name, step) {
|
|
18
|
+
if (this.steps.some((entry) => entry.name === name)) {
|
|
19
|
+
throw new Error(`Duplicate pipeline step name: ${name}`);
|
|
20
|
+
}
|
|
21
|
+
const pipeline = new ParallelPipeline();
|
|
22
|
+
pipeline.steps = [...this.steps, { name, step }];
|
|
23
|
+
return pipeline;
|
|
24
|
+
}
|
|
25
|
+
run(contextEntity, input) {
|
|
26
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
+
const entries = yield Promise.all(this.steps.map((_a) => __awaiter(this, [_a], void 0, function* ({ name, step }) {
|
|
28
|
+
if (!(yield step.shouldRun(contextEntity, input)))
|
|
29
|
+
return undefined;
|
|
30
|
+
return { name, value: yield step.run(contextEntity, input) };
|
|
31
|
+
})));
|
|
32
|
+
const results = {};
|
|
33
|
+
for (const entry of entries) {
|
|
34
|
+
if (entry) {
|
|
35
|
+
Object.defineProperty(results, entry.name, {
|
|
36
|
+
value: entry.value,
|
|
37
|
+
enumerable: true,
|
|
38
|
+
configurable: true,
|
|
39
|
+
writable: true,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Keys and result types are accumulated by pipe; skipped keys remain absent.
|
|
44
|
+
return results;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.ParallelPipeline = ParallelPipeline;
|
|
49
|
+
//# sourceMappingURL=parallel-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-pipeline.js","sourceRoot":"","sources":["../../src/pipelines/parallel-pipeline.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,MAAa,gBAAgB;IAA7B;QACU,UAAK,GAAwE,EAAE,CAAC;IAqC1F,CAAC;IAnCC,IAAI,CACF,IAAU,EACV,IAAiC;QAEjC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAkD,CAAC;QACxF,QAAQ,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEK,GAAG,CAAC,aAA4B,EAAE,KAAY;;YAClD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAuB,EAAE,0CAAlB,EAAE,IAAI,EAAE,IAAI,EAAE;gBAClC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;oBAAE,OAAO,SAAS,CAAC;gBACpE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;YAC/D,CAAC,CAAA,CAAC,CACH,CAAC;YAEF,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE;wBACzC,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,UAAU,EAAE,IAAI;wBAChB,YAAY,EAAE,IAAI;wBAClB,QAAQ,EAAE,IAAI;qBACf,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,6EAA6E;YAC7E,OAAO,OAAkB,CAAC;QAC5B,CAAC;KAAA;CACF;AAtCD,4CAsCC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-step.js","sourceRoot":"","sources":["../../src/pipelines/pipeline-step.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.pipelineExample = pipelineExample;
|
|
13
|
+
const context_entity_1 = require("../types/context.entity");
|
|
14
|
+
const index_1 = require("./index");
|
|
15
|
+
// In a consuming service, import these types and classes from '@6thbridge/utils'.
|
|
16
|
+
// Run locally with: npx ts-node src/pipelines/pipeline.example.ts
|
|
17
|
+
class MeasureText {
|
|
18
|
+
constructor(minimumLength) {
|
|
19
|
+
this.minimumLength = minimumLength;
|
|
20
|
+
}
|
|
21
|
+
shouldRun(contextEntity, input) {
|
|
22
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
23
|
+
return input.length >= this.minimumLength;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
run(contextEntity, input) {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
return input.length;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function pipelineExample(contextEntity) {
|
|
33
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
34
|
+
// Register class instances or object literals. Each pipe returns a new pipeline.
|
|
35
|
+
const serial = new index_1.SerialPipeline()
|
|
36
|
+
.pipe('measure', new MeasureText(3))
|
|
37
|
+
.pipe('describe', {
|
|
38
|
+
shouldRun(contextEntity, input) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
return true;
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
run(contextEntity, input) {
|
|
44
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
+
// input is string | number because a skipped measurement preserves the string.
|
|
46
|
+
return typeof input === 'number' ? `Length: ${input}` : `Unmeasured: ${input}`;
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
// The measurement result becomes the describe step's input.
|
|
51
|
+
console.log('Serial:', yield serial.run(contextEntity, 'hello')); // Length: 5
|
|
52
|
+
// shouldRun returns false for measure, so describe receives the original input.
|
|
53
|
+
console.log('Serial with skipped step:', yield serial.run(contextEntity, 'hi')); // Unmeasured: hi
|
|
54
|
+
const parallel = new index_1.ParallelPipeline()
|
|
55
|
+
.pipe('length', new MeasureText(3))
|
|
56
|
+
.pipe('uppercase', {
|
|
57
|
+
shouldRun(contextEntity, input) {
|
|
58
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
return input.length > 0;
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
run(contextEntity, input) {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
// Every parallel step receives the same original string and context entity.
|
|
65
|
+
return input.toUpperCase();
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
const results = yield parallel.run(contextEntity, 'hello');
|
|
70
|
+
console.log('Parallel:', results); // { length: 5, uppercase: 'HELLO' }
|
|
71
|
+
// Named properties retain their result types and are optional because steps can skip.
|
|
72
|
+
if (results.length !== undefined) {
|
|
73
|
+
console.log('Measured length:', results.length.toFixed(0));
|
|
74
|
+
}
|
|
75
|
+
console.log('Parallel with skipped step:', yield parallel.run(contextEntity, 'hi'));
|
|
76
|
+
// { uppercase: 'HI' }; the skipped length property is absent.
|
|
77
|
+
// Reuse a pipeline with a different context on each invocation, even concurrently.
|
|
78
|
+
const otherContextEntity = new context_entity_1.ContextEntity();
|
|
79
|
+
otherContextEntity.requestId = 'another-request';
|
|
80
|
+
console.log('Concurrent invocations:', yield Promise.all([
|
|
81
|
+
parallel.run(contextEntity, 'first'),
|
|
82
|
+
parallel.run(otherContextEntity, 'second'),
|
|
83
|
+
]));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Importing this file does not execute the examples.
|
|
87
|
+
if (require.main === module) {
|
|
88
|
+
const contextEntity = new context_entity_1.ContextEntity();
|
|
89
|
+
contextEntity.requestId = 'pipeline-example';
|
|
90
|
+
// Errors from shouldRun or run reject the pipeline's promise.
|
|
91
|
+
pipelineExample(contextEntity).catch((error) => {
|
|
92
|
+
console.error('Pipeline example failed:', error);
|
|
93
|
+
process.exitCode = 1;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=pipeline.example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.example.js","sourceRoot":"","sources":["../../src/pipelines/pipeline.example.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const index_1 = require("./index");
|
|
13
|
+
function createContext(requestId) {
|
|
14
|
+
return { requestId };
|
|
15
|
+
}
|
|
16
|
+
function deferred() {
|
|
17
|
+
let resolve;
|
|
18
|
+
const promise = new Promise((complete) => { resolve = complete; });
|
|
19
|
+
return { promise, resolve };
|
|
20
|
+
}
|
|
21
|
+
const context = createContext('first');
|
|
22
|
+
describe('SerialPipeline', () => {
|
|
23
|
+
it('awaits predicates and executions, then forwards results in order', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
24
|
+
const predicate = deferred();
|
|
25
|
+
const execution = deferred();
|
|
26
|
+
const firstRun = jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { return execution.promise; }));
|
|
27
|
+
const secondPredicate = jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { return true; }));
|
|
28
|
+
const secondRun = jest.fn((_, input) => __awaiter(void 0, void 0, void 0, function* () { return `${input}!`; }));
|
|
29
|
+
const pipeline = new index_1.SerialPipeline()
|
|
30
|
+
.pipe('first', { shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return predicate.promise; }), run: firstRun })
|
|
31
|
+
.pipe('second', { shouldRun: secondPredicate, run: secondRun });
|
|
32
|
+
const pending = pipeline.run(context, 'input');
|
|
33
|
+
expect(firstRun).not.toHaveBeenCalled();
|
|
34
|
+
predicate.resolve(true);
|
|
35
|
+
yield Promise.resolve();
|
|
36
|
+
yield Promise.resolve();
|
|
37
|
+
expect(secondPredicate).not.toHaveBeenCalled();
|
|
38
|
+
execution.resolve(42);
|
|
39
|
+
yield expect(pending).resolves.toBe('42!');
|
|
40
|
+
expect(firstRun).toHaveBeenCalledWith(context, 'input');
|
|
41
|
+
expect(secondPredicate).toHaveBeenCalledWith(context, 42);
|
|
42
|
+
expect(secondRun).toHaveBeenCalledWith(context, 42);
|
|
43
|
+
}));
|
|
44
|
+
it('forwards unchanged input when a step is skipped', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
45
|
+
const skippedRun = jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { return 42; }));
|
|
46
|
+
const nextRun = jest.fn((_, value) => __awaiter(void 0, void 0, void 0, function* () { return value; }));
|
|
47
|
+
const pipeline = new index_1.SerialPipeline()
|
|
48
|
+
.pipe('skipped', { shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return false; }), run: skippedRun })
|
|
49
|
+
.pipe('next', { shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return true; }), run: nextRun });
|
|
50
|
+
yield expect(pipeline.run(context, 'original')).resolves.toBe('original');
|
|
51
|
+
expect(skippedRun).not.toHaveBeenCalled();
|
|
52
|
+
expect(nextRun).toHaveBeenCalledWith(context, 'original');
|
|
53
|
+
}));
|
|
54
|
+
it('forwards undefined as an executed result', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
55
|
+
const nextRun = jest.fn((_, value) => __awaiter(void 0, void 0, void 0, function* () { return value; }));
|
|
56
|
+
const pipeline = new index_1.SerialPipeline()
|
|
57
|
+
.pipe('undefined', { shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return true; }), run: () => __awaiter(void 0, void 0, void 0, function* () { return undefined; }) })
|
|
58
|
+
.pipe('next', { shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return true; }), run: nextRun });
|
|
59
|
+
yield expect(pipeline.run(context, 'input')).resolves.toBeUndefined();
|
|
60
|
+
expect(nextRun).toHaveBeenCalledWith(context, undefined);
|
|
61
|
+
}));
|
|
62
|
+
it.each(['shouldRun', 'run'])('stops and propagates errors from %s', (method) => __awaiter(void 0, void 0, void 0, function* () {
|
|
63
|
+
const error = new Error(method);
|
|
64
|
+
const nextRun = jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { return 2; }));
|
|
65
|
+
const step = {
|
|
66
|
+
shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return true; }),
|
|
67
|
+
run: () => __awaiter(void 0, void 0, void 0, function* () { return 1; }),
|
|
68
|
+
[method]: () => __awaiter(void 0, void 0, void 0, function* () { throw error; }),
|
|
69
|
+
};
|
|
70
|
+
const pipeline = new index_1.SerialPipeline()
|
|
71
|
+
.pipe('failure', step)
|
|
72
|
+
.pipe('next', { shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return true; }), run: nextRun });
|
|
73
|
+
yield expect(pipeline.run(context, 0)).rejects.toBe(error);
|
|
74
|
+
expect(nextRun).not.toHaveBeenCalled();
|
|
75
|
+
}));
|
|
76
|
+
});
|
|
77
|
+
describe('ParallelPipeline', () => {
|
|
78
|
+
it('starts predicates and runs concurrently, returning named results in registration order', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
79
|
+
const firstPredicate = deferred();
|
|
80
|
+
const secondStarted = deferred();
|
|
81
|
+
const firstResult = deferred();
|
|
82
|
+
const secondResult = deferred();
|
|
83
|
+
const firstRun = jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { return firstResult.promise; }));
|
|
84
|
+
const secondPredicate = jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { return true; }));
|
|
85
|
+
const secondRun = jest.fn(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
86
|
+
secondStarted.resolve();
|
|
87
|
+
return secondResult.promise;
|
|
88
|
+
}));
|
|
89
|
+
const pipeline = new index_1.ParallelPipeline()
|
|
90
|
+
.pipe('first', { shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return firstPredicate.promise; }), run: firstRun })
|
|
91
|
+
.pipe('second', { shouldRun: secondPredicate, run: secondRun });
|
|
92
|
+
const pending = pipeline.run(context, 7);
|
|
93
|
+
yield secondStarted.promise;
|
|
94
|
+
expect(firstRun).not.toHaveBeenCalled();
|
|
95
|
+
expect(secondPredicate).toHaveBeenCalledWith(context, 7);
|
|
96
|
+
secondResult.resolve('second');
|
|
97
|
+
firstPredicate.resolve(true);
|
|
98
|
+
firstResult.resolve(10);
|
|
99
|
+
const result = yield pending;
|
|
100
|
+
expect(result).toEqual({ first: 10, second: 'second' });
|
|
101
|
+
expect(Object.keys(result)).toEqual(['first', 'second']);
|
|
102
|
+
expect(firstRun).toHaveBeenCalledWith(context, 7);
|
|
103
|
+
expect(secondRun).toHaveBeenCalledWith(context, 7);
|
|
104
|
+
}));
|
|
105
|
+
it('omits skipped steps but includes executed undefined values', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
106
|
+
const skippedRun = jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { return 'skipped'; }));
|
|
107
|
+
const pipeline = new index_1.ParallelPipeline()
|
|
108
|
+
.pipe('skipped', { shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return false; }), run: skippedRun })
|
|
109
|
+
.pipe('executed', { shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return true; }), run: () => __awaiter(void 0, void 0, void 0, function* () { return undefined; }) });
|
|
110
|
+
const result = yield pipeline.run(context, 0);
|
|
111
|
+
expect(Object.keys(result)).toEqual(['executed']);
|
|
112
|
+
expect(result.executed).toBeUndefined();
|
|
113
|
+
expect(skippedRun).not.toHaveBeenCalled();
|
|
114
|
+
}));
|
|
115
|
+
it('supports names that overlap Object prototype properties', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
116
|
+
const pipeline = new index_1.ParallelPipeline()
|
|
117
|
+
.pipe('__proto__', { shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return true; }), run: () => __awaiter(void 0, void 0, void 0, function* () { return 1; }) });
|
|
118
|
+
const result = yield pipeline.run(context, 0);
|
|
119
|
+
expect(Object.getPrototypeOf(result)).toBe(Object.prototype);
|
|
120
|
+
expect(Object.prototype.hasOwnProperty.call(result, '__proto__')).toBe(true);
|
|
121
|
+
expect(result.__proto__).toBe(1);
|
|
122
|
+
}));
|
|
123
|
+
it.each(['shouldRun', 'run'])('rejects %s errors while started work continues', (method) => __awaiter(void 0, void 0, void 0, function* () {
|
|
124
|
+
const error = new Error(method);
|
|
125
|
+
const completion = deferred();
|
|
126
|
+
const started = deferred();
|
|
127
|
+
const finished = deferred();
|
|
128
|
+
const failure = {
|
|
129
|
+
shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return true; }),
|
|
130
|
+
run: () => __awaiter(void 0, void 0, void 0, function* () { return 1; }),
|
|
131
|
+
[method]: () => __awaiter(void 0, void 0, void 0, function* () { throw error; }),
|
|
132
|
+
};
|
|
133
|
+
const pipeline = new index_1.ParallelPipeline()
|
|
134
|
+
.pipe('failure', failure)
|
|
135
|
+
.pipe('continuing', {
|
|
136
|
+
shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return true; }),
|
|
137
|
+
run: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
138
|
+
started.resolve();
|
|
139
|
+
const value = yield completion.promise;
|
|
140
|
+
finished.resolve();
|
|
141
|
+
return value;
|
|
142
|
+
}),
|
|
143
|
+
});
|
|
144
|
+
const pending = pipeline.run(context, 0);
|
|
145
|
+
yield expect(pending).rejects.toBe(error);
|
|
146
|
+
yield started.promise;
|
|
147
|
+
completion.resolve(2);
|
|
148
|
+
yield finished.promise;
|
|
149
|
+
}));
|
|
150
|
+
});
|
|
151
|
+
describe.each([
|
|
152
|
+
['serial', () => new index_1.SerialPipeline()],
|
|
153
|
+
['parallel', () => new index_1.ParallelPipeline()],
|
|
154
|
+
])('%s registration and invocation', (_, createPipeline) => {
|
|
155
|
+
it('keeps earlier pipelines unchanged and rejects duplicate names', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
156
|
+
const original = createPipeline();
|
|
157
|
+
const step = { shouldRun: () => __awaiter(void 0, void 0, void 0, function* () { return true; }), run: () => __awaiter(void 0, void 0, void 0, function* () { return 3; }) };
|
|
158
|
+
const extended = original instanceof index_1.SerialPipeline
|
|
159
|
+
? original.pipe('step', step)
|
|
160
|
+
: original.pipe('step', step);
|
|
161
|
+
const emptyResult = yield original.run(context, 1);
|
|
162
|
+
expect(emptyResult).toEqual(original instanceof index_1.SerialPipeline ? 1 : {});
|
|
163
|
+
expect(() => {
|
|
164
|
+
if (extended instanceof index_1.SerialPipeline)
|
|
165
|
+
extended.pipe('step', step);
|
|
166
|
+
else
|
|
167
|
+
extended.pipe('step', step);
|
|
168
|
+
}).toThrow('Duplicate pipeline step name: step');
|
|
169
|
+
expect(() => {
|
|
170
|
+
if (original instanceof index_1.SerialPipeline)
|
|
171
|
+
original.pipe('step', step);
|
|
172
|
+
else
|
|
173
|
+
original.pipe('step', step);
|
|
174
|
+
}).not.toThrow();
|
|
175
|
+
}));
|
|
176
|
+
it('preserves instance binding and uses the context from each concurrent invocation', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
177
|
+
class Step {
|
|
178
|
+
constructor() {
|
|
179
|
+
this.prefix = 'result';
|
|
180
|
+
}
|
|
181
|
+
shouldRun(ctx) {
|
|
182
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
183
|
+
return this.prefix === 'result' && ctx.requestId !== undefined;
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
run(ctx, input) {
|
|
187
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
188
|
+
yield Promise.resolve();
|
|
189
|
+
return `${this.prefix}:${ctx.requestId}:${input}`;
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const original = createPipeline();
|
|
194
|
+
const pipeline = original instanceof index_1.SerialPipeline
|
|
195
|
+
? original.pipe('step', new Step())
|
|
196
|
+
: original.pipe('step', new Step());
|
|
197
|
+
const otherContext = createContext('second');
|
|
198
|
+
const results = yield Promise.all([pipeline.run(context, 1), pipeline.run(otherContext, 2)]);
|
|
199
|
+
expect(results).toEqual(pipeline instanceof index_1.SerialPipeline
|
|
200
|
+
? ['result:first:1', 'result:second:2']
|
|
201
|
+
: [{ step: 'result:first:1' }, { step: 'result:second:2' }]);
|
|
202
|
+
}));
|
|
203
|
+
});
|
|
204
|
+
//# sourceMappingURL=pipelines.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipelines.test.js","sourceRoot":"","sources":["../../src/pipelines/pipelines.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const index_1 = require("./index");
|
|
13
|
+
// Checked by tsc; never invoked at runtime.
|
|
14
|
+
function checkPipelineTypes(contextEntity) {
|
|
15
|
+
const length = {
|
|
16
|
+
shouldRun: () => __awaiter(this, void 0, void 0, function* () { return true; }),
|
|
17
|
+
run: (_, input) => __awaiter(this, void 0, void 0, function* () { return input.length; }),
|
|
18
|
+
};
|
|
19
|
+
const serial = new index_1.SerialPipeline().pipe('length', length);
|
|
20
|
+
const serialResult = serial.run(contextEntity, 'input');
|
|
21
|
+
void serialResult;
|
|
22
|
+
// @ts-expect-error A skipped step can still return the original string.
|
|
23
|
+
const numberOnly = serial.run(contextEntity, 'input');
|
|
24
|
+
void numberOnly;
|
|
25
|
+
// @ts-expect-error The next step must accept both string and number.
|
|
26
|
+
serial.pipe('narrow', { shouldRun: () => __awaiter(this, void 0, void 0, function* () { return true; }), run: (_, input) => __awaiter(this, void 0, void 0, function* () { return input + 1; }) });
|
|
27
|
+
// @ts-expect-error The predicate must also accept both possible input types.
|
|
28
|
+
serial.pipe('narrowPredicate', { shouldRun: (_, input) => __awaiter(this, void 0, void 0, function* () { return input > 0; }), run: () => __awaiter(this, void 0, void 0, function* () { return true; }) });
|
|
29
|
+
// @ts-expect-error shouldRun must return a promise.
|
|
30
|
+
new index_1.SerialPipeline().pipe('syncPredicate', { shouldRun: () => true, run: () => __awaiter(this, void 0, void 0, function* () { return 1; }) });
|
|
31
|
+
// @ts-expect-error run must return a promise.
|
|
32
|
+
new index_1.SerialPipeline().pipe('syncRun', { shouldRun: () => __awaiter(this, void 0, void 0, function* () { return true; }), run: () => 1 });
|
|
33
|
+
// @ts-expect-error Invocations require ContextEntity as the first argument.
|
|
34
|
+
serial.run('input');
|
|
35
|
+
const transformed = serial.pipe('label', {
|
|
36
|
+
shouldRun: () => __awaiter(this, void 0, void 0, function* () { return true; }),
|
|
37
|
+
run: (_, input) => __awaiter(this, void 0, void 0, function* () { return ({ label: String(input) }); }),
|
|
38
|
+
});
|
|
39
|
+
const transformedResult = transformed.run(contextEntity, 'input');
|
|
40
|
+
void transformedResult;
|
|
41
|
+
const parallel = new index_1.ParallelPipeline()
|
|
42
|
+
.pipe('length', length)
|
|
43
|
+
.pipe('label', { shouldRun: () => __awaiter(this, void 0, void 0, function* () { return true; }), run: (_, input) => __awaiter(this, void 0, void 0, function* () { return input.toUpperCase(); }) });
|
|
44
|
+
const parallelResult = parallel.run(contextEntity, 'input');
|
|
45
|
+
void parallelResult;
|
|
46
|
+
parallel.run(contextEntity, 'input').then((result) => {
|
|
47
|
+
const lengthResult = result.length;
|
|
48
|
+
const labelResult = result.label;
|
|
49
|
+
void lengthResult;
|
|
50
|
+
void labelResult;
|
|
51
|
+
// @ts-expect-error Skipped results are optional.
|
|
52
|
+
const required = result.length;
|
|
53
|
+
void required;
|
|
54
|
+
// @ts-expect-error Each named result retains its own type.
|
|
55
|
+
const wrongType = result.label;
|
|
56
|
+
void wrongType;
|
|
57
|
+
// @ts-expect-error Unregistered names are not part of the result.
|
|
58
|
+
void result.missing;
|
|
59
|
+
});
|
|
60
|
+
// @ts-expect-error Parallel steps receive the original input type.
|
|
61
|
+
parallel.pipe('wrongInput', { shouldRun: () => __awaiter(this, void 0, void 0, function* () { return true; }), run: (_, input) => __awaiter(this, void 0, void 0, function* () { return input; }) });
|
|
62
|
+
// @ts-expect-error Parallel predicates must return promises.
|
|
63
|
+
parallel.pipe('syncPredicate', { shouldRun: () => true, run: () => __awaiter(this, void 0, void 0, function* () { return 1; }) });
|
|
64
|
+
// @ts-expect-error Parallel execution methods must return promises.
|
|
65
|
+
parallel.pipe('syncRun', { shouldRun: () => __awaiter(this, void 0, void 0, function* () { return true; }), run: () => 1 });
|
|
66
|
+
}
|
|
67
|
+
void checkPipelineTypes;
|
|
68
|
+
//# sourceMappingURL=pipelines.typecheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipelines.typecheck.js","sourceRoot":"","sources":["../../src/pipelines/pipelines.typecheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ContextEntity } from '../types/context.entity';
|
|
2
|
+
import type { PipelineStep } from './pipeline-step';
|
|
3
|
+
export declare class SerialPipeline<Input, Result = Input> {
|
|
4
|
+
private steps;
|
|
5
|
+
pipe<NextResult>(name: string, step: PipelineStep<Result, NextResult>): SerialPipeline<Input, Result | NextResult>;
|
|
6
|
+
run(contextEntity: ContextEntity, input: Input): Promise<Result>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SerialPipeline = void 0;
|
|
13
|
+
class SerialPipeline {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.steps = [];
|
|
16
|
+
}
|
|
17
|
+
pipe(name, step) {
|
|
18
|
+
if (this.steps.some((entry) => entry.name === name)) {
|
|
19
|
+
throw new Error(`Duplicate pipeline step name: ${name}`);
|
|
20
|
+
}
|
|
21
|
+
const pipeline = new SerialPipeline();
|
|
22
|
+
// Registration checks adjacent types; execution stores heterogeneous steps together.
|
|
23
|
+
pipeline.steps = [...this.steps, { name, step: step }];
|
|
24
|
+
return pipeline;
|
|
25
|
+
}
|
|
26
|
+
run(contextEntity, input) {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
let result = input;
|
|
29
|
+
for (const { step } of this.steps) {
|
|
30
|
+
if (yield step.shouldRun(contextEntity, result)) {
|
|
31
|
+
result = yield step.run(contextEntity, result);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.SerialPipeline = SerialPipeline;
|
|
39
|
+
//# sourceMappingURL=serial-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serial-pipeline.js","sourceRoot":"","sources":["../../src/pipelines/serial-pipeline.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,MAAa,cAAc;IAA3B;QACU,UAAK,GAA0E,EAAE,CAAC;IAyB5F,CAAC;IAvBC,IAAI,CACF,IAAY,EACZ,IAAsC;QAEtC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,cAAc,EAA8B,CAAC;QAClE,qFAAqF;QACrF,QAAQ,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAsC,EAAE,CAAC,CAAC;QACzF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEK,GAAG,CAAC,aAA4B,EAAE,KAAY;;YAClD,IAAI,MAAM,GAAY,KAAK,CAAC;YAC5B,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAClC,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC;oBAChD,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YACD,OAAO,MAAgB,CAAC;QAC1B,CAAC;KAAA;CACF;AA1BD,wCA0BC"}
|