@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.
- package/.swcrc +17 -0
- package/README.md +7 -0
- package/dist/backend.d.ts +107 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +3 -0
- package/dist/backend.js.map +1 -0
- package/dist/chaos.test.d.ts +2 -0
- package/dist/chaos.test.d.ts.map +1 -0
- package/dist/chaos.test.js +92 -0
- package/dist/chaos.test.js.map +1 -0
- package/dist/client.d.ts +178 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +223 -0
- package/dist/client.js.map +1 -0
- package/dist/client.test.d.ts +2 -0
- package/dist/client.test.d.ts.map +1 -0
- package/dist/client.test.js +339 -0
- package/dist/client.test.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +24 -0
- package/dist/config.test.js.map +1 -0
- package/dist/core/duration.d.ts +22 -0
- package/dist/core/duration.d.ts.map +1 -0
- package/dist/core/duration.js +64 -0
- package/dist/core/duration.js.map +1 -0
- package/dist/core/duration.test.d.ts +2 -0
- package/dist/core/duration.test.d.ts.map +1 -0
- package/dist/core/duration.test.js +265 -0
- package/dist/core/duration.test.js.map +1 -0
- package/dist/core/error.d.ts +15 -0
- package/dist/core/error.d.ts.map +1 -0
- package/dist/core/error.js +25 -0
- package/dist/core/error.js.map +1 -0
- package/dist/core/error.test.d.ts +2 -0
- package/dist/core/error.test.d.ts.map +1 -0
- package/dist/core/error.test.js +63 -0
- package/dist/core/error.test.js.map +1 -0
- package/dist/core/json.d.ts +5 -0
- package/dist/core/json.d.ts.map +1 -0
- package/dist/core/json.js +3 -0
- package/dist/core/json.js.map +1 -0
- package/dist/core/result.d.ts +22 -0
- package/dist/core/result.d.ts.map +1 -0
- package/dist/core/result.js +22 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/result.test.d.ts +2 -0
- package/dist/core/result.test.d.ts.map +1 -0
- package/dist/core/result.test.js +19 -0
- package/dist/core/result.test.js.map +1 -0
- package/dist/core/retry.d.ts +21 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/core/retry.js +25 -0
- package/dist/core/retry.js.map +1 -0
- package/dist/core/retry.test.d.ts +2 -0
- package/dist/core/retry.test.d.ts.map +1 -0
- package/dist/core/retry.test.js +37 -0
- package/dist/core/retry.test.js.map +1 -0
- package/dist/core/schema.d.ts +57 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +4 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/step.d.ts +96 -0
- package/dist/core/step.d.ts.map +1 -0
- package/dist/core/step.js +78 -0
- package/dist/core/step.js.map +1 -0
- package/dist/core/step.test.d.ts +2 -0
- package/dist/core/step.test.d.ts.map +1 -0
- package/dist/core/step.test.js +356 -0
- package/dist/core/step.test.js.map +1 -0
- package/dist/core/workflow.d.ts +78 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +46 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/core/workflow.test.d.ts +2 -0
- package/dist/core/workflow.test.d.ts.map +1 -0
- package/dist/core/workflow.test.js +172 -0
- package/dist/core/workflow.test.js.map +1 -0
- package/dist/database/backend.d.ts +60 -0
- package/dist/database/backend.d.ts.map +1 -0
- package/dist/database/backend.js +387 -0
- package/dist/database/backend.js.map +1 -0
- package/dist/database/backend.test.d.ts +2 -0
- package/dist/database/backend.test.d.ts.map +1 -0
- package/dist/database/backend.test.js +17 -0
- package/dist/database/backend.test.js.map +1 -0
- package/dist/database/backend.testsuite.d.ts +20 -0
- package/dist/database/backend.testsuite.d.ts.map +1 -0
- package/dist/database/backend.testsuite.js +1174 -0
- package/dist/database/backend.testsuite.js.map +1 -0
- package/dist/database/base.d.ts +12 -0
- package/dist/database/base.d.ts.map +1 -0
- package/dist/database/base.js +19 -0
- package/dist/database/base.js.map +1 -0
- package/dist/database/migrations/20251212000000_0_init.js +9 -0
- package/dist/database/migrations/20251212000000_0_init.js.map +1 -0
- package/dist/database/migrations/20251212000000_1_tables.js +88 -0
- package/dist/database/migrations/20251212000000_1_tables.js.map +1 -0
- package/dist/database/migrations/20251212000000_2_fk.js +48 -0
- package/dist/database/migrations/20251212000000_2_fk.js.map +1 -0
- package/dist/database/migrations/20251212000000_3_indexes.js +107 -0
- package/dist/database/migrations/20251212000000_3_indexes.js.map +1 -0
- package/dist/database/pubsub.d.ts +17 -0
- package/dist/database/pubsub.d.ts.map +1 -0
- package/dist/database/pubsub.js +70 -0
- package/dist/database/pubsub.js.map +1 -0
- package/dist/database/pubsub.test.d.ts +2 -0
- package/dist/database/pubsub.test.d.ts.map +1 -0
- package/dist/database/pubsub.test.js +86 -0
- package/dist/database/pubsub.test.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +21 -0
- package/dist/errors.js.map +1 -0
- package/dist/execution.d.ts +82 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +182 -0
- package/dist/execution.js.map +1 -0
- package/dist/execution.test.d.ts +2 -0
- package/dist/execution.test.d.ts.map +1 -0
- package/dist/execution.test.js +556 -0
- package/dist/execution.test.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +12 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +5 -0
- package/dist/internal.js.map +1 -0
- package/dist/practices/01-remote-workflow.d.ts +2 -0
- package/dist/practices/01-remote-workflow.d.ts.map +1 -0
- package/dist/practices/01-remote-workflow.js +69 -0
- package/dist/practices/01-remote-workflow.js.map +1 -0
- package/dist/practices/01-remote.d.ts +2 -0
- package/dist/practices/01-remote.d.ts.map +1 -0
- package/dist/practices/01-remote.js +87 -0
- package/dist/practices/01-remote.js.map +1 -0
- package/dist/practices/02-local.d.ts +2 -0
- package/dist/practices/02-local.d.ts.map +1 -0
- package/dist/practices/02-local.js +84 -0
- package/dist/practices/02-local.js.map +1 -0
- package/dist/practices/03-local-retry.d.ts +2 -0
- package/dist/practices/03-local-retry.d.ts.map +1 -0
- package/dist/practices/03-local-retry.js +85 -0
- package/dist/practices/03-local-retry.js.map +1 -0
- package/dist/practices/04-scheduler-dispose.d.ts +2 -0
- package/dist/practices/04-scheduler-dispose.d.ts.map +1 -0
- package/dist/practices/04-scheduler-dispose.js +65 -0
- package/dist/practices/04-scheduler-dispose.js.map +1 -0
- package/dist/practices/05-router.d.ts +2 -0
- package/dist/practices/05-router.d.ts.map +1 -0
- package/dist/practices/05-router.js +80 -0
- package/dist/practices/05-router.js.map +1 -0
- package/dist/registry.d.ts +33 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +54 -0
- package/dist/registry.js.map +1 -0
- package/dist/registry.test.d.ts +2 -0
- package/dist/registry.test.d.ts.map +1 -0
- package/dist/registry.test.js +95 -0
- package/dist/registry.test.js.map +1 -0
- package/dist/scheduler.d.ts +22 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +117 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/tasks/index.d.ts +4 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +5 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/local-task.d.ts +6 -0
- package/dist/tasks/local-task.d.ts.map +1 -0
- package/dist/tasks/local-task.js +95 -0
- package/dist/tasks/local-task.js.map +1 -0
- package/dist/tasks/remote-task.d.ts +11 -0
- package/dist/tasks/remote-task.d.ts.map +1 -0
- package/dist/tasks/remote-task.js +213 -0
- package/dist/tasks/remote-task.js.map +1 -0
- package/dist/tasks/shared.d.ts +8 -0
- package/dist/tasks/shared.d.ts.map +1 -0
- package/dist/tasks/shared.js +41 -0
- package/dist/tasks/shared.js.map +1 -0
- package/dist/testing/connection.d.ts +7 -0
- package/dist/testing/connection.d.ts.map +1 -0
- package/dist/testing/connection.js +38 -0
- package/dist/testing/connection.js.map +1 -0
- package/dist/types/config.d.ts +44 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/context.d.ts +18 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +4 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/events.d.ts +43 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +3 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/task-items.d.ts +12 -0
- package/dist/types/task-items.d.ts.map +1 -0
- package/dist/types/task-items.js +3 -0
- package/dist/types/task-items.js.map +1 -0
- package/dist/types/utils.d.ts +4 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/dist/types/utils.js +8 -0
- package/dist/types/utils.js.map +1 -0
- package/dist/worker.d.ts +61 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +206 -0
- package/dist/worker.js.map +1 -0
- package/dist/worker.test.d.ts +2 -0
- package/dist/worker.test.d.ts.map +1 -0
- package/dist/worker.test.js +1163 -0
- package/dist/worker.test.js.map +1 -0
- package/dist/workflow.d.ts +44 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +21 -0
- package/dist/workflow.js.map +1 -0
- package/dist/workflow.test.d.ts +2 -0
- package/dist/workflow.test.d.ts.map +1 -0
- package/dist/workflow.test.js +73 -0
- package/dist/workflow.test.js.map +1 -0
- package/nodemon.json +6 -0
- package/package.json +63 -0
- package/scripts/migrate.ts +11 -0
- package/src/backend.ts +133 -0
- package/src/chaos.test.ts +108 -0
- package/src/client.test.ts +297 -0
- package/src/client.ts +331 -0
- package/src/config.test.ts +23 -0
- package/src/config.ts +35 -0
- package/src/core/duration.test.ts +326 -0
- package/src/core/duration.ts +86 -0
- package/src/core/error.test.ts +77 -0
- package/src/core/error.ts +30 -0
- package/src/core/json.ts +2 -0
- package/src/core/result.test.ts +13 -0
- package/src/core/result.ts +29 -0
- package/src/core/retry.test.ts +41 -0
- package/src/core/retry.ts +29 -0
- package/src/core/schema.ts +74 -0
- package/src/core/step.test.ts +362 -0
- package/src/core/step.ts +152 -0
- package/src/core/workflow.test.ts +184 -0
- package/src/core/workflow.ts +127 -0
- package/src/database/backend.test.ts +16 -0
- package/src/database/backend.testsuite.ts +1376 -0
- package/src/database/backend.ts +655 -0
- package/src/database/base.ts +23 -0
- package/src/database/migrations/20251212000000_0_init.ts +10 -0
- package/src/database/migrations/20251212000000_1_tables.ts +54 -0
- package/src/database/migrations/20251212000000_2_fk.ts +46 -0
- package/src/database/migrations/20251212000000_3_indexes.ts +82 -0
- package/src/database/pubsub.test.ts +92 -0
- package/src/database/pubsub.ts +92 -0
- package/src/execution.test.ts +508 -0
- package/src/execution.ts +291 -0
- package/src/index.ts +7 -0
- package/src/internal.ts +11 -0
- package/src/practices/01-remote-workflow.ts +61 -0
- package/src/registry.test.ts +122 -0
- package/src/registry.ts +65 -0
- package/src/testing/connection.ts +44 -0
- package/src/worker.test.ts +1138 -0
- package/src/worker.ts +281 -0
- package/src/workflow.test.ts +68 -0
- package/src/workflow.ts +84 -0
- package/table_ddl.sql +60 -0
- package/templates/openworkflow.config.ts +22 -0
- package/tsconfig.json +40 -0
- package/tsconfig.test.json +4 -0
- 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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"}
|
package/dist/backend.js
ADDED
|
@@ -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 @@
|
|
|
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":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -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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"}
|