@sonamu-kit/tasks 0.0.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 (280) hide show
  1. package/.swcrc +17 -0
  2. package/README.md +7 -0
  3. package/dist/backend.d.ts +107 -0
  4. package/dist/backend.d.ts.map +1 -0
  5. package/dist/backend.js +3 -0
  6. package/dist/backend.js.map +1 -0
  7. package/dist/chaos.test.d.ts +2 -0
  8. package/dist/chaos.test.d.ts.map +1 -0
  9. package/dist/chaos.test.js +92 -0
  10. package/dist/chaos.test.js.map +1 -0
  11. package/dist/client.d.ts +178 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +223 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/client.test.d.ts +2 -0
  16. package/dist/client.test.d.ts.map +1 -0
  17. package/dist/client.test.js +339 -0
  18. package/dist/client.test.js.map +1 -0
  19. package/dist/config.d.ts +22 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +23 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/config.test.d.ts +2 -0
  24. package/dist/config.test.d.ts.map +1 -0
  25. package/dist/config.test.js +24 -0
  26. package/dist/config.test.js.map +1 -0
  27. package/dist/core/duration.d.ts +22 -0
  28. package/dist/core/duration.d.ts.map +1 -0
  29. package/dist/core/duration.js +64 -0
  30. package/dist/core/duration.js.map +1 -0
  31. package/dist/core/duration.test.d.ts +2 -0
  32. package/dist/core/duration.test.d.ts.map +1 -0
  33. package/dist/core/duration.test.js +265 -0
  34. package/dist/core/duration.test.js.map +1 -0
  35. package/dist/core/error.d.ts +15 -0
  36. package/dist/core/error.d.ts.map +1 -0
  37. package/dist/core/error.js +25 -0
  38. package/dist/core/error.js.map +1 -0
  39. package/dist/core/error.test.d.ts +2 -0
  40. package/dist/core/error.test.d.ts.map +1 -0
  41. package/dist/core/error.test.js +63 -0
  42. package/dist/core/error.test.js.map +1 -0
  43. package/dist/core/json.d.ts +5 -0
  44. package/dist/core/json.d.ts.map +1 -0
  45. package/dist/core/json.js +3 -0
  46. package/dist/core/json.js.map +1 -0
  47. package/dist/core/result.d.ts +22 -0
  48. package/dist/core/result.d.ts.map +1 -0
  49. package/dist/core/result.js +22 -0
  50. package/dist/core/result.js.map +1 -0
  51. package/dist/core/result.test.d.ts +2 -0
  52. package/dist/core/result.test.d.ts.map +1 -0
  53. package/dist/core/result.test.js +19 -0
  54. package/dist/core/result.test.js.map +1 -0
  55. package/dist/core/retry.d.ts +21 -0
  56. package/dist/core/retry.d.ts.map +1 -0
  57. package/dist/core/retry.js +25 -0
  58. package/dist/core/retry.js.map +1 -0
  59. package/dist/core/retry.test.d.ts +2 -0
  60. package/dist/core/retry.test.d.ts.map +1 -0
  61. package/dist/core/retry.test.js +37 -0
  62. package/dist/core/retry.test.js.map +1 -0
  63. package/dist/core/schema.d.ts +57 -0
  64. package/dist/core/schema.d.ts.map +1 -0
  65. package/dist/core/schema.js +4 -0
  66. package/dist/core/schema.js.map +1 -0
  67. package/dist/core/step.d.ts +96 -0
  68. package/dist/core/step.d.ts.map +1 -0
  69. package/dist/core/step.js +78 -0
  70. package/dist/core/step.js.map +1 -0
  71. package/dist/core/step.test.d.ts +2 -0
  72. package/dist/core/step.test.d.ts.map +1 -0
  73. package/dist/core/step.test.js +356 -0
  74. package/dist/core/step.test.js.map +1 -0
  75. package/dist/core/workflow.d.ts +78 -0
  76. package/dist/core/workflow.d.ts.map +1 -0
  77. package/dist/core/workflow.js +46 -0
  78. package/dist/core/workflow.js.map +1 -0
  79. package/dist/core/workflow.test.d.ts +2 -0
  80. package/dist/core/workflow.test.d.ts.map +1 -0
  81. package/dist/core/workflow.test.js +172 -0
  82. package/dist/core/workflow.test.js.map +1 -0
  83. package/dist/database/backend.d.ts +60 -0
  84. package/dist/database/backend.d.ts.map +1 -0
  85. package/dist/database/backend.js +387 -0
  86. package/dist/database/backend.js.map +1 -0
  87. package/dist/database/backend.test.d.ts +2 -0
  88. package/dist/database/backend.test.d.ts.map +1 -0
  89. package/dist/database/backend.test.js +17 -0
  90. package/dist/database/backend.test.js.map +1 -0
  91. package/dist/database/backend.testsuite.d.ts +20 -0
  92. package/dist/database/backend.testsuite.d.ts.map +1 -0
  93. package/dist/database/backend.testsuite.js +1174 -0
  94. package/dist/database/backend.testsuite.js.map +1 -0
  95. package/dist/database/base.d.ts +12 -0
  96. package/dist/database/base.d.ts.map +1 -0
  97. package/dist/database/base.js +19 -0
  98. package/dist/database/base.js.map +1 -0
  99. package/dist/database/migrations/20251212000000_0_init.js +9 -0
  100. package/dist/database/migrations/20251212000000_0_init.js.map +1 -0
  101. package/dist/database/migrations/20251212000000_1_tables.js +88 -0
  102. package/dist/database/migrations/20251212000000_1_tables.js.map +1 -0
  103. package/dist/database/migrations/20251212000000_2_fk.js +48 -0
  104. package/dist/database/migrations/20251212000000_2_fk.js.map +1 -0
  105. package/dist/database/migrations/20251212000000_3_indexes.js +107 -0
  106. package/dist/database/migrations/20251212000000_3_indexes.js.map +1 -0
  107. package/dist/database/pubsub.d.ts +17 -0
  108. package/dist/database/pubsub.d.ts.map +1 -0
  109. package/dist/database/pubsub.js +70 -0
  110. package/dist/database/pubsub.js.map +1 -0
  111. package/dist/database/pubsub.test.d.ts +2 -0
  112. package/dist/database/pubsub.test.d.ts.map +1 -0
  113. package/dist/database/pubsub.test.js +86 -0
  114. package/dist/database/pubsub.test.js.map +1 -0
  115. package/dist/errors.d.ts +8 -0
  116. package/dist/errors.d.ts.map +1 -0
  117. package/dist/errors.js +21 -0
  118. package/dist/errors.js.map +1 -0
  119. package/dist/execution.d.ts +82 -0
  120. package/dist/execution.d.ts.map +1 -0
  121. package/dist/execution.js +182 -0
  122. package/dist/execution.js.map +1 -0
  123. package/dist/execution.test.d.ts +2 -0
  124. package/dist/execution.test.d.ts.map +1 -0
  125. package/dist/execution.test.js +556 -0
  126. package/dist/execution.test.js.map +1 -0
  127. package/dist/index.d.ts +8 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +6 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/internal.d.ts +12 -0
  132. package/dist/internal.d.ts.map +1 -0
  133. package/dist/internal.js +5 -0
  134. package/dist/internal.js.map +1 -0
  135. package/dist/practices/01-remote-workflow.d.ts +2 -0
  136. package/dist/practices/01-remote-workflow.d.ts.map +1 -0
  137. package/dist/practices/01-remote-workflow.js +69 -0
  138. package/dist/practices/01-remote-workflow.js.map +1 -0
  139. package/dist/practices/01-remote.d.ts +2 -0
  140. package/dist/practices/01-remote.d.ts.map +1 -0
  141. package/dist/practices/01-remote.js +87 -0
  142. package/dist/practices/01-remote.js.map +1 -0
  143. package/dist/practices/02-local.d.ts +2 -0
  144. package/dist/practices/02-local.d.ts.map +1 -0
  145. package/dist/practices/02-local.js +84 -0
  146. package/dist/practices/02-local.js.map +1 -0
  147. package/dist/practices/03-local-retry.d.ts +2 -0
  148. package/dist/practices/03-local-retry.d.ts.map +1 -0
  149. package/dist/practices/03-local-retry.js +85 -0
  150. package/dist/practices/03-local-retry.js.map +1 -0
  151. package/dist/practices/04-scheduler-dispose.d.ts +2 -0
  152. package/dist/practices/04-scheduler-dispose.d.ts.map +1 -0
  153. package/dist/practices/04-scheduler-dispose.js +65 -0
  154. package/dist/practices/04-scheduler-dispose.js.map +1 -0
  155. package/dist/practices/05-router.d.ts +2 -0
  156. package/dist/practices/05-router.d.ts.map +1 -0
  157. package/dist/practices/05-router.js +80 -0
  158. package/dist/practices/05-router.js.map +1 -0
  159. package/dist/registry.d.ts +33 -0
  160. package/dist/registry.d.ts.map +1 -0
  161. package/dist/registry.js +54 -0
  162. package/dist/registry.js.map +1 -0
  163. package/dist/registry.test.d.ts +2 -0
  164. package/dist/registry.test.d.ts.map +1 -0
  165. package/dist/registry.test.js +95 -0
  166. package/dist/registry.test.js.map +1 -0
  167. package/dist/scheduler.d.ts +22 -0
  168. package/dist/scheduler.d.ts.map +1 -0
  169. package/dist/scheduler.js +117 -0
  170. package/dist/scheduler.js.map +1 -0
  171. package/dist/tasks/index.d.ts +4 -0
  172. package/dist/tasks/index.d.ts.map +1 -0
  173. package/dist/tasks/index.js +5 -0
  174. package/dist/tasks/index.js.map +1 -0
  175. package/dist/tasks/local-task.d.ts +6 -0
  176. package/dist/tasks/local-task.d.ts.map +1 -0
  177. package/dist/tasks/local-task.js +95 -0
  178. package/dist/tasks/local-task.js.map +1 -0
  179. package/dist/tasks/remote-task.d.ts +11 -0
  180. package/dist/tasks/remote-task.d.ts.map +1 -0
  181. package/dist/tasks/remote-task.js +213 -0
  182. package/dist/tasks/remote-task.js.map +1 -0
  183. package/dist/tasks/shared.d.ts +8 -0
  184. package/dist/tasks/shared.d.ts.map +1 -0
  185. package/dist/tasks/shared.js +41 -0
  186. package/dist/tasks/shared.js.map +1 -0
  187. package/dist/testing/connection.d.ts +7 -0
  188. package/dist/testing/connection.d.ts.map +1 -0
  189. package/dist/testing/connection.js +38 -0
  190. package/dist/testing/connection.js.map +1 -0
  191. package/dist/types/config.d.ts +44 -0
  192. package/dist/types/config.d.ts.map +1 -0
  193. package/dist/types/config.js +3 -0
  194. package/dist/types/config.js.map +1 -0
  195. package/dist/types/context.d.ts +18 -0
  196. package/dist/types/context.d.ts.map +1 -0
  197. package/dist/types/context.js +4 -0
  198. package/dist/types/context.js.map +1 -0
  199. package/dist/types/events.d.ts +43 -0
  200. package/dist/types/events.d.ts.map +1 -0
  201. package/dist/types/events.js +3 -0
  202. package/dist/types/events.js.map +1 -0
  203. package/dist/types/index.d.ts +6 -0
  204. package/dist/types/index.d.ts.map +1 -0
  205. package/dist/types/index.js +3 -0
  206. package/dist/types/index.js.map +1 -0
  207. package/dist/types/task-items.d.ts +12 -0
  208. package/dist/types/task-items.d.ts.map +1 -0
  209. package/dist/types/task-items.js +3 -0
  210. package/dist/types/task-items.js.map +1 -0
  211. package/dist/types/utils.d.ts +4 -0
  212. package/dist/types/utils.d.ts.map +1 -0
  213. package/dist/types/utils.js +8 -0
  214. package/dist/types/utils.js.map +1 -0
  215. package/dist/worker.d.ts +61 -0
  216. package/dist/worker.d.ts.map +1 -0
  217. package/dist/worker.js +206 -0
  218. package/dist/worker.js.map +1 -0
  219. package/dist/worker.test.d.ts +2 -0
  220. package/dist/worker.test.d.ts.map +1 -0
  221. package/dist/worker.test.js +1163 -0
  222. package/dist/worker.test.js.map +1 -0
  223. package/dist/workflow.d.ts +44 -0
  224. package/dist/workflow.d.ts.map +1 -0
  225. package/dist/workflow.js +21 -0
  226. package/dist/workflow.js.map +1 -0
  227. package/dist/workflow.test.d.ts +2 -0
  228. package/dist/workflow.test.d.ts.map +1 -0
  229. package/dist/workflow.test.js +73 -0
  230. package/dist/workflow.test.js.map +1 -0
  231. package/nodemon.json +6 -0
  232. package/package.json +63 -0
  233. package/scripts/migrate.ts +11 -0
  234. package/src/backend.ts +133 -0
  235. package/src/chaos.test.ts +108 -0
  236. package/src/client.test.ts +297 -0
  237. package/src/client.ts +331 -0
  238. package/src/config.test.ts +23 -0
  239. package/src/config.ts +35 -0
  240. package/src/core/duration.test.ts +326 -0
  241. package/src/core/duration.ts +86 -0
  242. package/src/core/error.test.ts +77 -0
  243. package/src/core/error.ts +30 -0
  244. package/src/core/json.ts +2 -0
  245. package/src/core/result.test.ts +13 -0
  246. package/src/core/result.ts +29 -0
  247. package/src/core/retry.test.ts +41 -0
  248. package/src/core/retry.ts +29 -0
  249. package/src/core/schema.ts +74 -0
  250. package/src/core/step.test.ts +362 -0
  251. package/src/core/step.ts +152 -0
  252. package/src/core/workflow.test.ts +184 -0
  253. package/src/core/workflow.ts +127 -0
  254. package/src/database/backend.test.ts +16 -0
  255. package/src/database/backend.testsuite.ts +1376 -0
  256. package/src/database/backend.ts +655 -0
  257. package/src/database/base.ts +23 -0
  258. package/src/database/migrations/20251212000000_0_init.ts +10 -0
  259. package/src/database/migrations/20251212000000_1_tables.ts +54 -0
  260. package/src/database/migrations/20251212000000_2_fk.ts +46 -0
  261. package/src/database/migrations/20251212000000_3_indexes.ts +82 -0
  262. package/src/database/pubsub.test.ts +92 -0
  263. package/src/database/pubsub.ts +92 -0
  264. package/src/execution.test.ts +508 -0
  265. package/src/execution.ts +291 -0
  266. package/src/index.ts +7 -0
  267. package/src/internal.ts +11 -0
  268. package/src/practices/01-remote-workflow.ts +61 -0
  269. package/src/registry.test.ts +122 -0
  270. package/src/registry.ts +65 -0
  271. package/src/testing/connection.ts +44 -0
  272. package/src/worker.test.ts +1138 -0
  273. package/src/worker.ts +281 -0
  274. package/src/workflow.test.ts +68 -0
  275. package/src/workflow.ts +84 -0
  276. package/table_ddl.sql +60 -0
  277. package/templates/openworkflow.config.ts +22 -0
  278. package/tsconfig.json +40 -0
  279. package/tsconfig.test.json +4 -0
  280. package/vite.config.ts +13 -0
package/.swcrc ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://swc.rs/schema.json",
3
+ "module": {
4
+ "type": "es6", // import/export 쓰는 esm으로 가겠습니다.
5
+ "resolveFully": true // esm이 요구하는 대로, 임포트 경로를 실제 파일 경로(확장자 포함)로 풀어줍니다.
6
+ },
7
+ "jsc": {
8
+ "parser": {
9
+ "syntax": "typescript",
10
+ "decorators": true
11
+ },
12
+ "baseUrl": ".", // 위 resolveFully 옵션이 작동하려면 이게 필요합니다. 이 파일이 있는 로컬에서 쉘에 직접 실행할 때에는 baseUrl에 이 파일이 위치한 경로 기준으로 절대경로가 resolve되어 들어갑니다. 그러나 만약 swc를 코드 상에서 import해서 쓰거나, 아니면 설정 파일(.swcrc) 대신 -C로 설정을 명령줄에 직접 넘기는 경우, baseUrl에 직접 올바른 절대경로를 넣어주어야 합니다.
13
+ "target": "esnext" // 타겟은 그냥 최신 문법으로.
14
+ },
15
+ "minify": false, // 어차피 용량 10%정도 차이밖에 안 남. minify를 끄면 혹시 혹시 정말 혹시나 나중에 소스맵 없이 코드를 봐야 하는 끔찍한 상황에 조금이나마 도움이 될 수 있지 않을까 해서 끔.
16
+ "sourceMaps": true // 소스맵 생성. 선언맵은 밖에서 tsc로 따로 만들거예요.
17
+ }
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # Sonamu Task Queue
2
+
3
+ ## Q&A
4
+
5
+ 1. 패키지 설치 중에 에러가 납니다.
6
+ - `@sonamu-kit/tasks`는 성능 상의 이슈로 인해 optional dependency로 `pg-native` 패키지를 사용합니다.
7
+ - [`pg-native` 문서](https://github.com/brianc/node-postgres/tree/master/packages/pg-native#install)에서는 설치 전 필요한 작업에 대해 안내해주고 있습니다.
@@ -0,0 +1,107 @@
1
+ import type { SerializedError } from "./core/error";
2
+ import type { JsonValue } from "./core/json";
3
+ import type { StepAttempt, StepAttemptContext, StepKind } from "./core/step";
4
+ import type { WorkflowRun } from "./core/workflow";
5
+ import type { OnSubscribed } from "./database/pubsub";
6
+ export declare const DEFAULT_NAMESPACE_ID = "default";
7
+ /**
8
+ * Backend is the interface for backend providers to implement.
9
+ */
10
+ export interface Backend {
11
+ subscribe(callback: OnSubscribed): Promise<void>;
12
+ publish(payload?: string): Promise<void>;
13
+ createWorkflowRun(params: Readonly<CreateWorkflowRunParams>): Promise<WorkflowRun>;
14
+ getWorkflowRun(params: Readonly<GetWorkflowRunParams>): Promise<WorkflowRun | null>;
15
+ listWorkflowRuns(params: Readonly<ListWorkflowRunsParams>): Promise<PaginatedResponse<WorkflowRun>>;
16
+ claimWorkflowRun(params: Readonly<ClaimWorkflowRunParams>): Promise<WorkflowRun | null>;
17
+ extendWorkflowRunLease(params: Readonly<ExtendWorkflowRunLeaseParams>): Promise<WorkflowRun>;
18
+ sleepWorkflowRun(params: Readonly<SleepWorkflowRunParams>): Promise<WorkflowRun>;
19
+ completeWorkflowRun(params: Readonly<CompleteWorkflowRunParams>): Promise<WorkflowRun>;
20
+ failWorkflowRun(params: Readonly<FailWorkflowRunParams>): Promise<WorkflowRun>;
21
+ cancelWorkflowRun(params: Readonly<CancelWorkflowRunParams>): Promise<WorkflowRun>;
22
+ createStepAttempt(params: Readonly<CreateStepAttemptParams>): Promise<StepAttempt>;
23
+ getStepAttempt(params: Readonly<GetStepAttemptParams>): Promise<StepAttempt | null>;
24
+ listStepAttempts(params: Readonly<ListStepAttemptsParams>): Promise<PaginatedResponse<StepAttempt>>;
25
+ completeStepAttempt(params: Readonly<CompleteStepAttemptParams>): Promise<StepAttempt>;
26
+ failStepAttempt(params: Readonly<FailStepAttemptParams>): Promise<StepAttempt>;
27
+ }
28
+ export interface CreateWorkflowRunParams {
29
+ workflowName: string;
30
+ version: string | null;
31
+ idempotencyKey: string | null;
32
+ config: JsonValue;
33
+ context: JsonValue | null;
34
+ input: JsonValue | null;
35
+ availableAt: Date | null;
36
+ deadlineAt: Date | null;
37
+ }
38
+ export interface GetWorkflowRunParams {
39
+ workflowRunId: string;
40
+ }
41
+ export type ListWorkflowRunsParams = PaginationOptions;
42
+ export interface ClaimWorkflowRunParams {
43
+ workerId: string;
44
+ leaseDurationMs: number;
45
+ }
46
+ export interface ExtendWorkflowRunLeaseParams {
47
+ workflowRunId: string;
48
+ workerId: string;
49
+ leaseDurationMs: number;
50
+ }
51
+ export interface SleepWorkflowRunParams {
52
+ workflowRunId: string;
53
+ workerId: string;
54
+ availableAt: Date;
55
+ }
56
+ export interface CompleteWorkflowRunParams {
57
+ workflowRunId: string;
58
+ workerId: string;
59
+ output: JsonValue | null;
60
+ }
61
+ export interface FailWorkflowRunParams {
62
+ workflowRunId: string;
63
+ workerId: string;
64
+ error: SerializedError;
65
+ }
66
+ export interface CancelWorkflowRunParams {
67
+ workflowRunId: string;
68
+ }
69
+ export interface CreateStepAttemptParams {
70
+ workflowRunId: string;
71
+ workerId: string;
72
+ stepName: string;
73
+ kind: StepKind;
74
+ config: JsonValue;
75
+ context: StepAttemptContext | null;
76
+ }
77
+ export interface GetStepAttemptParams {
78
+ stepAttemptId: string;
79
+ }
80
+ export interface ListStepAttemptsParams extends PaginationOptions {
81
+ workflowRunId: string;
82
+ }
83
+ export interface CompleteStepAttemptParams {
84
+ workflowRunId: string;
85
+ stepAttemptId: string;
86
+ workerId: string;
87
+ output: JsonValue | null;
88
+ }
89
+ export interface FailStepAttemptParams {
90
+ workflowRunId: string;
91
+ stepAttemptId: string;
92
+ workerId: string;
93
+ error: SerializedError;
94
+ }
95
+ export interface PaginationOptions {
96
+ limit?: number;
97
+ after?: string;
98
+ before?: string;
99
+ }
100
+ export interface PaginatedResponse<T> {
101
+ data: T[];
102
+ pagination: {
103
+ next: string | null;
104
+ prev: string | null;
105
+ };
106
+ }
107
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export const DEFAULT_NAMESPACE_ID = "default";
2
+
3
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/backend.ts"],"sourcesContent":["import type { SerializedError } from \"./core/error\";\nimport type { JsonValue } from \"./core/json\";\nimport type { StepAttempt, StepAttemptContext, StepKind } from \"./core/step\";\nimport type { WorkflowRun } from \"./core/workflow\";\nimport type { OnSubscribed } from \"./database/pubsub\";\n\nexport const DEFAULT_NAMESPACE_ID = \"default\";\n\n/**\n * Backend is the interface for backend providers to implement.\n */\nexport interface Backend {\n // Listen for events on a channel\n subscribe(callback: OnSubscribed): Promise<void>;\n publish(payload?: string): Promise<void>;\n\n // Workflow Runs\n createWorkflowRun(params: Readonly<CreateWorkflowRunParams>): Promise<WorkflowRun>;\n getWorkflowRun(params: Readonly<GetWorkflowRunParams>): Promise<WorkflowRun | null>;\n listWorkflowRuns(\n params: Readonly<ListWorkflowRunsParams>,\n ): Promise<PaginatedResponse<WorkflowRun>>;\n claimWorkflowRun(params: Readonly<ClaimWorkflowRunParams>): Promise<WorkflowRun | null>;\n extendWorkflowRunLease(params: Readonly<ExtendWorkflowRunLeaseParams>): Promise<WorkflowRun>;\n sleepWorkflowRun(params: Readonly<SleepWorkflowRunParams>): Promise<WorkflowRun>;\n completeWorkflowRun(params: Readonly<CompleteWorkflowRunParams>): Promise<WorkflowRun>;\n failWorkflowRun(params: Readonly<FailWorkflowRunParams>): Promise<WorkflowRun>;\n cancelWorkflowRun(params: Readonly<CancelWorkflowRunParams>): Promise<WorkflowRun>;\n\n // Step Attempts\n createStepAttempt(params: Readonly<CreateStepAttemptParams>): Promise<StepAttempt>;\n getStepAttempt(params: Readonly<GetStepAttemptParams>): Promise<StepAttempt | null>;\n listStepAttempts(\n params: Readonly<ListStepAttemptsParams>,\n ): Promise<PaginatedResponse<StepAttempt>>;\n completeStepAttempt(params: Readonly<CompleteStepAttemptParams>): Promise<StepAttempt>;\n failStepAttempt(params: Readonly<FailStepAttemptParams>): Promise<StepAttempt>;\n}\n\nexport interface CreateWorkflowRunParams {\n workflowName: string;\n version: string | null;\n idempotencyKey: string | null;\n config: JsonValue;\n context: JsonValue | null;\n input: JsonValue | null;\n availableAt: Date | null; // null = immediately\n deadlineAt: Date | null; // null = no deadline\n}\n\nexport interface GetWorkflowRunParams {\n workflowRunId: string;\n}\n\nexport type ListWorkflowRunsParams = PaginationOptions;\n\nexport interface ClaimWorkflowRunParams {\n workerId: string;\n leaseDurationMs: number;\n}\n\nexport interface ExtendWorkflowRunLeaseParams {\n workflowRunId: string;\n workerId: string;\n leaseDurationMs: number;\n}\n\nexport interface SleepWorkflowRunParams {\n workflowRunId: string;\n workerId: string;\n availableAt: Date;\n}\n\nexport interface CompleteWorkflowRunParams {\n workflowRunId: string;\n workerId: string;\n output: JsonValue | null;\n}\n\nexport interface FailWorkflowRunParams {\n workflowRunId: string;\n workerId: string;\n error: SerializedError;\n}\n\nexport interface CancelWorkflowRunParams {\n workflowRunId: string;\n}\n\nexport interface CreateStepAttemptParams {\n workflowRunId: string;\n workerId: string;\n stepName: string;\n kind: StepKind;\n config: JsonValue;\n context: StepAttemptContext | null;\n}\n\nexport interface GetStepAttemptParams {\n stepAttemptId: string;\n}\n\nexport interface ListStepAttemptsParams extends PaginationOptions {\n workflowRunId: string;\n}\n\nexport interface CompleteStepAttemptParams {\n workflowRunId: string;\n stepAttemptId: string;\n workerId: string;\n output: JsonValue | null;\n}\n\nexport interface FailStepAttemptParams {\n workflowRunId: string;\n stepAttemptId: string;\n workerId: string;\n error: SerializedError;\n}\n\nexport interface PaginationOptions {\n limit?: number;\n after?: string;\n before?: string;\n}\n\nexport interface PaginatedResponse<T> {\n data: T[];\n pagination: {\n next: string | null;\n prev: string | null;\n };\n}\n"],"names":["DEFAULT_NAMESPACE_ID"],"mappings":"AAMA,OAAO,MAAMA,uBAAuB,UAAU"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chaos.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chaos.test.d.ts","sourceRoot":"","sources":["../src/chaos.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
1
+ import { randomInt } from "node:crypto";
2
+ import { describe, expect, test } from "vitest";
3
+ import { OpenWorkflow } from "./client.js";
4
+ import { createBackend } from "./testing/connection.js";
5
+ const TOTAL_STEPS = 50;
6
+ const WORKER_COUNT = 3;
7
+ const WORKER_CONCURRENCY = 2;
8
+ const STEP_DURATION_MS = 25;
9
+ const CHAOS_DURATION_MS = 5000;
10
+ const CHAOS_INTERVAL_MS = 200;
11
+ const TEST_TIMEOUT_MS = 30_000;
12
+ describe("chaos test", ()=>{
13
+ test("workflow completes despite random worker deaths (known slow test)", async ()=>{
14
+ const backend = await createBackend();
15
+ const client = new OpenWorkflow({
16
+ backend
17
+ });
18
+ const workflow = client.defineWorkflow({
19
+ name: "chaos-workflow"
20
+ }, async ({ step })=>{
21
+ const results = [];
22
+ for(let i = 0; i < TOTAL_STEPS; i++){
23
+ const stepName = `step-${i.toString()}`;
24
+ const result = await step.run({
25
+ name: stepName
26
+ }, async ()=>{
27
+ await sleep(STEP_DURATION_MS); // fake work
28
+ return i;
29
+ });
30
+ results.push(result);
31
+ }
32
+ return results;
33
+ });
34
+ const workers = await Promise.all(Array.from({
35
+ length: WORKER_COUNT
36
+ }, ()=>createAndStartWorker(client)));
37
+ const handle = await workflow.run();
38
+ let workflowCompleted = false;
39
+ let chaosTask = null;
40
+ try {
41
+ chaosTask = runChaosTest({
42
+ client,
43
+ workers,
44
+ durationMs: CHAOS_DURATION_MS,
45
+ intervalMs: CHAOS_INTERVAL_MS,
46
+ shouldStop: ()=>workflowCompleted
47
+ });
48
+ const result = await handle.result();
49
+ workflowCompleted = true;
50
+ const restarts = await chaosTask;
51
+ expect(result).toHaveLength(TOTAL_STEPS);
52
+ expect(result[TOTAL_STEPS - 1]).toBe(TOTAL_STEPS - 1);
53
+ expect(restarts).toBeGreaterThan(0);
54
+ } finally{
55
+ workflowCompleted = true;
56
+ if (chaosTask) await chaosTask;
57
+ await Promise.all(workers.map((worker)=>worker.stop()));
58
+ await backend.stop();
59
+ }
60
+ }, TEST_TIMEOUT_MS);
61
+ });
62
+ async function runChaosTest(params) {
63
+ const { client, workers, durationMs, intervalMs, shouldStop } = params;
64
+ const chaosEndsAt = Date.now() + durationMs;
65
+ let restartCount = 0;
66
+ while(Date.now() < chaosEndsAt && !shouldStop()){
67
+ await sleep(intervalMs);
68
+ if (workers.length === 0) {
69
+ workers.push(await createAndStartWorker(client));
70
+ continue;
71
+ }
72
+ const index = randomInt(workers.length);
73
+ const victim = workers.splice(index, 1)[0];
74
+ await victim?.stop();
75
+ const replacement = await createAndStartWorker(client);
76
+ workers.push(replacement);
77
+ restartCount++;
78
+ }
79
+ return restartCount;
80
+ }
81
+ async function createAndStartWorker(client) {
82
+ const worker = client.newWorker({
83
+ concurrency: WORKER_CONCURRENCY
84
+ });
85
+ await worker.start();
86
+ return worker;
87
+ }
88
+ function sleep(ms) {
89
+ return new Promise((resolve)=>setTimeout(resolve, ms));
90
+ }
91
+
92
+ //# sourceMappingURL=chaos.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chaos.test.ts"],"sourcesContent":["import { randomInt } from \"node:crypto\";\nimport { describe, expect, test } from \"vitest\";\nimport { OpenWorkflow } from \"./client\";\nimport { createBackend } from \"./testing/connection\";\nimport type { Worker } from \"./worker\";\n\nconst TOTAL_STEPS = 50;\nconst WORKER_COUNT = 3;\nconst WORKER_CONCURRENCY = 2;\nconst STEP_DURATION_MS = 25;\nconst CHAOS_DURATION_MS = 5000;\nconst CHAOS_INTERVAL_MS = 200;\nconst TEST_TIMEOUT_MS = 30_000;\n\ndescribe(\"chaos test\", () => {\n test(\n \"workflow completes despite random worker deaths (known slow test)\",\n async () => {\n const backend = await createBackend();\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"chaos-workflow\" }, async ({ step }) => {\n const results: number[] = [];\n for (let i = 0; i < TOTAL_STEPS; i++) {\n const stepName = `step-${i.toString()}`;\n const result = await step.run({ name: stepName }, async () => {\n await sleep(STEP_DURATION_MS); // fake work\n return i;\n });\n results.push(result);\n }\n return results;\n });\n\n const workers = await Promise.all(\n Array.from({ length: WORKER_COUNT }, () => createAndStartWorker(client)),\n );\n\n const handle = await workflow.run();\n let workflowCompleted = false;\n let chaosTask: Promise<number> | null = null;\n\n try {\n chaosTask = runChaosTest({\n client,\n workers,\n durationMs: CHAOS_DURATION_MS,\n intervalMs: CHAOS_INTERVAL_MS,\n shouldStop: () => workflowCompleted,\n });\n\n const result = await handle.result();\n workflowCompleted = true;\n const restarts = await chaosTask;\n\n expect(result).toHaveLength(TOTAL_STEPS);\n expect(result[TOTAL_STEPS - 1]).toBe(TOTAL_STEPS - 1);\n expect(restarts).toBeGreaterThan(0);\n } finally {\n workflowCompleted = true;\n if (chaosTask) await chaosTask;\n await Promise.all(workers.map((worker) => worker.stop()));\n await backend.stop();\n }\n },\n TEST_TIMEOUT_MS,\n );\n});\n\nasync function runChaosTest(params: {\n client: OpenWorkflow;\n workers: Worker[];\n durationMs: number;\n intervalMs: number;\n shouldStop: () => boolean;\n}): Promise<number> {\n const { client, workers, durationMs, intervalMs, shouldStop } = params;\n const chaosEndsAt = Date.now() + durationMs;\n let restartCount = 0;\n\n while (Date.now() < chaosEndsAt && !shouldStop()) {\n await sleep(intervalMs);\n if (workers.length === 0) {\n workers.push(await createAndStartWorker(client));\n continue;\n }\n\n const index = randomInt(workers.length);\n const victim = workers.splice(index, 1)[0];\n await victim?.stop();\n\n const replacement = await createAndStartWorker(client);\n workers.push(replacement);\n restartCount++;\n }\n\n return restartCount;\n}\n\nasync function createAndStartWorker(client: OpenWorkflow): Promise<Worker> {\n const worker = client.newWorker({ concurrency: WORKER_CONCURRENCY });\n await worker.start();\n return worker;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],"names":["randomInt","describe","expect","test","OpenWorkflow","createBackend","TOTAL_STEPS","WORKER_COUNT","WORKER_CONCURRENCY","STEP_DURATION_MS","CHAOS_DURATION_MS","CHAOS_INTERVAL_MS","TEST_TIMEOUT_MS","backend","client","workflow","defineWorkflow","name","step","results","i","stepName","toString","result","run","sleep","push","workers","Promise","all","Array","from","length","createAndStartWorker","handle","workflowCompleted","chaosTask","runChaosTest","durationMs","intervalMs","shouldStop","restarts","toHaveLength","toBe","toBeGreaterThan","map","worker","stop","params","chaosEndsAt","Date","now","restartCount","index","victim","splice","replacement","newWorker","concurrency","start","ms","resolve","setTimeout"],"mappings":"AAAA,SAASA,SAAS,QAAQ,cAAc;AACxC,SAASC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,QAAQ,SAAS;AAChD,SAASC,YAAY,QAAQ,cAAW;AACxC,SAASC,aAAa,QAAQ,0BAAuB;AAGrD,MAAMC,cAAc;AACpB,MAAMC,eAAe;AACrB,MAAMC,qBAAqB;AAC3B,MAAMC,mBAAmB;AACzB,MAAMC,oBAAoB;AAC1B,MAAMC,oBAAoB;AAC1B,MAAMC,kBAAkB;AAExBX,SAAS,cAAc;IACrBE,KACE,qEACA;QACE,MAAMU,UAAU,MAAMR;QACtB,MAAMS,SAAS,IAAIV,aAAa;YAAES;QAAQ;QAE1C,MAAME,WAAWD,OAAOE,cAAc,CAAC;YAAEC,MAAM;QAAiB,GAAG,OAAO,EAAEC,IAAI,EAAE;YAChF,MAAMC,UAAoB,EAAE;YAC5B,IAAK,IAAIC,IAAI,GAAGA,IAAId,aAAac,IAAK;gBACpC,MAAMC,WAAW,CAAC,KAAK,EAAED,EAAEE,QAAQ,IAAI;gBACvC,MAAMC,SAAS,MAAML,KAAKM,GAAG,CAAC;oBAAEP,MAAMI;gBAAS,GAAG;oBAChD,MAAMI,MAAMhB,mBAAmB,YAAY;oBAC3C,OAAOW;gBACT;gBACAD,QAAQO,IAAI,CAACH;YACf;YACA,OAAOJ;QACT;QAEA,MAAMQ,UAAU,MAAMC,QAAQC,GAAG,CAC/BC,MAAMC,IAAI,CAAC;YAAEC,QAAQzB;QAAa,GAAG,IAAM0B,qBAAqBnB;QAGlE,MAAMoB,SAAS,MAAMnB,SAASS,GAAG;QACjC,IAAIW,oBAAoB;QACxB,IAAIC,YAAoC;QAExC,IAAI;YACFA,YAAYC,aAAa;gBACvBvB;gBACAa;gBACAW,YAAY5B;gBACZ6B,YAAY5B;gBACZ6B,YAAY,IAAML;YACpB;YAEA,MAAMZ,SAAS,MAAMW,OAAOX,MAAM;YAClCY,oBAAoB;YACpB,MAAMM,WAAW,MAAML;YAEvBlC,OAAOqB,QAAQmB,YAAY,CAACpC;YAC5BJ,OAAOqB,MAAM,CAACjB,cAAc,EAAE,EAAEqC,IAAI,CAACrC,cAAc;YACnDJ,OAAOuC,UAAUG,eAAe,CAAC;QACnC,SAAU;YACRT,oBAAoB;YACpB,IAAIC,WAAW,MAAMA;YACrB,MAAMR,QAAQC,GAAG,CAACF,QAAQkB,GAAG,CAAC,CAACC,SAAWA,OAAOC,IAAI;YACrD,MAAMlC,QAAQkC,IAAI;QACpB;IACF,GACAnC;AAEJ;AAEA,eAAeyB,aAAaW,MAM3B;IACC,MAAM,EAAElC,MAAM,EAAEa,OAAO,EAAEW,UAAU,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGQ;IAChE,MAAMC,cAAcC,KAAKC,GAAG,KAAKb;IACjC,IAAIc,eAAe;IAEnB,MAAOF,KAAKC,GAAG,KAAKF,eAAe,CAACT,aAAc;QAChD,MAAMf,MAAMc;QACZ,IAAIZ,QAAQK,MAAM,KAAK,GAAG;YACxBL,QAAQD,IAAI,CAAC,MAAMO,qBAAqBnB;YACxC;QACF;QAEA,MAAMuC,QAAQrD,UAAU2B,QAAQK,MAAM;QACtC,MAAMsB,SAAS3B,QAAQ4B,MAAM,CAACF,OAAO,EAAE,CAAC,EAAE;QAC1C,MAAMC,QAAQP;QAEd,MAAMS,cAAc,MAAMvB,qBAAqBnB;QAC/Ca,QAAQD,IAAI,CAAC8B;QACbJ;IACF;IAEA,OAAOA;AACT;AAEA,eAAenB,qBAAqBnB,MAAoB;IACtD,MAAMgC,SAAShC,OAAO2C,SAAS,CAAC;QAAEC,aAAalD;IAAmB;IAClE,MAAMsC,OAAOa,KAAK;IAClB,OAAOb;AACT;AAEA,SAASrB,MAAMmC,EAAU;IACvB,OAAO,IAAIhC,QAAQ,CAACiC,UAAYC,WAAWD,SAASD;AACtD"}
@@ -0,0 +1,178 @@
1
+ import type { Backend } from "./backend";
2
+ import type { StandardSchemaV1 } from "./core/schema";
3
+ import type { SchemaInput, SchemaOutput, WorkflowRun } from "./core/workflow";
4
+ import type { WorkflowFunction } from "./execution";
5
+ import { Worker } from "./worker";
6
+ import { defineWorkflowSpec, type Workflow, type WorkflowSpec } from "./workflow";
7
+ type WorkflowHandlerInput<TSchema, Input> = SchemaOutput<TSchema, Input>;
8
+ type WorkflowRunInput<TSchema, Input> = SchemaInput<TSchema, Input>;
9
+ /**
10
+ * Options for the OpenWorkflow client.
11
+ */
12
+ export interface OpenWorkflowOptions {
13
+ backend: Backend;
14
+ }
15
+ /**
16
+ * Client used to register workflows and start runs.
17
+ */
18
+ export declare class OpenWorkflow {
19
+ private backend;
20
+ private registry;
21
+ constructor(options: OpenWorkflowOptions);
22
+ /**
23
+ * Create a new Worker with this client's backend and workflows.
24
+ * @param options - Worker options
25
+ * @param options.concurrency - Max concurrent workflow runs
26
+ * @returns Worker instance
27
+ */
28
+ newWorker(options?: {
29
+ concurrency?: number | undefined;
30
+ usePubSub?: boolean;
31
+ listenDelay?: number;
32
+ }): Worker;
33
+ /**
34
+ * Provide the implementation for a declared workflow. This links the workflow
35
+ * specification to its execution logic and registers it with this
36
+ * OpenWorkflow instance for worker execution.
37
+ * @param spec - Workflow spec
38
+ * @param fn - Workflow implementation
39
+ */
40
+ implementWorkflow<Input, Output, RunInput = Input>(spec: WorkflowSpec<Input, Output, RunInput>, fn: WorkflowFunction<Input, Output>): void;
41
+ /**
42
+ * Run a workflow from its specification. This is the primary way to schedule
43
+ * a workflow using only its WorkflowSpec.
44
+ * @param spec - Workflow spec
45
+ * @param input - Workflow input
46
+ * @param options - Run options
47
+ * @returns Handle for awaiting the result
48
+ * @example
49
+ * ```ts
50
+ * const handle = await ow.runWorkflow(emailWorkflow, { to: 'user@example.com' });
51
+ * const result = await handle.result();
52
+ * ```
53
+ */
54
+ runWorkflow<Input, Output, RunInput = Input>(spec: WorkflowSpec<Input, Output, RunInput>, input?: RunInput, options?: WorkflowRunOptions): Promise<WorkflowRunHandle<Output>>;
55
+ /**
56
+ * Define and register a new workflow.
57
+ *
58
+ * This is a convenience method that combines `declareWorkflow` and
59
+ * `implementWorkflow` into a single call. For better code splitting and to
60
+ * separate declaration from implementation, consider using those methods
61
+ * separately.
62
+ * @param config - Workflow config
63
+ * @param fn - Workflow implementation
64
+ * @returns Runnable workflow
65
+ * @example
66
+ * ```ts
67
+ * const workflow = ow.defineWorkflow(
68
+ * { name: 'my-workflow' },
69
+ * async ({ input, step }) => {
70
+ * // workflow implementation
71
+ * },
72
+ * );
73
+ * ```
74
+ */
75
+ defineWorkflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(spec: WorkflowSpec<WorkflowHandlerInput<TSchema, Input>, Output, WorkflowRunInput<TSchema, Input>>, fn: WorkflowFunction<WorkflowHandlerInput<TSchema, Input>, Output>): RunnableWorkflow<WorkflowHandlerInput<TSchema, Input>, Output, WorkflowRunInput<TSchema, Input>>;
76
+ /**
77
+ * Unregister a workflow from the registry.
78
+ * @param name - The workflow name
79
+ * @param version - The workflow version (null for unversioned)
80
+ * @example
81
+ * ```ts
82
+ * ow.unregisterWorkflow("my-workflow", "v1");
83
+ * ```
84
+ */
85
+ unregisterWorkflow(name: string, version: string | null): void;
86
+ /**
87
+ * Check if a workflow is registered in the registry.
88
+ * @param name - The workflow name
89
+ * @param version - The workflow version (null for unversioned)
90
+ * @returns True if the workflow is registered, false otherwise
91
+ * @example
92
+ * ```ts
93
+ * ow.isWorkflowRegistered("my-workflow", "v1");
94
+ * ```
95
+ */
96
+ isWorkflowRegistered(name: string, version: string | null): boolean;
97
+ }
98
+ /**
99
+ * Declare a workflow without providing its implementation (which is provided
100
+ * separately via `implementWorkflow`). Returns a lightweight WorkflowSpec
101
+ * that can be used to schedule workflow runs.
102
+ * @param config - Workflow config
103
+ * @param spec - Workflow spec
104
+ * @returns Workflow spec
105
+ * @example
106
+ * ```ts
107
+ * export const emailWorkflow = declareWorkflow({
108
+ * name: 'send-email',
109
+ * schema: z.object({ to: z.string().email() }),
110
+ * });
111
+ * ```
112
+ */
113
+ export declare const declareWorkflow: typeof defineWorkflowSpec;
114
+ /**
115
+ * A fully defined workflow with its implementation. This class is returned by
116
+ * `defineWorkflow` and provides the `.run()` method for scheduling workflow
117
+ * runs.
118
+ */
119
+ export declare class RunnableWorkflow<Input, Output, RunInput = Input> {
120
+ private readonly ow;
121
+ readonly workflow: Workflow<Input, Output, RunInput>;
122
+ constructor(ow: OpenWorkflow, workflow: Workflow<Input, Output, RunInput>);
123
+ /**
124
+ * Starts a new workflow run.
125
+ * @param input - Workflow input
126
+ * @param options - Run options
127
+ * @returns Workflow run handle
128
+ */
129
+ run(input?: RunInput, options?: WorkflowRunOptions): Promise<WorkflowRunHandle<Output>>;
130
+ }
131
+ /**
132
+ * Options for creating a new workflow run from a runnable workflow when calling
133
+ * `workflow.run()`.
134
+ */
135
+ export interface WorkflowRunOptions {
136
+ /**
137
+ * Set a deadline for the workflow run. If the workflow exceeds this deadline,
138
+ * it will be marked as failed.
139
+ */
140
+ deadlineAt?: Date;
141
+ /**
142
+ * Publish when the workflow run is created to the channel.
143
+ * Default: true
144
+ */
145
+ publishToChannel?: boolean;
146
+ }
147
+ /**
148
+ * Options for WorkflowHandle.
149
+ */
150
+ export interface WorkflowHandleOptions {
151
+ backend: Backend;
152
+ workflowRun: WorkflowRun;
153
+ resultPollIntervalMs: number;
154
+ resultTimeoutMs: number;
155
+ }
156
+ /**
157
+ * Represents a started workflow run and provides methods to await its result.
158
+ * Returned from `workflowDef.run()`.
159
+ */
160
+ export declare class WorkflowRunHandle<Output> {
161
+ private backend;
162
+ readonly workflowRun: WorkflowRun;
163
+ private resultPollIntervalMs;
164
+ private resultTimeoutMs;
165
+ constructor(options: WorkflowHandleOptions);
166
+ /**
167
+ * Waits for the workflow run to complete and returns the result.
168
+ * @returns Workflow output
169
+ */
170
+ result(): Promise<Output>;
171
+ /**
172
+ * Cancels the workflow run. Only workflows in pending, running, or sleeping
173
+ * status can be canceled.
174
+ */
175
+ cancel(): Promise<void>;
176
+ }
177
+ export {};
178
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}