@dudousxd/nestjs-durable 0.9.0 → 0.10.0
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/dist/decorators.d.ts +35 -0
- package/dist/decorators.d.ts.map +1 -1
- package/dist/decorators.js +24 -1
- package/dist/decorators.js.map +1 -1
- package/dist/durable.module.d.ts.map +1 -1
- package/dist/durable.module.js +4 -0
- package/dist/durable.module.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/input-validation.d.ts +9 -0
- package/dist/input-validation.d.ts.map +1 -0
- package/dist/input-validation.js +30 -0
- package/dist/input-validation.js.map +1 -0
- package/dist/step-interceptor.d.ts +20 -0
- package/dist/step-interceptor.d.ts.map +1 -0
- package/dist/step-interceptor.js +22 -0
- package/dist/step-interceptor.js.map +1 -0
- package/dist/timer-poller.d.ts.map +1 -1
- package/dist/timer-poller.js +3 -0
- package/dist/timer-poller.js.map +1 -1
- package/dist/workflow.registrar.d.ts.map +1 -1
- package/dist/workflow.registrar.js +12 -0
- package/dist/workflow.registrar.js.map +1 -1
- package/dist/workflow.service.d.ts +22 -7
- package/dist/workflow.service.d.ts.map +1 -1
- package/dist/workflow.service.js +14 -4
- package/dist/workflow.service.js.map +1 -1
- package/package.json +14 -2
package/dist/decorators.d.ts
CHANGED
|
@@ -12,6 +12,12 @@ export interface WorkflowMeta {
|
|
|
12
12
|
singleton?: SingletonConfig;
|
|
13
13
|
/** Max wall-clock lifetime before a run is cancelled (e.g. `'2h'`). See `WorkflowOptions`. */
|
|
14
14
|
executionTimeout?: string | number;
|
|
15
|
+
/** class-validator DTO validated at start. See `WorkflowOptions`. */
|
|
16
|
+
inputSchema?: new (...args: any[]) => object;
|
|
17
|
+
/** Custom input validator (throws on invalid). See `WorkflowOptions`. */
|
|
18
|
+
validateInput?: (input: unknown) => void | Promise<void>;
|
|
19
|
+
/** Event names that start a fresh run of this workflow. See `WorkflowOptions`. */
|
|
20
|
+
onEvent?: string[];
|
|
15
21
|
}
|
|
16
22
|
export interface WorkflowOptions {
|
|
17
23
|
name: string;
|
|
@@ -42,6 +48,25 @@ export interface WorkflowOptions {
|
|
|
42
48
|
* runs that get stuck or loop forever. Omit for no limit.
|
|
43
49
|
*/
|
|
44
50
|
executionTimeout?: string | number;
|
|
51
|
+
/**
|
|
52
|
+
* Validate the workflow input at `start` against a **class-validator DTO** (the same
|
|
53
|
+
* `plainToInstance` + `validate` NestJS runs in controllers) — invalid input is rejected before any
|
|
54
|
+
* run is created. Needs the optional peers `class-validator` + `class-transformer`.
|
|
55
|
+
* `@Workflow({ inputSchema: CheckoutInput })`.
|
|
56
|
+
*/
|
|
57
|
+
inputSchema?: new (...args: any[]) => object;
|
|
58
|
+
/**
|
|
59
|
+
* Custom input validator (throws on invalid) — an escape hatch for zod/yup/etc. instead of
|
|
60
|
+
* `inputSchema`. Takes precedence over `inputSchema` if both are set.
|
|
61
|
+
*/
|
|
62
|
+
validateInput?: (input: unknown) => void | Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Start a fresh run of this workflow whenever any of these events is published via
|
|
65
|
+
* `publishEvent(name, payload)` — the payload becomes the run's input. e.g.
|
|
66
|
+
* `onEvent: ['user.registered', 'user.invited']`. The same subscription can also be declared with
|
|
67
|
+
* the `@OnEvent(...)` class decorator; the two are merged.
|
|
68
|
+
*/
|
|
69
|
+
onEvent?: string[];
|
|
45
70
|
}
|
|
46
71
|
/**
|
|
47
72
|
* Marks a provider class as a durable workflow. Its `run(ctx, input)` method becomes the
|
|
@@ -87,4 +112,14 @@ export interface DeadLetter<TInput = unknown> {
|
|
|
87
112
|
*/
|
|
88
113
|
export declare function DeadLetter(): MethodDecorator;
|
|
89
114
|
export declare function isDeadLetterHandler(method: Function): boolean;
|
|
115
|
+
export declare const ON_EVENT_METADATA: unique symbol;
|
|
116
|
+
/**
|
|
117
|
+
* Subscribe a `@Workflow` class to one or more events: when any of them is published via
|
|
118
|
+
* `publishEvent(name, payload)`, a fresh run of the workflow starts with the payload as input.
|
|
119
|
+
* Equivalent to `@Workflow({ onEvent })` — use whichever reads better; multiple `@OnEvent(...)`
|
|
120
|
+
* decorators and the option are all merged.
|
|
121
|
+
*/
|
|
122
|
+
export declare function OnEvent(...events: string[]): ClassDecorator;
|
|
123
|
+
/** All events a workflow class subscribes to — the union of `@Workflow({ onEvent })` and `@OnEvent`. */
|
|
124
|
+
export declare function getOnEvents(meta: WorkflowMeta, target: object): string[];
|
|
90
125
|
//# sourceMappingURL=decorators.d.ts.map
|
package/dist/decorators.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,SAAS,EAEd,KAAK,WAAW,EACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,kBAAkB,CAAC;AAE1B,eAAO,MAAM,iBAAiB,eAAoC,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,kGAAkG;IAClG,kBAAkB,CAAC,EAAE,WAAW,CAAC;IACjC,6FAA6F;IAC7F,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,sEAAsE;IACtE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,8FAA8F;IAC9F,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
|
package/dist/decorators.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DEAD_LETTER_METADATA = exports.DURABLE_STEP_METADATA = exports.WORKFLOW_METADATA = void 0;
|
|
3
|
+
exports.ON_EVENT_METADATA = exports.DEAD_LETTER_METADATA = exports.DURABLE_STEP_METADATA = exports.WORKFLOW_METADATA = void 0;
|
|
4
4
|
exports.Workflow = Workflow;
|
|
5
5
|
exports.getWorkflowMeta = getWorkflowMeta;
|
|
6
6
|
exports.DurableStep = DurableStep;
|
|
7
7
|
exports.getDurableStepMeta = getDurableStepMeta;
|
|
8
8
|
exports.DeadLetter = DeadLetter;
|
|
9
9
|
exports.isDeadLetterHandler = isDeadLetterHandler;
|
|
10
|
+
exports.OnEvent = OnEvent;
|
|
11
|
+
exports.getOnEvents = getOnEvents;
|
|
10
12
|
const nestjs_durable_core_1 = require("@dudousxd/nestjs-durable-core");
|
|
11
13
|
require("reflect-metadata");
|
|
12
14
|
exports.WORKFLOW_METADATA = Symbol('nestjs-durable:workflow');
|
|
@@ -23,6 +25,9 @@ function Workflow(options) {
|
|
|
23
25
|
tags: options.tags,
|
|
24
26
|
singleton: options.singleton,
|
|
25
27
|
executionTimeout: options.executionTimeout,
|
|
28
|
+
inputSchema: options.inputSchema,
|
|
29
|
+
validateInput: options.validateInput,
|
|
30
|
+
onEvent: options.onEvent,
|
|
26
31
|
};
|
|
27
32
|
Reflect.defineMetadata(exports.WORKFLOW_METADATA, meta, target);
|
|
28
33
|
// Stamp the registered name so this class can be used as a typed workflow ref (ctx.child,
|
|
@@ -75,4 +80,22 @@ function DeadLetter() {
|
|
|
75
80
|
function isDeadLetterHandler(method) {
|
|
76
81
|
return Reflect.getMetadata(exports.DEAD_LETTER_METADATA, method) === true;
|
|
77
82
|
}
|
|
83
|
+
exports.ON_EVENT_METADATA = Symbol('nestjs-durable:on-event');
|
|
84
|
+
/**
|
|
85
|
+
* Subscribe a `@Workflow` class to one or more events: when any of them is published via
|
|
86
|
+
* `publishEvent(name, payload)`, a fresh run of the workflow starts with the payload as input.
|
|
87
|
+
* Equivalent to `@Workflow({ onEvent })` — use whichever reads better; multiple `@OnEvent(...)`
|
|
88
|
+
* decorators and the option are all merged.
|
|
89
|
+
*/
|
|
90
|
+
function OnEvent(...events) {
|
|
91
|
+
return (target) => {
|
|
92
|
+
const existing = Reflect.getMetadata(exports.ON_EVENT_METADATA, target) ?? [];
|
|
93
|
+
Reflect.defineMetadata(exports.ON_EVENT_METADATA, [...existing, ...events], target);
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** All events a workflow class subscribes to — the union of `@Workflow({ onEvent })` and `@OnEvent`. */
|
|
97
|
+
function getOnEvents(meta, target) {
|
|
98
|
+
const fromDecorator = Reflect.getMetadata(exports.ON_EVENT_METADATA, target) ?? [];
|
|
99
|
+
return [...new Set([...(meta.onEvent ?? []), ...fromDecorator])];
|
|
100
|
+
}
|
|
78
101
|
//# sourceMappingURL=decorators.js.map
|
package/dist/decorators.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable.module.d.ts","sourceRoot":"","sources":["../src/durable.module.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,cAAc,EACnB,KAAK,WAAW,EAEhB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAEf,KAAK,SAAS,EAEd,KAAK,WAAW,EACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAyB,MAAM,gBAAgB,CAAC;AAgBhG,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EAAE,WAAW,CAAC;IACjC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uFAAuF;IACvF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAChC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACvC,oGAAoG;IACpG,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACvF,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,qBACa,aAAa;IACxB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa;IAI5D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,yBAAyB,GAAG,aAAa;IAQtE,OAAO,CAAC,MAAM,CAAC,KAAK;
|
|
1
|
+
{"version":3,"file":"durable.module.d.ts","sourceRoot":"","sources":["../src/durable.module.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,cAAc,EACnB,KAAK,WAAW,EAEhB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAEf,KAAK,SAAS,EAEd,KAAK,WAAW,EACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAyB,MAAM,gBAAgB,CAAC;AAgBhG,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EAAE,WAAW,CAAC;IACjC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uFAAuF;IACvF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAChC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACvC,oGAAoG;IACpG,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACvF,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,qBACa,aAAa;IACxB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa;IAI5D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,yBAAyB,GAAG,aAAa;IAQtE,OAAO,CAAC,MAAM,CAAC,KAAK;CA0DrB"}
|
package/dist/durable.module.js
CHANGED
|
@@ -66,6 +66,10 @@ let DurableModule = DurableModule_1 = class DurableModule {
|
|
|
66
66
|
webhookUrl: opts.webhookUrl,
|
|
67
67
|
traceparent: opts.traceparent,
|
|
68
68
|
compensationRetries: opts.compensationRetries,
|
|
69
|
+
// A non-worker (API/dashboard) instance must not run workflows: enqueue-only, leaving
|
|
70
|
+
// each `pending` run in the store for a worker's `runPending` poll. Workers use the
|
|
71
|
+
// default in-process dispatcher (execute locally).
|
|
72
|
+
runDispatcher: opts.worker === false ? { dispatch: () => { } } : undefined,
|
|
69
73
|
});
|
|
70
74
|
for (const queue of opts.queues ?? [])
|
|
71
75
|
engine.registerQueue(queue);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable.module.js","sourceRoot":"","sources":["../src/durable.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,uEAYuC;AACvC,2CAAgG;AAChG,uCAA+C;AAC/C,qEAAgE;AAChE,iDAA6C;AAC7C,6DAAyD;AACzD,yDAAqD;AAErD,yGAAyG;AACzG,SAAS,cAAc,CAAC,CAAU;IAChC,OAAO,CACL,CAAC,CAAC,CAAC;QACH,OAAQ,CAAkB,CAAC,cAAc,KAAK,UAAU;QACxD,OAAQ,CAAkB,CAAC,SAAS,KAAK,UAAU,CACpD,CAAC;AACJ,CAAC;AAwFM,IAAM,aAAa,qBAAnB,MAAM,aAAa;IACxB,MAAM,CAAC,OAAO,CAAC,OAA6B;QAC1C,OAAO,eAAa,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,qCAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAkC;QACpD,OAAO,eAAa,CAAC,KAAK,CAAC;YACzB,OAAO,EAAE,qCAAe;YACxB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,eAAyB;QAC5C,OAAO;YACL,MAAM,EAAE,eAAa;YACrB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,sBAAe,CAAC;YAC1B,SAAS,EAAE;gBACT,eAAe;gBACf;oBACE,OAAO,EAAE,iCAAW;oBACpB,UAAU,EAAE,CAAC,OAA6B,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK;oBAC5D,MAAM,EAAE,CAAC,qCAAe,CAAC;iBAC1B;gBACD;oBACE,OAAO,EAAE,+BAAS;oBAClB,UAAU,EAAE,CAAC,OAA6B,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI;oBACxE,MAAM,EAAE,CAAC,qCAAe,CAAC;iBAC1B;gBACD;oBACE,OAAO,EAAE,oCAAc;oBACvB,UAAU,EAAE,CACV,KAAiB,EACjB,SAA2B,EAC3B,IAA0B,EAC1B,EAAE;wBACF,wFAAwF;wBACxF,yBAAyB;wBACzB,MAAM,OAAO,GAAG,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;wBAC7D,MAAM,MAAM,GAAG,IAAI,oCAAc,CAAC;4BAChC,KAAK;4BACL,SAAS,EAAE,SAAS,IAAI,SAAS;4BACjC,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;4BAClF,OAAO,EAAE,IAAI,CAAC,OAAO;4BACrB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;4BAC7C,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC7B,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"durable.module.js","sourceRoot":"","sources":["../src/durable.module.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -16,5 +16,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./decorators"), exports);
|
|
18
18
|
__exportStar(require("./durable.module"), exports);
|
|
19
|
+
__exportStar(require("./step-interceptor"), exports);
|
|
19
20
|
__exportStar(require("./workflow.service"), exports);
|
|
20
21
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,mDAAiC;AACjC,qDAAmC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,mDAAiC;AACjC,qDAAmC;AACnC,qDAAmC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type ClassCtor = new (...args: any[]) => object;
|
|
2
|
+
/**
|
|
3
|
+
* Build a `validateInput` from a class-validator DTO class — the same `plainToInstance` + `validate`
|
|
4
|
+
* NestJS runs in controllers. `class-validator` and `class-transformer` are lazy-required optional
|
|
5
|
+
* peers (only needed if you use `@Workflow({ inputSchema })`), so they stay out of the type graph.
|
|
6
|
+
*/
|
|
7
|
+
export declare function classValidatorInput(cls: ClassCtor): (input: unknown) => Promise<void>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=input-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-validation.d.ts","sourceRoot":"","sources":["../src/input-validation.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAqBrF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.classValidatorInput = classValidatorInput;
|
|
4
|
+
/**
|
|
5
|
+
* Build a `validateInput` from a class-validator DTO class — the same `plainToInstance` + `validate`
|
|
6
|
+
* NestJS runs in controllers. `class-validator` and `class-transformer` are lazy-required optional
|
|
7
|
+
* peers (only needed if you use `@Workflow({ inputSchema })`), so they stay out of the type graph.
|
|
8
|
+
*/
|
|
9
|
+
function classValidatorInput(cls) {
|
|
10
|
+
let cv;
|
|
11
|
+
let ct;
|
|
12
|
+
try {
|
|
13
|
+
cv = require('class-validator');
|
|
14
|
+
ct = require('class-transformer');
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
throw new Error('@Workflow({ inputSchema }) needs the optional peers "class-validator" and "class-transformer" — install them, or pass a `validateInput` function instead.');
|
|
18
|
+
}
|
|
19
|
+
return async (input) => {
|
|
20
|
+
const instance = ct.plainToInstance(cls, input);
|
|
21
|
+
const errors = await cv.validate(instance, { whitelist: true });
|
|
22
|
+
if (errors.length > 0) {
|
|
23
|
+
const message = errors
|
|
24
|
+
.map((e) => Object.values(e.constraints ?? { _: e.property }).join(', '))
|
|
25
|
+
.join('; ');
|
|
26
|
+
throw new Error(`invalid input for workflow: ${message}`);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=input-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-validation.js","sourceRoot":"","sources":["../src/input-validation.ts"],"names":[],"mappings":";;AAOA,kDAqBC;AA1BD;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,GAAc;IAChD,IAAI,EAAO,CAAC;IACZ,IAAI,EAAO,CAAC;IACZ,IAAI,CAAC;QACH,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAChC,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,2JAA2J,CAC5J,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,EAAE,KAAc,EAAE,EAAE;QAC9B,MAAM,QAAQ,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,MAAM;iBACnB,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC7E,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { StepInvocation } from '@dudousxd/nestjs-durable-core';
|
|
2
|
+
import 'reflect-metadata';
|
|
3
|
+
export declare const STEP_INTERCEPTOR_METADATA: unique symbol;
|
|
4
|
+
/**
|
|
5
|
+
* The shape a `@StepInterceptor()` provider must implement: `intercept(invocation, next)` wraps the
|
|
6
|
+
* real execution of every local `ctx.step` (call `next()` to run the step body / next interceptor,
|
|
7
|
+
* and return — or transform — its result). The engine-level {@link StepInterceptor} primitive, with
|
|
8
|
+
* NestJS dependency injection.
|
|
9
|
+
*/
|
|
10
|
+
export interface DurableStepInterceptor {
|
|
11
|
+
intercept(invocation: StepInvocation, next: () => Promise<unknown>): Promise<unknown>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Marks an `@Injectable()` class as a durable step interceptor. The module discovers it on boot and
|
|
15
|
+
* registers its `intercept` method with the engine (so it can inject loggers/tracers/etc.). First
|
|
16
|
+
* declared is outermost. Interceptors fire only when a step actually executes, never on replay.
|
|
17
|
+
*/
|
|
18
|
+
export declare function StepInterceptor(): ClassDecorator;
|
|
19
|
+
export declare function isStepInterceptor(target: Function): boolean;
|
|
20
|
+
//# sourceMappingURL=step-interceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-interceptor.d.ts","sourceRoot":"","sources":["../src/step-interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,kBAAkB,CAAC;AAE1B,eAAO,MAAM,yBAAyB,eAA4C,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,cAAc,CAIhD;AAGD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAE3D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STEP_INTERCEPTOR_METADATA = void 0;
|
|
4
|
+
exports.StepInterceptor = StepInterceptor;
|
|
5
|
+
exports.isStepInterceptor = isStepInterceptor;
|
|
6
|
+
require("reflect-metadata");
|
|
7
|
+
exports.STEP_INTERCEPTOR_METADATA = Symbol('nestjs-durable:step-interceptor');
|
|
8
|
+
/**
|
|
9
|
+
* Marks an `@Injectable()` class as a durable step interceptor. The module discovers it on boot and
|
|
10
|
+
* registers its `intercept` method with the engine (so it can inject loggers/tracers/etc.). First
|
|
11
|
+
* declared is outermost. Interceptors fire only when a step actually executes, never on replay.
|
|
12
|
+
*/
|
|
13
|
+
function StepInterceptor() {
|
|
14
|
+
return (target) => {
|
|
15
|
+
Reflect.defineMetadata(exports.STEP_INTERCEPTOR_METADATA, true, target);
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
// biome-ignore lint/complexity/noBannedTypes: matches reflect-metadata's class target type
|
|
19
|
+
function isStepInterceptor(target) {
|
|
20
|
+
return Reflect.getMetadata(exports.STEP_INTERCEPTOR_METADATA, target) === true;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=step-interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-interceptor.js","sourceRoot":"","sources":["../src/step-interceptor.ts"],"names":[],"mappings":";;;AAoBA,0CAIC;AAGD,8CAEC;AA5BD,4BAA0B;AAEb,QAAA,yBAAyB,GAAG,MAAM,CAAC,iCAAiC,CAAC,CAAC;AAYnF;;;;GAIG;AACH,SAAgB,eAAe;IAC7B,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,OAAO,CAAC,cAAc,CAAC,iCAAyB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC;AACJ,CAAC;AAED,2FAA2F;AAC3F,SAAgB,iBAAiB,CAAC,MAAgB;IAChD,OAAO,OAAO,CAAC,WAAW,CAAC,iCAAyB,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;AACzE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timer-poller.d.ts","sourceRoot":"","sources":["../src/timer-poller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,cAAc,EAAgB,MAAM,+BAA+B,CAAC;AAC9F,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D;;;;GAIG;AACH,qBACa,WAAY,YAAW,sBAAsB,EAAE,eAAe;IAKvE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACE,OAAO,CAAC,QAAQ,CAAC,OAAO;IALnD,OAAO,CAAC,KAAK,CAAC,CAAiC;IAC/C,OAAO,CAAC,OAAO,CAAS;gBAGL,MAAM,EAAE,cAAc,EACG,OAAO,EAAE,oBAAoB;IAGnE,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAY7C,eAAe,IAAI,IAAI;YAIT,IAAI;
|
|
1
|
+
{"version":3,"file":"timer-poller.d.ts","sourceRoot":"","sources":["../src/timer-poller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,cAAc,EAAgB,MAAM,+BAA+B,CAAC;AAC9F,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D;;;;GAIG;AACH,qBACa,WAAY,YAAW,sBAAsB,EAAE,eAAe;IAKvE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACE,OAAO,CAAC,QAAQ,CAAC,OAAO;IALnD,OAAO,CAAC,KAAK,CAAC,CAAiC;IAC/C,OAAO,CAAC,OAAO,CAAS;gBAGL,MAAM,EAAE,cAAc,EACG,OAAO,EAAE,oBAAoB;IAGnE,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAY7C,eAAe,IAAI,IAAI;YAIT,IAAI;CAiBnB"}
|
package/dist/timer-poller.js
CHANGED
|
@@ -50,6 +50,9 @@ let TimerPoller = class TimerPoller {
|
|
|
50
50
|
return; // never overlap two sweeps
|
|
51
51
|
this.polling = true;
|
|
52
52
|
try {
|
|
53
|
+
// Pick up runs enqueued elsewhere (an API pod's `start`, or another worker) still `pending`,
|
|
54
|
+
// then resume due timers and sweep execution timeouts.
|
|
55
|
+
await this.engine.runPending();
|
|
53
56
|
await this.engine.resumeDueTimers();
|
|
54
57
|
await this.engine.sweepTimeouts();
|
|
55
58
|
const schedules = this.options.schedules;
|
package/dist/timer-poller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timer-poller.js","sourceRoot":"","sources":["../src/timer-poller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uEAA8F;AAC9F,2CAKwB;AAGxB;;;;GAIG;AAEI,IAAM,WAAW,GAAjB,MAAM,WAAW;IAKH;IACyB;IALpC,KAAK,CAAkC;IACvC,OAAO,GAAG,KAAK,CAAC;IAExB,YACmB,MAAsB,EACG,OAA6B;QADtD,WAAM,GAAN,MAAM,CAAgB;QACG,YAAO,GAAP,OAAO,CAAsB;IACtE,CAAC;IAEJ,KAAK,CAAC,sBAAsB;QAC1B,gFAAgF;QAChF,wEAAwE;QACxE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK;YAAE,OAAO;QAC1C,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;QACrD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,2BAA2B;QACrD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAA,kCAAY,EAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"timer-poller.js","sourceRoot":"","sources":["../src/timer-poller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uEAA8F;AAC9F,2CAKwB;AAGxB;;;;GAIG;AAEI,IAAM,WAAW,GAAjB,MAAM,WAAW;IAKH;IACyB;IALpC,KAAK,CAAkC;IACvC,OAAO,GAAG,KAAK,CAAC;IAExB,YACmB,MAAsB,EACG,OAA6B;QADtD,WAAM,GAAN,MAAM,CAAgB;QACG,YAAO,GAAP,OAAO,CAAsB;IACtE,CAAC;IAEJ,KAAK,CAAC,sBAAsB;QAC1B,gFAAgF;QAChF,wEAAwE;QACxE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK;YAAE,OAAO;QAC1C,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;QACrD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,2BAA2B;QACrD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,6FAA6F;YAC7F,uDAAuD;YACvD,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAA,kCAAY,EAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAA;AA1CY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;IAOR,WAAA,IAAA,eAAM,EAAC,qCAAe,CAAC,CAAA;qCADC,oCAAc;GAL9B,WAAW,CA0CvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.registrar.d.ts","sourceRoot":"","sources":["../src/workflow.registrar.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EAEf,cAAc,EAGf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow.registrar.d.ts","sourceRoot":"","sources":["../src/workflow.registrar.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EAEf,cAAc,EAGf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAU7D;;;;;GAKG;AACH,qBACa,iBACX,YAAW,YAAY,EAAE,sBAAsB,EAAE,qBAAqB;IAGpE,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACF,OAAO,CAAC,QAAQ,CAAC,KAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJhC,SAAS,EAAE,gBAAgB,EAC3B,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,cAAc,EACD,KAAK,EAAE,UAAU,EACb,OAAO,EAAE,oBAAoB;IAGnE,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7C,0FAA0F;IACpF,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAyDnC,iGAAiG;IACjG,OAAO,CAAC,qBAAqB;IAW7B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;CAiBjC"}
|
|
@@ -17,6 +17,8 @@ const nestjs_durable_core_1 = require("@dudousxd/nestjs-durable-core");
|
|
|
17
17
|
const common_1 = require("@nestjs/common");
|
|
18
18
|
const core_1 = require("@nestjs/core");
|
|
19
19
|
const decorators_1 = require("./decorators");
|
|
20
|
+
const input_validation_1 = require("./input-validation");
|
|
21
|
+
const step_interceptor_1 = require("./step-interceptor");
|
|
20
22
|
/**
|
|
21
23
|
* Ensures the schema (auto-schema) and registers `@Workflow` providers on init, resumes runs left
|
|
22
24
|
* incomplete by a previous process once booted, and drains in-flight runs on shutdown.
|
|
@@ -59,6 +61,10 @@ let WorkflowRegistrar = class WorkflowRegistrar {
|
|
|
59
61
|
const { instance } = wrapper;
|
|
60
62
|
if (!instance || typeof instance !== 'object')
|
|
61
63
|
continue;
|
|
64
|
+
if ((0, step_interceptor_1.isStepInterceptor)(instance.constructor)) {
|
|
65
|
+
const interceptor = instance;
|
|
66
|
+
this.engine.use((invocation, next) => interceptor.intercept(invocation, next));
|
|
67
|
+
}
|
|
62
68
|
const meta = (0, decorators_1.getWorkflowMeta)(instance.constructor);
|
|
63
69
|
if (!meta)
|
|
64
70
|
continue;
|
|
@@ -66,10 +72,16 @@ let WorkflowRegistrar = class WorkflowRegistrar {
|
|
|
66
72
|
if (typeof workflow.run !== 'function') {
|
|
67
73
|
throw new Error(`@Workflow ${meta.name} must define a run(ctx, input) method`);
|
|
68
74
|
}
|
|
75
|
+
// Input validation: a custom `validateInput` wins; otherwise build one from the class-validator
|
|
76
|
+
// `inputSchema` DTO (lazy — class-validator is only required if a workflow uses inputSchema).
|
|
77
|
+
const validateInput = meta.validateInput ??
|
|
78
|
+
(meta.inputSchema ? (0, input_validation_1.classValidatorInput)(meta.inputSchema) : undefined);
|
|
69
79
|
this.engine.register(meta.name, meta.version, (ctx, input) => workflow.run(ctx, input), {
|
|
70
80
|
tags: meta.tags,
|
|
71
81
|
singleton: meta.singleton,
|
|
72
82
|
executionTimeout: meta.executionTimeout,
|
|
83
|
+
validateInput,
|
|
84
|
+
onEvent: (0, decorators_1.getOnEvents)(meta, instance.constructor),
|
|
73
85
|
});
|
|
74
86
|
const inline = this.findDeadLetterHandler(instance);
|
|
75
87
|
if (inline && meta.deadLetterWorkflow) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.registrar.js","sourceRoot":"","sources":["../src/workflow.registrar.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uEAQuC;AACvC,2CAMwB;AACxB,uCAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"workflow.registrar.js","sourceRoot":"","sources":["../src/workflow.registrar.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,20 +4,35 @@ export declare class WorkflowService {
|
|
|
4
4
|
private readonly engine;
|
|
5
5
|
constructor(engine: WorkflowEngine);
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `
|
|
7
|
+
* Enqueue a workflow run — it creates the run (`pending`) and returns `{ runId, status: 'pending' }`
|
|
8
|
+
* immediately; a worker executes the body (so the caller never blocks on workflow logic). Use
|
|
9
|
+
* {@link waitForRun} when you need the outcome. Pass the workflow's **class**
|
|
10
|
+
* (`start(CheckoutWorkflow, input)`) for a typed input + refactor-safety, or a **name** string for a
|
|
11
|
+
* cross-runtime workflow. `runId` defaults to a random id; pass your own to make the start idempotent
|
|
12
|
+
* (a redelivery returns the existing run). `opts.tags` are merged with the workflow's static
|
|
13
|
+
* `@Workflow({ tags })`; `opts.searchAttributes` stamp typed, queryable run data.
|
|
11
14
|
*/
|
|
12
15
|
start<C extends WorkflowClass>(workflow: C, input: WorkflowInputOf<C>, runId?: string, opts?: StartOptions): Promise<RunResult>;
|
|
13
16
|
start(workflow: string, input: unknown, runId?: string, opts?: StartOptions): Promise<RunResult>;
|
|
14
17
|
resume(runId: string): Promise<RunResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Resolve once a run settles — terminal (completed/failed/cancelled/dead) or suspended. `start`
|
|
20
|
+
* only enqueues (a worker runs the body), so pair them when a request needs the outcome:
|
|
21
|
+
* `const { runId } = await svc.start(...); const result = await svc.waitForRun(runId)`.
|
|
22
|
+
*/
|
|
23
|
+
waitForRun(runId: string, opts?: {
|
|
24
|
+
timeoutMs?: number;
|
|
25
|
+
}): Promise<RunResult>;
|
|
15
26
|
/** Deliver an external signal (e.g. from a webhook) to the run waiting on `token`. */
|
|
16
27
|
signal(token: string, payload: unknown): Promise<RunResult | null>;
|
|
17
28
|
/**
|
|
18
|
-
* Publish a named event
|
|
19
|
-
*
|
|
29
|
+
* Publish a named event. Resumes runs waiting on it via `ctx.waitForEvent(name, { match })` and
|
|
30
|
+
* starts a fresh run of every workflow subscribed via `@Workflow({ onEvent })` / `@OnEvent` (the
|
|
31
|
+
* payload becomes its input). Pass `opts.id` to dedupe redeliveries. Returns how many runs it
|
|
32
|
+
* touched (resumed + started).
|
|
20
33
|
*/
|
|
21
|
-
publishEvent(name: string, payload: unknown
|
|
34
|
+
publishEvent(name: string, payload: unknown, opts?: {
|
|
35
|
+
id?: string;
|
|
36
|
+
}): Promise<number>;
|
|
22
37
|
}
|
|
23
38
|
//# sourceMappingURL=workflow.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.service.d.ts","sourceRoot":"","sources":["../src/workflow.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,cAAc,EACd,KAAK,eAAe,EACrB,MAAM,+BAA+B,CAAC;AAGvC,kEAAkE;AAClE,qBACa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEnD
|
|
1
|
+
{"version":3,"file":"workflow.service.d.ts","sourceRoot":"","sources":["../src/workflow.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,cAAc,EACd,KAAK,eAAe,EACrB,MAAM,+BAA+B,CAAC;AAGvC,kEAAkE;AAClE,qBACa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEnD;;;;;;;;OAQG;IACH,KAAK,CAAC,CAAC,SAAS,aAAa,EAC3B,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EACzB,KAAK,CAAC,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,SAAS,CAAC;IACrB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC;IAUhG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAIzC;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAI5E,sFAAsF;IACtF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAIlE;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAGtF"}
|
package/dist/workflow.service.js
CHANGED
|
@@ -25,16 +25,26 @@ let WorkflowService = class WorkflowService {
|
|
|
25
25
|
resume(runId) {
|
|
26
26
|
return this.engine.resume(runId);
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve once a run settles — terminal (completed/failed/cancelled/dead) or suspended. `start`
|
|
30
|
+
* only enqueues (a worker runs the body), so pair them when a request needs the outcome:
|
|
31
|
+
* `const { runId } = await svc.start(...); const result = await svc.waitForRun(runId)`.
|
|
32
|
+
*/
|
|
33
|
+
waitForRun(runId, opts) {
|
|
34
|
+
return this.engine.waitForRun(runId, opts);
|
|
35
|
+
}
|
|
28
36
|
/** Deliver an external signal (e.g. from a webhook) to the run waiting on `token`. */
|
|
29
37
|
signal(token, payload) {
|
|
30
38
|
return this.engine.signal(token, payload);
|
|
31
39
|
}
|
|
32
40
|
/**
|
|
33
|
-
* Publish a named event
|
|
34
|
-
*
|
|
41
|
+
* Publish a named event. Resumes runs waiting on it via `ctx.waitForEvent(name, { match })` and
|
|
42
|
+
* starts a fresh run of every workflow subscribed via `@Workflow({ onEvent })` / `@OnEvent` (the
|
|
43
|
+
* payload becomes its input). Pass `opts.id` to dedupe redeliveries. Returns how many runs it
|
|
44
|
+
* touched (resumed + started).
|
|
35
45
|
*/
|
|
36
|
-
publishEvent(name, payload) {
|
|
37
|
-
return this.engine.publishEvent(name, payload);
|
|
46
|
+
publishEvent(name, payload, opts) {
|
|
47
|
+
return this.engine.publishEvent(name, payload, opts);
|
|
38
48
|
}
|
|
39
49
|
};
|
|
40
50
|
exports.WorkflowService = WorkflowService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.service.js","sourceRoot":"","sources":["../src/workflow.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAyC;AACzC,uEAMuC;AACvC,2CAA4C;AAE5C,kEAAkE;AAE3D,IAAM,eAAe,GAArB,MAAM,eAAe;IACG;IAA7B,YAA6B,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow.service.js","sourceRoot":"","sources":["../src/workflow.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAyC;AACzC,uEAMuC;AACvC,2CAA4C;AAE5C,kEAAkE;AAE3D,IAAM,eAAe,GAArB,MAAM,eAAe;IACG;IAA7B,YAA6B,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAkBvD,KAAK,CACH,QAAgB,EAChB,KAAc,EACd,QAAgB,IAAA,wBAAU,GAAE,EAC5B,IAAmB;QAEnB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,KAAa,EAAE,IAA6B;QACrD,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,sFAAsF;IACtF,MAAM,CAAC,KAAa,EAAE,OAAgB;QACpC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,IAAY,EAAE,OAAgB,EAAE,IAAsB;QACjE,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;CACF,CAAA;AAvDY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;qCAE0B,oCAAc;GADxC,eAAe,CAuD3B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dudousxd/nestjs-durable",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Durable workflows for NestJS — module, decorators, discovery and boot recovery",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Davide Carvalho",
|
|
@@ -19,19 +19,31 @@
|
|
|
19
19
|
"@dudousxd/nestjs-durable-core": ">=0.1.0 <1.0.0",
|
|
20
20
|
"@nestjs/common": "^10.0.0 || ^11.0.0",
|
|
21
21
|
"@nestjs/core": "^10.0.0 || ^11.0.0",
|
|
22
|
+
"class-transformer": "^0.5.0",
|
|
23
|
+
"class-validator": "^0.14.0",
|
|
22
24
|
"reflect-metadata": "^0.2.0"
|
|
23
25
|
},
|
|
26
|
+
"peerDependenciesMeta": {
|
|
27
|
+
"class-transformer": {
|
|
28
|
+
"optional": true
|
|
29
|
+
},
|
|
30
|
+
"class-validator": {
|
|
31
|
+
"optional": true
|
|
32
|
+
}
|
|
33
|
+
},
|
|
24
34
|
"devDependencies": {
|
|
25
35
|
"@nestjs/common": "11.1.26",
|
|
26
36
|
"@nestjs/core": "11.1.26",
|
|
27
37
|
"@nestjs/event-emitter": "3.1.0",
|
|
28
38
|
"@nestjs/testing": "11.1.26",
|
|
39
|
+
"class-transformer": "0.5.1",
|
|
40
|
+
"class-validator": "0.14.2",
|
|
29
41
|
"eventemitter2": "6.4.9",
|
|
30
42
|
"reflect-metadata": "0.2.2",
|
|
31
43
|
"rxjs": "7.8.2",
|
|
32
44
|
"typescript": "5.9.3",
|
|
33
45
|
"zod": "3.25.76",
|
|
34
|
-
"@dudousxd/nestjs-durable-core": "^0.
|
|
46
|
+
"@dudousxd/nestjs-durable-core": "^0.13.0",
|
|
35
47
|
"@dudousxd/nestjs-durable-transport-event-emitter": "^0.4.0"
|
|
36
48
|
},
|
|
37
49
|
"scripts": {
|