@dudousxd/nestjs-durable 0.11.0 → 0.13.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 +21 -0
- package/dist/decorators.d.ts.map +1 -1
- package/dist/decorators.js +2 -0
- package/dist/decorators.js.map +1 -1
- package/dist/durable.module.d.ts.map +1 -1
- package/dist/durable.module.js +3 -1
- package/dist/durable.module.js.map +1 -1
- package/dist/entity.d.ts +43 -0
- package/dist/entity.d.ts.map +1 -0
- package/dist/entity.js +94 -0
- package/dist/entity.js.map +1 -0
- 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/timer-poller.d.ts +1 -0
- package/dist/timer-poller.d.ts.map +1 -1
- package/dist/timer-poller.js +5 -0
- package/dist/timer-poller.js.map +1 -1
- package/dist/workflow.registrar.d.ts +3 -1
- package/dist/workflow.registrar.d.ts.map +1 -1
- package/dist/workflow.registrar.js +24 -1
- package/dist/workflow.registrar.js.map +1 -1
- package/dist/workflow.service.d.ts +17 -0
- package/dist/workflow.service.d.ts.map +1 -1
- package/dist/workflow.service.js +3 -0
- package/dist/workflow.service.js.map +1 -1
- package/package.json +2 -2
package/dist/decorators.d.ts
CHANGED
|
@@ -18,6 +18,13 @@ export interface WorkflowMeta {
|
|
|
18
18
|
validateInput?: (input: unknown) => void | Promise<void>;
|
|
19
19
|
/** Event names that start a fresh run of this workflow. See `WorkflowOptions`. */
|
|
20
20
|
onEvent?: string[];
|
|
21
|
+
/** Debounce `onEvent` triggers — fire once it's quiet for this long. See `WorkflowOptions`. */
|
|
22
|
+
debounce?: string | number;
|
|
23
|
+
/** Batch `onEvent` triggers — fire on size or window. See `WorkflowOptions`. */
|
|
24
|
+
batch?: {
|
|
25
|
+
maxSize: number;
|
|
26
|
+
within: string | number;
|
|
27
|
+
};
|
|
21
28
|
}
|
|
22
29
|
export interface WorkflowOptions {
|
|
23
30
|
name: string;
|
|
@@ -67,6 +74,20 @@ export interface WorkflowOptions {
|
|
|
67
74
|
* the `@OnEvent(...)` class decorator; the two are merged.
|
|
68
75
|
*/
|
|
69
76
|
onEvent?: string[];
|
|
77
|
+
/**
|
|
78
|
+
* Coalesce `onEvent` triggers by **debouncing** — start one run only once events have been quiet
|
|
79
|
+
* for this long (resets on each event), with the LAST payload. e.g. `debounce: '30s'`.
|
|
80
|
+
*/
|
|
81
|
+
debounce?: string | number;
|
|
82
|
+
/**
|
|
83
|
+
* Coalesce `onEvent` triggers by **batching** — start one run with all payloads (`{ events: [...] }`)
|
|
84
|
+
* once `maxSize` is reached or `within` elapses from the first event. e.g.
|
|
85
|
+
* `batch: { maxSize: 100, within: '10s' }`.
|
|
86
|
+
*/
|
|
87
|
+
batch?: {
|
|
88
|
+
maxSize: number;
|
|
89
|
+
within: string | number;
|
|
90
|
+
};
|
|
70
91
|
}
|
|
71
92
|
/**
|
|
72
93
|
* Marks a provider class as a durable workflow. Its `run(ctx, input)` method becomes the
|
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;IACnC,qEAAqE;IACrE,WAAW,CAAC,EAAE,KACZ,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,MAAM,CAAC;IACZ,yEAAyE;IACzE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
|
package/dist/decorators.js
CHANGED
|
@@ -28,6 +28,8 @@ function Workflow(options) {
|
|
|
28
28
|
inputSchema: options.inputSchema,
|
|
29
29
|
validateInput: options.validateInput,
|
|
30
30
|
onEvent: options.onEvent,
|
|
31
|
+
debounce: options.debounce,
|
|
32
|
+
batch: options.batch,
|
|
31
33
|
};
|
|
32
34
|
Reflect.defineMetadata(exports.WORKFLOW_METADATA, meta, target);
|
|
33
35
|
// Stamp the registered name so this class can be used as a typed workflow ref (ctx.child,
|
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;
|
|
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;AAiBhG,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;CA2DrB"}
|
package/dist/durable.module.js
CHANGED
|
@@ -12,6 +12,7 @@ const nestjs_durable_core_1 = require("@dudousxd/nestjs-durable-core");
|
|
|
12
12
|
const common_1 = require("@nestjs/common");
|
|
13
13
|
const core_1 = require("@nestjs/core");
|
|
14
14
|
const durable_step_registrar_1 = require("./durable-step.registrar");
|
|
15
|
+
const entity_1 = require("./entity");
|
|
15
16
|
const timer_poller_1 = require("./timer-poller");
|
|
16
17
|
const workflow_registrar_1 = require("./workflow.registrar");
|
|
17
18
|
const workflow_service_1 = require("./workflow.service");
|
|
@@ -80,11 +81,12 @@ let DurableModule = DurableModule_1 = class DurableModule {
|
|
|
80
81
|
inject: [nestjs_durable_core_1.STATE_STORE, nestjs_durable_core_1.TRANSPORT, nestjs_durable_core_1.DURABLE_OPTIONS],
|
|
81
82
|
},
|
|
82
83
|
workflow_service_1.WorkflowService,
|
|
84
|
+
entity_1.EntityService,
|
|
83
85
|
workflow_registrar_1.WorkflowRegistrar,
|
|
84
86
|
durable_step_registrar_1.DurableStepRegistrar,
|
|
85
87
|
timer_poller_1.TimerPoller,
|
|
86
88
|
],
|
|
87
|
-
exports: [workflow_service_1.WorkflowService, nestjs_durable_core_1.WorkflowEngine, nestjs_durable_core_1.STATE_STORE, nestjs_durable_core_1.TRANSPORT],
|
|
89
|
+
exports: [workflow_service_1.WorkflowService, entity_1.EntityService, nestjs_durable_core_1.WorkflowEngine, nestjs_durable_core_1.STATE_STORE, nestjs_durable_core_1.TRANSPORT],
|
|
88
90
|
};
|
|
89
91
|
}
|
|
90
92
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable.module.js","sourceRoot":"","sources":["../src/durable.module.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"durable.module.js","sourceRoot":"","sources":["../src/durable.module.ts"],"names":[],"mappings":"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"}
|
package/dist/entity.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type EntityHandler, WorkflowEngine } from '@dudousxd/nestjs-durable-core';
|
|
2
|
+
import 'reflect-metadata';
|
|
3
|
+
export declare const ENTITY_METADATA: unique symbol;
|
|
4
|
+
export declare const ENTITY_ON_METADATA: unique symbol;
|
|
5
|
+
/**
|
|
6
|
+
* Marks an `@Injectable()` class as a **durable entity** (a virtual object): its `@On(op)` methods run
|
|
7
|
+
* serialized per key over the instance's fields as durable state. e.g.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* @Entity({ name: 'cart' }) @Injectable()
|
|
11
|
+
* class Cart { items: Item[] = []; @On('add') add(i: Item) { this.items.push(i); } @On('list') list() { return this.items; } }
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* The class must be **constructible with no arguments** (a fresh instance is the initial state per key)
|
|
15
|
+
* — keep entities pure state, no DI. Drive them with `EntityService` or `ctx.signalEntity`/`callEntity`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function Entity(options: {
|
|
18
|
+
name: string;
|
|
19
|
+
}): ClassDecorator;
|
|
20
|
+
/** Marks an entity method as the handler for operation `op`. */
|
|
21
|
+
export declare function On(op: string): MethodDecorator;
|
|
22
|
+
export declare function getEntityMeta(target: Function): {
|
|
23
|
+
name: string;
|
|
24
|
+
} | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Build the engine `EntityConfig` for a discovered `@Entity` class: a fresh instance per key, and
|
|
27
|
+
* handlers that rehydrate the class prototype onto the (serialized) state before dispatching the op,
|
|
28
|
+
* so methods work after replay.
|
|
29
|
+
*/
|
|
30
|
+
export declare function entityConfigFor(ctor: Function): {
|
|
31
|
+
initialState: () => object;
|
|
32
|
+
handlers: Record<string, EntityHandler>;
|
|
33
|
+
};
|
|
34
|
+
/** Inject this to drive durable entities from outside a workflow. */
|
|
35
|
+
export declare class EntityService {
|
|
36
|
+
private readonly engine;
|
|
37
|
+
constructor(engine: WorkflowEngine);
|
|
38
|
+
/** Send an operation to an entity (fire-and-forget; ordered + exactly-once per key). */
|
|
39
|
+
signal(name: string, key: string, op: string, arg?: unknown): Promise<void>;
|
|
40
|
+
/** Read an entity's current durable state (or undefined if it has none yet). */
|
|
41
|
+
getState<S = unknown>(name: string, key: string): Promise<S | undefined>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEnF,OAAO,kBAAkB,CAAC;AAE1B,eAAO,MAAM,eAAe,eAAkC,CAAC;AAC/D,eAAO,MAAM,kBAAkB,eAAqC,CAAC;AAErE;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAIhE;AAED,gEAAgE;AAChE,wBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,CAQ9C;AAGD,wBAAgB,aAAa,CAAC,MAAM,EAAE,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAE5E;AAED;;;;GAIG;AAEH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG;IAC/C,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC,CAaA;AAED,qEAAqE;AACrE,qBACa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEnD,wFAAwF;IACxF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3E,gFAAgF;IAChF,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CAGzE"}
|
package/dist/entity.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.EntityService = exports.ENTITY_ON_METADATA = exports.ENTITY_METADATA = void 0;
|
|
13
|
+
exports.Entity = Entity;
|
|
14
|
+
exports.On = On;
|
|
15
|
+
exports.getEntityMeta = getEntityMeta;
|
|
16
|
+
exports.entityConfigFor = entityConfigFor;
|
|
17
|
+
const nestjs_durable_core_1 = require("@dudousxd/nestjs-durable-core");
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
require("reflect-metadata");
|
|
20
|
+
exports.ENTITY_METADATA = Symbol('nestjs-durable:entity');
|
|
21
|
+
exports.ENTITY_ON_METADATA = Symbol('nestjs-durable:entity-on');
|
|
22
|
+
/**
|
|
23
|
+
* Marks an `@Injectable()` class as a **durable entity** (a virtual object): its `@On(op)` methods run
|
|
24
|
+
* serialized per key over the instance's fields as durable state. e.g.
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* @Entity({ name: 'cart' }) @Injectable()
|
|
28
|
+
* class Cart { items: Item[] = []; @On('add') add(i: Item) { this.items.push(i); } @On('list') list() { return this.items; } }
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* The class must be **constructible with no arguments** (a fresh instance is the initial state per key)
|
|
32
|
+
* — keep entities pure state, no DI. Drive them with `EntityService` or `ctx.signalEntity`/`callEntity`.
|
|
33
|
+
*/
|
|
34
|
+
function Entity(options) {
|
|
35
|
+
return (target) => {
|
|
36
|
+
Reflect.defineMetadata(exports.ENTITY_METADATA, options, target);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Marks an entity method as the handler for operation `op`. */
|
|
40
|
+
function On(op) {
|
|
41
|
+
return (target, propertyKey) => {
|
|
42
|
+
// biome-ignore lint/complexity/noBannedTypes: reflect-metadata keys on the class constructor
|
|
43
|
+
const ctor = target.constructor;
|
|
44
|
+
const ops = Reflect.getMetadata(exports.ENTITY_ON_METADATA, ctor) ?? new Map();
|
|
45
|
+
ops.set(op, propertyKey);
|
|
46
|
+
Reflect.defineMetadata(exports.ENTITY_ON_METADATA, ops, ctor);
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// biome-ignore lint/complexity/noBannedTypes: matches reflect-metadata's class target type
|
|
50
|
+
function getEntityMeta(target) {
|
|
51
|
+
return Reflect.getMetadata(exports.ENTITY_METADATA, target);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Build the engine `EntityConfig` for a discovered `@Entity` class: a fresh instance per key, and
|
|
55
|
+
* handlers that rehydrate the class prototype onto the (serialized) state before dispatching the op,
|
|
56
|
+
* so methods work after replay.
|
|
57
|
+
*/
|
|
58
|
+
// biome-ignore lint/complexity/noBannedTypes: a class constructor
|
|
59
|
+
function entityConfigFor(ctor) {
|
|
60
|
+
const ops = Reflect.getMetadata(exports.ENTITY_ON_METADATA, ctor) ?? new Map();
|
|
61
|
+
const Cls = ctor;
|
|
62
|
+
const handlers = {};
|
|
63
|
+
for (const [op, method] of ops) {
|
|
64
|
+
handlers[op] = (state, arg) => {
|
|
65
|
+
Object.setPrototypeOf(state, Cls.prototype); // re-attach methods to the plain state
|
|
66
|
+
const fn = state[method];
|
|
67
|
+
if (typeof fn !== 'function')
|
|
68
|
+
throw new Error(`entity handler "${method}" is not a method`);
|
|
69
|
+
return fn.call(state, arg);
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return { initialState: () => new Cls(), handlers };
|
|
73
|
+
}
|
|
74
|
+
/** Inject this to drive durable entities from outside a workflow. */
|
|
75
|
+
let EntityService = class EntityService {
|
|
76
|
+
engine;
|
|
77
|
+
constructor(engine) {
|
|
78
|
+
this.engine = engine;
|
|
79
|
+
}
|
|
80
|
+
/** Send an operation to an entity (fire-and-forget; ordered + exactly-once per key). */
|
|
81
|
+
signal(name, key, op, arg) {
|
|
82
|
+
return this.engine.signalEntity(name, key, op, arg);
|
|
83
|
+
}
|
|
84
|
+
/** Read an entity's current durable state (or undefined if it has none yet). */
|
|
85
|
+
getState(name, key) {
|
|
86
|
+
return this.engine.getEntityState(name, key);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
exports.EntityService = EntityService;
|
|
90
|
+
exports.EntityService = EntityService = __decorate([
|
|
91
|
+
(0, common_1.Injectable)(),
|
|
92
|
+
__metadata("design:paramtypes", [nestjs_durable_core_1.WorkflowEngine])
|
|
93
|
+
], EntityService);
|
|
94
|
+
//# sourceMappingURL=entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../src/entity.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;AACnC,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,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ 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("./entity"), exports);
|
|
19
20
|
__exportStar(require("./step-interceptor"), exports);
|
|
20
21
|
__exportStar(require("./workflow.service"), exports);
|
|
21
22
|
//# 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;AACnC,qDAAmC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,mDAAiC;AACjC,2CAAyB;AACzB,qDAAmC;AACnC,qDAAmC"}
|
package/dist/timer-poller.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export declare class TimerPoller implements OnApplicationBootstrap, OnModuleDest
|
|
|
11
11
|
private readonly options;
|
|
12
12
|
private timer?;
|
|
13
13
|
private polling;
|
|
14
|
+
private unsubscribeEnqueued?;
|
|
14
15
|
constructor(engine: WorkflowEngine, options: DurableModuleOptions);
|
|
15
16
|
onApplicationBootstrap(): Promise<void>;
|
|
16
17
|
onModuleDestroy(): void;
|
|
@@ -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;
|
|
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;IAMvE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACE,OAAO,CAAC,QAAQ,CAAC,OAAO;IANnD,OAAO,CAAC,KAAK,CAAC,CAAiC;IAC/C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,mBAAmB,CAAC,CAAa;gBAGtB,MAAM,EAAE,cAAc,EACG,OAAO,EAAE,oBAAoB;IAGnE,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAe7C,eAAe,IAAI,IAAI;YAKT,IAAI;CAmBnB"}
|
package/dist/timer-poller.js
CHANGED
|
@@ -25,6 +25,7 @@ let TimerPoller = class TimerPoller {
|
|
|
25
25
|
options;
|
|
26
26
|
timer;
|
|
27
27
|
polling = false;
|
|
28
|
+
unsubscribeEnqueued;
|
|
28
29
|
constructor(engine, options) {
|
|
29
30
|
this.engine = engine;
|
|
30
31
|
this.options = options;
|
|
@@ -34,6 +35,9 @@ let TimerPoller = class TimerPoller {
|
|
|
34
35
|
// (`worker: false`) must not resume timers — leave that to the workers.
|
|
35
36
|
if (this.options.worker === false)
|
|
36
37
|
return;
|
|
38
|
+
// Low-latency dispatch: when a run is enqueued elsewhere (e.g. an API pod), pick it up at once
|
|
39
|
+
// over the control plane instead of waiting for the next poll tick. Leasing dedups across workers.
|
|
40
|
+
this.unsubscribeEnqueued = this.engine.onEnqueued((runId) => void this.engine.runOne(runId));
|
|
37
41
|
await this.poll();
|
|
38
42
|
const intervalMs = this.options.timerPollMs ?? 1_000;
|
|
39
43
|
if (intervalMs > 0) {
|
|
@@ -44,6 +48,7 @@ let TimerPoller = class TimerPoller {
|
|
|
44
48
|
onModuleDestroy() {
|
|
45
49
|
if (this.timer)
|
|
46
50
|
clearInterval(this.timer);
|
|
51
|
+
this.unsubscribeEnqueued?.();
|
|
47
52
|
}
|
|
48
53
|
async poll() {
|
|
49
54
|
if (this.polling)
|
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;
|
|
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;IAMH;IACyB;IANpC,KAAK,CAAkC;IACvC,OAAO,GAAG,KAAK,CAAC;IAChB,mBAAmB,CAAc;IAEzC,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,+FAA+F;QAC/F,mGAAmG;QACnG,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7F,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;QAC1C,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;IAC/B,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,+FAA+F;YAC/F,sFAAsF;YACtF,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACtC,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;AAjDY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;IAQR,WAAA,IAAA,eAAM,EAAC,qCAAe,CAAC,CAAA;qCADC,oCAAc;GAN9B,WAAW,CAiDvB"}
|
|
@@ -16,7 +16,9 @@ export declare class WorkflowRegistrar implements OnModuleInit, OnApplicationBoo
|
|
|
16
16
|
private readonly options;
|
|
17
17
|
constructor(discovery: DiscoveryService, metadataScanner: MetadataScanner, engine: WorkflowEngine, store: StateStore, options: DurableModuleOptions);
|
|
18
18
|
onApplicationBootstrap(): Promise<void>;
|
|
19
|
-
/** On deploy/shutdown: stop picking up new runs and wait for in-flight ones to settle
|
|
19
|
+
/** On deploy/shutdown: stop picking up new runs and wait for in-flight ones to settle, then close
|
|
20
|
+
* the transport(s) so the broker workers stop consuming and connections are released. Closing
|
|
21
|
+
* AFTER the drain keeps the transport alive while in-flight runs dispatch/await their remote steps. */
|
|
20
22
|
onApplicationShutdown(): Promise<void>;
|
|
21
23
|
onModuleInit(): Promise<void>;
|
|
22
24
|
/** Returns the instance's `@DeadLetter()` method bound to the instance, or undefined if none. */
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"workflow.registrar.d.ts","sourceRoot":"","sources":["../src/workflow.registrar.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EAEf,cAAc,EAIf,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;AAW7D;;;;;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;;4GAEwG;IAClG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAStC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAwEnC,iGAAiG;IACjG,OAAO,CAAC,qBAAqB;IAW7B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;CAiBjC"}
|
|
@@ -17,6 +17,7 @@ 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 entity_1 = require("./entity");
|
|
20
21
|
const input_validation_1 = require("./input-validation");
|
|
21
22
|
const step_interceptor_1 = require("./step-interceptor");
|
|
22
23
|
/**
|
|
@@ -45,9 +46,16 @@ let WorkflowRegistrar = class WorkflowRegistrar {
|
|
|
45
46
|
return;
|
|
46
47
|
await this.engine.recoverIncomplete();
|
|
47
48
|
}
|
|
48
|
-
/** On deploy/shutdown: stop picking up new runs and wait for in-flight ones to settle
|
|
49
|
+
/** On deploy/shutdown: stop picking up new runs and wait for in-flight ones to settle, then close
|
|
50
|
+
* the transport(s) so the broker workers stop consuming and connections are released. Closing
|
|
51
|
+
* AFTER the drain keeps the transport alive while in-flight runs dispatch/await their remote steps. */
|
|
49
52
|
async onApplicationShutdown() {
|
|
50
53
|
await this.engine.drain(this.options.shutdownTimeoutMs);
|
|
54
|
+
const transports = [
|
|
55
|
+
this.options.transport,
|
|
56
|
+
...(this.options.transports ?? []).map((t) => t.transport),
|
|
57
|
+
];
|
|
58
|
+
await Promise.allSettled(transports.map((t) => t?.close?.()));
|
|
51
59
|
}
|
|
52
60
|
async onModuleInit() {
|
|
53
61
|
if (this.options.autoSchema !== false) {
|
|
@@ -65,6 +73,11 @@ let WorkflowRegistrar = class WorkflowRegistrar {
|
|
|
65
73
|
const interceptor = instance;
|
|
66
74
|
this.engine.use((invocation, next) => interceptor.intercept(invocation, next));
|
|
67
75
|
}
|
|
76
|
+
const entityMeta = (0, entity_1.getEntityMeta)(instance.constructor);
|
|
77
|
+
if (entityMeta) {
|
|
78
|
+
this.engine.registerEntity(entityMeta.name, (0, entity_1.entityConfigFor)(instance.constructor));
|
|
79
|
+
continue; // an @Entity is not a @Workflow
|
|
80
|
+
}
|
|
68
81
|
const meta = (0, decorators_1.getWorkflowMeta)(instance.constructor);
|
|
69
82
|
if (!meta)
|
|
70
83
|
continue;
|
|
@@ -76,12 +89,22 @@ let WorkflowRegistrar = class WorkflowRegistrar {
|
|
|
76
89
|
// `inputSchema` DTO (lazy — class-validator is only required if a workflow uses inputSchema).
|
|
77
90
|
const validateInput = meta.validateInput ??
|
|
78
91
|
(meta.inputSchema ? (0, input_validation_1.classValidatorInput)(meta.inputSchema) : undefined);
|
|
92
|
+
const eventBatch = meta.debounce
|
|
93
|
+
? { mode: 'debounce', windowMs: (0, nestjs_durable_core_1.parseDuration)(meta.debounce) }
|
|
94
|
+
: meta.batch
|
|
95
|
+
? {
|
|
96
|
+
mode: 'batch',
|
|
97
|
+
maxSize: meta.batch.maxSize,
|
|
98
|
+
windowMs: (0, nestjs_durable_core_1.parseDuration)(meta.batch.within),
|
|
99
|
+
}
|
|
100
|
+
: undefined;
|
|
79
101
|
this.engine.register(meta.name, meta.version, (ctx, input) => workflow.run(ctx, input), {
|
|
80
102
|
tags: meta.tags,
|
|
81
103
|
singleton: meta.singleton,
|
|
82
104
|
executionTimeout: meta.executionTimeout,
|
|
83
105
|
validateInput,
|
|
84
106
|
onEvent: (0, decorators_1.getOnEvents)(meta, instance.constructor),
|
|
107
|
+
eventBatch,
|
|
85
108
|
});
|
|
86
109
|
const inline = this.findDeadLetterHandler(instance);
|
|
87
110
|
if (inline && meta.deadLetterWorkflow) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.registrar.js","sourceRoot":"","sources":["../src/workflow.registrar.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"workflow.registrar.js","sourceRoot":"","sources":["../src/workflow.registrar.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,23 @@ export declare class WorkflowService {
|
|
|
25
25
|
}): Promise<RunResult>;
|
|
26
26
|
/** Deliver an external signal (e.g. from a webhook) to the run waiting on `token`. */
|
|
27
27
|
signal(token: string, payload: unknown): Promise<RunResult | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Ensure a run exists for `runId`, then deliver a signal to it — race-free (the signal is buffered
|
|
30
|
+
* until the run reaches its `waitForSignal`). The durable-entity / accumulator pattern: one
|
|
31
|
+
* long-lived run per key fed events by many calls. See {@link WorkflowEngine.signalWithStart}.
|
|
32
|
+
*/
|
|
33
|
+
signalWithStart<C extends WorkflowClass>(workflow: C, input: WorkflowInputOf<C>, runId: string, signal: {
|
|
34
|
+
token: string;
|
|
35
|
+
payload?: unknown;
|
|
36
|
+
}, opts?: StartOptions): Promise<{
|
|
37
|
+
runId: string;
|
|
38
|
+
}>;
|
|
39
|
+
signalWithStart(workflow: string, input: unknown, runId: string, signal: {
|
|
40
|
+
token: string;
|
|
41
|
+
payload?: unknown;
|
|
42
|
+
}, opts?: StartOptions): Promise<{
|
|
43
|
+
runId: string;
|
|
44
|
+
}>;
|
|
28
45
|
/**
|
|
29
46
|
* Publish a named event. Resumes runs waiting on it via `ctx.waitForEvent(name, { match })` and
|
|
30
47
|
* starts a fresh run of every workflow subscribed via `@Workflow({ onEvent })` / `@OnEvent` (the
|
|
@@ -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;;;;;;;;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"}
|
|
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;;;;OAIG;IACH,eAAe,CAAC,CAAC,SAAS,aAAa,EACrC,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EACzB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,EAC5C,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,eAAe,CACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,EAC5C,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAW7B;;;;;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
|
@@ -37,6 +37,9 @@ let WorkflowService = class WorkflowService {
|
|
|
37
37
|
signal(token, payload) {
|
|
38
38
|
return this.engine.signal(token, payload);
|
|
39
39
|
}
|
|
40
|
+
signalWithStart(workflow, input, runId, signal, opts) {
|
|
41
|
+
return this.engine.signalWithStart(workflow, input, runId, signal, opts);
|
|
42
|
+
}
|
|
40
43
|
/**
|
|
41
44
|
* Publish a named event. Resumes runs waiting on it via `ctx.waitForEvent(name, { match })` and
|
|
42
45
|
* starts a fresh run of every workflow subscribed via `@Workflow({ onEvent })` / `@OnEvent` (the
|
|
@@ -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;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;
|
|
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;IAqBD,eAAe,CACb,QAAgB,EAChB,KAAc,EACd,KAAa,EACb,MAA4C,EAC5C,IAAmB;QAEnB,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3E,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;AApFY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;qCAE0B,oCAAc;GADxC,eAAe,CAoF3B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dudousxd/nestjs-durable",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Durable workflows for NestJS — module, decorators, discovery and boot recovery",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Davide Carvalho",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"rxjs": "7.8.2",
|
|
44
44
|
"typescript": "5.9.3",
|
|
45
45
|
"zod": "3.25.76",
|
|
46
|
-
"@dudousxd/nestjs-durable-core": "^0.
|
|
46
|
+
"@dudousxd/nestjs-durable-core": "^0.18.0",
|
|
47
47
|
"@dudousxd/nestjs-durable-transport-event-emitter": "^0.4.0"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|