@hardlydifficult/workflow-engine 1.0.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/README.md ADDED
@@ -0,0 +1,90 @@
1
+ # @hardlydifficult/workflow-engine
2
+
3
+ General-purpose state machine with typed statuses, validated transitions, and persistent state.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @hardlydifficult/workflow-engine @hardlydifficult/state-tracker
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { WorkflowEngine } from "@hardlydifficult/workflow-engine";
15
+
16
+ type Status = "idle" | "running" | "completed" | "failed";
17
+ interface Data { count: number; result?: string; }
18
+
19
+ const engine = new WorkflowEngine<Status, Data>({
20
+ key: "my-workflow",
21
+ initialStatus: "idle",
22
+ initialData: { count: 0 },
23
+ transitions: {
24
+ idle: ["running", "failed"],
25
+ running: ["completed", "failed"],
26
+ completed: [],
27
+ failed: [],
28
+ },
29
+ stateDirectory: "/var/data",
30
+ onTransition: (event) => console.log(`${event.from} -> ${event.to}`),
31
+ });
32
+
33
+ await engine.load();
34
+
35
+ await engine.transition("running", (draft) => {
36
+ draft.count = 1;
37
+ });
38
+
39
+ await engine.transition("completed", (draft) => {
40
+ draft.result = "done";
41
+ });
42
+
43
+ engine.isTerminal; // true
44
+ ```
45
+
46
+ ## API
47
+
48
+ ### `new WorkflowEngine<TStatus, TData>(options)`
49
+
50
+ | Option | Type | Description |
51
+ |--------|------|-------------|
52
+ | `key` | `string` | Unique persistence key |
53
+ | `initialStatus` | `TStatus` | Default status for new workflows |
54
+ | `initialData` | `TData` | Default data for new workflows |
55
+ | `transitions` | `Record<TStatus, TStatus[]>` | Allowed transitions per status |
56
+ | `stateDirectory` | `string?` | Persistence directory |
57
+ | `autoSaveMs` | `number?` | Auto-save interval (default 5000) |
58
+ | `onTransition` | `function?` | Event callback |
59
+
60
+ ### Properties
61
+
62
+ | Property | Type | Description |
63
+ |----------|------|-------------|
64
+ | `status` | `TStatus` | Current status |
65
+ | `data` | `Readonly<TData>` | Current data |
66
+ | `isLoaded` | `boolean` | Whether `load()` has been called |
67
+ | `isPersistent` | `boolean` | Whether disk storage is available |
68
+ | `isTerminal` | `boolean` | Whether current status has no outgoing transitions |
69
+
70
+ ### Methods
71
+
72
+ | Method | Description |
73
+ |--------|-------------|
74
+ | `load()` | Load persisted state from disk. Safe to call multiple times. |
75
+ | `transition(to, updater?)` | Change status, optionally mutate data. Validates transition, persists immediately. |
76
+ | `update(updater)` | Mutate data without changing status. Persists immediately. |
77
+ | `save()` | Force-save current state to disk. |
78
+ | `canTransition(to)` | Check if a transition is allowed from current status. |
79
+ | `allowedTransitions()` | List statuses reachable from current status. |
80
+
81
+ ### Updater Pattern
82
+
83
+ `transition()` and `update()` accept an updater callback that receives a `structuredClone` of the data. Mutate it directly — if the updater throws, nothing changes.
84
+
85
+ ```typescript
86
+ await engine.transition("running", (draft) => {
87
+ draft.count += 1;
88
+ draft.result = computeResult();
89
+ });
90
+ ```
@@ -0,0 +1,51 @@
1
+ import type { DataUpdater, WorkflowEngineOptions } from "./types.js";
2
+ /**
3
+ * General-purpose state machine with typed statuses, validated transitions,
4
+ * and persistent state via StateTracker.
5
+ */
6
+ export declare class WorkflowEngine<TStatus extends string, TData> {
7
+ private readonly tracker;
8
+ private readonly transitions;
9
+ private readonly onTransitionCb?;
10
+ private loaded;
11
+ constructor(options: WorkflowEngineOptions<TStatus, TData>);
12
+ /** Current status */
13
+ get status(): TStatus;
14
+ /** Current data (read-only) */
15
+ get data(): Readonly<TData>;
16
+ /** Whether load() has been called */
17
+ get isLoaded(): boolean;
18
+ /** Whether disk storage is available */
19
+ get isPersistent(): boolean;
20
+ /** Whether the current status is terminal (no outgoing transitions) */
21
+ get isTerminal(): boolean;
22
+ /**
23
+ * Load persisted state from disk.
24
+ * Uses defaults if no state file exists. Safe to call multiple times.
25
+ */
26
+ load(): Promise<void>;
27
+ /**
28
+ * Transition to a new status, optionally mutating data.
29
+ *
30
+ * The updater receives a structuredClone of current data.
31
+ * If the updater throws, the transition is aborted.
32
+ * On success, state is persisted immediately.
33
+ */
34
+ transition(to: TStatus, updater?: DataUpdater<TData>): Promise<void>;
35
+ /**
36
+ * Update data without changing status.
37
+ *
38
+ * The updater receives a structuredClone of current data.
39
+ * If the updater throws, no changes are applied.
40
+ * On success, state is persisted immediately.
41
+ */
42
+ update(updater: DataUpdater<TData>): Promise<void>;
43
+ /** Check if a specific transition is allowed from current status */
44
+ canTransition(to: TStatus): boolean;
45
+ /** Get statuses reachable from current status */
46
+ allowedTransitions(): readonly TStatus[];
47
+ /** Force-save current state to disk */
48
+ save(): Promise<void>;
49
+ private emitEvent;
50
+ }
51
+ //# sourceMappingURL=WorkflowEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowEngine.d.ts","sourceRoot":"","sources":["../src/WorkflowEngine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EAIX,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,qBAAa,cAAc,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IACvE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAEtB;IACV,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC;IAoB1D,qBAAqB;IACrB,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,+BAA+B;IAC/B,IAAI,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,CAE1B;IAED,qCAAqC;IACrC,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,wCAAwC;IACxC,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,uEAAuE;IACvE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B;;;;;;OAMG;IACG,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B1E;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxD,oEAAoE;IACpE,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO;IAInC,iDAAiD;IACjD,kBAAkB,IAAI,SAAS,OAAO,EAAE;IAIxC,uCAAuC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,OAAO,CAAC,SAAS;CAclB"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkflowEngine = void 0;
4
+ const state_tracker_1 = require("@hardlydifficult/state-tracker");
5
+ /**
6
+ * General-purpose state machine with typed statuses, validated transitions,
7
+ * and persistent state via StateTracker.
8
+ */
9
+ class WorkflowEngine {
10
+ tracker;
11
+ transitions;
12
+ onTransitionCb;
13
+ loaded = false;
14
+ constructor(options) {
15
+ const { transitions, initialStatus } = options;
16
+ if (!(initialStatus in transitions)) {
17
+ throw new Error(`initialStatus "${initialStatus}" is not a key in the transitions map`);
18
+ }
19
+ this.transitions = transitions;
20
+ this.onTransitionCb = options.onTransition;
21
+ this.tracker = new state_tracker_1.StateTracker({
22
+ key: options.key,
23
+ default: { status: initialStatus, data: options.initialData },
24
+ stateDirectory: options.stateDirectory,
25
+ autoSaveMs: options.autoSaveMs ?? 5000,
26
+ });
27
+ }
28
+ /** Current status */
29
+ get status() {
30
+ return this.tracker.state.status;
31
+ }
32
+ /** Current data (read-only) */
33
+ get data() {
34
+ return this.tracker.state.data;
35
+ }
36
+ /** Whether load() has been called */
37
+ get isLoaded() {
38
+ return this.loaded;
39
+ }
40
+ /** Whether disk storage is available */
41
+ get isPersistent() {
42
+ return this.tracker.isPersistent;
43
+ }
44
+ /** Whether the current status is terminal (no outgoing transitions) */
45
+ get isTerminal() {
46
+ return this.transitions[this.status].length === 0;
47
+ }
48
+ /**
49
+ * Load persisted state from disk.
50
+ * Uses defaults if no state file exists. Safe to call multiple times.
51
+ */
52
+ async load() {
53
+ await this.tracker.loadAsync();
54
+ this.loaded = true;
55
+ this.emitEvent("load");
56
+ }
57
+ /**
58
+ * Transition to a new status, optionally mutating data.
59
+ *
60
+ * The updater receives a structuredClone of current data.
61
+ * If the updater throws, the transition is aborted.
62
+ * On success, state is persisted immediately.
63
+ */
64
+ async transition(to, updater) {
65
+ const from = this.status;
66
+ if (this.isTerminal) {
67
+ throw new Error(`Cannot transition from terminal status "${from}"`);
68
+ }
69
+ const allowed = this.transitions[from];
70
+ if (!allowed.includes(to)) {
71
+ throw new Error(`Cannot transition from "${from}" to "${to}". ` +
72
+ `Allowed: [${allowed.join(", ")}]`);
73
+ }
74
+ const data = structuredClone(this.tracker.state.data);
75
+ if (updater !== undefined) {
76
+ updater(data);
77
+ }
78
+ this.tracker.set({ status: to, data });
79
+ await this.tracker.saveAsync();
80
+ this.emitEvent("transition", from, to);
81
+ }
82
+ /**
83
+ * Update data without changing status.
84
+ *
85
+ * The updater receives a structuredClone of current data.
86
+ * If the updater throws, no changes are applied.
87
+ * On success, state is persisted immediately.
88
+ */
89
+ async update(updater) {
90
+ const data = structuredClone(this.tracker.state.data);
91
+ updater(data);
92
+ this.tracker.set({ status: this.status, data });
93
+ await this.tracker.saveAsync();
94
+ this.emitEvent("update");
95
+ }
96
+ /** Check if a specific transition is allowed from current status */
97
+ canTransition(to) {
98
+ return this.transitions[this.status].includes(to);
99
+ }
100
+ /** Get statuses reachable from current status */
101
+ allowedTransitions() {
102
+ return this.transitions[this.status];
103
+ }
104
+ /** Force-save current state to disk */
105
+ async save() {
106
+ await this.tracker.saveAsync();
107
+ }
108
+ emitEvent(type, from, to) {
109
+ this.onTransitionCb?.({
110
+ type,
111
+ from,
112
+ to,
113
+ status: this.status,
114
+ data: this.data,
115
+ timestamp: new Date().toISOString(),
116
+ });
117
+ }
118
+ }
119
+ exports.WorkflowEngine = WorkflowEngine;
120
+ //# sourceMappingURL=WorkflowEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowEngine.js","sourceRoot":"","sources":["../src/WorkflowEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { WorkflowEngine } from "./WorkflowEngine.js";
2
+ export type { WorkflowEngineOptions, TransitionEvent, TransitionMap, DataUpdater, } from "./types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkflowEngine = void 0;
4
+ var WorkflowEngine_js_1 = require("./WorkflowEngine.js");
5
+ Object.defineProperty(exports, "WorkflowEngine", { enumerable: true, get: function () { return WorkflowEngine_js_1.WorkflowEngine; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yDAAqD;AAA5C,mHAAA,cAAc,OAAA"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Allowed transitions per status.
3
+ * Each key is a status, its value is the list of statuses it can transition to.
4
+ * Statuses with empty arrays are terminal (no outgoing transitions).
5
+ */
6
+ export type TransitionMap<TStatus extends string> = Record<TStatus, readonly TStatus[]>;
7
+ /**
8
+ * Callback that receives a mutable draft of the data.
9
+ * Mutations are applied if the function returns without throwing.
10
+ */
11
+ export type DataUpdater<TData> = (draft: TData) => void;
12
+ /**
13
+ * Event emitted on transitions, updates, and loads.
14
+ */
15
+ export interface TransitionEvent<TStatus extends string, TData> {
16
+ type: "transition" | "update" | "load";
17
+ from?: TStatus;
18
+ to?: TStatus;
19
+ status: TStatus;
20
+ data: Readonly<TData>;
21
+ timestamp: string;
22
+ }
23
+ /**
24
+ * Configuration for WorkflowEngine.
25
+ */
26
+ export interface WorkflowEngineOptions<TStatus extends string, TData> {
27
+ /** Unique key for StateTracker persistence */
28
+ key: string;
29
+ /** Initial status when creating a new workflow */
30
+ initialStatus: TStatus;
31
+ /** Initial data when creating a new workflow */
32
+ initialData: TData;
33
+ /** Map of allowed transitions: status -> allowed next statuses */
34
+ transitions: TransitionMap<TStatus>;
35
+ /** Directory for state persistence */
36
+ stateDirectory?: string;
37
+ /** Auto-save interval in ms (default 5000) */
38
+ autoSaveMs?: number;
39
+ /** Called on transitions, updates, and loads */
40
+ onTransition?: (event: TransitionEvent<TStatus, TData>) => void;
41
+ }
42
+ /**
43
+ * Internal persisted shape: status + data together.
44
+ */
45
+ export interface PersistedState<TStatus extends string, TData> {
46
+ status: TStatus;
47
+ data: TData;
48
+ }
49
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,OAAO,SAAS,MAAM,IAAI,MAAM,CACxD,OAAO,EACP,SAAS,OAAO,EAAE,CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IAC5D,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IAClE,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,aAAa,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,WAAW,EAAE,KAAK,CAAC;IACnB,kEAAkE;IAClE,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;CACjE;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,KAAK,CAAC;CACb"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@hardlydifficult/workflow-engine",
3
+ "version": "1.0.0",
4
+ "main": "./dist/index.js",
5
+ "types": "./dist/index.d.ts",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "test": "vitest run",
12
+ "test:watch": "vitest",
13
+ "test:coverage": "vitest run --coverage",
14
+ "lint": "tsc --noEmit",
15
+ "clean": "rm -rf dist"
16
+ },
17
+ "dependencies": {
18
+ "@hardlydifficult/state-tracker": "file:../state-tracker"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "20.19.31",
22
+ "typescript": "5.8.3",
23
+ "vitest": "1.6.1"
24
+ },
25
+ "peerDependencies": {
26
+ "@hardlydifficult/state-tracker": ">=2.0.0"
27
+ },
28
+ "engines": {
29
+ "node": ">=18.0.0"
30
+ }
31
+ }