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