openworkflow 0.4.1 → 0.5.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 +53 -48
- package/dist/backend-postgres/index.d.ts +44 -0
- package/dist/backend-postgres/index.d.ts.map +1 -0
- package/dist/backend-postgres/index.js +535 -0
- package/dist/backend-postgres/index.js.map +1 -0
- package/dist/backend-postgres/postgres.d.ts +42 -0
- package/dist/backend-postgres/postgres.d.ts.map +1 -0
- package/dist/backend-postgres/postgres.js +234 -0
- package/dist/backend-postgres/postgres.js.map +1 -0
- package/dist/backend-sqlite/index.d.ts +41 -1
- package/dist/backend-sqlite/index.d.ts.map +1 -1
- package/dist/backend-sqlite/index.js +654 -1
- package/dist/backend-sqlite/index.js.map +1 -1
- package/dist/backend-sqlite/sqlite.d.ts +18 -2
- package/dist/backend-sqlite/sqlite.d.ts.map +1 -1
- package/dist/backend-sqlite/sqlite.js +20 -2
- package/dist/backend-sqlite/sqlite.js.map +1 -1
- package/dist/{core/backend.d.ts → backend.d.ts} +7 -5
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js.map +1 -0
- package/dist/bin/openworkflow.d.ts +3 -0
- package/dist/bin/openworkflow.d.ts.map +1 -0
- package/dist/bin/openworkflow.js +44 -0
- package/dist/bin/openworkflow.js.map +1 -0
- package/dist/client.d.ts +141 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/{sdk/sdk.js → client.js} +44 -71
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +27 -21
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +44 -36
- package/dist/config.js.map +1 -1
- package/dist/core/duration.d.ts +4 -2
- package/dist/core/duration.d.ts.map +1 -1
- package/dist/core/duration.js +3 -1
- package/dist/core/duration.js.map +1 -1
- package/dist/core/error.d.ts +14 -0
- package/dist/core/error.d.ts.map +1 -0
- package/dist/core/error.js +18 -0
- package/dist/core/error.js.map +1 -0
- package/dist/core/result.d.ts +14 -4
- package/dist/core/result.d.ts.map +1 -1
- package/dist/core/result.js +10 -0
- package/dist/core/result.js.map +1 -1
- package/dist/core/retry.d.ts +0 -9
- package/dist/core/retry.d.ts.map +1 -1
- package/dist/core/retry.js +0 -14
- package/dist/core/retry.js.map +1 -1
- package/dist/core/step.d.ts +1 -32
- package/dist/core/step.d.ts.map +1 -1
- package/dist/core/step.js +0 -35
- package/dist/core/step.js.map +1 -1
- package/dist/core/workflow.d.ts +2 -47
- package/dist/core/workflow.d.ts.map +1 -1
- package/dist/core/workflow.js +0 -44
- package/dist/core/workflow.js.map +1 -1
- package/dist/{execution/execution.d.ts → execution.d.ts} +4 -26
- package/dist/execution.d.ts.map +1 -0
- package/dist/{execution/execution.js → execution.js} +4 -4
- package/dist/execution.js.map +1 -0
- package/dist/index.d.ts +6 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +8 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +5 -0
- package/dist/internal.js.map +1 -0
- package/dist/pg/backend.d.ts +42 -0
- package/dist/pg/backend.d.ts.map +1 -0
- package/dist/pg/backend.js +534 -0
- package/dist/pg/backend.js.map +1 -0
- package/dist/pg/index.d.ts +3 -0
- package/dist/pg/index.d.ts.map +1 -0
- package/dist/pg/index.js +3 -0
- package/dist/pg/index.js.map +1 -0
- package/dist/pg/postgres.d.ts +42 -0
- package/dist/pg/postgres.d.ts.map +1 -0
- package/dist/pg/postgres.js +234 -0
- package/dist/pg/postgres.js.map +1 -0
- package/dist/pg/scripts/db-migrate.d.ts +2 -0
- package/dist/pg/scripts/db-migrate.d.ts.map +1 -0
- package/dist/pg/scripts/db-migrate.js +5 -0
- package/dist/pg/scripts/db-migrate.js.map +1 -0
- package/dist/pg/scripts/db-reset.d.ts +2 -0
- package/dist/pg/scripts/db-reset.d.ts.map +1 -0
- package/dist/pg/scripts/db-reset.js +6 -0
- package/dist/pg/scripts/db-reset.js.map +1 -0
- package/dist/pg/scripts/squawk.d.ts +2 -0
- package/dist/pg/scripts/squawk.d.ts.map +1 -0
- package/dist/pg/scripts/squawk.js +17 -0
- package/dist/pg/scripts/squawk.js.map +1 -0
- package/dist/pg/vitest.global-setup.d.ts +3 -0
- package/dist/pg/vitest.global-setup.d.ts.map +1 -0
- package/dist/pg/vitest.global-setup.js +8 -0
- package/dist/pg/vitest.global-setup.js.map +1 -0
- package/dist/registry.d.ts +27 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +49 -0
- package/dist/registry.js.map +1 -0
- package/dist/{backend-sqlite → sqlite}/backend.d.ts +6 -4
- package/dist/sqlite/backend.d.ts.map +1 -0
- package/dist/{backend-sqlite → sqlite}/backend.js +31 -5
- package/dist/sqlite/backend.js.map +1 -0
- package/dist/sqlite/index.d.ts +3 -0
- package/dist/sqlite/index.d.ts.map +1 -0
- package/dist/sqlite/index.js +3 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite/sqlite.d.ts +61 -0
- package/dist/sqlite/sqlite.d.ts.map +1 -0
- package/dist/sqlite/sqlite.js +247 -0
- package/dist/sqlite/sqlite.js.map +1 -0
- package/dist/testing/backend.testsuite.d.ts +20 -0
- package/dist/testing/backend.testsuite.d.ts.map +1 -0
- package/dist/{core → testing}/backend.testsuite.js +186 -53
- package/dist/testing/backend.testsuite.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/{worker/worker.d.ts → worker.d.ts} +11 -4
- package/dist/worker.d.ts.map +1 -0
- package/dist/{worker/worker.js → worker.js} +20 -10
- package/dist/worker.js.map +1 -0
- package/dist/workflow.d.ts +60 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +49 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +13 -3
- package/dist/backend-sqlite/backend.d.ts.map +0 -1
- package/dist/backend-sqlite/backend.js.map +0 -1
- package/dist/config/config.d.ts +0 -102
- package/dist/config/config.d.ts.map +0 -1
- package/dist/config/config.js +0 -29
- package/dist/config/config.js.map +0 -1
- package/dist/config/index.d.ts +0 -3
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -2
- package/dist/config/index.js.map +0 -1
- package/dist/core/backend-test-suite.d.ts +0 -22
- package/dist/core/backend-test-suite.d.ts.map +0 -1
- package/dist/core/backend-test-suite.js +0 -960
- package/dist/core/backend-test-suite.js.map +0 -1
- package/dist/core/backend.d.ts.map +0 -1
- package/dist/core/backend.js.map +0 -1
- package/dist/core/backend.testsuite.d.ts +0 -21
- package/dist/core/backend.testsuite.d.ts.map +0 -1
- package/dist/core/backend.testsuite.js.map +0 -1
- package/dist/core/duration.test.d.ts +0 -2
- package/dist/core/duration.test.d.ts.map +0 -1
- package/dist/core/duration.test.js +0 -264
- package/dist/core/duration.test.js.map +0 -1
- package/dist/core/result.test.d.ts +0 -2
- package/dist/core/result.test.d.ts.map +0 -1
- package/dist/core/result.test.js +0 -11
- package/dist/core/result.test.js.map +0 -1
- package/dist/core/retry.test.d.ts +0 -2
- package/dist/core/retry.test.d.ts.map +0 -1
- package/dist/core/retry.test.js +0 -36
- package/dist/core/retry.test.js.map +0 -1
- package/dist/core/step.test.d.ts +0 -2
- package/dist/core/step.test.d.ts.map +0 -1
- package/dist/core/step.test.js +0 -340
- package/dist/core/step.test.js.map +0 -1
- package/dist/core/workflow.test.d.ts +0 -2
- package/dist/core/workflow.test.d.ts.map +0 -1
- package/dist/core/workflow.test.js +0 -216
- package/dist/core/workflow.test.js.map +0 -1
- package/dist/execution/execution.d.ts.map +0 -1
- package/dist/execution/execution.js.map +0 -1
- package/dist/execution/execution.test.d.ts +0 -2
- package/dist/execution/execution.test.d.ts.map +0 -1
- package/dist/execution/execution.test.js +0 -382
- package/dist/execution/execution.test.js.map +0 -1
- package/dist/global.d.ts +0 -62
- package/dist/global.d.ts.map +0 -1
- package/dist/global.js +0 -78
- package/dist/global.js.map +0 -1
- package/dist/sdk/sdk.d.ts +0 -182
- package/dist/sdk/sdk.d.ts.map +0 -1
- package/dist/sdk/sdk.js.map +0 -1
- package/dist/sdk/sdk.test.d.ts +0 -2
- package/dist/sdk/sdk.test.d.ts.map +0 -1
- package/dist/sdk/sdk.test.js +0 -195
- package/dist/sdk/sdk.test.js.map +0 -1
- package/dist/worker/worker.d.ts.map +0 -1
- package/dist/worker/worker.js.map +0 -1
- package/dist/worker/worker.test.d.ts +0 -2
- package/dist/worker/worker.test.d.ts.map +0 -1
- package/dist/worker/worker.test.js +0 -786
- package/dist/worker/worker.test.js.map +0 -1
- /package/dist/{core/backend.js → backend.js} +0 -0
|
@@ -1,2 +1,655 @@
|
|
|
1
|
-
|
|
1
|
+
import { DEFAULT_NAMESPACE_ID } from "../backend.js";
|
|
2
|
+
import { DEFAULT_RETRY_POLICY } from "../core/retry.js";
|
|
3
|
+
import { newDatabase, migrate, generateUUID, now, addMilliseconds, toJSON, fromJSON, toISO, fromISO, } from "./sqlite.js";
|
|
4
|
+
const DEFAULT_PAGINATION_PAGE_SIZE = 100;
|
|
5
|
+
/**
|
|
6
|
+
* Manages a connection to a SQLite database for workflow operations.
|
|
7
|
+
*/
|
|
8
|
+
export class BackendSqlite {
|
|
9
|
+
db;
|
|
10
|
+
namespaceId;
|
|
11
|
+
constructor(db, namespaceId) {
|
|
12
|
+
this.db = db;
|
|
13
|
+
this.namespaceId = namespaceId;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create and initialize a new BackendSqlite instance. This will
|
|
17
|
+
* automatically run migrations on startup unless `runMigrations` is set to
|
|
18
|
+
* false.
|
|
19
|
+
* @param path - Database path
|
|
20
|
+
* @param options - Backend options
|
|
21
|
+
* @returns A connected backend instance
|
|
22
|
+
*/
|
|
23
|
+
static connect(path, options) {
|
|
24
|
+
const { namespaceId, runMigrations } = {
|
|
25
|
+
namespaceId: DEFAULT_NAMESPACE_ID,
|
|
26
|
+
runMigrations: true,
|
|
27
|
+
...options,
|
|
28
|
+
};
|
|
29
|
+
const db = newDatabase(path);
|
|
30
|
+
if (runMigrations) {
|
|
31
|
+
migrate(db);
|
|
32
|
+
}
|
|
33
|
+
return new BackendSqlite(db, namespaceId);
|
|
34
|
+
}
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
36
|
+
async stop() {
|
|
37
|
+
this.db.close();
|
|
38
|
+
}
|
|
39
|
+
async createWorkflowRun(params) {
|
|
40
|
+
const id = generateUUID();
|
|
41
|
+
const currentTime = now();
|
|
42
|
+
const availableAt = params.availableAt
|
|
43
|
+
? toISO(params.availableAt)
|
|
44
|
+
: currentTime;
|
|
45
|
+
const stmt = this.db.prepare(`
|
|
46
|
+
INSERT INTO "workflow_runs" (
|
|
47
|
+
"namespace_id",
|
|
48
|
+
"id",
|
|
49
|
+
"workflow_name",
|
|
50
|
+
"version",
|
|
51
|
+
"status",
|
|
52
|
+
"idempotency_key",
|
|
53
|
+
"config",
|
|
54
|
+
"context",
|
|
55
|
+
"input",
|
|
56
|
+
"attempts",
|
|
57
|
+
"available_at",
|
|
58
|
+
"deadline_at",
|
|
59
|
+
"created_at",
|
|
60
|
+
"updated_at"
|
|
61
|
+
)
|
|
62
|
+
VALUES (?, ?, ?, ?, 'pending', ?, ?, ?, ?, 0, ?, ?, ?, ?)
|
|
63
|
+
`);
|
|
64
|
+
stmt.run(this.namespaceId, id, params.workflowName, params.version, params.idempotencyKey, toJSON(params.config), toJSON(params.context), toJSON(params.input), availableAt, toISO(params.deadlineAt), currentTime, currentTime);
|
|
65
|
+
const workflowRun = await this.getWorkflowRun({ workflowRunId: id });
|
|
66
|
+
if (!workflowRun)
|
|
67
|
+
throw new Error("Failed to create workflow run");
|
|
68
|
+
return workflowRun;
|
|
69
|
+
}
|
|
70
|
+
getWorkflowRun(params) {
|
|
71
|
+
const stmt = this.db.prepare(`
|
|
72
|
+
SELECT *
|
|
73
|
+
FROM "workflow_runs"
|
|
74
|
+
WHERE "namespace_id" = ? AND "id" = ?
|
|
75
|
+
LIMIT 1
|
|
76
|
+
`);
|
|
77
|
+
const row = stmt.get(this.namespaceId, params.workflowRunId);
|
|
78
|
+
return Promise.resolve(row ? rowToWorkflowRun(row) : null);
|
|
79
|
+
}
|
|
80
|
+
async claimWorkflowRun(params) {
|
|
81
|
+
const currentTime = now();
|
|
82
|
+
const newAvailableAt = addMilliseconds(currentTime, params.leaseDurationMs);
|
|
83
|
+
// SQLite doesn't have SKIP LOCKED, so we need to handle claims differently
|
|
84
|
+
this.db.exec("BEGIN IMMEDIATE");
|
|
85
|
+
try {
|
|
86
|
+
// 1. mark any deadline-expired workflow runs as failed
|
|
87
|
+
const expireStmt = this.db.prepare(`
|
|
88
|
+
UPDATE "workflow_runs"
|
|
89
|
+
SET
|
|
90
|
+
"status" = 'failed',
|
|
91
|
+
"error" = ?,
|
|
92
|
+
"worker_id" = NULL,
|
|
93
|
+
"available_at" = NULL,
|
|
94
|
+
"finished_at" = ?,
|
|
95
|
+
"updated_at" = ?
|
|
96
|
+
WHERE "namespace_id" = ?
|
|
97
|
+
AND "status" IN ('pending', 'running', 'sleeping')
|
|
98
|
+
AND "deadline_at" IS NOT NULL
|
|
99
|
+
AND "deadline_at" <= ?
|
|
100
|
+
`);
|
|
101
|
+
expireStmt.run(toJSON({ message: "Workflow run deadline exceeded" }), currentTime, currentTime, this.namespaceId, currentTime);
|
|
102
|
+
// 2. find an available workflow run to claim
|
|
103
|
+
const findStmt = this.db.prepare(`
|
|
104
|
+
SELECT "id"
|
|
105
|
+
FROM "workflow_runs"
|
|
106
|
+
WHERE "namespace_id" = ?
|
|
107
|
+
AND "status" IN ('pending', 'running', 'sleeping')
|
|
108
|
+
AND "available_at" <= ?
|
|
109
|
+
AND ("deadline_at" IS NULL OR "deadline_at" > ?)
|
|
110
|
+
ORDER BY
|
|
111
|
+
CASE WHEN "status" = 'pending' THEN 0 ELSE 1 END,
|
|
112
|
+
"available_at",
|
|
113
|
+
"created_at"
|
|
114
|
+
LIMIT 1
|
|
115
|
+
`);
|
|
116
|
+
const candidate = findStmt.get(this.namespaceId, currentTime, currentTime);
|
|
117
|
+
if (!candidate) {
|
|
118
|
+
this.db.exec("COMMIT");
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
// 3. claim the workflow run
|
|
122
|
+
const claimStmt = this.db.prepare(`
|
|
123
|
+
UPDATE "workflow_runs"
|
|
124
|
+
SET
|
|
125
|
+
"status" = 'running',
|
|
126
|
+
"attempts" = "attempts" + 1,
|
|
127
|
+
"worker_id" = ?,
|
|
128
|
+
"available_at" = ?,
|
|
129
|
+
"started_at" = COALESCE("started_at", ?),
|
|
130
|
+
"updated_at" = ?
|
|
131
|
+
WHERE "id" = ?
|
|
132
|
+
AND "namespace_id" = ?
|
|
133
|
+
`);
|
|
134
|
+
claimStmt.run(params.workerId, newAvailableAt, currentTime, currentTime, candidate.id, this.namespaceId);
|
|
135
|
+
this.db.exec("COMMIT");
|
|
136
|
+
return await this.getWorkflowRun({ workflowRunId: candidate.id });
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
this.db.exec("ROLLBACK");
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async extendWorkflowRunLease(params) {
|
|
144
|
+
const currentTime = now();
|
|
145
|
+
const newAvailableAt = addMilliseconds(currentTime, params.leaseDurationMs);
|
|
146
|
+
const stmt = this.db.prepare(`
|
|
147
|
+
UPDATE "workflow_runs"
|
|
148
|
+
SET
|
|
149
|
+
"available_at" = ?,
|
|
150
|
+
"updated_at" = ?
|
|
151
|
+
WHERE "namespace_id" = ?
|
|
152
|
+
AND "id" = ?
|
|
153
|
+
AND "status" = 'running'
|
|
154
|
+
AND "worker_id" = ?
|
|
155
|
+
`);
|
|
156
|
+
const result = stmt.run(newAvailableAt, currentTime, this.namespaceId, params.workflowRunId, params.workerId);
|
|
157
|
+
if (result.changes === 0) {
|
|
158
|
+
throw new Error("Failed to extend lease for workflow run");
|
|
159
|
+
}
|
|
160
|
+
const updated = await this.getWorkflowRun({
|
|
161
|
+
workflowRunId: params.workflowRunId,
|
|
162
|
+
});
|
|
163
|
+
if (!updated)
|
|
164
|
+
throw new Error("Failed to extend lease for workflow run");
|
|
165
|
+
return updated;
|
|
166
|
+
}
|
|
167
|
+
async sleepWorkflowRun(params) {
|
|
168
|
+
const currentTime = now();
|
|
169
|
+
const stmt = this.db.prepare(`
|
|
170
|
+
UPDATE "workflow_runs"
|
|
171
|
+
SET
|
|
172
|
+
"status" = 'sleeping',
|
|
173
|
+
"available_at" = ?,
|
|
174
|
+
"worker_id" = NULL,
|
|
175
|
+
"updated_at" = ?
|
|
176
|
+
WHERE "namespace_id" = ?
|
|
177
|
+
AND "id" = ?
|
|
178
|
+
AND "status" NOT IN ('completed', 'failed', 'canceled')
|
|
179
|
+
AND "worker_id" = ?
|
|
180
|
+
`);
|
|
181
|
+
const result = stmt.run(toISO(params.availableAt), currentTime, this.namespaceId, params.workflowRunId, params.workerId);
|
|
182
|
+
if (result.changes === 0) {
|
|
183
|
+
throw new Error("Failed to sleep workflow run");
|
|
184
|
+
}
|
|
185
|
+
const updated = await this.getWorkflowRun({
|
|
186
|
+
workflowRunId: params.workflowRunId,
|
|
187
|
+
});
|
|
188
|
+
if (!updated)
|
|
189
|
+
throw new Error("Failed to sleep workflow run");
|
|
190
|
+
return updated;
|
|
191
|
+
}
|
|
192
|
+
async completeWorkflowRun(params) {
|
|
193
|
+
const currentTime = now();
|
|
194
|
+
const stmt = this.db.prepare(`
|
|
195
|
+
UPDATE "workflow_runs"
|
|
196
|
+
SET
|
|
197
|
+
"status" = 'completed',
|
|
198
|
+
"output" = ?,
|
|
199
|
+
"error" = NULL,
|
|
200
|
+
"worker_id" = ?,
|
|
201
|
+
"available_at" = NULL,
|
|
202
|
+
"finished_at" = ?,
|
|
203
|
+
"updated_at" = ?
|
|
204
|
+
WHERE "namespace_id" = ?
|
|
205
|
+
AND "id" = ?
|
|
206
|
+
AND "status" = 'running'
|
|
207
|
+
AND "worker_id" = ?
|
|
208
|
+
`);
|
|
209
|
+
const result = stmt.run(toJSON(params.output), params.workerId, currentTime, currentTime, this.namespaceId, params.workflowRunId, params.workerId);
|
|
210
|
+
if (result.changes === 0) {
|
|
211
|
+
throw new Error("Failed to mark workflow run completed");
|
|
212
|
+
}
|
|
213
|
+
const updated = await this.getWorkflowRun({
|
|
214
|
+
workflowRunId: params.workflowRunId,
|
|
215
|
+
});
|
|
216
|
+
if (!updated)
|
|
217
|
+
throw new Error("Failed to mark workflow run completed");
|
|
218
|
+
return updated;
|
|
219
|
+
}
|
|
220
|
+
async failWorkflowRun(params) {
|
|
221
|
+
const { workflowRunId, error } = params;
|
|
222
|
+
const { initialIntervalMs, backoffCoefficient, maximumIntervalMs } = DEFAULT_RETRY_POLICY;
|
|
223
|
+
const currentTime = now();
|
|
224
|
+
// Get the current workflow run to access attempts
|
|
225
|
+
const workflowRun = await this.getWorkflowRun({ workflowRunId });
|
|
226
|
+
if (!workflowRun)
|
|
227
|
+
throw new Error("Workflow run not found");
|
|
228
|
+
// Calculate retry delay
|
|
229
|
+
const backoffMs = initialIntervalMs *
|
|
230
|
+
Math.pow(backoffCoefficient, workflowRun.attempts - 1);
|
|
231
|
+
const retryDelayMs = Math.min(backoffMs, maximumIntervalMs);
|
|
232
|
+
// Determine if we should reschedule or permanently fail
|
|
233
|
+
const nextRetryTime = new Date(Date.now() + retryDelayMs);
|
|
234
|
+
const shouldRetry = !workflowRun.deadlineAt || nextRetryTime < workflowRun.deadlineAt;
|
|
235
|
+
const status = shouldRetry ? "pending" : "failed";
|
|
236
|
+
const availableAt = shouldRetry ? nextRetryTime.toISOString() : null;
|
|
237
|
+
const finishedAt = shouldRetry ? null : currentTime;
|
|
238
|
+
const stmt = this.db.prepare(`
|
|
239
|
+
UPDATE "workflow_runs"
|
|
240
|
+
SET
|
|
241
|
+
"status" = ?,
|
|
242
|
+
"available_at" = ?,
|
|
243
|
+
"finished_at" = ?,
|
|
244
|
+
"error" = ?,
|
|
245
|
+
"worker_id" = NULL,
|
|
246
|
+
"started_at" = NULL,
|
|
247
|
+
"updated_at" = ?
|
|
248
|
+
WHERE "namespace_id" = ?
|
|
249
|
+
AND "id" = ?
|
|
250
|
+
AND "status" = 'running'
|
|
251
|
+
AND "worker_id" = ?
|
|
252
|
+
`);
|
|
253
|
+
const result = stmt.run(status, availableAt, finishedAt, toJSON(error), currentTime, this.namespaceId, workflowRunId, params.workerId);
|
|
254
|
+
if (result.changes === 0) {
|
|
255
|
+
throw new Error("Failed to mark workflow run failed");
|
|
256
|
+
}
|
|
257
|
+
const updated = await this.getWorkflowRun({ workflowRunId });
|
|
258
|
+
if (!updated)
|
|
259
|
+
throw new Error("Failed to mark workflow run failed");
|
|
260
|
+
return updated;
|
|
261
|
+
}
|
|
262
|
+
async cancelWorkflowRun(params) {
|
|
263
|
+
const currentTime = now();
|
|
264
|
+
const stmt = this.db.prepare(`
|
|
265
|
+
UPDATE "workflow_runs"
|
|
266
|
+
SET
|
|
267
|
+
"status" = 'canceled',
|
|
268
|
+
"worker_id" = NULL,
|
|
269
|
+
"available_at" = NULL,
|
|
270
|
+
"finished_at" = ?,
|
|
271
|
+
"updated_at" = ?
|
|
272
|
+
WHERE "namespace_id" = ?
|
|
273
|
+
AND "id" = ?
|
|
274
|
+
AND "status" IN ('pending', 'running', 'sleeping')
|
|
275
|
+
`);
|
|
276
|
+
const result = stmt.run(currentTime, currentTime, this.namespaceId, params.workflowRunId);
|
|
277
|
+
if (result.changes === 0) {
|
|
278
|
+
// workflow may already be in a terminal state
|
|
279
|
+
const existing = await this.getWorkflowRun({
|
|
280
|
+
workflowRunId: params.workflowRunId,
|
|
281
|
+
});
|
|
282
|
+
if (!existing) {
|
|
283
|
+
throw new Error(`Workflow run ${params.workflowRunId} does not exist`);
|
|
284
|
+
}
|
|
285
|
+
// if already canceled, just return it
|
|
286
|
+
if (existing.status === "canceled") {
|
|
287
|
+
return existing;
|
|
288
|
+
}
|
|
289
|
+
// throw error for completed/failed workflows
|
|
290
|
+
if (["completed", "failed"].includes(existing.status)) {
|
|
291
|
+
throw new Error(`Cannot cancel workflow run ${params.workflowRunId} with status ${existing.status}`);
|
|
292
|
+
}
|
|
293
|
+
throw new Error("Failed to cancel workflow run");
|
|
294
|
+
}
|
|
295
|
+
const updated = await this.getWorkflowRun({
|
|
296
|
+
workflowRunId: params.workflowRunId,
|
|
297
|
+
});
|
|
298
|
+
if (!updated)
|
|
299
|
+
throw new Error("Failed to cancel workflow run");
|
|
300
|
+
return updated;
|
|
301
|
+
}
|
|
302
|
+
listWorkflowRuns(params) {
|
|
303
|
+
const limit = params.limit ?? DEFAULT_PAGINATION_PAGE_SIZE;
|
|
304
|
+
const { after, before } = params;
|
|
305
|
+
let cursor = null;
|
|
306
|
+
if (after) {
|
|
307
|
+
cursor = decodeCursor(after);
|
|
308
|
+
}
|
|
309
|
+
else if (before) {
|
|
310
|
+
cursor = decodeCursor(before);
|
|
311
|
+
}
|
|
312
|
+
const order = before
|
|
313
|
+
? `ORDER BY "created_at" DESC, "id" DESC`
|
|
314
|
+
: `ORDER BY "created_at" ASC, "id" ASC`;
|
|
315
|
+
let query;
|
|
316
|
+
let queryParams;
|
|
317
|
+
if (cursor) {
|
|
318
|
+
const op = after ? ">" : "<";
|
|
319
|
+
query = `
|
|
320
|
+
SELECT *
|
|
321
|
+
FROM "workflow_runs"
|
|
322
|
+
WHERE "namespace_id" = ?
|
|
323
|
+
AND ("created_at", "id") ${op} (?, ?)
|
|
324
|
+
${order}
|
|
325
|
+
LIMIT ?
|
|
326
|
+
`;
|
|
327
|
+
queryParams = [
|
|
328
|
+
this.namespaceId,
|
|
329
|
+
cursor.createdAt.toISOString(),
|
|
330
|
+
cursor.id,
|
|
331
|
+
limit + 1,
|
|
332
|
+
];
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
query = `
|
|
336
|
+
SELECT *
|
|
337
|
+
FROM "workflow_runs"
|
|
338
|
+
WHERE "namespace_id" = ?
|
|
339
|
+
${order}
|
|
340
|
+
LIMIT ?
|
|
341
|
+
`;
|
|
342
|
+
queryParams = [this.namespaceId, limit + 1];
|
|
343
|
+
}
|
|
344
|
+
const stmt = this.db.prepare(query);
|
|
345
|
+
const rawRows = stmt.all(...queryParams);
|
|
346
|
+
if (!Array.isArray(rawRows)) {
|
|
347
|
+
return Promise.resolve({
|
|
348
|
+
data: [],
|
|
349
|
+
pagination: { next: null, prev: null },
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
const rows = rawRows.map((row) => rowToWorkflowRun(row));
|
|
353
|
+
return Promise.resolve(this.processPaginationResults(rows, limit, !!after, !!before));
|
|
354
|
+
}
|
|
355
|
+
listStepAttempts(params) {
|
|
356
|
+
const limit = params.limit ?? DEFAULT_PAGINATION_PAGE_SIZE;
|
|
357
|
+
const { after, before } = params;
|
|
358
|
+
let cursor = null;
|
|
359
|
+
if (after) {
|
|
360
|
+
cursor = decodeCursor(after);
|
|
361
|
+
}
|
|
362
|
+
else if (before) {
|
|
363
|
+
cursor = decodeCursor(before);
|
|
364
|
+
}
|
|
365
|
+
const order = before
|
|
366
|
+
? `ORDER BY "created_at" DESC, "id" DESC`
|
|
367
|
+
: `ORDER BY "created_at" ASC, "id" ASC`;
|
|
368
|
+
let query;
|
|
369
|
+
let queryParams;
|
|
370
|
+
if (cursor) {
|
|
371
|
+
const op = after ? ">" : "<";
|
|
372
|
+
query = `
|
|
373
|
+
SELECT *
|
|
374
|
+
FROM "step_attempts"
|
|
375
|
+
WHERE "namespace_id" = ?
|
|
376
|
+
AND "workflow_run_id" = ?
|
|
377
|
+
AND ("created_at", "id") ${op} (?, ?)
|
|
378
|
+
${order}
|
|
379
|
+
LIMIT ?
|
|
380
|
+
`;
|
|
381
|
+
queryParams = [
|
|
382
|
+
this.namespaceId,
|
|
383
|
+
params.workflowRunId,
|
|
384
|
+
cursor.createdAt.toISOString(),
|
|
385
|
+
cursor.id,
|
|
386
|
+
limit + 1,
|
|
387
|
+
];
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
query = `
|
|
391
|
+
SELECT *
|
|
392
|
+
FROM "step_attempts"
|
|
393
|
+
WHERE "namespace_id" = ?
|
|
394
|
+
AND "workflow_run_id" = ?
|
|
395
|
+
${order}
|
|
396
|
+
LIMIT ?
|
|
397
|
+
`;
|
|
398
|
+
queryParams = [this.namespaceId, params.workflowRunId, limit + 1];
|
|
399
|
+
}
|
|
400
|
+
const stmt = this.db.prepare(query);
|
|
401
|
+
const rawRows = stmt.all(...queryParams);
|
|
402
|
+
if (!Array.isArray(rawRows)) {
|
|
403
|
+
return Promise.resolve({
|
|
404
|
+
data: [],
|
|
405
|
+
pagination: { next: null, prev: null },
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
const rows = rawRows.map((row) => rowToStepAttempt(row));
|
|
409
|
+
return Promise.resolve(this.processPaginationResults(rows, limit, !!after, !!before));
|
|
410
|
+
}
|
|
411
|
+
processPaginationResults(rows, limit, hasAfter, hasBefore) {
|
|
412
|
+
const data = rows;
|
|
413
|
+
let hasNext = false;
|
|
414
|
+
let hasPrev = false;
|
|
415
|
+
if (hasBefore) {
|
|
416
|
+
data.reverse();
|
|
417
|
+
if (data.length > limit) {
|
|
418
|
+
hasPrev = true;
|
|
419
|
+
data.shift();
|
|
420
|
+
}
|
|
421
|
+
hasNext = true;
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
if (data.length > limit) {
|
|
425
|
+
hasNext = true;
|
|
426
|
+
data.pop();
|
|
427
|
+
}
|
|
428
|
+
if (hasAfter) {
|
|
429
|
+
hasPrev = true;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
const lastItem = data.at(-1);
|
|
433
|
+
const nextCursor = hasNext && lastItem ? encodeCursor(lastItem) : null;
|
|
434
|
+
const firstItem = data[0];
|
|
435
|
+
const prevCursor = hasPrev && firstItem ? encodeCursor(firstItem) : null;
|
|
436
|
+
return {
|
|
437
|
+
data,
|
|
438
|
+
pagination: {
|
|
439
|
+
next: nextCursor,
|
|
440
|
+
prev: prevCursor,
|
|
441
|
+
},
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
async createStepAttempt(params) {
|
|
445
|
+
const id = generateUUID();
|
|
446
|
+
const currentTime = now();
|
|
447
|
+
const stmt = this.db.prepare(`
|
|
448
|
+
INSERT INTO "step_attempts" (
|
|
449
|
+
"namespace_id",
|
|
450
|
+
"id",
|
|
451
|
+
"workflow_run_id",
|
|
452
|
+
"step_name",
|
|
453
|
+
"kind",
|
|
454
|
+
"status",
|
|
455
|
+
"config",
|
|
456
|
+
"context",
|
|
457
|
+
"started_at",
|
|
458
|
+
"created_at",
|
|
459
|
+
"updated_at"
|
|
460
|
+
)
|
|
461
|
+
VALUES (?, ?, ?, ?, ?, 'running', ?, ?, ?, ?, ?)
|
|
462
|
+
`);
|
|
463
|
+
stmt.run(this.namespaceId, id, params.workflowRunId, params.stepName, params.kind, toJSON(params.config), toJSON(params.context), currentTime, currentTime, currentTime);
|
|
464
|
+
const stepAttempt = await this.getStepAttempt({ stepAttemptId: id });
|
|
465
|
+
if (!stepAttempt)
|
|
466
|
+
throw new Error("Failed to create step attempt");
|
|
467
|
+
return stepAttempt;
|
|
468
|
+
}
|
|
469
|
+
getStepAttempt(params) {
|
|
470
|
+
const stmt = this.db.prepare(`
|
|
471
|
+
SELECT *
|
|
472
|
+
FROM "step_attempts"
|
|
473
|
+
WHERE "namespace_id" = ? AND "id" = ?
|
|
474
|
+
LIMIT 1
|
|
475
|
+
`);
|
|
476
|
+
const row = stmt.get(this.namespaceId, params.stepAttemptId);
|
|
477
|
+
return Promise.resolve(row ? rowToStepAttempt(row) : null);
|
|
478
|
+
}
|
|
479
|
+
async completeStepAttempt(params) {
|
|
480
|
+
const currentTime = now();
|
|
481
|
+
// Check that the workflow is running and owned by the worker
|
|
482
|
+
const workflowStmt = this.db.prepare(`
|
|
483
|
+
SELECT "id"
|
|
484
|
+
FROM "workflow_runs"
|
|
485
|
+
WHERE "namespace_id" = ?
|
|
486
|
+
AND "id" = ?
|
|
487
|
+
AND "status" = 'running'
|
|
488
|
+
AND "worker_id" = ?
|
|
489
|
+
`);
|
|
490
|
+
const workflowRow = workflowStmt.get(this.namespaceId, params.workflowRunId, params.workerId);
|
|
491
|
+
if (!workflowRow) {
|
|
492
|
+
throw new Error("Failed to mark step attempt completed");
|
|
493
|
+
}
|
|
494
|
+
const stmt = this.db.prepare(`
|
|
495
|
+
UPDATE "step_attempts"
|
|
496
|
+
SET
|
|
497
|
+
"status" = 'completed',
|
|
498
|
+
"output" = ?,
|
|
499
|
+
"error" = NULL,
|
|
500
|
+
"finished_at" = ?,
|
|
501
|
+
"updated_at" = ?
|
|
502
|
+
WHERE "namespace_id" = ?
|
|
503
|
+
AND "workflow_run_id" = ?
|
|
504
|
+
AND "id" = ?
|
|
505
|
+
AND "status" = 'running'
|
|
506
|
+
`);
|
|
507
|
+
const result = stmt.run(toJSON(params.output), currentTime, currentTime, this.namespaceId, params.workflowRunId, params.stepAttemptId);
|
|
508
|
+
if (result.changes === 0) {
|
|
509
|
+
throw new Error("Failed to mark step attempt completed");
|
|
510
|
+
}
|
|
511
|
+
const updated = await this.getStepAttempt({
|
|
512
|
+
stepAttemptId: params.stepAttemptId,
|
|
513
|
+
});
|
|
514
|
+
if (!updated)
|
|
515
|
+
throw new Error("Failed to mark step attempt completed");
|
|
516
|
+
return updated;
|
|
517
|
+
}
|
|
518
|
+
async failStepAttempt(params) {
|
|
519
|
+
const currentTime = now();
|
|
520
|
+
// Check that the workflow is running and owned by the worker
|
|
521
|
+
const workflowStmt = this.db.prepare(`
|
|
522
|
+
SELECT "id"
|
|
523
|
+
FROM "workflow_runs"
|
|
524
|
+
WHERE "namespace_id" = ?
|
|
525
|
+
AND "id" = ?
|
|
526
|
+
AND "status" = 'running'
|
|
527
|
+
AND "worker_id" = ?
|
|
528
|
+
`);
|
|
529
|
+
const workflowRow = workflowStmt.get(this.namespaceId, params.workflowRunId, params.workerId);
|
|
530
|
+
if (!workflowRow) {
|
|
531
|
+
throw new Error("Failed to mark step attempt failed");
|
|
532
|
+
}
|
|
533
|
+
const stmt = this.db.prepare(`
|
|
534
|
+
UPDATE "step_attempts"
|
|
535
|
+
SET
|
|
536
|
+
"status" = 'failed',
|
|
537
|
+
"output" = NULL,
|
|
538
|
+
"error" = ?,
|
|
539
|
+
"finished_at" = ?,
|
|
540
|
+
"updated_at" = ?
|
|
541
|
+
WHERE "namespace_id" = ?
|
|
542
|
+
AND "workflow_run_id" = ?
|
|
543
|
+
AND "id" = ?
|
|
544
|
+
AND "status" = 'running'
|
|
545
|
+
`);
|
|
546
|
+
const result = stmt.run(toJSON(params.error), currentTime, currentTime, this.namespaceId, params.workflowRunId, params.stepAttemptId);
|
|
547
|
+
if (result.changes === 0) {
|
|
548
|
+
throw new Error("Failed to mark step attempt failed");
|
|
549
|
+
}
|
|
550
|
+
const updated = await this.getStepAttempt({
|
|
551
|
+
stepAttemptId: params.stepAttemptId,
|
|
552
|
+
});
|
|
553
|
+
if (!updated)
|
|
554
|
+
throw new Error("Failed to mark step attempt failed");
|
|
555
|
+
return updated;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
// Conversion functions
|
|
559
|
+
/**
|
|
560
|
+
* Convert a database row to a WorkflowRun.
|
|
561
|
+
* @param row - Workflow run row
|
|
562
|
+
* @returns Workflow run
|
|
563
|
+
* @throws {Error} If required fields are missing
|
|
564
|
+
*/
|
|
565
|
+
function rowToWorkflowRun(row) {
|
|
566
|
+
const createdAt = fromISO(row.created_at);
|
|
567
|
+
const updatedAt = fromISO(row.updated_at);
|
|
568
|
+
const config = fromJSON(row.config);
|
|
569
|
+
if (!createdAt)
|
|
570
|
+
throw new Error("createdAt is required");
|
|
571
|
+
if (!updatedAt)
|
|
572
|
+
throw new Error("updatedAt is required");
|
|
573
|
+
if (config === null)
|
|
574
|
+
throw new Error("config is required");
|
|
575
|
+
return {
|
|
576
|
+
namespaceId: row.namespace_id,
|
|
577
|
+
id: row.id,
|
|
578
|
+
workflowName: row.workflow_name,
|
|
579
|
+
version: row.version,
|
|
580
|
+
status: row.status,
|
|
581
|
+
idempotencyKey: row.idempotency_key,
|
|
582
|
+
config: config,
|
|
583
|
+
context: fromJSON(row.context),
|
|
584
|
+
input: fromJSON(row.input),
|
|
585
|
+
output: fromJSON(row.output),
|
|
586
|
+
error: fromJSON(row.error),
|
|
587
|
+
attempts: row.attempts,
|
|
588
|
+
parentStepAttemptNamespaceId: row.parent_step_attempt_namespace_id,
|
|
589
|
+
parentStepAttemptId: row.parent_step_attempt_id,
|
|
590
|
+
workerId: row.worker_id,
|
|
591
|
+
availableAt: fromISO(row.available_at),
|
|
592
|
+
deadlineAt: fromISO(row.deadline_at),
|
|
593
|
+
startedAt: fromISO(row.started_at),
|
|
594
|
+
finishedAt: fromISO(row.finished_at),
|
|
595
|
+
createdAt,
|
|
596
|
+
updatedAt,
|
|
597
|
+
};
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Convert a database row to a StepAttempt.
|
|
601
|
+
* @param row - Step attempt row
|
|
602
|
+
* @returns Step attempt
|
|
603
|
+
* @throws {Error} If required fields are missing
|
|
604
|
+
*/
|
|
605
|
+
function rowToStepAttempt(row) {
|
|
606
|
+
const createdAt = fromISO(row.created_at);
|
|
607
|
+
const updatedAt = fromISO(row.updated_at);
|
|
608
|
+
const config = fromJSON(row.config);
|
|
609
|
+
if (!createdAt)
|
|
610
|
+
throw new Error("createdAt is required");
|
|
611
|
+
if (!updatedAt)
|
|
612
|
+
throw new Error("updatedAt is required");
|
|
613
|
+
if (config === null)
|
|
614
|
+
throw new Error("config is required");
|
|
615
|
+
return {
|
|
616
|
+
namespaceId: row.namespace_id,
|
|
617
|
+
id: row.id,
|
|
618
|
+
workflowRunId: row.workflow_run_id,
|
|
619
|
+
stepName: row.step_name,
|
|
620
|
+
kind: row.kind,
|
|
621
|
+
status: row.status,
|
|
622
|
+
config: config,
|
|
623
|
+
context: fromJSON(row.context),
|
|
624
|
+
output: fromJSON(row.output),
|
|
625
|
+
error: fromJSON(row.error),
|
|
626
|
+
childWorkflowRunNamespaceId: row.child_workflow_run_namespace_id,
|
|
627
|
+
childWorkflowRunId: row.child_workflow_run_id,
|
|
628
|
+
startedAt: fromISO(row.started_at),
|
|
629
|
+
finishedAt: fromISO(row.finished_at),
|
|
630
|
+
createdAt,
|
|
631
|
+
updatedAt,
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
/**
|
|
635
|
+
* Encode a pagination cursor to a string.
|
|
636
|
+
* @param item - Cursor data
|
|
637
|
+
* @returns Encoded cursor
|
|
638
|
+
*/
|
|
639
|
+
function encodeCursor(item) {
|
|
640
|
+
return Buffer.from(JSON.stringify({ createdAt: item.createdAt, id: item.id })).toString("base64");
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* Decode a pagination cursor from a string.
|
|
644
|
+
* @param cursor - Encoded cursor
|
|
645
|
+
* @returns Cursor data
|
|
646
|
+
*/
|
|
647
|
+
function decodeCursor(cursor) {
|
|
648
|
+
const decoded = Buffer.from(cursor, "base64").toString("utf8");
|
|
649
|
+
const parsed = JSON.parse(decoded);
|
|
650
|
+
return {
|
|
651
|
+
createdAt: new Date(parsed.createdAt),
|
|
652
|
+
id: parsed.id,
|
|
653
|
+
};
|
|
654
|
+
}
|
|
2
655
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../backend-sqlite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backend-sqlite/index.ts"],"names":[],"mappings":"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"}
|