openworkflow 0.5.0 → 0.6.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.
Files changed (115) hide show
  1. package/README.md +41 -346
  2. package/dist/backend.js +0 -1
  3. package/dist/bin/openworkflow.js +0 -1
  4. package/dist/client.js +0 -1
  5. package/dist/core/duration.js +0 -1
  6. package/dist/core/error.js +0 -1
  7. package/dist/core/json.js +0 -1
  8. package/dist/core/result.js +0 -1
  9. package/dist/core/retry.js +0 -1
  10. package/dist/core/schema.js +0 -1
  11. package/dist/core/step.js +0 -1
  12. package/dist/core/workflow.js +0 -1
  13. package/dist/execution.js +0 -1
  14. package/dist/index.js +0 -1
  15. package/dist/internal.d.ts +3 -5
  16. package/dist/internal.d.ts.map +1 -1
  17. package/dist/internal.js +0 -4
  18. package/dist/{pg → postgres}/backend.d.ts +3 -1
  19. package/dist/postgres/backend.d.ts.map +1 -0
  20. package/dist/{pg → postgres}/backend.js +5 -5
  21. package/dist/postgres/postgres.d.ts.map +1 -0
  22. package/dist/{backend-postgres → postgres}/postgres.js +0 -1
  23. package/dist/postgres/scripts/db-migrate.d.ts.map +1 -0
  24. package/dist/{pg → postgres}/scripts/db-migrate.js +0 -1
  25. package/dist/postgres/scripts/db-reset.d.ts.map +1 -0
  26. package/dist/{pg → postgres}/scripts/db-reset.js +0 -1
  27. package/dist/{pg → postgres}/scripts/squawk.d.ts.map +1 -1
  28. package/dist/{pg → postgres}/scripts/squawk.js +0 -1
  29. package/dist/postgres.d.ts +2 -0
  30. package/dist/postgres.d.ts.map +1 -0
  31. package/dist/postgres.js +1 -0
  32. package/dist/registry.js +0 -1
  33. package/dist/sqlite/backend.d.ts +3 -1
  34. package/dist/sqlite/backend.d.ts.map +1 -1
  35. package/dist/sqlite/backend.js +5 -5
  36. package/dist/sqlite/sqlite.js +0 -1
  37. package/dist/sqlite.d.ts +2 -0
  38. package/dist/sqlite.d.ts.map +1 -0
  39. package/dist/sqlite.js +1 -0
  40. package/dist/worker.js +0 -1
  41. package/dist/workflow.js +0 -1
  42. package/package.json +24 -6
  43. package/dist/backend-postgres/index.d.ts +0 -44
  44. package/dist/backend-postgres/index.d.ts.map +0 -1
  45. package/dist/backend-postgres/index.js +0 -535
  46. package/dist/backend-postgres/index.js.map +0 -1
  47. package/dist/backend-postgres/postgres.d.ts.map +0 -1
  48. package/dist/backend-postgres/postgres.js.map +0 -1
  49. package/dist/backend-sqlite/index.d.ts +0 -42
  50. package/dist/backend-sqlite/index.d.ts.map +0 -1
  51. package/dist/backend-sqlite/index.js +0 -655
  52. package/dist/backend-sqlite/index.js.map +0 -1
  53. package/dist/backend-sqlite/sqlite.d.ts +0 -61
  54. package/dist/backend-sqlite/sqlite.d.ts.map +0 -1
  55. package/dist/backend-sqlite/sqlite.js +0 -247
  56. package/dist/backend-sqlite/sqlite.js.map +0 -1
  57. package/dist/backend.js.map +0 -1
  58. package/dist/bin/openworkflow.js.map +0 -1
  59. package/dist/client.js.map +0 -1
  60. package/dist/config.d.ts +0 -34
  61. package/dist/config.d.ts.map +0 -1
  62. package/dist/config.js +0 -49
  63. package/dist/config.js.map +0 -1
  64. package/dist/core/duration.js.map +0 -1
  65. package/dist/core/error.js.map +0 -1
  66. package/dist/core/json.js.map +0 -1
  67. package/dist/core/result.js.map +0 -1
  68. package/dist/core/retry.js.map +0 -1
  69. package/dist/core/schema.js.map +0 -1
  70. package/dist/core/step.js.map +0 -1
  71. package/dist/core/workflow.js.map +0 -1
  72. package/dist/execution.js.map +0 -1
  73. package/dist/index.js.map +0 -1
  74. package/dist/internal.js.map +0 -1
  75. package/dist/pg/backend.d.ts.map +0 -1
  76. package/dist/pg/backend.js.map +0 -1
  77. package/dist/pg/index.d.ts +0 -3
  78. package/dist/pg/index.d.ts.map +0 -1
  79. package/dist/pg/index.js +0 -3
  80. package/dist/pg/index.js.map +0 -1
  81. package/dist/pg/postgres.d.ts +0 -42
  82. package/dist/pg/postgres.d.ts.map +0 -1
  83. package/dist/pg/postgres.js +0 -234
  84. package/dist/pg/postgres.js.map +0 -1
  85. package/dist/pg/scripts/db-migrate.d.ts.map +0 -1
  86. package/dist/pg/scripts/db-migrate.js.map +0 -1
  87. package/dist/pg/scripts/db-reset.d.ts.map +0 -1
  88. package/dist/pg/scripts/db-reset.js.map +0 -1
  89. package/dist/pg/scripts/squawk.js.map +0 -1
  90. package/dist/pg/vitest.global-setup.d.ts +0 -3
  91. package/dist/pg/vitest.global-setup.d.ts.map +0 -1
  92. package/dist/pg/vitest.global-setup.js +0 -8
  93. package/dist/pg/vitest.global-setup.js.map +0 -1
  94. package/dist/registry.js.map +0 -1
  95. package/dist/sqlite/backend.js.map +0 -1
  96. package/dist/sqlite/index.d.ts +0 -3
  97. package/dist/sqlite/index.d.ts.map +0 -1
  98. package/dist/sqlite/index.js +0 -3
  99. package/dist/sqlite/index.js.map +0 -1
  100. package/dist/sqlite/sqlite.js.map +0 -1
  101. package/dist/testing/backend.testsuite.d.ts +0 -20
  102. package/dist/testing/backend.testsuite.d.ts.map +0 -1
  103. package/dist/testing/backend.testsuite.js +0 -1091
  104. package/dist/testing/backend.testsuite.js.map +0 -1
  105. package/dist/testing/index.d.ts +0 -2
  106. package/dist/testing/index.d.ts.map +0 -1
  107. package/dist/testing/index.js +0 -2
  108. package/dist/testing/index.js.map +0 -1
  109. package/dist/tsconfig.tsbuildinfo +0 -1
  110. package/dist/worker.js.map +0 -1
  111. package/dist/workflow.js.map +0 -1
  112. /package/dist/{backend-postgres → postgres}/postgres.d.ts +0 -0
  113. /package/dist/{pg → postgres}/scripts/db-migrate.d.ts +0 -0
  114. /package/dist/{pg → postgres}/scripts/db-reset.d.ts +0 -0
  115. /package/dist/{pg → postgres}/scripts/squawk.d.ts +0 -0
@@ -1,655 +0,0 @@
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
- }
655
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backend-sqlite/index.ts"],"names":[],"mappings":"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"}