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
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export type { OpenWorkflowOptions } from "./client.js";
2
2
  export { OpenWorkflow } from "./client.js";
3
- export * from "./backend.js";
4
3
  export type { WorkerOptions } from "./worker.js";
5
4
  export { Worker } from "./worker.js";
5
+ export type { Workflow } from "./workflow.js";
6
+ export { defineWorkflowSpec, defineWorkflow, declareWorkflow, } from "./workflow.js";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,cAAc,cAAc,CAAC;AAE7B,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { OpenWorkflow } from "./client.js";
2
- export * from "./backend.js";
3
2
  export { Worker } from "./worker.js";
3
+ export { defineWorkflowSpec, defineWorkflow, declareWorkflow, // eslint-disable-line @typescript-eslint/no-deprecated
4
+ } from "./workflow.js";
4
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,eAAe,EAAE,uDAAuD;EACzE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type { Workflow } from "./workflow.js";
2
+ export { isWorkflow } from "./workflow.js";
3
+ export * from "./backend.js";
4
+ export type { JsonValue } from "./core/json.js";
5
+ export type { WorkflowRun } from "./core/workflow.js";
6
+ export type { StepAttempt } from "./core/step.js";
7
+ export { DEFAULT_RETRY_POLICY } from "./core/retry.js";
8
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../internal.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,cAAc,cAAc,CAAC;AAG7B,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { isWorkflow } from "./workflow.js";
2
+ // backend
3
+ export * from "./backend.js";
4
+ export { DEFAULT_RETRY_POLICY } from "./core/retry.js";
5
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../internal.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,UAAU;AACV,cAAc,cAAc,CAAC;AAM7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { Backend, CancelWorkflowRunParams, ClaimWorkflowRunParams, CreateStepAttemptParams, CreateWorkflowRunParams, GetStepAttemptParams, GetWorkflowRunParams, ExtendWorkflowRunLeaseParams, ListStepAttemptsParams, ListWorkflowRunsParams, PaginatedResponse, FailStepAttemptParams, CompleteStepAttemptParams, FailWorkflowRunParams, CompleteWorkflowRunParams, SleepWorkflowRunParams, StepAttempt, WorkflowRun } from "openworkflow/internal";
2
+ interface BackendPostgresOptions {
3
+ namespaceId?: string;
4
+ runMigrations?: boolean;
5
+ }
6
+ /**
7
+ * Manages a connection to a Postgres database for workflow operations.
8
+ */
9
+ export declare class BackendPostgres implements Backend {
10
+ private pg;
11
+ private namespaceId;
12
+ private constructor();
13
+ /**
14
+ * Create and initialize a new BackendPostgres instance. This will
15
+ * automatically run migrations on startup unless `runMigrations` is set to
16
+ * false.
17
+ * @param url - Postgres connection URL
18
+ * @param options - Backend options
19
+ * @returns A connected backend instance
20
+ */
21
+ static connect(url: string, options?: BackendPostgresOptions): Promise<BackendPostgres>;
22
+ stop(): Promise<void>;
23
+ createWorkflowRun(params: CreateWorkflowRunParams): Promise<WorkflowRun>;
24
+ getWorkflowRun(params: GetWorkflowRunParams): Promise<WorkflowRun | null>;
25
+ listWorkflowRuns(params: ListWorkflowRunsParams): Promise<PaginatedResponse<WorkflowRun>>;
26
+ private buildListWorkflowRunsWhere;
27
+ claimWorkflowRun(params: ClaimWorkflowRunParams): Promise<WorkflowRun | null>;
28
+ extendWorkflowRunLease(params: ExtendWorkflowRunLeaseParams): Promise<WorkflowRun>;
29
+ sleepWorkflowRun(params: SleepWorkflowRunParams): Promise<WorkflowRun>;
30
+ completeWorkflowRun(params: CompleteWorkflowRunParams): Promise<WorkflowRun>;
31
+ failWorkflowRun(params: FailWorkflowRunParams): Promise<WorkflowRun>;
32
+ cancelWorkflowRun(params: CancelWorkflowRunParams): Promise<WorkflowRun>;
33
+ createStepAttempt(params: CreateStepAttemptParams): Promise<StepAttempt>;
34
+ getStepAttempt(params: GetStepAttemptParams): Promise<StepAttempt | null>;
35
+ listStepAttempts(params: ListStepAttemptsParams): Promise<PaginatedResponse<StepAttempt>>;
36
+ private buildListStepAttemptsWhere;
37
+ private processPaginationResults;
38
+ completeStepAttempt(params: CompleteStepAttemptParams): Promise<StepAttempt>;
39
+ failStepAttempt(params: FailStepAttemptParams): Promise<StepAttempt>;
40
+ }
41
+ export {};
42
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../pg/backend.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,OAAO,EACP,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EACtB,WAAW,EACX,WAAW,EAGZ,MAAM,uBAAuB,CAAC;AAI/B,UAAU,sBAAsB;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,OAAO;IAC7C,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO;IAKP;;;;;;;OAOG;WACU,OAAO,CAClB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,eAAe,CAAC;IAiBrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,iBAAiB,CACrB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,WAAW,CAAC;IA0CjB,cAAc,CAClB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAYxB,gBAAgB,CACpB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IA2B1C,OAAO,CAAC,0BAA0B;IA0B5B,gBAAgB,CACpB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAmDxB,sBAAsB,CAC1B,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,WAAW,CAAC;IAkBjB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBtE,mBAAmB,CACvB,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,WAAW,CAAC;IAuBjB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;IAgEpE,iBAAiB,CACrB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,WAAW,CAAC;IA2CjB,iBAAiB,CACrB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,WAAW,CAAC;IAoCjB,cAAc,CAClB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAWxB,gBAAgB,CACpB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IA2B1C,OAAO,CAAC,0BAA0B;IA6BlC,OAAO,CAAC,wBAAwB;IAyC1B,mBAAmB,CACvB,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,WAAW,CAAC;IA0BjB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;CAyB3E"}
@@ -0,0 +1,534 @@
1
+ import { newPostgres, newPostgresMaxOne, migrate, DEFAULT_SCHEMA, } from "./postgres.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 Postgres database for workflow operations.
6
+ */
7
+ export class BackendPostgres {
8
+ pg;
9
+ namespaceId;
10
+ constructor(pg, namespaceId) {
11
+ this.pg = pg;
12
+ this.namespaceId = namespaceId;
13
+ }
14
+ /**
15
+ * Create and initialize a new BackendPostgres instance. This will
16
+ * automatically run migrations on startup unless `runMigrations` is set to
17
+ * false.
18
+ * @param url - Postgres connection URL
19
+ * @param options - Backend options
20
+ * @returns A connected backend instance
21
+ */
22
+ static async connect(url, options) {
23
+ const { namespaceId, runMigrations } = {
24
+ namespaceId: DEFAULT_NAMESPACE_ID,
25
+ runMigrations: true,
26
+ ...options,
27
+ };
28
+ if (runMigrations) {
29
+ const pgForMigrate = newPostgresMaxOne(url);
30
+ await migrate(pgForMigrate, DEFAULT_SCHEMA);
31
+ await pgForMigrate.end();
32
+ }
33
+ const pg = newPostgres(url);
34
+ return new BackendPostgres(pg, namespaceId);
35
+ }
36
+ async stop() {
37
+ await this.pg.end();
38
+ }
39
+ async createWorkflowRun(params) {
40
+ const [workflowRun] = await this.pg `
41
+ INSERT INTO "openworkflow"."workflow_runs" (
42
+ "namespace_id",
43
+ "id",
44
+ "workflow_name",
45
+ "version",
46
+ "status",
47
+ "idempotency_key",
48
+ "config",
49
+ "context",
50
+ "input",
51
+ "attempts",
52
+ "available_at",
53
+ "deadline_at",
54
+ "created_at",
55
+ "updated_at"
56
+ )
57
+ VALUES (
58
+ ${this.namespaceId},
59
+ gen_random_uuid(),
60
+ ${params.workflowName},
61
+ ${params.version},
62
+ 'pending',
63
+ ${params.idempotencyKey},
64
+ ${this.pg.json(params.config)},
65
+ ${this.pg.json(params.context)},
66
+ ${this.pg.json(params.input)},
67
+ 0,
68
+ ${sqlDateDefaultNow(this.pg, params.availableAt)},
69
+ ${params.deadlineAt},
70
+ date_trunc('milliseconds', NOW()),
71
+ NOW()
72
+ )
73
+ RETURNING *
74
+ `;
75
+ if (!workflowRun)
76
+ throw new Error("Failed to create workflow run");
77
+ return workflowRun;
78
+ }
79
+ async getWorkflowRun(params) {
80
+ const [workflowRun] = await this.pg `
81
+ SELECT *
82
+ FROM "openworkflow"."workflow_runs"
83
+ WHERE "namespace_id" = ${this.namespaceId}
84
+ AND "id" = ${params.workflowRunId}
85
+ LIMIT 1
86
+ `;
87
+ return workflowRun ?? null;
88
+ }
89
+ async listWorkflowRuns(params) {
90
+ const limit = params.limit ?? DEFAULT_PAGINATION_PAGE_SIZE;
91
+ const { after, before } = params;
92
+ let cursor = null;
93
+ if (after) {
94
+ cursor = decodeCursor(after);
95
+ }
96
+ else if (before) {
97
+ cursor = decodeCursor(before);
98
+ }
99
+ const whereClause = this.buildListWorkflowRunsWhere(params, cursor);
100
+ const order = before
101
+ ? this.pg `ORDER BY "created_at" DESC, "id" DESC`
102
+ : this.pg `ORDER BY "created_at" ASC, "id" ASC`;
103
+ const rows = await this.pg `
104
+ SELECT *
105
+ FROM "openworkflow"."workflow_runs"
106
+ WHERE ${whereClause}
107
+ ${order}
108
+ LIMIT ${limit + 1}
109
+ `;
110
+ return this.processPaginationResults(rows, limit, !!after, !!before);
111
+ }
112
+ buildListWorkflowRunsWhere(params, cursor) {
113
+ const { after } = params;
114
+ const conditions = [this.pg `"namespace_id" = ${this.namespaceId}`];
115
+ if (cursor) {
116
+ const op = after ? this.pg `>` : this.pg `<`;
117
+ conditions.push(this.pg `("created_at", "id") ${op} (${cursor.createdAt}, ${cursor.id})`);
118
+ }
119
+ let whereClause = conditions[0];
120
+ if (!whereClause)
121
+ throw new Error("No conditions");
122
+ for (let i = 1; i < conditions.length; i++) {
123
+ const condition = conditions[i];
124
+ if (condition) {
125
+ whereClause = this.pg `${whereClause} AND ${condition}`;
126
+ }
127
+ }
128
+ return whereClause;
129
+ }
130
+ async claimWorkflowRun(params) {
131
+ // 1. mark any deadline-expired workflow runs as failed
132
+ // 2. find an available workflow run to claim
133
+ // 3. claim the workflow run
134
+ const [claimed] = await this.pg `
135
+ WITH expired AS (
136
+ UPDATE "openworkflow"."workflow_runs"
137
+ SET
138
+ "status" = 'failed',
139
+ "error" = ${this.pg.json({ message: "Workflow run deadline exceeded" })},
140
+ "worker_id" = NULL,
141
+ "available_at" = NULL,
142
+ "finished_at" = NOW(),
143
+ "updated_at" = NOW()
144
+ WHERE "namespace_id" = ${this.namespaceId}
145
+ AND "status" IN ('pending', 'running', 'sleeping')
146
+ AND "deadline_at" IS NOT NULL
147
+ AND "deadline_at" <= NOW()
148
+ RETURNING "id"
149
+ ),
150
+ candidate AS (
151
+ SELECT "id"
152
+ FROM "openworkflow"."workflow_runs"
153
+ WHERE "namespace_id" = ${this.namespaceId}
154
+ AND "status" IN ('pending', 'running', 'sleeping')
155
+ AND "available_at" <= NOW()
156
+ AND ("deadline_at" IS NULL OR "deadline_at" > NOW())
157
+ ORDER BY
158
+ CASE WHEN "status" = 'pending' THEN 0 ELSE 1 END,
159
+ "available_at",
160
+ "created_at"
161
+ LIMIT 1
162
+ FOR UPDATE SKIP LOCKED
163
+ )
164
+ UPDATE "openworkflow"."workflow_runs" AS wr
165
+ SET
166
+ "status" = 'running',
167
+ "attempts" = "attempts" + 1,
168
+ "worker_id" = ${params.workerId},
169
+ "available_at" = NOW() + ${params.leaseDurationMs} * INTERVAL '1 millisecond',
170
+ "started_at" = COALESCE("started_at", NOW()),
171
+ "updated_at" = NOW()
172
+ FROM candidate
173
+ WHERE wr."id" = candidate."id"
174
+ AND wr."namespace_id" = ${this.namespaceId}
175
+ RETURNING wr.*;
176
+ `;
177
+ return claimed ?? null;
178
+ }
179
+ async extendWorkflowRunLease(params) {
180
+ const [updated] = await this.pg `
181
+ UPDATE "openworkflow"."workflow_runs"
182
+ SET
183
+ "available_at" = ${this.pg `NOW() + ${params.leaseDurationMs} * INTERVAL '1 millisecond'`},
184
+ "updated_at" = NOW()
185
+ WHERE "namespace_id" = ${this.namespaceId}
186
+ AND "id" = ${params.workflowRunId}
187
+ AND "status" = 'running'
188
+ AND "worker_id" = ${params.workerId}
189
+ RETURNING *
190
+ `;
191
+ if (!updated)
192
+ throw new Error("Failed to extend lease for workflow run");
193
+ return updated;
194
+ }
195
+ async sleepWorkflowRun(params) {
196
+ // 'succeeded' status is deprecated
197
+ const [updated] = await this.pg `
198
+ UPDATE "openworkflow"."workflow_runs"
199
+ SET
200
+ "status" = 'sleeping',
201
+ "available_at" = ${params.availableAt},
202
+ "worker_id" = NULL,
203
+ "updated_at" = NOW()
204
+ WHERE "namespace_id" = ${this.namespaceId}
205
+ AND "id" = ${params.workflowRunId}
206
+ AND "status" != 'succeeded'
207
+ AND "status" != 'completed'
208
+ AND "status" != 'failed'
209
+ AND "status" != 'canceled'
210
+ AND "worker_id" = ${params.workerId}
211
+ RETURNING *
212
+ `;
213
+ if (!updated)
214
+ throw new Error("Failed to sleep workflow run");
215
+ return updated;
216
+ }
217
+ async completeWorkflowRun(params) {
218
+ const [updated] = await this.pg `
219
+ UPDATE "openworkflow"."workflow_runs"
220
+ SET
221
+ "status" = 'completed',
222
+ "output" = ${this.pg.json(params.output)},
223
+ "error" = NULL,
224
+ "worker_id" = ${params.workerId},
225
+ "available_at" = NULL,
226
+ "finished_at" = NOW(),
227
+ "updated_at" = NOW()
228
+ WHERE "namespace_id" = ${this.namespaceId}
229
+ AND "id" = ${params.workflowRunId}
230
+ AND "status" = 'running'
231
+ AND "worker_id" = ${params.workerId}
232
+ RETURNING *
233
+ `;
234
+ if (!updated)
235
+ throw new Error("Failed to mark workflow run completed");
236
+ return updated;
237
+ }
238
+ async failWorkflowRun(params) {
239
+ const { workflowRunId, error } = params;
240
+ const { initialIntervalMs, backoffCoefficient, maximumIntervalMs } = DEFAULT_RETRY_POLICY;
241
+ // this beefy query updates a workflow's status, available_at, and
242
+ // finished_at based on the workflow's deadline and retry policy
243
+ //
244
+ // if the next retry would exceed the deadline, the run is marked as
245
+ // 'failed' and finalized, otherwise, the run is rescheduled with an updated
246
+ // 'available_at' timestamp for the next retry
247
+ const [updated] = await this.pg `
248
+ UPDATE "openworkflow"."workflow_runs"
249
+ SET
250
+ "status" = CASE
251
+ WHEN "deadline_at" IS NOT NULL AND NOW() + (
252
+ LEAST(
253
+ ${initialIntervalMs} * POWER(${backoffCoefficient}, "attempts" - 1),
254
+ ${maximumIntervalMs}
255
+ ) * INTERVAL '1 millisecond'
256
+ ) >= "deadline_at" THEN 'failed'
257
+ ELSE 'pending'
258
+ END,
259
+
260
+ "available_at" = CASE
261
+ WHEN "deadline_at" IS NOT NULL AND NOW() + (
262
+ LEAST(
263
+ ${initialIntervalMs} * POWER(${backoffCoefficient}, "attempts" - 1),
264
+ ${maximumIntervalMs}
265
+ ) * INTERVAL '1 millisecond'
266
+ ) >= "deadline_at" THEN NULL
267
+ ELSE NOW() + (
268
+ LEAST(
269
+ ${initialIntervalMs} * POWER(${backoffCoefficient}, "attempts" - 1),
270
+ ${maximumIntervalMs}
271
+ ) * INTERVAL '1 millisecond'
272
+ )
273
+ END,
274
+
275
+ "finished_at" = CASE
276
+ WHEN "deadline_at" IS NOT NULL AND NOW() + (
277
+ LEAST(
278
+ ${initialIntervalMs} * POWER(${backoffCoefficient}, "attempts" - 1),
279
+ ${maximumIntervalMs}
280
+ ) * INTERVAL '1 millisecond'
281
+ ) >= "deadline_at" THEN NOW()
282
+ ELSE NULL
283
+ END,
284
+ "error" = ${this.pg.json(error)},
285
+ "worker_id" = NULL,
286
+ "started_at" = NULL,
287
+ "updated_at" = NOW()
288
+ WHERE "namespace_id" = ${this.namespaceId}
289
+ AND "id" = ${workflowRunId}
290
+ AND "status" = 'running'
291
+ AND "worker_id" = ${params.workerId}
292
+ RETURNING *
293
+ `;
294
+ if (!updated)
295
+ throw new Error("Failed to mark workflow run failed");
296
+ return updated;
297
+ }
298
+ async cancelWorkflowRun(params) {
299
+ const [updated] = await this.pg `
300
+ UPDATE "openworkflow"."workflow_runs"
301
+ SET
302
+ "status" = 'canceled',
303
+ "worker_id" = NULL,
304
+ "available_at" = NULL,
305
+ "finished_at" = NOW(),
306
+ "updated_at" = NOW()
307
+ WHERE "namespace_id" = ${this.namespaceId}
308
+ AND "id" = ${params.workflowRunId}
309
+ AND "status" IN ('pending', 'running', 'sleeping')
310
+ RETURNING *
311
+ `;
312
+ if (!updated) {
313
+ // workflow may already be in a terminal state
314
+ const existing = await this.getWorkflowRun({
315
+ workflowRunId: params.workflowRunId,
316
+ });
317
+ if (!existing) {
318
+ throw new Error(`Workflow run ${params.workflowRunId} does not exist`);
319
+ }
320
+ // if already canceled, just return it
321
+ if (existing.status === "canceled") {
322
+ return existing;
323
+ }
324
+ // throw error for completed/failed workflows
325
+ // 'succeeded' status is deprecated
326
+ if (["succeeded", "completed", "failed"].includes(existing.status)) {
327
+ throw new Error(`Cannot cancel workflow run ${params.workflowRunId} with status ${existing.status}`);
328
+ }
329
+ throw new Error("Failed to cancel workflow run");
330
+ }
331
+ return updated;
332
+ }
333
+ async createStepAttempt(params) {
334
+ const [stepAttempt] = await this.pg `
335
+ INSERT INTO "openworkflow"."step_attempts" (
336
+ "namespace_id",
337
+ "id",
338
+ "workflow_run_id",
339
+ "step_name",
340
+ "kind",
341
+ "status",
342
+ "config",
343
+ "context",
344
+ "started_at",
345
+ "created_at",
346
+ "updated_at"
347
+ )
348
+ VALUES (
349
+ ${this.namespaceId},
350
+ gen_random_uuid(),
351
+ ${params.workflowRunId},
352
+ ${params.stepName},
353
+ ${params.kind},
354
+ 'running',
355
+ ${this.pg.json(params.config)},
356
+ ${this.pg.json(params.context)},
357
+ NOW(),
358
+ date_trunc('milliseconds', NOW()),
359
+ NOW()
360
+ )
361
+ RETURNING *
362
+ `;
363
+ if (!stepAttempt)
364
+ throw new Error("Failed to create step attempt");
365
+ return stepAttempt;
366
+ }
367
+ async getStepAttempt(params) {
368
+ const [stepAttempt] = await this.pg `
369
+ SELECT *
370
+ FROM "openworkflow"."step_attempts"
371
+ WHERE "namespace_id" = ${this.namespaceId}
372
+ AND "id" = ${params.stepAttemptId}
373
+ LIMIT 1
374
+ `;
375
+ return stepAttempt ?? null;
376
+ }
377
+ async listStepAttempts(params) {
378
+ const limit = params.limit ?? DEFAULT_PAGINATION_PAGE_SIZE;
379
+ const { after, before } = params;
380
+ let cursor = null;
381
+ if (after) {
382
+ cursor = decodeCursor(after);
383
+ }
384
+ else if (before) {
385
+ cursor = decodeCursor(before);
386
+ }
387
+ const whereClause = this.buildListStepAttemptsWhere(params, cursor);
388
+ const order = before
389
+ ? this.pg `ORDER BY "created_at" DESC, "id" DESC`
390
+ : this.pg `ORDER BY "created_at" ASC, "id" ASC`;
391
+ const rows = await this.pg `
392
+ SELECT *
393
+ FROM "openworkflow"."step_attempts"
394
+ WHERE ${whereClause}
395
+ ${order}
396
+ LIMIT ${limit + 1}
397
+ `;
398
+ return this.processPaginationResults(rows, limit, !!after, !!before);
399
+ }
400
+ buildListStepAttemptsWhere(params, cursor) {
401
+ const { after } = params;
402
+ const conditions = [
403
+ this.pg `"namespace_id" = ${this.namespaceId}`,
404
+ this.pg `"workflow_run_id" = ${params.workflowRunId}`,
405
+ ];
406
+ if (cursor) {
407
+ const op = after ? this.pg `>` : this.pg `<`;
408
+ conditions.push(this.pg `("created_at", "id") ${op} (${cursor.createdAt}, ${cursor.id})`);
409
+ }
410
+ let whereClause = conditions[0];
411
+ if (!whereClause)
412
+ throw new Error("No conditions");
413
+ for (let i = 1; i < conditions.length; i++) {
414
+ const condition = conditions[i];
415
+ if (condition) {
416
+ whereClause = this.pg `${whereClause} AND ${condition}`;
417
+ }
418
+ }
419
+ return whereClause;
420
+ }
421
+ processPaginationResults(rows, limit, hasAfter, hasBefore) {
422
+ const data = rows;
423
+ let hasNext = false;
424
+ let hasPrev = false;
425
+ if (hasBefore) {
426
+ data.reverse();
427
+ if (data.length > limit) {
428
+ hasPrev = true;
429
+ data.shift();
430
+ }
431
+ hasNext = true;
432
+ }
433
+ else {
434
+ if (data.length > limit) {
435
+ hasNext = true;
436
+ data.pop();
437
+ }
438
+ if (hasAfter) {
439
+ hasPrev = true;
440
+ }
441
+ }
442
+ const lastItem = data.at(-1);
443
+ const nextCursor = hasNext && lastItem ? encodeCursor(lastItem) : null;
444
+ const firstItem = data[0];
445
+ const prevCursor = hasPrev && firstItem ? encodeCursor(firstItem) : null;
446
+ return {
447
+ data,
448
+ pagination: {
449
+ next: nextCursor,
450
+ prev: prevCursor,
451
+ },
452
+ };
453
+ }
454
+ async completeStepAttempt(params) {
455
+ const [updated] = await this.pg `
456
+ UPDATE "openworkflow"."step_attempts" sa
457
+ SET
458
+ "status" = 'completed',
459
+ "output" = ${this.pg.json(params.output)},
460
+ "error" = NULL,
461
+ "finished_at" = NOW(),
462
+ "updated_at" = NOW()
463
+ FROM "openworkflow"."workflow_runs" wr
464
+ WHERE sa."namespace_id" = ${this.namespaceId}
465
+ AND sa."workflow_run_id" = ${params.workflowRunId}
466
+ AND sa."id" = ${params.stepAttemptId}
467
+ AND sa."status" = 'running'
468
+ AND wr."namespace_id" = sa."namespace_id"
469
+ AND wr."id" = sa."workflow_run_id"
470
+ AND wr."status" = 'running'
471
+ AND wr."worker_id" = ${params.workerId}
472
+ RETURNING sa.*
473
+ `;
474
+ if (!updated)
475
+ throw new Error("Failed to mark step attempt completed");
476
+ return updated;
477
+ }
478
+ async failStepAttempt(params) {
479
+ const [updated] = await this.pg `
480
+ UPDATE "openworkflow"."step_attempts" sa
481
+ SET
482
+ "status" = 'failed',
483
+ "output" = NULL,
484
+ "error" = ${this.pg.json(params.error)},
485
+ "finished_at" = NOW(),
486
+ "updated_at" = NOW()
487
+ FROM "openworkflow"."workflow_runs" wr
488
+ WHERE sa."namespace_id" = ${this.namespaceId}
489
+ AND sa."workflow_run_id" = ${params.workflowRunId}
490
+ AND sa."id" = ${params.stepAttemptId}
491
+ AND sa."status" = 'running'
492
+ AND wr."namespace_id" = sa."namespace_id"
493
+ AND wr."id" = sa."workflow_run_id"
494
+ AND wr."status" = 'running'
495
+ AND wr."worker_id" = ${params.workerId}
496
+ RETURNING sa.*
497
+ `;
498
+ if (!updated)
499
+ throw new Error("Failed to mark step attempt failed");
500
+ return updated;
501
+ }
502
+ }
503
+ /**
504
+ * sqlDateDefaultNow returns the provided date or `NOW()` if not.
505
+ * This is needed so we don't have to disable the eslint rule for every query.
506
+ * @param pg - Postgres client
507
+ * @param date - Date to use (or null)
508
+ * @returns The provided date or a NOW() expression
509
+ */
510
+ function sqlDateDefaultNow(pg, date) {
511
+ return date ?? pg `NOW()`;
512
+ }
513
+ /**
514
+ * Encode a pagination cursor to a string.
515
+ * @param item - Cursor data
516
+ * @returns Encoded cursor
517
+ */
518
+ function encodeCursor(item) {
519
+ return Buffer.from(JSON.stringify({ createdAt: item.createdAt, id: item.id })).toString("base64");
520
+ }
521
+ /**
522
+ * Decode a pagination cursor from a string.
523
+ * @param cursor - Encoded cursor
524
+ * @returns Cursor data
525
+ */
526
+ function decodeCursor(cursor) {
527
+ const decoded = Buffer.from(cursor, "base64").toString("utf8");
528
+ const parsed = JSON.parse(decoded);
529
+ return {
530
+ createdAt: new Date(parsed.createdAt),
531
+ id: parsed.id,
532
+ };
533
+ }
534
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../pg/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { BackendPostgres } from "./backend.js";
2
+ export { DEFAULT_POSTGRES_URL, DEFAULT_SCHEMA, type Postgres, type PostgresOptions, newPostgres, newPostgresMaxOne, migrations, migrate, dropSchema, } from "./postgres.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../pg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,UAAU,GACX,MAAM,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { BackendPostgres } from "./backend.js";
2
+ export { DEFAULT_POSTGRES_URL, DEFAULT_SCHEMA, newPostgres, newPostgresMaxOne, migrations, migrate, dropSchema, } from "./postgres.js";
3
+ //# sourceMappingURL=index.js.map