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.
- package/README.md +57 -46
- package/dist/backend-postgres/index.d.ts +44 -0
- package/dist/backend-postgres/index.d.ts.map +1 -0
- package/dist/backend-postgres/index.js +535 -0
- package/dist/backend-postgres/index.js.map +1 -0
- package/dist/backend-postgres/postgres.d.ts +42 -0
- package/dist/backend-postgres/postgres.d.ts.map +1 -0
- package/dist/backend-postgres/postgres.js +234 -0
- package/dist/backend-postgres/postgres.js.map +1 -0
- package/dist/backend-sqlite/index.d.ts +42 -0
- package/dist/backend-sqlite/index.d.ts.map +1 -0
- package/dist/backend-sqlite/index.js +655 -0
- package/dist/backend-sqlite/index.js.map +1 -0
- package/dist/backend-sqlite/sqlite.d.ts +61 -0
- package/dist/backend-sqlite/sqlite.d.ts.map +1 -0
- package/dist/backend-sqlite/sqlite.js +247 -0
- package/dist/backend-sqlite/sqlite.js.map +1 -0
- package/dist/backend.d.ts +21 -89
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +0 -21
- package/dist/backend.js.map +1 -1
- package/dist/bin/openworkflow.d.ts +3 -0
- package/dist/bin/openworkflow.d.ts.map +1 -0
- package/dist/bin/openworkflow.js +44 -0
- package/dist/bin/openworkflow.js.map +1 -0
- package/dist/client.d.ts +68 -80
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +83 -53
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +49 -0
- package/dist/config.js.map +1 -0
- package/dist/{duration.d.ts → core/duration.d.ts} +5 -2
- package/dist/core/duration.d.ts.map +1 -0
- package/dist/{duration.js → core/duration.js} +9 -6
- package/dist/core/duration.js.map +1 -0
- package/dist/core/error.d.ts +14 -0
- package/dist/core/error.d.ts.map +1 -0
- package/dist/core/error.js +18 -0
- package/dist/core/error.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 +2 -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 +17 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/retry.d.ts +7 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/core/retry.js +7 -0
- package/dist/core/retry.js.map +1 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/step.d.ts +89 -0
- package/dist/core/step.d.ts.map +1 -0
- package/dist/core/step.js +66 -0
- package/dist/core/step.js.map +1 -0
- package/dist/core/workflow.d.ts +63 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +35 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/execution.d.ts +69 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +188 -0
- package/dist/execution.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +8 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +5 -0
- package/dist/internal.js.map +1 -0
- package/dist/pg/backend.d.ts +42 -0
- package/dist/pg/backend.d.ts.map +1 -0
- package/dist/pg/backend.js +534 -0
- package/dist/pg/backend.js.map +1 -0
- package/dist/pg/index.d.ts +3 -0
- package/dist/pg/index.d.ts.map +1 -0
- package/dist/pg/index.js +3 -0
- package/dist/pg/index.js.map +1 -0
- package/dist/pg/postgres.d.ts +42 -0
- package/dist/pg/postgres.d.ts.map +1 -0
- package/dist/pg/postgres.js +234 -0
- package/dist/pg/postgres.js.map +1 -0
- package/dist/pg/scripts/db-migrate.d.ts +2 -0
- package/dist/pg/scripts/db-migrate.d.ts.map +1 -0
- package/dist/pg/scripts/db-migrate.js +5 -0
- package/dist/pg/scripts/db-migrate.js.map +1 -0
- package/dist/pg/scripts/db-reset.d.ts +2 -0
- package/dist/pg/scripts/db-reset.d.ts.map +1 -0
- package/dist/pg/scripts/db-reset.js +6 -0
- package/dist/pg/scripts/db-reset.js.map +1 -0
- package/dist/pg/scripts/squawk.d.ts +2 -0
- package/dist/pg/scripts/squawk.d.ts.map +1 -0
- package/dist/pg/scripts/squawk.js +17 -0
- package/dist/pg/scripts/squawk.js.map +1 -0
- package/dist/pg/vitest.global-setup.d.ts +3 -0
- package/dist/pg/vitest.global-setup.d.ts.map +1 -0
- package/dist/pg/vitest.global-setup.js +8 -0
- package/dist/pg/vitest.global-setup.js.map +1 -0
- package/dist/registry.d.ts +27 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +49 -0
- package/dist/registry.js.map +1 -0
- package/dist/sqlite/backend.d.ts +40 -0
- package/dist/sqlite/backend.d.ts.map +1 -0
- package/dist/sqlite/backend.js +654 -0
- package/dist/sqlite/backend.js.map +1 -0
- package/dist/sqlite/index.d.ts +3 -0
- package/dist/sqlite/index.d.ts.map +1 -0
- package/dist/sqlite/index.js +3 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite/sqlite.d.ts +61 -0
- package/dist/sqlite/sqlite.d.ts.map +1 -0
- package/dist/sqlite/sqlite.js +247 -0
- package/dist/sqlite/sqlite.js.map +1 -0
- package/dist/testing/backend.testsuite.d.ts +20 -0
- package/dist/testing/backend.testsuite.d.ts.map +1 -0
- package/dist/testing/backend.testsuite.js +1091 -0
- package/dist/testing/backend.testsuite.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/worker.d.ts +10 -3
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +29 -195
- package/dist/worker.js.map +1 -1
- package/dist/workflow.d.ts +60 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +49 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +16 -6
- package/dist/duration.d.ts.map +0 -1
- package/dist/duration.js.map +0 -1
- package/dist/schema.d.ts.map +0 -1
- package/dist/schema.js.map +0 -1
- /package/dist/{schema.d.ts → core/schema.d.ts} +0 -0
- /package/dist/{schema.js → core/schema.js} +0 -0
package/dist/client.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { Backend
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import type { Backend } from "./backend.js";
|
|
2
|
+
import type { StandardSchemaV1 } from "./core/schema.js";
|
|
3
|
+
import type { SchemaInput, SchemaOutput, WorkflowRun } from "./core/workflow.js";
|
|
4
|
+
import type { WorkflowFunction } from "./execution.js";
|
|
4
5
|
import { Worker } from "./worker.js";
|
|
5
|
-
type
|
|
6
|
-
type SchemaOutput<TSchema, Fallback> = TSchema extends StandardSchemaV1 ? StandardSchemaV1.InferOutput<TSchema> : Fallback;
|
|
6
|
+
import { type Workflow, type WorkflowSpec } from "./workflow.js";
|
|
7
7
|
type WorkflowHandlerInput<TSchema, Input> = SchemaOutput<TSchema, Input>;
|
|
8
8
|
type WorkflowRunInput<TSchema, Input> = SchemaInput<TSchema, Input>;
|
|
9
9
|
/**
|
|
@@ -17,101 +17,76 @@ export interface OpenWorkflowOptions {
|
|
|
17
17
|
*/
|
|
18
18
|
export declare class OpenWorkflow {
|
|
19
19
|
private backend;
|
|
20
|
-
private
|
|
20
|
+
private registry;
|
|
21
21
|
constructor(options: OpenWorkflowOptions);
|
|
22
22
|
/**
|
|
23
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
|
|
24
27
|
*/
|
|
25
28
|
newWorker(options?: {
|
|
26
|
-
concurrency?: number;
|
|
29
|
+
concurrency?: number | undefined;
|
|
27
30
|
}): Worker;
|
|
28
31
|
/**
|
|
29
|
-
*
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
* Options for WorkflowDefinition.
|
|
35
|
-
*/
|
|
36
|
-
export interface WorkflowDefinitionOptions<Input, Output, RunInput = Input> {
|
|
37
|
-
backend: Backend;
|
|
38
|
-
name: string;
|
|
39
|
-
version?: string;
|
|
40
|
-
fn: WorkflowFunction<Input, Output>;
|
|
41
|
-
schema?: StandardSchemaV1<RunInput, Input> | undefined;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Config passed to `defineWorkflow()` when defining a workflow.
|
|
45
|
-
*/
|
|
46
|
-
export interface WorkflowDefinitionConfig<TSchema extends StandardSchemaV1 | undefined = undefined> {
|
|
47
|
-
/**
|
|
48
|
-
* The name of the workflow.
|
|
32
|
+
* Provide the implementation for a declared workflow. This links the workflow
|
|
33
|
+
* specification to its execution logic and registers it with this
|
|
34
|
+
* OpenWorkflow instance for worker execution.
|
|
35
|
+
* @param spec - Workflow spec
|
|
36
|
+
* @param fn - Workflow implementation
|
|
49
37
|
*/
|
|
50
|
-
|
|
38
|
+
implementWorkflow<Input, Output, RunInput = Input>(spec: WorkflowSpec<Input, Output, RunInput>, fn: WorkflowFunction<Input, Output>): void;
|
|
51
39
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
40
|
+
* Run a workflow from its specification. This is the primary way to schedule
|
|
41
|
+
* a workflow using only its WorkflowSpec.
|
|
42
|
+
* @param spec - Workflow spec
|
|
43
|
+
* @param input - Workflow input
|
|
44
|
+
* @param options - Run options
|
|
45
|
+
* @returns Handle for awaiting the result
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* const handle = await ow.runWorkflow(emailWorkflow, { to: 'user@example.com' });
|
|
49
|
+
* const result = await handle.result();
|
|
50
|
+
* ```
|
|
54
51
|
*/
|
|
55
|
-
|
|
52
|
+
runWorkflow<Input, Output, RunInput = Input>(spec: WorkflowSpec<Input, Output, RunInput>, input?: RunInput, options?: WorkflowRunOptions): Promise<WorkflowRunHandle<Output>>;
|
|
56
53
|
/**
|
|
57
|
-
*
|
|
54
|
+
* Define and register a new workflow.
|
|
55
|
+
* @param spec - Workflow spec
|
|
56
|
+
* @param fn - Workflow implementation
|
|
57
|
+
* @returns Runnable workflow
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* const workflow = ow.defineWorkflow(
|
|
61
|
+
* { name: 'my-workflow' },
|
|
62
|
+
* async ({ input, step }) => {
|
|
63
|
+
* // workflow implementation
|
|
64
|
+
* },
|
|
65
|
+
* );
|
|
66
|
+
* ```
|
|
58
67
|
*/
|
|
59
|
-
|
|
68
|
+
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>>;
|
|
60
69
|
}
|
|
61
70
|
/**
|
|
62
|
-
*
|
|
63
|
-
*
|
|
71
|
+
* A fully defined workflow with its implementation. This class is returned by
|
|
72
|
+
* `client.defineWorkflow` and provides the `.run()` method for scheduling
|
|
73
|
+
* workflow runs.
|
|
64
74
|
*/
|
|
65
|
-
export declare class
|
|
66
|
-
private
|
|
67
|
-
readonly
|
|
68
|
-
|
|
69
|
-
readonly fn: WorkflowFunction<Input, Output>;
|
|
70
|
-
private readonly schema;
|
|
71
|
-
constructor(options: WorkflowDefinitionOptions<Input, Output, RunInput>);
|
|
75
|
+
export declare class RunnableWorkflow<Input, Output, RunInput = Input> {
|
|
76
|
+
private readonly ow;
|
|
77
|
+
readonly workflow: Workflow<Input, Output, RunInput>;
|
|
78
|
+
constructor(ow: OpenWorkflow, workflow: Workflow<Input, Output, RunInput>);
|
|
72
79
|
/**
|
|
73
80
|
* Starts a new workflow run.
|
|
81
|
+
* @param input - Workflow input
|
|
82
|
+
* @param options - Run options
|
|
83
|
+
* @returns Workflow run handle
|
|
74
84
|
*/
|
|
75
85
|
run(input?: RunInput, options?: WorkflowRunOptions): Promise<WorkflowRunHandle<Output>>;
|
|
76
86
|
}
|
|
77
87
|
/**
|
|
78
|
-
*
|
|
79
|
-
|
|
80
|
-
export interface WorkflowFunctionParams<Input> {
|
|
81
|
-
input: Input;
|
|
82
|
-
step: StepApi;
|
|
83
|
-
version: string | null;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* The workflow definition's function (defined by the user) that the user uses
|
|
87
|
-
* to define the workflow's steps.
|
|
88
|
-
*/
|
|
89
|
-
export type WorkflowFunction<Input, Output> = (params: WorkflowFunctionParams<Input>) => Promise<Output> | Output;
|
|
90
|
-
/**
|
|
91
|
-
* Config for an individual step defined with `step.run()`.
|
|
92
|
-
*/
|
|
93
|
-
export interface StepFunctionConfig {
|
|
94
|
-
/**
|
|
95
|
-
* The name of the step.
|
|
96
|
-
*/
|
|
97
|
-
name: string;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Represents the API for defining steps within a workflow. Used within a
|
|
101
|
-
* workflow handler to define steps by calling `step.run()`.
|
|
102
|
-
*/
|
|
103
|
-
export interface StepApi {
|
|
104
|
-
run<Output>(config: StepFunctionConfig, fn: StepFunction<Output>): Promise<Output>;
|
|
105
|
-
sleep(name: string, duration: DurationString): Promise<void>;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* The step definition (defined by the user) that executes user code. Can return
|
|
109
|
-
* undefined (e.g., when using `return;`) which will be converted to null.
|
|
110
|
-
*/
|
|
111
|
-
export type StepFunction<Output> = () => Promise<Output | undefined> | Output | undefined;
|
|
112
|
-
/**
|
|
113
|
-
* Options for creating a new workflow run from a workflow definition when
|
|
114
|
-
* calling `workflowDef.run()`.
|
|
88
|
+
* Options for creating a new workflow run from a runnable workflow when calling
|
|
89
|
+
* `workflowDef.run()`.
|
|
115
90
|
*/
|
|
116
91
|
export interface WorkflowRunOptions {
|
|
117
92
|
/**
|
|
@@ -129,6 +104,17 @@ export interface WorkflowHandleOptions {
|
|
|
129
104
|
resultPollIntervalMs: number;
|
|
130
105
|
resultTimeoutMs: number;
|
|
131
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* Options for result() on a WorkflowRunHandle.
|
|
109
|
+
*/
|
|
110
|
+
export interface WorkflowRunHandleResultOptions {
|
|
111
|
+
/**
|
|
112
|
+
* Time to wait for a workflow run to complete. Throws an error if the timeout
|
|
113
|
+
* is exceeded.
|
|
114
|
+
* @default 300000 (5 minutes)
|
|
115
|
+
*/
|
|
116
|
+
timeoutMs?: number;
|
|
117
|
+
}
|
|
132
118
|
/**
|
|
133
119
|
* Represents a started workflow run and provides methods to await its result.
|
|
134
120
|
* Returned from `workflowDef.run()`.
|
|
@@ -141,8 +127,10 @@ export declare class WorkflowRunHandle<Output> {
|
|
|
141
127
|
constructor(options: WorkflowHandleOptions);
|
|
142
128
|
/**
|
|
143
129
|
* Waits for the workflow run to complete and returns the result.
|
|
130
|
+
* @param options - Options for waiting for the result
|
|
131
|
+
* @returns Workflow output
|
|
144
132
|
*/
|
|
145
|
-
result(): Promise<Output>;
|
|
133
|
+
result(options?: WorkflowRunHandleResultOptions): Promise<Output>;
|
|
146
134
|
/**
|
|
147
135
|
* Cancels the workflow run. Only workflows in pending, running, or sleeping
|
|
148
136
|
* status can be canceled.
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { validateInput } from "./core/workflow.js";
|
|
2
|
+
import { WorkflowRegistry } from "./registry.js";
|
|
1
3
|
import { Worker } from "./worker.js";
|
|
4
|
+
import { defineWorkflow, } from "./workflow.js";
|
|
2
5
|
const DEFAULT_RESULT_POLL_INTERVAL_MS = 1000; // 1s
|
|
3
6
|
const DEFAULT_RESULT_TIMEOUT_MS = 5 * 60 * 1000; // 5m
|
|
4
7
|
/**
|
|
@@ -6,77 +9,59 @@ const DEFAULT_RESULT_TIMEOUT_MS = 5 * 60 * 1000; // 5m
|
|
|
6
9
|
*/
|
|
7
10
|
export class OpenWorkflow {
|
|
8
11
|
backend;
|
|
9
|
-
|
|
12
|
+
registry = new WorkflowRegistry();
|
|
10
13
|
constructor(options) {
|
|
11
14
|
this.backend = options.backend;
|
|
12
15
|
}
|
|
13
16
|
/**
|
|
14
17
|
* Create a new Worker with this client's backend and workflows.
|
|
18
|
+
* @param options - Worker options
|
|
19
|
+
* @param options.concurrency - Max concurrent workflow runs
|
|
20
|
+
* @returns Worker instance
|
|
15
21
|
*/
|
|
16
22
|
newWorker(options) {
|
|
17
23
|
return new Worker({
|
|
18
24
|
backend: this.backend,
|
|
19
|
-
workflows:
|
|
25
|
+
workflows: this.registry.getAll(),
|
|
20
26
|
concurrency: options?.concurrency,
|
|
21
27
|
});
|
|
22
28
|
}
|
|
23
29
|
/**
|
|
24
|
-
*
|
|
30
|
+
* Provide the implementation for a declared workflow. This links the workflow
|
|
31
|
+
* specification to its execution logic and registers it with this
|
|
32
|
+
* OpenWorkflow instance for worker execution.
|
|
33
|
+
* @param spec - Workflow spec
|
|
34
|
+
* @param fn - Workflow implementation
|
|
25
35
|
*/
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
throw new Error(`Workflow "${name}" is already registered`);
|
|
30
|
-
}
|
|
31
|
-
const definition = new WorkflowDefinition({
|
|
32
|
-
backend: this.backend,
|
|
33
|
-
name,
|
|
34
|
-
...(version !== undefined && { version }),
|
|
36
|
+
implementWorkflow(spec, fn) {
|
|
37
|
+
const workflow = {
|
|
38
|
+
spec,
|
|
35
39
|
fn,
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
this.registeredWorkflows.set(name, definition);
|
|
39
|
-
return definition;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Represents a workflow definition that can be used to start runs. Returned
|
|
44
|
-
* from `client.defineWorkflow()`.
|
|
45
|
-
*/
|
|
46
|
-
export class WorkflowDefinition {
|
|
47
|
-
backend;
|
|
48
|
-
name;
|
|
49
|
-
version;
|
|
50
|
-
fn;
|
|
51
|
-
schema;
|
|
52
|
-
constructor(options) {
|
|
53
|
-
this.backend = options.backend;
|
|
54
|
-
this.name = options.name;
|
|
55
|
-
this.version = options.version ?? null;
|
|
56
|
-
this.fn = options.fn;
|
|
57
|
-
this.schema = options.schema ?? null;
|
|
40
|
+
};
|
|
41
|
+
this.registry.register(workflow);
|
|
58
42
|
}
|
|
59
43
|
/**
|
|
60
|
-
*
|
|
44
|
+
* Run a workflow from its specification. This is the primary way to schedule
|
|
45
|
+
* a workflow using only its WorkflowSpec.
|
|
46
|
+
* @param spec - Workflow spec
|
|
47
|
+
* @param input - Workflow input
|
|
48
|
+
* @param options - Run options
|
|
49
|
+
* @returns Handle for awaiting the result
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* const handle = await ow.runWorkflow(emailWorkflow, { to: 'user@example.com' });
|
|
53
|
+
* const result = await handle.result();
|
|
54
|
+
* ```
|
|
61
55
|
*/
|
|
62
|
-
async
|
|
63
|
-
|
|
64
|
-
if (
|
|
65
|
-
|
|
66
|
-
const result = this.schema["~standard"].validate(input);
|
|
67
|
-
const resolved = await Promise.resolve(result);
|
|
68
|
-
if (resolved.issues) {
|
|
69
|
-
const messages = resolved.issues.length > 0
|
|
70
|
-
? resolved.issues.map((issue) => issue.message).join("; ")
|
|
71
|
-
: "Validation failed";
|
|
72
|
-
throw new Error(messages);
|
|
73
|
-
}
|
|
74
|
-
parsedInput = resolved.value;
|
|
56
|
+
async runWorkflow(spec, input, options) {
|
|
57
|
+
const validationResult = await validateInput(spec.schema, input);
|
|
58
|
+
if (!validationResult.success) {
|
|
59
|
+
throw new Error(validationResult.error);
|
|
75
60
|
}
|
|
76
|
-
|
|
61
|
+
const parsedInput = validationResult.value;
|
|
77
62
|
const workflowRun = await this.backend.createWorkflowRun({
|
|
78
|
-
workflowName:
|
|
79
|
-
version:
|
|
63
|
+
workflowName: spec.name,
|
|
64
|
+
version: spec.version ?? null,
|
|
80
65
|
idempotencyKey: null,
|
|
81
66
|
config: {},
|
|
82
67
|
context: null,
|
|
@@ -91,6 +76,48 @@ export class WorkflowDefinition {
|
|
|
91
76
|
resultTimeoutMs: DEFAULT_RESULT_TIMEOUT_MS,
|
|
92
77
|
});
|
|
93
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Define and register a new workflow.
|
|
81
|
+
* @param spec - Workflow spec
|
|
82
|
+
* @param fn - Workflow implementation
|
|
83
|
+
* @returns Runnable workflow
|
|
84
|
+
* @example
|
|
85
|
+
* ```ts
|
|
86
|
+
* const workflow = ow.defineWorkflow(
|
|
87
|
+
* { name: 'my-workflow' },
|
|
88
|
+
* async ({ input, step }) => {
|
|
89
|
+
* // workflow implementation
|
|
90
|
+
* },
|
|
91
|
+
* );
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
defineWorkflow(spec, fn) {
|
|
95
|
+
const workflow = defineWorkflow(spec, fn);
|
|
96
|
+
this.registry.register(workflow);
|
|
97
|
+
return new RunnableWorkflow(this, workflow);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* A fully defined workflow with its implementation. This class is returned by
|
|
102
|
+
* `client.defineWorkflow` and provides the `.run()` method for scheduling
|
|
103
|
+
* workflow runs.
|
|
104
|
+
*/
|
|
105
|
+
export class RunnableWorkflow {
|
|
106
|
+
ow;
|
|
107
|
+
workflow;
|
|
108
|
+
constructor(ow, workflow) {
|
|
109
|
+
this.ow = ow;
|
|
110
|
+
this.workflow = workflow;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Starts a new workflow run.
|
|
114
|
+
* @param input - Workflow input
|
|
115
|
+
* @param options - Run options
|
|
116
|
+
* @returns Workflow run handle
|
|
117
|
+
*/
|
|
118
|
+
async run(input, options) {
|
|
119
|
+
return this.ow.runWorkflow(this.workflow.spec, input, options);
|
|
120
|
+
}
|
|
94
121
|
}
|
|
95
122
|
/**
|
|
96
123
|
* Represents a started workflow run and provides methods to await its result.
|
|
@@ -109,9 +136,12 @@ export class WorkflowRunHandle {
|
|
|
109
136
|
}
|
|
110
137
|
/**
|
|
111
138
|
* Waits for the workflow run to complete and returns the result.
|
|
139
|
+
* @param options - Options for waiting for the result
|
|
140
|
+
* @returns Workflow output
|
|
112
141
|
*/
|
|
113
|
-
async result() {
|
|
142
|
+
async result(options) {
|
|
114
143
|
const start = Date.now();
|
|
144
|
+
const timeout = options?.timeoutMs ?? this.resultTimeoutMs;
|
|
115
145
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
116
146
|
while (true) {
|
|
117
147
|
const latest = await this.backend.getWorkflowRun({
|
|
@@ -130,7 +160,7 @@ export class WorkflowRunHandle {
|
|
|
130
160
|
if (latest.status === "canceled") {
|
|
131
161
|
throw new Error(`Workflow ${this.workflowRun.workflowName} was canceled`);
|
|
132
162
|
}
|
|
133
|
-
if (Date.now() - start >
|
|
163
|
+
if (Date.now() - start > timeout) {
|
|
134
164
|
throw new Error(`Timed out waiting for workflow run ${this.workflowRun.id} to finish`);
|
|
135
165
|
}
|
|
136
166
|
await new Promise((resolve) => {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Backend } from "./backend.js";
|
|
2
|
+
import { WorkerOptions } from "./worker.js";
|
|
3
|
+
export interface OpenWorkflowConfig {
|
|
4
|
+
backend: Backend;
|
|
5
|
+
worker?: WorkerConfig;
|
|
6
|
+
/**
|
|
7
|
+
* Directory or directories to scan for workflow files. All `.ts`, `.js`,
|
|
8
|
+
* `.mjs`, and `.cjs` files in these directories (recursively) will be loaded.
|
|
9
|
+
* Workflow files should export workflows created with `defineWorkflow()`.
|
|
10
|
+
* @example "./openworkflow"
|
|
11
|
+
* @example ["./openworkflow", "./src/openworkflow", "./workflows"]
|
|
12
|
+
*/
|
|
13
|
+
dirs?: string | string[];
|
|
14
|
+
}
|
|
15
|
+
export type WorkerConfig = Pick<WorkerOptions, "concurrency">;
|
|
16
|
+
/**
|
|
17
|
+
* Create a typed OpenWorkflow configuration.
|
|
18
|
+
* @param config - the config
|
|
19
|
+
* @returns the config
|
|
20
|
+
*/
|
|
21
|
+
export declare function defineConfig(config: OpenWorkflowConfig): OpenWorkflowConfig;
|
|
22
|
+
interface LoadedConfig {
|
|
23
|
+
config: OpenWorkflowConfig;
|
|
24
|
+
configFile: string | undefined;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load the OpenWorkflow config at openworkflow.config.{js,mjs,cjs}.
|
|
28
|
+
* @param rootDir - Optional root directory to search from (defaults to
|
|
29
|
+
* process.cwd())
|
|
30
|
+
* @returns The loaded configuration and metadata
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadConfig(rootDir?: string): Promise<LoadedConfig>;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAK5C,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE9D;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,CAE3E;AAED,UAAU,YAAY;IACpB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAKD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAqCxE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
/**
|
|
5
|
+
* Create a typed OpenWorkflow configuration.
|
|
6
|
+
* @param config - the config
|
|
7
|
+
* @returns the config
|
|
8
|
+
*/
|
|
9
|
+
export function defineConfig(config) {
|
|
10
|
+
return config;
|
|
11
|
+
}
|
|
12
|
+
const CONFIG_NAME = "openworkflow.config";
|
|
13
|
+
const CONFIG_EXTENSIONS = ["js", "mjs", "cjs"];
|
|
14
|
+
/**
|
|
15
|
+
* Load the OpenWorkflow config at openworkflow.config.{js,mjs,cjs}.
|
|
16
|
+
* @param rootDir - Optional root directory to search from (defaults to
|
|
17
|
+
* process.cwd())
|
|
18
|
+
* @returns The loaded configuration and metadata
|
|
19
|
+
*/
|
|
20
|
+
export async function loadConfig(rootDir) {
|
|
21
|
+
const cwd = rootDir ?? process.cwd();
|
|
22
|
+
for (const ext of CONFIG_EXTENSIONS) {
|
|
23
|
+
const fileName = `${CONFIG_NAME}.${ext}`;
|
|
24
|
+
const filePath = path.join(cwd, fileName);
|
|
25
|
+
if (existsSync(filePath)) {
|
|
26
|
+
try {
|
|
27
|
+
const fileUrl = pathToFileURL(filePath).href;
|
|
28
|
+
const mod = (await import(fileUrl));
|
|
29
|
+
const config = mod.default ??
|
|
30
|
+
mod;
|
|
31
|
+
return {
|
|
32
|
+
config,
|
|
33
|
+
configFile: filePath,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
throw new Error(`Failed to load config file ${filePath}: ${String(error)}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
// not great, but meant to match the c12 api since that is what was used in
|
|
43
|
+
// the initial implementation of loadConfig
|
|
44
|
+
// this can be easily refactored later
|
|
45
|
+
config: {},
|
|
46
|
+
configFile: undefined, // no config found
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAiBzC;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,OAAO,MAAM,CAAC;AAChB,CAAC;AAOD,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAC1C,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAExD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAgB;IAC/C,MAAM,GAAG,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAErC,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,GAAG,WAAW,IAAI,GAAG,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAE1C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBAE7C,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAEZ,CAAC;gBACvB,MAAM,MAAM,GACT,GAAwC,CAAC,OAAO;oBAChD,GAA0B,CAAC;gBAE9B,OAAO;oBACL,MAAM;oBACN,UAAU,EAAE,QAAQ;iBACrB,CAAC;YACJ,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,8BAA8B,QAAQ,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAC3D,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,2EAA2E;QAC3E,2CAA2C;QAC3C,sCAAsC;QACtC,MAAM,EAAE,EAAmC;QAC3C,UAAU,EAAE,SAAS,EAAE,kBAAkB;KAC1C,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Result } from "./result.js";
|
|
1
2
|
type Years = "years" | "year" | "yrs" | "yr" | "y";
|
|
2
3
|
type Months = "months" | "month" | "mo";
|
|
3
4
|
type Weeks = "weeks" | "week" | "w";
|
|
@@ -10,10 +11,12 @@ type Unit = Years | Months | Weeks | Days | Hours | Minutes | Seconds | Millisec
|
|
|
10
11
|
type UnitAnyCase = Capitalize<Unit> | Uppercase<Unit> | Lowercase<Unit>;
|
|
11
12
|
export type DurationString = `${number}` | `${number}${UnitAnyCase}` | `${number} ${UnitAnyCase}`;
|
|
12
13
|
/**
|
|
13
|
-
* Parse a duration string into milliseconds.
|
|
14
|
+
* Parse a duration string into milliseconds. Examples:
|
|
14
15
|
* - short units: "1ms", "5s", "30m", "2h", "7d", "3w", "1y"
|
|
15
16
|
* - long units: "1 millisecond", "5 seconds", "30 minutes", "2 hours", "7 days", "3 weeks", "1 year"
|
|
17
|
+
* @param str - Duration string
|
|
18
|
+
* @returns Milliseconds
|
|
16
19
|
*/
|
|
17
|
-
export declare function parseDuration(str: DurationString): number
|
|
20
|
+
export declare function parseDuration(str: DurationString): Result<number>;
|
|
18
21
|
export {};
|
|
19
22
|
//# sourceMappingURL=duration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../../core/duration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,GAAG,CAAC;AACnD,KAAK,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;AACxC,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,GAAG,CAAC;AACpC,KAAK,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC;AACjC,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,GAAG,CAAC;AACnD,KAAK,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC;AAC3D,KAAK,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC;AAC3D,KAAK,YAAY,GAAG,cAAc,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;AAC7E,KAAK,IAAI,GACL,KAAK,GACL,MAAM,GACN,KAAK,GACL,IAAI,GACJ,KAAK,GACL,OAAO,GACP,OAAO,GACP,YAAY,CAAC;AACjB,KAAK,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AACxE,MAAM,MAAM,cAAc,GACtB,GAAG,MAAM,EAAE,GACX,GAAG,MAAM,GAAG,WAAW,EAAE,GACzB,GAAG,MAAM,IAAI,WAAW,EAAE,CAAC;AAE/B;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAiEjE"}
|
|
@@ -1,18 +1,21 @@
|
|
|
1
|
+
import { ok, err } from "./result.js";
|
|
1
2
|
/**
|
|
2
|
-
* Parse a duration string into milliseconds.
|
|
3
|
+
* Parse a duration string into milliseconds. Examples:
|
|
3
4
|
* - short units: "1ms", "5s", "30m", "2h", "7d", "3w", "1y"
|
|
4
5
|
* - long units: "1 millisecond", "5 seconds", "30 minutes", "2 hours", "7 days", "3 weeks", "1 year"
|
|
6
|
+
* @param str - Duration string
|
|
7
|
+
* @returns Milliseconds
|
|
5
8
|
*/
|
|
6
9
|
export function parseDuration(str) {
|
|
7
10
|
if (typeof str !== "string") {
|
|
8
|
-
|
|
11
|
+
return err(new TypeError("Invalid duration format: expected a string but received " + typeof str));
|
|
9
12
|
}
|
|
10
13
|
if (str.length === 0) {
|
|
11
|
-
|
|
14
|
+
return err(new Error('Invalid duration format: ""'));
|
|
12
15
|
}
|
|
13
16
|
const match = /^(-?\.?\d+(?:\.\d+)?)\s*([a-z]+)?$/i.exec(str);
|
|
14
17
|
if (!match?.[1]) {
|
|
15
|
-
|
|
18
|
+
return err(new Error(`Invalid duration format: "${str}"`));
|
|
16
19
|
}
|
|
17
20
|
const numValue = Number.parseFloat(match[1]);
|
|
18
21
|
const unit = match[2]?.toLowerCase() ?? "ms"; // default to ms if not provided
|
|
@@ -54,8 +57,8 @@ export function parseDuration(str) {
|
|
|
54
57
|
};
|
|
55
58
|
const multiplier = multipliers[unit];
|
|
56
59
|
if (multiplier === undefined) {
|
|
57
|
-
|
|
60
|
+
return err(new Error(`Invalid duration format: "${str}"`));
|
|
58
61
|
}
|
|
59
|
-
return numValue * multiplier;
|
|
62
|
+
return ok(numValue * multiplier);
|
|
60
63
|
}
|
|
61
64
|
//# sourceMappingURL=duration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duration.js","sourceRoot":"","sources":["../../core/duration.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAyBtC;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAmB;IAC/C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,CACR,IAAI,SAAS,CACX,0DAA0D,GAAG,OAAO,GAAG,CACxE,CACF,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,KAAK,GAAG,qCAAqC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE9D,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,6BAA6B,GAAG,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,gCAAgC;IAE9E,MAAM,WAAW,GAA2B;QAC1C,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;QACR,EAAE,EAAE,CAAC;QACL,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,IAAI;QACT,IAAI,EAAE,IAAI;QACV,CAAC,EAAE,IAAI;QACP,MAAM,EAAE,EAAE,GAAG,IAAI;QACjB,OAAO,EAAE,EAAE,GAAG,IAAI;QAClB,GAAG,EAAE,EAAE,GAAG,IAAI;QACd,IAAI,EAAE,EAAE,GAAG,IAAI;QACf,CAAC,EAAE,EAAE,GAAG,IAAI;QACZ,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACpB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACrB,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QAClB,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACnB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACjB,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QACxB,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QACzB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QACtB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QAC7B,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QAC9B,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QAC1B,KAAK,EAAE,aAAa;QACpB,MAAM,EAAE,aAAa;QACrB,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,cAAc;QACrB,EAAE,EAAE,cAAc;QAClB,GAAG,EAAE,cAAc;QACnB,CAAC,EAAE,cAAc;KAClB,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,6BAA6B,GAAG,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,EAAE,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { JsonValue } from "./json.js";
|
|
2
|
+
export interface SerializedError {
|
|
3
|
+
name?: string;
|
|
4
|
+
message: string;
|
|
5
|
+
stack?: string;
|
|
6
|
+
[key: string]: JsonValue;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Serialize an error to a JSON-compatible format.
|
|
10
|
+
* @param error - The error to serialize (can be Error instance or any value)
|
|
11
|
+
* @returns A JSON-serializable error object
|
|
12
|
+
*/
|
|
13
|
+
export declare function serializeError(error: unknown): SerializedError;
|
|
14
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../core/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAc9D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serialize an error to a JSON-compatible format.
|
|
3
|
+
* @param error - The error to serialize (can be Error instance or any value)
|
|
4
|
+
* @returns A JSON-serializable error object
|
|
5
|
+
*/
|
|
6
|
+
export function serializeError(error) {
|
|
7
|
+
if (error instanceof Error) {
|
|
8
|
+
const { name, message, stack } = error;
|
|
9
|
+
if (stack) {
|
|
10
|
+
return { name, message, stack };
|
|
11
|
+
}
|
|
12
|
+
return { name, message };
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
message: String(error),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../core/error.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;QAEvC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAClC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;KACvB,CAAC;AACJ,CAAC"}
|