@dudousxd/nestjs-durable-core 0.15.0 → 0.17.1
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/codec-state-store.d.ts +8 -0
- package/dist/codec-state-store.d.ts.map +1 -1
- package/dist/codec-state-store.js +14 -0
- package/dist/codec-state-store.js.map +1 -1
- package/dist/engine.d.ts +61 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +135 -2
- package/dist/engine.js.map +1 -1
- package/dist/entities.d.ts +44 -0
- package/dist/entities.d.ts.map +1 -0
- package/dist/entities.js +68 -0
- package/dist/entities.js.map +1 -0
- package/dist/event-accumulators.d.ts +39 -0
- package/dist/event-accumulators.d.ts.map +1 -0
- package/dist/event-accumulators.js +74 -0
- package/dist/event-accumulators.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +52 -1
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/testing/in-memory-state-store.d.ts +9 -0
- package/dist/testing/in-memory-state-store.d.ts.map +1 -1
- package/dist/testing/in-memory-state-store.js +20 -0
- package/dist/testing/in-memory-state-store.js.map +1 -1
- package/dist/workflow-ctx.d.ts +2 -0
- package/dist/workflow-ctx.d.ts.map +1 -1
- package/dist/workflow-ctx.js +67 -0
- package/dist/workflow-ctx.js.map +1 -1
- package/package.json +1 -1
|
@@ -34,6 +34,10 @@ export declare class CodecStateStore implements StateStore {
|
|
|
34
34
|
getRun(runId: string): Promise<WorkflowRun | null>;
|
|
35
35
|
getCheckpoint(runId: string, seq: number): Promise<StepCheckpoint | null>;
|
|
36
36
|
saveCheckpoint(checkpoint: StepCheckpoint): Promise<void>;
|
|
37
|
+
transaction<T>(work: (tx: {
|
|
38
|
+
raw: unknown;
|
|
39
|
+
saveCheckpoint: (cp: StepCheckpoint) => Promise<void>;
|
|
40
|
+
}) => Promise<T>): Promise<T>;
|
|
37
41
|
listIncompleteRuns(): Promise<WorkflowRun[]>;
|
|
38
42
|
listPendingRuns(limit: number): Promise<WorkflowRun[]>;
|
|
39
43
|
listDueTimers(nowMs: number): Promise<WorkflowRun[]>;
|
|
@@ -43,6 +47,10 @@ export declare class CodecStateStore implements StateStore {
|
|
|
43
47
|
putSignalWaiter(waiter: SignalWaiter): Promise<void>;
|
|
44
48
|
takeSignalWaiter(token: string): Promise<SignalWaiter | null>;
|
|
45
49
|
listSignalWaiters(prefix: string): Promise<SignalWaiter[]>;
|
|
50
|
+
bufferSignal(token: string, payload: unknown): Promise<void>;
|
|
51
|
+
takeBufferedSignal(token: string): Promise<{
|
|
52
|
+
payload: unknown;
|
|
53
|
+
} | null>;
|
|
46
54
|
listRuns(query: RunQuery): Promise<WorkflowRun[]>;
|
|
47
55
|
listCheckpoints(runId: string): Promise<StepCheckpoint[]>;
|
|
48
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec-state-store.d.ts","sourceRoot":"","sources":["../src/codec-state-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEpG;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAChC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAE9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,YAAY;IAGtC,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,MAAM;IAGd,OAAO,CAAC,MAAM;IAGd,OAAO,CAAC,KAAK;IAGb,OAAO,CAAC,KAAK;IAIb,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAG1C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAGlD,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAG/E,cAAc,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"codec-state-store.d.ts","sourceRoot":"","sources":["../src/codec-state-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEpG;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAChC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAE9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,YAAY;IAGtC,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,MAAM;IAGd,OAAO,CAAC,MAAM;IAGd,OAAO,CAAC,KAAK;IAGb,OAAO,CAAC,KAAK;IAIb,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAG1C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAGlD,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAG/E,cAAc,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAGzD,WAAW,CAAC,CAAC,EACX,IAAI,EAAE,CAAC,EAAE,EAAE;QACT,GAAG,EAAE,OAAO,CAAC;QACb,cAAc,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACvD,KAAK,OAAO,CAAC,CAAC,CAAC,GACf,OAAO,CAAC,CAAC,CAAC;IASP,kBAAkB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAG5C,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAGtD,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAG1D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAG/F,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAG5C,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAGlF,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAGpD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAG7D,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAG1D,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAGtD,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAIvE,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAGjD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAGhE"}
|
|
@@ -59,6 +59,13 @@ class CodecStateStore {
|
|
|
59
59
|
saveCheckpoint(checkpoint) {
|
|
60
60
|
return this.inner.saveCheckpoint(this.encCp(checkpoint));
|
|
61
61
|
}
|
|
62
|
+
transaction(work) {
|
|
63
|
+
if (!this.inner.transaction) {
|
|
64
|
+
throw new Error('the wrapped store does not support transactions');
|
|
65
|
+
}
|
|
66
|
+
// Encode the checkpoint inside the tx, so payloads stay encoded at rest like the normal path.
|
|
67
|
+
return this.inner.transaction((tx) => work({ raw: tx.raw, saveCheckpoint: (cp) => tx.saveCheckpoint(this.encCp(cp)) }));
|
|
68
|
+
}
|
|
62
69
|
async listIncompleteRuns() {
|
|
63
70
|
return (await this.inner.listIncompleteRuns()).map((r) => this.decRun(r));
|
|
64
71
|
}
|
|
@@ -86,6 +93,13 @@ class CodecStateStore {
|
|
|
86
93
|
listSignalWaiters(prefix) {
|
|
87
94
|
return this.inner.listSignalWaiters(prefix);
|
|
88
95
|
}
|
|
96
|
+
bufferSignal(token, payload) {
|
|
97
|
+
return this.inner.bufferSignal(token, this.enc(payload));
|
|
98
|
+
}
|
|
99
|
+
async takeBufferedSignal(token) {
|
|
100
|
+
const buffered = await this.inner.takeBufferedSignal(token);
|
|
101
|
+
return buffered && { payload: this.dec(buffered.payload) };
|
|
102
|
+
}
|
|
89
103
|
async listRuns(query) {
|
|
90
104
|
return (await this.inner.listRuns(query)).map((r) => this.decRun(r));
|
|
91
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec-state-store.js","sourceRoot":"","sources":["../src/codec-state-store.ts"],"names":[],"mappings":";;;AAYA;;;;;;;;;GASG;AACH,MAAa,eAAe;IAEP;IACA;IAFnB,YACmB,KAAiB,EACjB,KAAmB;QADnB,UAAK,GAAL,KAAK,CAAY;QACjB,UAAK,GAAL,KAAK,CAAc;IACnC,CAAC;IAEI,GAAG,CAAC,CAAU;QACpB,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IACO,GAAG,CAAC,CAAU;QACpB,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAEO,MAAM,CAAC,GAAgB;QAC7B,OAAO,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IAC9E,CAAC;IACO,MAAM,CAA+B,GAAM;QACjD,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAM,CAAC;IAC5F,CAAC;IACO,KAAK,CAAC,EAAkB;QAC9B,OAAO,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;IAC3E,CAAC;IACO,KAAK,CAAkC,EAAK;QAClD,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAM,CAAC;IACxF,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1D,CAAC;IAED,SAAS,CAAC,GAAgB;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,SAAS,CAAC,KAAa,EAAE,KAA2B;QAClD,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QAC1B,IAAI,OAAO,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,QAAQ,IAAI,KAAK;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,GAAW;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,cAAc,CAAC,UAA0B;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,CAAC,kBAAkB;QACtB,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,KAAK,CAAC,eAAe,CAAC,KAAa;QACjC,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,UAAU,CAAC,KAAa,EAAE,KAAa,EAAE,YAAoB,EAAE,KAAa;QAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IACD,cAAc,CAAC,KAAa;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,YAAY,CAAC,KAAa,EAAE,KAAa,EAAE,YAAoB;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAC7D,CAAC;IACD,eAAe,CAAC,MAAoB;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD,gBAAgB,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IACD,iBAAiB,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,KAAe;QAC5B,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,CAAC,eAAe,CAAC,KAAa;QACjC,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"codec-state-store.js","sourceRoot":"","sources":["../src/codec-state-store.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { type EntityConfig } from './entities';
|
|
2
|
+
import { type EventBatchConfig } from './event-accumulators';
|
|
1
3
|
import type { ControlPlane, EngineListener, NamedTransport, RunDispatcher, RunResult, SearchAttributes, StateStore, StepError, StepInterceptor, Transport, UpdateResult, UpdateValidator, WorkflowCtx, WorkflowRun } from './interfaces';
|
|
2
4
|
import { type QueueConfig } from './queue';
|
|
3
|
-
import { type WorkflowClass, type WorkflowInputOf } from './workflow-ref';
|
|
5
|
+
import { type WorkflowClass, type WorkflowInputOf, type WorkflowRef } from './workflow-ref';
|
|
4
6
|
type WorkflowFn = (ctx: WorkflowCtx, input: unknown) => Promise<unknown>;
|
|
5
7
|
/** Options for {@link WorkflowEngine.start}. */
|
|
6
8
|
export interface StartOptions {
|
|
@@ -100,6 +102,10 @@ export declare class WorkflowEngine {
|
|
|
100
102
|
private readonly latest;
|
|
101
103
|
/** Event name → workflow names started when that event is published (see `onEvent`). */
|
|
102
104
|
private readonly eventTriggers;
|
|
105
|
+
/** Durable-entity subsystem (registers the `__entity` runner; see `registerEntity`). */
|
|
106
|
+
private readonly entities;
|
|
107
|
+
/** Event debounce/batch accumulators (register the `__evt_*` runners; see `accumulators.route`). */
|
|
108
|
+
private readonly accumulators;
|
|
103
109
|
/** In-flight remote steps awaiting a worker result, keyed by stepId. */
|
|
104
110
|
private readonly pending;
|
|
105
111
|
/** Per-step "reset the liveness timer" callbacks, called when a heartbeat arrives. */
|
|
@@ -109,6 +115,8 @@ export declare class WorkflowEngine {
|
|
|
109
115
|
private readonly interceptors;
|
|
110
116
|
/** Callbacks notified (on any instance) when a run is cancelled — for cooperative cancellation. */
|
|
111
117
|
private readonly cancelListeners;
|
|
118
|
+
/** Callbacks notified when a run is enqueued elsewhere — for low-latency cross-pod dispatch. */
|
|
119
|
+
private readonly enqueuedListeners;
|
|
112
120
|
/** Notified when a run is dead-lettered (moved to `dead`) — a hook for a DLQ handler. */
|
|
113
121
|
private readonly deadListeners;
|
|
114
122
|
/** Validators gating `engine.update`, keyed by `<workflow>:<updateName>`. */
|
|
@@ -123,6 +131,22 @@ export declare class WorkflowEngine {
|
|
|
123
131
|
private readonly inflight;
|
|
124
132
|
private draining;
|
|
125
133
|
constructor(deps: WorkflowEngineDeps);
|
|
134
|
+
/**
|
|
135
|
+
* Register a **durable entity** (a virtual object): a keyed actor whose `handlers` run **serialized
|
|
136
|
+
* per key** over **durable state**, exactly once. Drive it with `signalEntity` (fire) /
|
|
137
|
+
* `ctx.callEntity` (call + await result) and read its state with `getEntityState`. See {@link Entities}.
|
|
138
|
+
*/
|
|
139
|
+
registerEntity<S>(name: string, config: EntityConfig<S>): void;
|
|
140
|
+
/** Send an operation to an entity (fire-and-forget). Ordered + exactly-once per key. */
|
|
141
|
+
signalEntity(name: string, key: string, op: string, arg?: unknown): Promise<void>;
|
|
142
|
+
/** Read an entity's current durable state (published after each op), or undefined if it has none yet. */
|
|
143
|
+
getEntityState<S = unknown>(name: string, key: string): Promise<S | undefined>;
|
|
144
|
+
/**
|
|
145
|
+
* Be notified when a run is enqueued on ANOTHER instance (via the control plane), so a worker can
|
|
146
|
+
* pick it up at once — e.g. `engine.onEnqueued((runId) => engine.runOne(runId))`. Returns an
|
|
147
|
+
* unsubscribe function. Only wire this on instances that should execute runs (workers).
|
|
148
|
+
*/
|
|
149
|
+
onEnqueued(listener: (runId: string) => void): () => void;
|
|
126
150
|
/** Fire cooperative-cancellation listeners for `runId` (a worker bridge aborts in-flight work). */
|
|
127
151
|
private notifyCancelled;
|
|
128
152
|
/**
|
|
@@ -136,6 +160,7 @@ export declare class WorkflowEngine {
|
|
|
136
160
|
executionTimeout?: string | number;
|
|
137
161
|
validateInput?: (input: unknown) => void | Promise<void>;
|
|
138
162
|
onEvent?: string[];
|
|
163
|
+
eventBatch?: EventBatchConfig;
|
|
139
164
|
}): void;
|
|
140
165
|
/**
|
|
141
166
|
* Register a flow-control queue referenced by `ctx.call(step, input, { queue })`. Caps concurrent
|
|
@@ -225,6 +250,14 @@ export declare class WorkflowEngine {
|
|
|
225
250
|
* the HTTP request on workflow execution.
|
|
226
251
|
*/
|
|
227
252
|
requeue(runId: string): Promise<RunResult | null>;
|
|
253
|
+
/**
|
|
254
|
+
* **Fix-and-replay**: re-run a run (typically a `dead`/`failed` one) with a corrected `input`, as a
|
|
255
|
+
* fresh run with clean history. It's a NEW run — `newRunId` defaults to `<runId>~retry~<uuid>` — so
|
|
256
|
+
* the original stays inspectable. Returns the new run's id, or null if `runId` is unknown.
|
|
257
|
+
*/
|
|
258
|
+
retryWithInput(runId: string, input: unknown, newRunId?: string): Promise<{
|
|
259
|
+
runId: string;
|
|
260
|
+
} | null>;
|
|
228
261
|
/**
|
|
229
262
|
* Pick up and execute every `pending` run — the poll-based side of dispatch for a worker pod with
|
|
230
263
|
* no broker. Runs enqueued by other pods (or by a caller using a no-op dispatcher) sit `pending`
|
|
@@ -261,6 +294,20 @@ export declare class WorkflowEngine {
|
|
|
261
294
|
id?: string;
|
|
262
295
|
}): Promise<number>;
|
|
263
296
|
signal(token: string, payload: unknown): Promise<RunResult | null>;
|
|
297
|
+
/**
|
|
298
|
+
* Ensure a run exists for `runId`, then deliver a signal to it — atomically race-free thanks to
|
|
299
|
+
* signal buffering: if the run is new (or busy / not yet waiting), the signal is buffered and
|
|
300
|
+
* consumed when it reaches `waitForSignal(token)`. The canonical **durable-entity / accumulator**
|
|
301
|
+
* pattern: one long-lived run per key (the `runId`) that loops on `waitForSignal`, fed events by
|
|
302
|
+
* many `signalWithStart` calls. `start` is idempotent by `runId`, so concurrent callers converge on
|
|
303
|
+
* one run. (Use a per-run `token`, e.g. derived from `runId`, so the signal targets this entity.)
|
|
304
|
+
*/
|
|
305
|
+
signalWithStart(workflow: WorkflowRef, input: unknown, runId: string, signal: {
|
|
306
|
+
token: string;
|
|
307
|
+
payload?: unknown;
|
|
308
|
+
}, opts?: StartOptions): Promise<{
|
|
309
|
+
runId: string;
|
|
310
|
+
}>;
|
|
264
311
|
/**
|
|
265
312
|
* Report the result of a `ctx.task(name, …)` back to its run (async completion). The external
|
|
266
313
|
* worker that the task dispatched to calls this when done; the run resumes with `result`. Returns
|
|
@@ -284,6 +331,19 @@ export declare class WorkflowEngine {
|
|
|
284
331
|
cancel(runId: string, opts?: {
|
|
285
332
|
compensate?: boolean;
|
|
286
333
|
}): Promise<RunResult | null>;
|
|
334
|
+
/**
|
|
335
|
+
* Cascade cancellation to a run's children — both awaited (`ctx.child`, found via its live
|
|
336
|
+
* `child:<id>` waiter) and fire-and-forget (`ctx.startChild`, found via its `spawn:<id>`
|
|
337
|
+
* checkpoint). Recursive, so a whole subtree is cancelled; the terminal guard in `cancel` stops it
|
|
338
|
+
* at finished / already-cancelled runs (no loops, no re-cancel).
|
|
339
|
+
*/
|
|
340
|
+
private cancelChildren;
|
|
341
|
+
/**
|
|
342
|
+
* The ids of the runs a run spawned — both awaited (`ctx.child`, found via its live `child:<id>`
|
|
343
|
+
* waiter) and fire-and-forget (`ctx.startChild`, found via its `spawn:<id>` checkpoint). The
|
|
344
|
+
* canonical parent→children edge, used for both cancellation cascades and the dashboard run-tree.
|
|
345
|
+
*/
|
|
346
|
+
getRunChildren(parentRunId: string): Promise<string[]>;
|
|
287
347
|
/** Checkpoint a finished step and announce it — the two things that must always happen together. */
|
|
288
348
|
private completeStep;
|
|
289
349
|
/** Checkpoint a step that failed terminally, so the failure point is visible (not just the run). */
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.js
CHANGED
|
@@ -4,7 +4,9 @@ exports.RemoteStepError = exports.WorkflowEngine = void 0;
|
|
|
4
4
|
const backoff_1 = require("./backoff");
|
|
5
5
|
const checkpoints_1 = require("./checkpoints");
|
|
6
6
|
const duration_1 = require("./duration");
|
|
7
|
+
const entities_1 = require("./entities");
|
|
7
8
|
const errors_1 = require("./errors");
|
|
9
|
+
const event_accumulators_1 = require("./event-accumulators");
|
|
8
10
|
const events_1 = require("./events");
|
|
9
11
|
const protocol_1 = require("./protocol");
|
|
10
12
|
const queue_1 = require("./queue");
|
|
@@ -65,6 +67,10 @@ class WorkflowEngine {
|
|
|
65
67
|
latest = new Map();
|
|
66
68
|
/** Event name → workflow names started when that event is published (see `onEvent`). */
|
|
67
69
|
eventTriggers = new Map();
|
|
70
|
+
/** Durable-entity subsystem (registers the `__entity` runner; see `registerEntity`). */
|
|
71
|
+
entities;
|
|
72
|
+
/** Event debounce/batch accumulators (register the `__evt_*` runners; see `accumulators.route`). */
|
|
73
|
+
accumulators;
|
|
68
74
|
/** In-flight remote steps awaiting a worker result, keyed by stepId. */
|
|
69
75
|
pending = new Map();
|
|
70
76
|
/** Per-step "reset the liveness timer" callbacks, called when a heartbeat arrives. */
|
|
@@ -74,6 +80,8 @@ class WorkflowEngine {
|
|
|
74
80
|
interceptors = [];
|
|
75
81
|
/** Callbacks notified (on any instance) when a run is cancelled — for cooperative cancellation. */
|
|
76
82
|
cancelListeners = new Set();
|
|
83
|
+
/** Callbacks notified when a run is enqueued elsewhere — for low-latency cross-pod dispatch. */
|
|
84
|
+
enqueuedListeners = new Set();
|
|
77
85
|
/** Notified when a run is dead-lettered (moved to `dead`) — a hook for a DLQ handler. */
|
|
78
86
|
deadListeners = new Set();
|
|
79
87
|
/** Validators gating `engine.update`, keyed by `<workflow>:<updateName>`. */
|
|
@@ -142,7 +150,46 @@ class WorkflowEngine {
|
|
|
142
150
|
else if (msg.kind === 'cancel') {
|
|
143
151
|
this.notifyCancelled(msg.runId);
|
|
144
152
|
}
|
|
153
|
+
else if (msg.kind === 'enqueued') {
|
|
154
|
+
// A run was enqueued on another instance — let worker subscribers pick it up immediately
|
|
155
|
+
// instead of waiting for the next poll. (Self-broadcasts are already filtered above.)
|
|
156
|
+
for (const fn of this.enqueuedListeners) {
|
|
157
|
+
try {
|
|
158
|
+
fn(msg.runId);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
/* an enqueue listener must not break the engine */
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
145
165
|
});
|
|
166
|
+
this.accumulators = new event_accumulators_1.EventAccumulators(this);
|
|
167
|
+
this.entities = new entities_1.Entities(this);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Register a **durable entity** (a virtual object): a keyed actor whose `handlers` run **serialized
|
|
171
|
+
* per key** over **durable state**, exactly once. Drive it with `signalEntity` (fire) /
|
|
172
|
+
* `ctx.callEntity` (call + await result) and read its state with `getEntityState`. See {@link Entities}.
|
|
173
|
+
*/
|
|
174
|
+
registerEntity(name, config) {
|
|
175
|
+
this.entities.register(name, config);
|
|
176
|
+
}
|
|
177
|
+
/** Send an operation to an entity (fire-and-forget). Ordered + exactly-once per key. */
|
|
178
|
+
signalEntity(name, key, op, arg) {
|
|
179
|
+
return this.entities.signal(name, key, op, arg);
|
|
180
|
+
}
|
|
181
|
+
/** Read an entity's current durable state (published after each op), or undefined if it has none yet. */
|
|
182
|
+
getEntityState(name, key) {
|
|
183
|
+
return this.entities.getState(name, key);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Be notified when a run is enqueued on ANOTHER instance (via the control plane), so a worker can
|
|
187
|
+
* pick it up at once — e.g. `engine.onEnqueued((runId) => engine.runOne(runId))`. Returns an
|
|
188
|
+
* unsubscribe function. Only wire this on instances that should execute runs (workers).
|
|
189
|
+
*/
|
|
190
|
+
onEnqueued(listener) {
|
|
191
|
+
this.enqueuedListeners.add(listener);
|
|
192
|
+
return () => this.enqueuedListeners.delete(listener);
|
|
146
193
|
}
|
|
147
194
|
/** Fire cooperative-cancellation listeners for `runId` (a worker bridge aborts in-flight work). */
|
|
148
195
|
notifyCancelled(runId) {
|
|
@@ -170,6 +217,7 @@ class WorkflowEngine {
|
|
|
170
217
|
executionTimeoutMs: opts?.executionTimeout != null ? (0, duration_1.parseDuration)(opts.executionTimeout) : undefined,
|
|
171
218
|
validateInput: opts?.validateInput,
|
|
172
219
|
onEvent: opts?.onEvent,
|
|
220
|
+
eventBatch: opts?.eventBatch,
|
|
173
221
|
};
|
|
174
222
|
this.workflows.set(versionKey(name, version), registered);
|
|
175
223
|
const current = this.latest.get(name);
|
|
@@ -304,6 +352,13 @@ class WorkflowEngine {
|
|
|
304
352
|
// The run is durably enqueued; a dispatcher (in-process by default) executes it — `start` does
|
|
305
353
|
// NOT run the body inline. Await the terminal/suspended state with `waitForRun(runId)` if needed.
|
|
306
354
|
await this.runDispatcher.dispatch(runId);
|
|
355
|
+
// Nudge worker instances to pick it up now instead of on their next poll (no-op without a control
|
|
356
|
+
// plane; self-receipt is filtered, so it only helps OTHER pods — e.g. an API pod's enqueue).
|
|
357
|
+
if (this.controlPlane) {
|
|
358
|
+
void this.controlPlane
|
|
359
|
+
.publishControl({ kind: 'enqueued', runId, from: this.instanceId })
|
|
360
|
+
.catch(() => undefined);
|
|
361
|
+
}
|
|
307
362
|
return { runId, status: 'pending' };
|
|
308
363
|
}
|
|
309
364
|
/** Read a run's current persisted state (or null if unknown). A thin pass-through to the store. */
|
|
@@ -461,6 +516,19 @@ class WorkflowEngine {
|
|
|
461
516
|
await this.runDispatcher.dispatch(runId);
|
|
462
517
|
return { runId, status: 'pending' };
|
|
463
518
|
}
|
|
519
|
+
/**
|
|
520
|
+
* **Fix-and-replay**: re-run a run (typically a `dead`/`failed` one) with a corrected `input`, as a
|
|
521
|
+
* fresh run with clean history. It's a NEW run — `newRunId` defaults to `<runId>~retry~<uuid>` — so
|
|
522
|
+
* the original stays inspectable. Returns the new run's id, or null if `runId` is unknown.
|
|
523
|
+
*/
|
|
524
|
+
async retryWithInput(runId, input, newRunId) {
|
|
525
|
+
const run = await this.store.getRun(runId);
|
|
526
|
+
if (!run)
|
|
527
|
+
return null;
|
|
528
|
+
const id = newRunId ?? `${runId}~retry~${globalThis.crypto.randomUUID().slice(0, 8)}`;
|
|
529
|
+
await this.start(run.workflow, input, id, { tags: run.tags });
|
|
530
|
+
return { runId: id };
|
|
531
|
+
}
|
|
464
532
|
/**
|
|
465
533
|
* Pick up and execute every `pending` run — the poll-based side of dispatch for a worker pod with
|
|
466
534
|
* no broker. Runs enqueued by other pods (or by a caller using a no-op dispatcher) sit `pending`
|
|
@@ -569,7 +637,15 @@ class WorkflowEngine {
|
|
|
569
637
|
// A subscriber that rejects the payload (validateInput) must not block the others or the
|
|
570
638
|
// waiters — its run simply never starts, mirroring fire-and-forget dead-letter routing.
|
|
571
639
|
try {
|
|
572
|
-
|
|
640
|
+
const batch = this.latest.get(workflow)?.eventBatch;
|
|
641
|
+
if (batch) {
|
|
642
|
+
// Coalesce: route the event into a per-workflow accumulator (one long-lived run that
|
|
643
|
+
// debounces/batches and then starts the target with the collected payload(s)).
|
|
644
|
+
await this.accumulators.route(workflow, batch, payload);
|
|
645
|
+
}
|
|
646
|
+
else {
|
|
647
|
+
await this.start(workflow, payload, `evt:${eventId}:${workflow}`);
|
|
648
|
+
}
|
|
573
649
|
touched += 1;
|
|
574
650
|
}
|
|
575
651
|
catch {
|
|
@@ -581,8 +657,12 @@ class WorkflowEngine {
|
|
|
581
657
|
}
|
|
582
658
|
async signal(token, payload) {
|
|
583
659
|
const waiter = await this.store.takeSignalWaiter(token);
|
|
584
|
-
if (!waiter)
|
|
660
|
+
if (!waiter) {
|
|
661
|
+
// No one is waiting yet — buffer it so the next `waitForSignal(token)` consumes it instead of
|
|
662
|
+
// dropping it (reliable signals; the basis of `signalWithStart`).
|
|
663
|
+
await this.store.bufferSignal(token, payload);
|
|
585
664
|
return null;
|
|
665
|
+
}
|
|
586
666
|
await this.store.saveCheckpoint((0, checkpoints_1.instantCheckpoint)({
|
|
587
667
|
runId: waiter.runId,
|
|
588
668
|
seq: waiter.seq,
|
|
@@ -592,6 +672,21 @@ class WorkflowEngine {
|
|
|
592
672
|
}));
|
|
593
673
|
return this.resume(waiter.runId);
|
|
594
674
|
}
|
|
675
|
+
/**
|
|
676
|
+
* Ensure a run exists for `runId`, then deliver a signal to it — atomically race-free thanks to
|
|
677
|
+
* signal buffering: if the run is new (or busy / not yet waiting), the signal is buffered and
|
|
678
|
+
* consumed when it reaches `waitForSignal(token)`. The canonical **durable-entity / accumulator**
|
|
679
|
+
* pattern: one long-lived run per key (the `runId`) that loops on `waitForSignal`, fed events by
|
|
680
|
+
* many `signalWithStart` calls. `start` is idempotent by `runId`, so concurrent callers converge on
|
|
681
|
+
* one run. (Use a per-run `token`, e.g. derived from `runId`, so the signal targets this entity.)
|
|
682
|
+
*/
|
|
683
|
+
async signalWithStart(workflow, input, runId, signal, opts) {
|
|
684
|
+
// `start` is overloaded per ref kind (class | string); a `WorkflowRef` union fits neither
|
|
685
|
+
// overload, so resolve to the string overload (the engine handles both at runtime).
|
|
686
|
+
await this.start(workflow, input, runId, opts); // idempotent: no-op if run exists
|
|
687
|
+
await this.signal(signal.token, signal.payload);
|
|
688
|
+
return { runId };
|
|
689
|
+
}
|
|
595
690
|
/**
|
|
596
691
|
* Report the result of a `ctx.task(name, …)` back to its run (async completion). The external
|
|
597
692
|
* worker that the task dispatched to calls this when done; the run resumes with `result`. Returns
|
|
@@ -625,6 +720,11 @@ class WorkflowEngine {
|
|
|
625
720
|
const run = await this.store.getRun(runId);
|
|
626
721
|
if (!run)
|
|
627
722
|
return null;
|
|
723
|
+
// Already finished — nothing to cancel (and don't clobber a completed/dead run). This also stops
|
|
724
|
+
// the child cascade below from looping on already-cancelled runs.
|
|
725
|
+
if (run.status === 'completed' || run.status === 'cancelled' || run.status === 'dead') {
|
|
726
|
+
return { runId, status: run.status, output: run.output, error: run.error };
|
|
727
|
+
}
|
|
628
728
|
// Compensating cancel: resume the run with a cancellation pending — replay re-registers the saga,
|
|
629
729
|
// and at the suspension point execute() runs the undo and marks it cancelled. Run that resume in
|
|
630
730
|
// the BACKGROUND so the caller (e.g. an HTTP request) never blocks on replaying the workflow +
|
|
@@ -642,11 +742,13 @@ class WorkflowEngine {
|
|
|
642
742
|
.then(() => this.notifyCancelled(runId))
|
|
643
743
|
.catch(() => undefined);
|
|
644
744
|
});
|
|
745
|
+
await this.cancelChildren(runId, opts);
|
|
645
746
|
return { runId, status: run.status };
|
|
646
747
|
}
|
|
647
748
|
const error = { message: 'cancelled' };
|
|
648
749
|
await this.store.updateRun(runId, { status: 'cancelled', error, updatedAt: new Date() });
|
|
649
750
|
this.emit({ type: 'run.failed', runId, workflow: run.workflow, error });
|
|
751
|
+
await this.cancelChildren(runId, opts);
|
|
650
752
|
// Notify local cancel listeners now (a worker on this pod), and broadcast so the instance/worker
|
|
651
753
|
// actually running this run learns of it and can abort cooperatively (the store already records
|
|
652
754
|
// `cancelled`, but a busy worker won't re-read it).
|
|
@@ -658,6 +760,34 @@ class WorkflowEngine {
|
|
|
658
760
|
}
|
|
659
761
|
return { runId, status: 'cancelled', error };
|
|
660
762
|
}
|
|
763
|
+
/**
|
|
764
|
+
* Cascade cancellation to a run's children — both awaited (`ctx.child`, found via its live
|
|
765
|
+
* `child:<id>` waiter) and fire-and-forget (`ctx.startChild`, found via its `spawn:<id>`
|
|
766
|
+
* checkpoint). Recursive, so a whole subtree is cancelled; the terminal guard in `cancel` stops it
|
|
767
|
+
* at finished / already-cancelled runs (no loops, no re-cancel).
|
|
768
|
+
*/
|
|
769
|
+
async cancelChildren(parentRunId, opts) {
|
|
770
|
+
for (const id of await this.getRunChildren(parentRunId)) {
|
|
771
|
+
await this.cancel(id, opts).catch(() => undefined);
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
/**
|
|
775
|
+
* The ids of the runs a run spawned — both awaited (`ctx.child`, found via its live `child:<id>`
|
|
776
|
+
* waiter) and fire-and-forget (`ctx.startChild`, found via its `spawn:<id>` checkpoint). The
|
|
777
|
+
* canonical parent→children edge, used for both cancellation cascades and the dashboard run-tree.
|
|
778
|
+
*/
|
|
779
|
+
async getRunChildren(parentRunId) {
|
|
780
|
+
const childIds = new Set();
|
|
781
|
+
for (const w of await this.store.listSignalWaiters('child:')) {
|
|
782
|
+
if (w.runId === parentRunId)
|
|
783
|
+
childIds.add(w.token.slice('child:'.length));
|
|
784
|
+
}
|
|
785
|
+
for (const cp of await this.store.listCheckpoints(parentRunId)) {
|
|
786
|
+
if (cp.name.startsWith('spawn:') && typeof cp.output === 'string')
|
|
787
|
+
childIds.add(cp.output);
|
|
788
|
+
}
|
|
789
|
+
return [...childIds];
|
|
790
|
+
}
|
|
661
791
|
/** Checkpoint a finished step and announce it — the two things that must always happen together. */
|
|
662
792
|
async completeStep(step) {
|
|
663
793
|
await this.store.saveCheckpoint({
|
|
@@ -909,6 +1039,9 @@ class WorkflowEngine {
|
|
|
909
1039
|
startChild: (workflow, input, id) => {
|
|
910
1040
|
queueMicrotask(() => void this.start(workflow, input, id).catch(() => undefined));
|
|
911
1041
|
},
|
|
1042
|
+
signalEntity: (name, key, op, arg, reply) => {
|
|
1043
|
+
queueMicrotask(() => void this.entities.dispatch(name, key, op, arg, reply).catch(() => undefined));
|
|
1044
|
+
},
|
|
912
1045
|
interceptStep: (invocation, body) => this.interceptStep(invocation, body),
|
|
913
1046
|
};
|
|
914
1047
|
}
|